From 529589d7fe9278858e3f251b559a1118598a8250 Mon Sep 17 00:00:00 2001 From: Richard Date: Fri, 1 Apr 2022 17:16:15 -0300 Subject: [PATCH 001/286] Introduce `multi_window` from `pure` --- Cargo.toml | 2 + src/lib.rs | 3 + src/multi_window.rs | 4 + src/multi_window/application.rs | 196 ++++++++++++++++++++++++++++++++ 4 files changed, 205 insertions(+) create mode 100644 src/multi_window.rs create mode 100644 src/multi_window/application.rs diff --git a/Cargo.toml b/Cargo.toml index 681aae5e..adcdb79f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,8 @@ chrome-trace = [ "iced_wgpu?/tracing", "iced_glow?/tracing", ] +# Enables experimental multi-window support +multi_window = [] [badges] maintenance = { status = "actively-developed" } diff --git a/src/lib.rs b/src/lib.rs index a0e31be4..6cda8c41 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -181,6 +181,9 @@ pub mod touch; pub mod widget; pub mod window; +#[cfg(feature = "multi_window")] +pub mod multi_window; + #[cfg(all(not(feature = "glow"), feature = "wgpu"))] use iced_winit as runtime; diff --git a/src/multi_window.rs b/src/multi_window.rs new file mode 100644 index 00000000..5b7a00b4 --- /dev/null +++ b/src/multi_window.rs @@ -0,0 +1,4 @@ +//! Leverage multi-window support in your application. +mod application; + +pub use application::Application; diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs new file mode 100644 index 00000000..db41d54a --- /dev/null +++ b/src/multi_window/application.rs @@ -0,0 +1,196 @@ +use crate::{Command, Element, Executor, Settings, Subscription}; + +pub use iced_native::application::{Appearance, StyleSheet}; + +/// A pure version of [`Application`]. +/// +/// Unlike the impure version, the `view` method of this trait takes an +/// immutable reference to `self` and returns a pure [`Element`]. +/// +/// [`Application`]: crate::Application +/// [`Element`]: pure::Element +pub trait Application: Sized { + /// The [`Executor`] that will run commands and subscriptions. + /// + /// The [default executor] can be a good starting point! + /// + /// [`Executor`]: Self::Executor + /// [default executor]: crate::executor::Default + type Executor: Executor; + + /// The type of __messages__ your [`Application`] will produce. + type Message: std::fmt::Debug + Send; + + /// The theme of your [`Application`]. + type Theme: Default + StyleSheet; + + /// The data needed to initialize your [`Application`]. + type Flags; + + /// Initializes the [`Application`] with the flags provided to + /// [`run`] as part of the [`Settings`]. + /// + /// Here is where you should return the initial state of your app. + /// + /// Additionally, you can return a [`Command`] if you need to perform some + /// async action in the background on startup. This is useful if you want to + /// load state from a file, perform an initial HTTP request, etc. + /// + /// [`run`]: Self::run + fn new(flags: Self::Flags) -> (Self, Command); + + /// Returns the current title of the [`Application`]. + /// + /// This title can be dynamic! The runtime will automatically update the + /// title of your application when necessary. + fn title(&self) -> String; + + /// Handles a __message__ and updates the state of the [`Application`]. + /// + /// This is where you define your __update logic__. All the __messages__, + /// produced by either user interactions or commands, will be handled by + /// this method. + /// + /// Any [`Command`] returned will be executed immediately in the background. + fn update(&mut self, message: Self::Message) -> Command; + + /// Returns the current [`Theme`] of the [`Application`]. + /// + /// [`Theme`]: Self::Theme + fn theme(&self) -> Self::Theme { + Self::Theme::default() + } + + /// Returns the current [`Style`] of the [`Theme`]. + /// + /// [`Style`]: ::Style + /// [`Theme`]: Self::Theme + fn style(&self) -> ::Style { + ::Style::default() + } + + /// Returns the event [`Subscription`] for the current state of the + /// application. + /// + /// A [`Subscription`] will be kept alive as long as you keep returning it, + /// and the __messages__ produced will be handled by + /// [`update`](#tymethod.update). + /// + /// By default, this method returns an empty [`Subscription`]. + fn subscription(&self) -> Subscription { + Subscription::none() + } + + /// Returns the widgets to display in the [`Application`]. + /// + /// These widgets can produce __messages__ based on user interaction. + fn view(&self) -> Element<'_, Self::Message, crate::Renderer>; + + /// Returns the scale factor of the [`Application`]. + /// + /// It can be used to dynamically control the size of the UI at runtime + /// (i.e. zooming). + /// + /// For instance, a scale factor of `2.0` will make widgets twice as big, + /// while a scale factor of `0.5` will shrink them to half their size. + /// + /// By default, it returns `1.0`. + fn scale_factor(&self) -> f64 { + 1.0 + } + + /// Returns whether the [`Application`] should be terminated. + /// + /// By default, it returns `false`. + fn should_exit(&self) -> bool { + false + } + + /// Runs the [`Application`]. + /// + /// On native platforms, this method will take control of the current thread + /// until the [`Application`] exits. + /// + /// On the web platform, this method __will NOT return__ unless there is an + /// [`Error`] during startup. + /// + /// [`Error`]: crate::Error + fn run(settings: Settings) -> crate::Result + where + Self: 'static, + { + #[allow(clippy::needless_update)] + let renderer_settings = crate::renderer::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + text_multithreading: settings.text_multithreading, + antialiasing: if settings.antialiasing { + Some(crate::renderer::settings::Antialiasing::MSAAx4) + } else { + None + }, + ..crate::renderer::Settings::from_env() + }; + + Ok(crate::runtime::application::run::< + Instance, + Self::Executor, + crate::renderer::window::Compositor, + >(settings.into(), renderer_settings)?) + } +} + +struct Instance(A); + +impl iced_winit::Program for Instance +where + A: Application, +{ + type Renderer = crate::Renderer; + type Message = A::Message; + + fn update(&mut self, message: Self::Message) -> Command { + self.0.update(message) + } + + fn view(&self) -> Element<'_, Self::Message, Self::Renderer> { + self.0.view() + } +} + +impl crate::runtime::Application for Instance +where + A: Application, +{ + type Flags = A::Flags; + + fn new(flags: Self::Flags) -> (Self, Command) { + let (app, command) = A::new(flags); + + (Instance(app), command) + } + + fn title(&self) -> String { + self.0.title() + } + + fn theme(&self) -> A::Theme { + self.0.theme() + } + + fn style(&self) -> ::Style { + self.0.style() + } + + fn subscription(&self) -> Subscription { + self.0.subscription() + } + + fn scale_factor(&self) -> f64 { + self.0.scale_factor() + } + + fn should_exit(&self) -> bool { + self.0.should_exit() + } +} From 287306e1ebec610c31e37782320fe00d20a6c9ac Mon Sep 17 00:00:00 2001 From: Richard Date: Fri, 1 Apr 2022 17:27:19 -0300 Subject: [PATCH 002/286] Introduce `multi_window` in `iced_winit` --- Cargo.toml | 2 +- winit/Cargo.toml | 1 + winit/src/lib.rs | 3 + winit/src/multi_window.rs | 742 ++++++++++++++++++++++++++++++++ winit/src/multi_window/state.rs | 212 +++++++++ 5 files changed, 959 insertions(+), 1 deletion(-) create mode 100644 winit/src/multi_window.rs create mode 100644 winit/src/multi_window/state.rs diff --git a/Cargo.toml b/Cargo.toml index adcdb79f..41f5af2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ chrome-trace = [ "iced_glow?/tracing", ] # Enables experimental multi-window support -multi_window = [] +multi_window = ["iced_winit/multi_window"] [badges] maintenance = { status = "actively-developed" } diff --git a/winit/Cargo.toml b/winit/Cargo.toml index 94aaa2ca..2152e7da 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -16,6 +16,7 @@ chrome-trace = ["trace", "tracing-chrome"] debug = ["iced_native/debug"] system = ["sysinfo"] application = [] +multi_window = [] [dependencies] window_clipboard = "0.2" diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 06674109..9b3c0a02 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -35,6 +35,9 @@ pub use iced_native::*; pub use winit; +#[cfg(feature = "multi_window")] +pub mod multi_window; + #[cfg(feature = "application")] pub mod application; pub mod clipboard; diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs new file mode 100644 index 00000000..4ea7383a --- /dev/null +++ b/winit/src/multi_window.rs @@ -0,0 +1,742 @@ +//! Create interactive, native cross-platform applications. +mod state; + +pub use state::State; + +use crate::clipboard::{self, Clipboard}; +use crate::conversion; +use crate::mouse; +use crate::renderer; +use crate::widget::operation; +use crate::{ + Command, Debug, Error, Executor, Proxy, Runtime, Settings, Size, + Subscription, +}; + +use iced_futures::futures; +use iced_futures::futures::channel::mpsc; +use iced_graphics::compositor; +use iced_graphics::window; +use iced_native::program::Program; +use iced_native::user_interface::{self, UserInterface}; + +pub use iced_native::application::{Appearance, StyleSheet}; + +use std::mem::ManuallyDrop; + +/// An interactive, native cross-platform application. +/// +/// This trait is the main entrypoint of Iced. Once implemented, you can run +/// your GUI application by simply calling [`run`]. It will run in +/// its own window. +/// +/// An [`Application`] can execute asynchronous actions by returning a +/// [`Command`] in some of its methods. +/// +/// When using an [`Application`] with the `debug` feature enabled, a debug view +/// can be toggled by pressing `F12`. +pub trait Application: Program +where + ::Theme: StyleSheet, +{ + /// The data needed to initialize your [`Application`]. + type Flags; + + /// Initializes the [`Application`] with the flags provided to + /// [`run`] as part of the [`Settings`]. + /// + /// Here is where you should return the initial state of your app. + /// + /// Additionally, you can return a [`Command`] if you need to perform some + /// async action in the background on startup. This is useful if you want to + /// load state from a file, perform an initial HTTP request, etc. + fn new(flags: Self::Flags) -> (Self, Command); + + /// Returns the current title of the [`Application`]. + /// + /// This title can be dynamic! The runtime will automatically update the + /// title of your application when necessary. + fn title(&self) -> String; + + /// Returns the current [`Theme`] of the [`Application`]. + fn theme(&self) -> ::Theme; + + /// Returns the [`Style`] variation of the [`Theme`]. + fn style( + &self, + ) -> <::Theme as StyleSheet>::Style { + Default::default() + } + + /// Returns the event `Subscription` for the current state of the + /// application. + /// + /// The messages produced by the `Subscription` will be handled by + /// [`update`](#tymethod.update). + /// + /// A `Subscription` will be kept alive as long as you keep returning it! + /// + /// By default, it returns an empty subscription. + fn subscription(&self) -> Subscription { + Subscription::none() + } + + /// Returns the scale factor of the [`Application`]. + /// + /// It can be used to dynamically control the size of the UI at runtime + /// (i.e. zooming). + /// + /// For instance, a scale factor of `2.0` will make widgets twice as big, + /// while a scale factor of `0.5` will shrink them to half their size. + /// + /// By default, it returns `1.0`. + fn scale_factor(&self) -> f64 { + 1.0 + } + + /// Returns whether the [`Application`] should be terminated. + /// + /// By default, it returns `false`. + fn should_exit(&self) -> bool { + false + } +} + +/// Runs an [`Application`] with an executor, compositor, and the provided +/// settings. +pub fn run( + settings: Settings, + compositor_settings: C::Settings, +) -> Result<(), Error> +where + A: Application + 'static, + E: Executor + 'static, + C: window::Compositor + 'static, + ::Theme: StyleSheet, +{ + use futures::task; + use futures::Future; + use winit::event_loop::EventLoopBuilder; + + let mut debug = Debug::new(); + debug.startup_started(); + + let event_loop = EventLoopBuilder::with_user_event().build(); + let proxy = event_loop.create_proxy(); + + let runtime = { + let proxy = Proxy::new(event_loop.create_proxy()); + let executor = E::new().map_err(Error::ExecutorCreationFailed)?; + + Runtime::new(executor, proxy) + }; + + let (application, init_command) = { + let flags = settings.flags; + + runtime.enter(|| A::new(flags)) + }; + + let builder = settings.window.into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ); + + log::info!("Window builder: {:#?}", builder); + + let window = builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?; + + #[cfg(target_arch = "wasm32")] + { + use winit::platform::web::WindowExtWebSys; + + let canvas = window.canvas(); + + let window = web_sys::window().unwrap(); + let document = window.document().unwrap(); + let body = document.body().unwrap(); + + let _ = body + .append_child(&canvas) + .expect("Append canvas to HTML body"); + } + + let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; + + let (mut sender, receiver) = mpsc::unbounded(); + + let mut instance = Box::pin(run_instance::( + application, + compositor, + renderer, + runtime, + proxy, + debug, + receiver, + init_command, + window, + settings.exit_on_close_request, + )); + + let mut context = task::Context::from_waker(task::noop_waker_ref()); + + platform::run(event_loop, move |event, _, control_flow| { + use winit::event_loop::ControlFlow; + + if let ControlFlow::ExitWithCode(_) = control_flow { + return; + } + + let event = match event { + winit::event::Event::WindowEvent { + event: + winit::event::WindowEvent::ScaleFactorChanged { + new_inner_size, + .. + }, + window_id, + } => Some(winit::event::Event::WindowEvent { + event: winit::event::WindowEvent::Resized(*new_inner_size), + window_id, + }), + _ => event.to_static(), + }; + + if let Some(event) = event { + sender.start_send(event).expect("Send event"); + + let poll = instance.as_mut().poll(&mut context); + + *control_flow = match poll { + task::Poll::Pending => ControlFlow::Wait, + task::Poll::Ready(_) => ControlFlow::Exit, + }; + } + }) +} + +async fn run_instance( + mut application: A, + mut compositor: C, + mut renderer: A::Renderer, + mut runtime: Runtime, A::Message>, + mut proxy: winit::event_loop::EventLoopProxy, + mut debug: Debug, + mut receiver: mpsc::UnboundedReceiver>, + init_command: Command, + window: winit::window::Window, + exit_on_close_request: bool, +) where + A: Application + 'static, + E: Executor + 'static, + C: window::Compositor + 'static, + ::Theme: StyleSheet, +{ + use iced_futures::futures::stream::StreamExt; + use winit::event; + + let mut clipboard = Clipboard::connect(&window); + let mut cache = user_interface::Cache::default(); + let mut surface = compositor.create_surface(&window); + + let mut state = State::new(&application, &window); + let mut viewport_version = state.viewport_version(); + + let physical_size = state.physical_size(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + run_command( + &application, + &mut cache, + &state, + &mut renderer, + init_command, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &window, + || compositor.fetch_information(), + ); + runtime.track(application.subscription()); + + let mut user_interface = ManuallyDrop::new(build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + )); + + let mut mouse_interaction = mouse::Interaction::default(); + let mut events = Vec::new(); + let mut messages = Vec::new(); + + debug.startup_finished(); + + while let Some(event) = receiver.next().await { + match event { + event::Event::MainEventsCleared => { + if events.is_empty() && messages.is_empty() { + continue; + } + + debug.event_processing_started(); + + let (interface_state, statuses) = user_interface.update( + &events, + state.cursor_position(), + &mut renderer, + &mut clipboard, + &mut messages, + ); + + debug.event_processing_finished(); + + for event in events.drain(..).zip(statuses.into_iter()) { + runtime.broadcast(event); + } + + if !messages.is_empty() + || matches!( + interface_state, + user_interface::State::Outdated, + ) + { + let mut cache = + ManuallyDrop::into_inner(user_interface).into_cache(); + + // Update application + update( + &mut application, + &mut cache, + &state, + &mut renderer, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &mut messages, + &window, + || compositor.fetch_information(), + ); + + // Update window + state.synchronize(&application, &window); + + let should_exit = application.should_exit(); + + user_interface = ManuallyDrop::new(build_user_interface( + &application, + cache, + &mut renderer, + state.logical_size(), + &mut debug, + )); + + if should_exit { + break; + } + } + + debug.draw_started(); + let new_mouse_interaction = user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ); + debug.draw_finished(); + + if new_mouse_interaction != mouse_interaction { + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + mouse_interaction = new_mouse_interaction; + } + + window.request_redraw(); + } + event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + )) => { + use iced_native::event; + + events.push(iced_native::Event::PlatformSpecific( + event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl( + url, + )), + )); + } + event::Event::UserEvent(message) => { + messages.push(message); + } + event::Event::RedrawRequested(_) => { + let physical_size = state.physical_size(); + + if physical_size.width == 0 || physical_size.height == 0 { + continue; + } + + debug.render_started(); + let current_viewport_version = state.viewport_version(); + + if viewport_version != current_viewport_version { + let logical_size = state.logical_size(); + + debug.layout_started(); + user_interface = ManuallyDrop::new( + ManuallyDrop::into_inner(user_interface) + .relayout(logical_size, &mut renderer), + ); + debug.layout_finished(); + + debug.draw_started(); + let new_mouse_interaction = user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ); + + if new_mouse_interaction != mouse_interaction { + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + mouse_interaction = new_mouse_interaction; + } + debug.draw_finished(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + viewport_version = current_viewport_version; + } + + match compositor.present( + &mut renderer, + &mut surface, + state.viewport(), + state.background_color(), + &debug.overlay(), + ) { + Ok(()) => { + debug.render_finished(); + + // TODO: Handle animations! + // Maybe we can use `ControlFlow::WaitUntil` for this. + } + Err(error) => match error { + // This is an unrecoverable error. + compositor::SurfaceError::OutOfMemory => { + panic!("{:?}", error); + } + _ => { + debug.render_finished(); + + // Try rendering again next frame. + window.request_redraw(); + } + }, + } + } + event::Event::WindowEvent { + event: window_event, + .. + } => { + if requests_exit(&window_event, state.modifiers()) + && exit_on_close_request + { + break; + } + + state.update(&window, &window_event, &mut debug); + + if let Some(event) = conversion::window_event( + &window_event, + state.scale_factor(), + state.modifiers(), + ) { + events.push(event); + } + } + _ => {} + } + } + + // Manually drop the user interface + drop(ManuallyDrop::into_inner(user_interface)); +} + +/// Returns true if the provided event should cause an [`Application`] to +/// exit. +pub fn requests_exit( + event: &winit::event::WindowEvent<'_>, + _modifiers: winit::event::ModifiersState, +) -> bool { + use winit::event::WindowEvent; + + match event { + WindowEvent::CloseRequested => true, + #[cfg(target_os = "macos")] + WindowEvent::KeyboardInput { + input: + winit::event::KeyboardInput { + virtual_keycode: Some(winit::event::VirtualKeyCode::Q), + state: winit::event::ElementState::Pressed, + .. + }, + .. + } if _modifiers.logo() => true, + _ => false, + } +} + +/// Builds a [`UserInterface`] for the provided [`Application`], logging +/// [`struct@Debug`] information accordingly. +pub fn build_user_interface<'a, A: Application>( + application: &'a A, + cache: user_interface::Cache, + renderer: &mut A::Renderer, + size: Size, + debug: &mut Debug, +) -> UserInterface<'a, A::Message, A::Renderer> +where + ::Theme: StyleSheet, +{ + debug.view_started(); + let view = application.view(); + debug.view_finished(); + + debug.layout_started(); + let user_interface = UserInterface::build(view, size, cache, renderer); + debug.layout_finished(); + + user_interface +} + +/// Updates an [`Application`] by feeding it the provided messages, spawning any +/// resulting [`Command`], and tracking its [`Subscription`]. +pub fn update( + application: &mut A, + cache: &mut user_interface::Cache, + state: &State, + renderer: &mut A::Renderer, + runtime: &mut Runtime, A::Message>, + clipboard: &mut Clipboard, + proxy: &mut winit::event_loop::EventLoopProxy, + debug: &mut Debug, + messages: &mut Vec, + window: &winit::window::Window, + graphics_info: impl FnOnce() -> compositor::Information + Copy, +) where + ::Theme: StyleSheet, +{ + for message in messages.drain(..) { + debug.log_message(&message); + + debug.update_started(); + let command = runtime.enter(|| application.update(message)); + debug.update_finished(); + + run_command( + application, + cache, + state, + renderer, + command, + runtime, + clipboard, + proxy, + debug, + window, + graphics_info, + ); + } + + let subscription = application.subscription(); + runtime.track(subscription); +} + +/// Runs the actions of a [`Command`]. +pub fn run_command( + application: &A, + cache: &mut user_interface::Cache, + state: &State, + renderer: &mut A::Renderer, + command: Command, + runtime: &mut Runtime, A::Message>, + clipboard: &mut Clipboard, + proxy: &mut winit::event_loop::EventLoopProxy, + debug: &mut Debug, + window: &winit::window::Window, + _graphics_info: impl FnOnce() -> compositor::Information + Copy, +) where + A: Application, + E: Executor, + ::Theme: StyleSheet, +{ + use iced_native::command; + use iced_native::system; + use iced_native::window; + + for action in command.actions() { + match action { + command::Action::Future(future) => { + runtime.spawn(future); + } + command::Action::Clipboard(action) => match action { + clipboard::Action::Read(tag) => { + let message = tag(clipboard.read()); + + proxy + .send_event(message) + .expect("Send message to event loop"); + } + clipboard::Action::Write(contents) => { + clipboard.write(contents); + } + }, + command::Action::Window(action) => match action { + window::Action::Resize { width, height } => { + window.set_inner_size(winit::dpi::LogicalSize { + width, + height, + }); + } + window::Action::Move { x, y } => { + window.set_outer_position(winit::dpi::LogicalPosition { + x, + y, + }); + } + window::Action::SetMode(mode) => { + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let mode = if window.is_visible().unwrap_or(true) { + conversion::mode(window.fullscreen()) + } else { + window::Mode::Hidden + }; + + proxy + .send_event(tag(mode)) + .expect("Send message to event loop"); + } + }, + command::Action::System(action) => match action { + system::Action::QueryInformation(_tag) => { + #[cfg(feature = "system")] + { + let graphics_info = _graphics_info(); + let proxy = proxy.clone(); + + let _ = std::thread::spawn(move || { + let information = + crate::system::information(graphics_info); + + let message = _tag(information); + + proxy + .send_event(message) + .expect("Send message to event loop") + }); + } + } + }, + command::Action::Widget(action) => { + let mut current_cache = std::mem::take(cache); + let mut current_operation = Some(action.into_operation()); + + let mut user_interface = build_user_interface( + application, + current_cache, + renderer, + state.logical_size(), + debug, + ); + + while let Some(mut operation) = current_operation.take() { + user_interface.operate(renderer, operation.as_mut()); + + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + proxy + .send_event(message) + .expect("Send message to event loop"); + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } + } + } + + current_cache = user_interface.into_cache(); + *cache = current_cache; + } + } + } +} + +#[cfg(not(target_arch = "wasm32"))] +mod platform { + pub fn run( + mut event_loop: winit::event_loop::EventLoop, + event_handler: F, + ) -> Result<(), super::Error> + where + F: 'static + + FnMut( + winit::event::Event<'_, T>, + &winit::event_loop::EventLoopWindowTarget, + &mut winit::event_loop::ControlFlow, + ), + { + use winit::platform::run_return::EventLoopExtRunReturn; + + let _ = event_loop.run_return(event_handler); + + Ok(()) + } +} + +#[cfg(target_arch = "wasm32")] +mod platform { + pub fn run( + event_loop: winit::event_loop::EventLoop, + event_handler: F, + ) -> ! + where + F: 'static + + FnMut( + winit::event::Event<'_, T>, + &winit::event_loop::EventLoopWindowTarget, + &mut winit::event_loop::ControlFlow, + ), + { + event_loop.run(event_handler) + } +} diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs new file mode 100644 index 00000000..2d120ca1 --- /dev/null +++ b/winit/src/multi_window/state.rs @@ -0,0 +1,212 @@ +use crate::application::{self, StyleSheet as _}; +use crate::conversion; +use crate::multi_window::Application; +use crate::{Color, Debug, Point, Size, Viewport}; + +use std::marker::PhantomData; +use winit::event::{Touch, WindowEvent}; +use winit::window::Window; + +/// The state of a windowed [`Application`]. +#[allow(missing_debug_implementations)] +pub struct State +where + ::Theme: application::StyleSheet, +{ + title: String, + scale_factor: f64, + viewport: Viewport, + viewport_version: usize, + cursor_position: winit::dpi::PhysicalPosition, + modifiers: winit::event::ModifiersState, + theme: ::Theme, + appearance: application::Appearance, + application: PhantomData, +} + +impl State +where + ::Theme: application::StyleSheet, +{ + /// Creates a new [`State`] for the provided [`Application`] and window. + pub fn new(application: &A, window: &Window) -> Self { + let title = application.title(); + let scale_factor = application.scale_factor(); + let theme = application.theme(); + let appearance = theme.appearance(application.style()); + + let viewport = { + let physical_size = window.inner_size(); + + Viewport::with_physical_size( + Size::new(physical_size.width, physical_size.height), + window.scale_factor() * scale_factor, + ) + }; + + Self { + title, + scale_factor, + viewport, + viewport_version: 0, + // TODO: Encode cursor availability in the type-system + cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0), + modifiers: winit::event::ModifiersState::default(), + theme, + appearance, + application: PhantomData, + } + } + + /// Returns the current [`Viewport`] of the [`State`]. + pub fn viewport(&self) -> &Viewport { + &self.viewport + } + + /// Returns the version of the [`Viewport`] of the [`State`]. + /// + /// The version is incremented every time the [`Viewport`] changes. + pub fn viewport_version(&self) -> usize { + self.viewport_version + } + + /// Returns the physical [`Size`] of the [`Viewport`] of the [`State`]. + pub fn physical_size(&self) -> Size { + self.viewport.physical_size() + } + + /// Returns the logical [`Size`] of the [`Viewport`] of the [`State`]. + pub fn logical_size(&self) -> Size { + self.viewport.logical_size() + } + + /// Returns the current scale factor of the [`Viewport`] of the [`State`]. + pub fn scale_factor(&self) -> f64 { + self.viewport.scale_factor() + } + + /// Returns the current cursor position of the [`State`]. + pub fn cursor_position(&self) -> Point { + conversion::cursor_position( + self.cursor_position, + self.viewport.scale_factor(), + ) + } + + /// Returns the current keyboard modifiers of the [`State`]. + pub fn modifiers(&self) -> winit::event::ModifiersState { + self.modifiers + } + + /// Returns the current theme of the [`State`]. + pub fn theme(&self) -> &::Theme { + &self.theme + } + + /// Returns the current background [`Color`] of the [`State`]. + pub fn background_color(&self) -> Color { + self.appearance.background_color + } + + /// Returns the current text [`Color`] of the [`State`]. + pub fn text_color(&self) -> Color { + self.appearance.text_color + } + + /// Processes the provided window event and updates the [`State`] + /// accordingly. + pub fn update( + &mut self, + window: &Window, + event: &WindowEvent<'_>, + _debug: &mut Debug, + ) { + match event { + WindowEvent::Resized(new_size) => { + let size = Size::new(new_size.width, new_size.height); + + self.viewport = Viewport::with_physical_size( + size, + window.scale_factor() * self.scale_factor, + ); + + self.viewport_version = self.viewport_version.wrapping_add(1); + } + WindowEvent::ScaleFactorChanged { + scale_factor: new_scale_factor, + new_inner_size, + } => { + let size = + Size::new(new_inner_size.width, new_inner_size.height); + + self.viewport = Viewport::with_physical_size( + size, + new_scale_factor * self.scale_factor, + ); + + self.viewport_version = self.viewport_version.wrapping_add(1); + } + WindowEvent::CursorMoved { position, .. } + | WindowEvent::Touch(Touch { + location: position, .. + }) => { + self.cursor_position = *position; + } + WindowEvent::CursorLeft { .. } => { + // TODO: Encode cursor availability in the type-system + self.cursor_position = + winit::dpi::PhysicalPosition::new(-1.0, -1.0); + } + WindowEvent::ModifiersChanged(new_modifiers) => { + self.modifiers = *new_modifiers; + } + #[cfg(feature = "debug")] + WindowEvent::KeyboardInput { + input: + winit::event::KeyboardInput { + virtual_keycode: Some(winit::event::VirtualKeyCode::F12), + state: winit::event::ElementState::Pressed, + .. + }, + .. + } => _debug.toggle(), + _ => {} + } + } + + /// Synchronizes the [`State`] with its [`Application`] and its respective + /// window. + /// + /// Normally an [`Application`] should be synchronized with its [`State`] + /// and window after calling [`Application::update`]. + /// + /// [`Application::update`]: crate::Program::update + pub fn synchronize(&mut self, application: &A, window: &Window) { + // Update window title + let new_title = application.title(); + + if self.title != new_title { + window.set_title(&new_title); + + self.title = new_title; + } + + // Update scale factor + let new_scale_factor = application.scale_factor(); + + if self.scale_factor != new_scale_factor { + let size = window.inner_size(); + + self.viewport = Viewport::with_physical_size( + Size::new(size.width, size.height), + window.scale_factor() * new_scale_factor, + ); + + self.scale_factor = new_scale_factor; + } + + // Update theme and appearance + self.theme = application.theme(); + self.appearance = self.theme.appearance(application.style()); + } +} From b896e41c6e03f1447419194ce41d15fb0db39d96 Mon Sep 17 00:00:00 2001 From: Richard Date: Fri, 1 Apr 2022 17:39:08 -0300 Subject: [PATCH 003/286] Unify `Application` and `Program` Instead of creating a separate `multi_window::Program`, the new `multi_window::Application` unifies both traits --- src/multi_window/application.rs | 30 ++++++++++++------------------ winit/src/multi_window.rs | 28 ++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index db41d54a..fa0c15b1 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -132,7 +132,7 @@ pub trait Application: Sized { ..crate::renderer::Settings::from_env() }; - Ok(crate::runtime::application::run::< + Ok(crate::runtime::multi_window::run::< Instance, Self::Executor, crate::renderer::window::Compositor, @@ -142,27 +142,13 @@ pub trait Application: Sized { struct Instance(A); -impl iced_winit::Program for Instance -where - A: Application, -{ - type Renderer = crate::Renderer; - type Message = A::Message; - - fn update(&mut self, message: Self::Message) -> Command { - self.0.update(message) - } - - fn view(&self) -> Element<'_, Self::Message, Self::Renderer> { - self.0.view() - } -} - -impl crate::runtime::Application for Instance +impl crate::runtime::multi_window::Application for Instance where A: Application, { type Flags = A::Flags; + type Renderer = crate::Renderer; + type Message = A::Message; fn new(flags: Self::Flags) -> (Self, Command) { let (app, command) = A::new(flags); @@ -174,6 +160,14 @@ where self.0.title() } + fn update(&mut self, message: Self::Message) -> Command { + self.0.update(message) + } + + fn view(&self) -> Element<'_, Self::Message, Self::Renderer> { + self.0.view() + } + fn theme(&self) -> A::Theme { self.0.theme() } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 4ea7383a..b519e471 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -9,15 +9,14 @@ use crate::mouse; use crate::renderer; use crate::widget::operation; use crate::{ - Command, Debug, Error, Executor, Proxy, Runtime, Settings, Size, - Subscription, + Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, + Settings, Size, Subscription, }; use iced_futures::futures; use iced_futures::futures::channel::mpsc; use iced_graphics::compositor; use iced_graphics::window; -use iced_native::program::Program; use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; @@ -35,13 +34,34 @@ use std::mem::ManuallyDrop; /// /// When using an [`Application`] with the `debug` feature enabled, a debug view /// can be toggled by pressing `F12`. -pub trait Application: Program +pub trait Application: Sized where ::Theme: StyleSheet, { /// The data needed to initialize your [`Application`]. type Flags; + /// The graphics backend to use to draw the [`Program`]. + type Renderer: Renderer; + + /// The type of __messages__ your [`Program`] will produce. + type Message: std::fmt::Debug + Send; + + /// Handles a __message__ and updates the state of the [`Program`]. + /// + /// This is where you define your __update logic__. All the __messages__, + /// produced by either user interactions or commands, will be handled by + /// this method. + /// + /// Any [`Command`] returned will be executed immediately in the + /// background by shells. + fn update(&mut self, message: Self::Message) -> Command; + + /// Returns the widgets to display in the [`Program`]. + /// + /// These widgets can produce __messages__ based on user interaction. + fn view(&self) -> Element<'_, Self::Message, Self::Renderer>; + /// Initializes the [`Application`] with the flags provided to /// [`run`] as part of the [`Settings`]. /// From 12538d3c5be08f2109f1dc61936ceb2fda0fc5c6 Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 15 Jun 2022 16:46:37 -0300 Subject: [PATCH 004/286] Use map of windows internally --- winit/src/multi_window.rs | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index b519e471..8a967207 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -21,6 +21,7 @@ use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; +use std::collections::HashMap; use std::mem::ManuallyDrop; /// An interactive, native cross-platform application. @@ -169,6 +170,10 @@ where .build(&event_loop) .map_err(Error::WindowCreationFailed)?; + let windows: HashMap = + HashMap::from([(0usize, window)]); + let window = windows.values().next().expect("No window found"); + #[cfg(target_arch = "wasm32")] { use winit::platform::web::WindowExtWebSys; @@ -197,7 +202,7 @@ where debug, receiver, init_command, - window, + windows, settings.exit_on_close_request, )); @@ -247,7 +252,7 @@ async fn run_instance( mut debug: Debug, mut receiver: mpsc::UnboundedReceiver>, init_command: Command, - window: winit::window::Window, + windows: HashMap, exit_on_close_request: bool, ) where A: Application + 'static, @@ -258,11 +263,12 @@ async fn run_instance( use iced_futures::futures::stream::StreamExt; use winit::event; - let mut clipboard = Clipboard::connect(&window); + let window = windows.values().next().expect("No window found"); + let mut clipboard = Clipboard::connect(window); let mut cache = user_interface::Cache::default(); let mut surface = compositor.create_surface(&window); - let mut state = State::new(&application, &window); + let mut state = State::new(&application, window); let mut viewport_version = state.viewport_version(); let physical_size = state.physical_size(); @@ -283,7 +289,7 @@ async fn run_instance( &mut clipboard, &mut proxy, &mut debug, - &window, + &windows, || compositor.fetch_information(), ); runtime.track(application.subscription()); @@ -345,12 +351,12 @@ async fn run_instance( &mut proxy, &mut debug, &mut messages, - &window, + &windows, || compositor.fetch_information(), ); // Update window - state.synchronize(&application, &window); + state.synchronize(&application, window); let should_exit = application.should_exit(); @@ -487,7 +493,7 @@ async fn run_instance( break; } - state.update(&window, &window_event, &mut debug); + state.update(window, &window_event, &mut debug); if let Some(event) = conversion::window_event( &window_event, @@ -564,7 +570,7 @@ pub fn update( proxy: &mut winit::event_loop::EventLoopProxy, debug: &mut Debug, messages: &mut Vec, - window: &winit::window::Window, + windows: &HashMap, graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where ::Theme: StyleSheet, @@ -586,7 +592,7 @@ pub fn update( clipboard, proxy, debug, - window, + windows, graphics_info, ); } @@ -606,7 +612,7 @@ pub fn run_command( clipboard: &mut Clipboard, proxy: &mut winit::event_loop::EventLoopProxy, debug: &mut Debug, - window: &winit::window::Window, + windows: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where A: Application, @@ -617,6 +623,8 @@ pub fn run_command( use iced_native::system; use iced_native::window; + let window = windows.values().next().expect("No window found"); + for action in command.actions() { match action { command::Action::Future(future) => { From 5919325d9b9ebf86f7358059201e6fc1af2412d8 Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 15 Jun 2022 20:01:50 -0300 Subject: [PATCH 005/286] Internally wrap `Message` with a `Event` enum --- winit/src/multi_window.rs | 43 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 8a967207..61984b93 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -13,8 +13,8 @@ use crate::{ Settings, Size, Subscription, }; -use iced_futures::futures; use iced_futures::futures::channel::mpsc; +use iced_futures::futures::{self, FutureExt}; use iced_graphics::compositor; use iced_graphics::window; use iced_native::user_interface::{self, UserInterface}; @@ -24,6 +24,16 @@ pub use iced_native::application::{Appearance, StyleSheet}; use std::collections::HashMap; use std::mem::ManuallyDrop; +/// TODO(derezzedex) +// This is the an wrapper around the `Application::Message` associate type +// to allows the `shell` to create internal messages, while still having +// the current user specified custom messages. +#[derive(Debug, Clone)] +pub enum Event { + /// An [`Application`] generated message + Application(Message), +} + /// An interactive, native cross-platform application. /// /// This trait is the main entrypoint of Iced. Once implemented, you can run @@ -247,10 +257,12 @@ async fn run_instance( mut application: A, mut compositor: C, mut renderer: A::Renderer, - mut runtime: Runtime, A::Message>, - mut proxy: winit::event_loop::EventLoopProxy, + mut runtime: Runtime>, Event>, + mut proxy: winit::event_loop::EventLoopProxy>, mut debug: Debug, - mut receiver: mpsc::UnboundedReceiver>, + mut receiver: mpsc::UnboundedReceiver< + winit::event::Event<'_, Event>, + >, init_command: Command, windows: HashMap, exit_on_close_request: bool, @@ -292,7 +304,7 @@ async fn run_instance( &windows, || compositor.fetch_information(), ); - runtime.track(application.subscription()); + runtime.track(application.subscription().map(Event::Application)); let mut user_interface = ManuallyDrop::new(build_user_interface( &application, @@ -406,6 +418,7 @@ async fn run_instance( )); } event::Event::UserEvent(message) => { + let Event::Application(message) = message; messages.push(message); } event::Event::RedrawRequested(_) => { @@ -565,9 +578,9 @@ pub fn update( cache: &mut user_interface::Cache, state: &State, renderer: &mut A::Renderer, - runtime: &mut Runtime, A::Message>, + runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy, + proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, messages: &mut Vec, windows: &HashMap, @@ -597,7 +610,7 @@ pub fn update( ); } - let subscription = application.subscription(); + let subscription = application.subscription().map(Event::Application); runtime.track(subscription); } @@ -608,9 +621,9 @@ pub fn run_command( state: &State, renderer: &mut A::Renderer, command: Command, - runtime: &mut Runtime, A::Message>, + runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy, + proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, windows: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, @@ -628,14 +641,14 @@ pub fn run_command( for action in command.actions() { match action { command::Action::Future(future) => { - runtime.spawn(future); + runtime.spawn(Box::pin(future.map(Event::Application))); } command::Action::Clipboard(action) => match action { clipboard::Action::Read(tag) => { let message = tag(clipboard.read()); proxy - .send_event(message) + .send_event(Event::Application(message)) .expect("Send message to event loop"); } clipboard::Action::Write(contents) => { @@ -670,7 +683,7 @@ pub fn run_command( }; proxy - .send_event(tag(mode)) + .send_event(Event::Application(tag(mode))) .expect("Send message to event loop"); } }, @@ -688,7 +701,7 @@ pub fn run_command( let message = _tag(information); proxy - .send_event(message) + .send_event(Event::Application(message)) .expect("Send message to event loop") }); } @@ -713,7 +726,7 @@ pub fn run_command( operation::Outcome::None => {} operation::Outcome::Some(message) => { proxy - .send_event(message) + .send_event(Event::Application(message)) .expect("Send message to event loop"); } operation::Outcome::Chain(next) => { From 00d6baf861ba57984a341283823e9fea3c262130 Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 15 Jun 2022 20:10:15 -0300 Subject: [PATCH 006/286] fix: temporalily remove the unsafe pointer `HWND` --- winit/src/settings.rs | 6 +++--- winit/src/settings/windows.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 9bbdef5c..94d243a7 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -154,9 +154,9 @@ impl Window { { use winit::platform::windows::WindowBuilderExtWindows; - if let Some(parent) = self.platform_specific.parent { - window_builder = window_builder.with_parent_window(parent); - } + // if let Some(parent) = self.platform_specific.parent { + // window_builder = window_builder.with_parent_window(parent); + // } window_builder = window_builder .with_drag_and_drop(self.platform_specific.drag_and_drop); diff --git a/winit/src/settings/windows.rs b/winit/src/settings/windows.rs index ff03a9c5..0891ec2c 100644 --- a/winit/src/settings/windows.rs +++ b/winit/src/settings/windows.rs @@ -4,7 +4,7 @@ #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct PlatformSpecific { /// Parent window - pub parent: Option, + // pub parent: Option, /// Drag and drop support pub drag_and_drop: bool, @@ -13,7 +13,7 @@ pub struct PlatformSpecific { impl Default for PlatformSpecific { fn default() -> Self { Self { - parent: None, + // parent: None, drag_and_drop: true, } } From 8fdd5ee8b60e551088d4a18fb1d58b6c3e62ba7d Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 15 Jun 2022 20:38:51 -0300 Subject: [PATCH 007/286] Synchronize window list with `windows` method --- winit/src/multi_window.rs | 72 +++++++++++++++++++++++++++------ winit/src/multi_window/state.rs | 22 +++++++++- 2 files changed, 79 insertions(+), 15 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 61984b93..900ee92a 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -7,6 +7,7 @@ use crate::clipboard::{self, Clipboard}; use crate::conversion; use crate::mouse; use crate::renderer; +use crate::settings; use crate::widget::operation; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, @@ -28,10 +29,17 @@ use std::mem::ManuallyDrop; // This is the an wrapper around the `Application::Message` associate type // to allows the `shell` to create internal messages, while still having // the current user specified custom messages. -#[derive(Debug, Clone)] +#[derive(Debug)] pub enum Event { /// An [`Application`] generated message Application(Message), + + /// TODO(derezzedex) + // Create a wrapper variant of `window::Event` type instead + // (maybe we should also allow users to listen/react to those internal messages?) + NewWindow(usize, settings::Window), + /// TODO(derezzedex) + WindowCreated(usize, winit::window::Window), } /// An interactive, native cross-platform application. @@ -218,7 +226,7 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); - platform::run(event_loop, move |event, _, control_flow| { + platform::run(event_loop, move |event, event_loop, control_flow| { use winit::event_loop::ControlFlow; if let ControlFlow::ExitWithCode(_) = control_flow { @@ -237,6 +245,21 @@ where event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), + winit::event::Event::UserEvent(Event::NewWindow(id, settings)) => { + // TODO(derezzedex) + let window = settings + .into_builder( + "fix window title", + event_loop.primary_monitor(), + None, + ) + .build(event_loop) + .expect("Failed to build window"); + + Some(winit::event::Event::UserEvent(Event::WindowCreated( + id, window, + ))) + } _ => event.to_static(), }; @@ -264,7 +287,7 @@ async fn run_instance( winit::event::Event<'_, Event>, >, init_command: Command, - windows: HashMap, + mut windows: HashMap, exit_on_close_request: bool, ) where A: Application + 'static, @@ -275,12 +298,18 @@ async fn run_instance( use iced_futures::futures::stream::StreamExt; use winit::event; - let window = windows.values().next().expect("No window found"); - let mut clipboard = Clipboard::connect(window); + // TODO(derezzedex) + let mut clipboard = + Clipboard::connect(windows.values().next().expect("No window found")); let mut cache = user_interface::Cache::default(); - let mut surface = compositor.create_surface(&window); + let mut surface = compositor + .create_surface(&windows.values().next().expect("No window found")); - let mut state = State::new(&application, window); + // TODO(derezzedex) + let mut state = State::new( + &application, + windows.values().next().expect("No window found"), + ); let mut viewport_version = state.viewport_version(); let physical_size = state.physical_size(); @@ -368,7 +397,7 @@ async fn run_instance( ); // Update window - state.synchronize(&application, window); + state.synchronize(&application, &windows, &proxy); let should_exit = application.should_exit(); @@ -396,6 +425,8 @@ async fn run_instance( ); debug.draw_finished(); + // TODO(derezzedex) + let window = windows.values().next().expect("No window found"); if new_mouse_interaction != mouse_interaction { window.set_cursor_icon(conversion::mouse_interaction( new_mouse_interaction, @@ -417,10 +448,15 @@ async fn run_instance( )), )); } - event::Event::UserEvent(message) => { - let Event::Application(message) = message; - messages.push(message); - } + event::Event::UserEvent(event) => match event { + Event::Application(message) => { + messages.push(message); + } + Event::WindowCreated(id, window) => { + let _ = windows.insert(id, window); + } + Event::NewWindow(_, _) => unreachable!(), + }, event::Event::RedrawRequested(_) => { let physical_size = state.physical_size(); @@ -451,6 +487,9 @@ async fn run_instance( state.cursor_position(), ); + // TODO(derezzedex) + let window = + windows.values().next().expect("No window found"); if new_mouse_interaction != mouse_interaction { window.set_cursor_icon(conversion::mouse_interaction( new_mouse_interaction, @@ -491,7 +530,12 @@ async fn run_instance( debug.render_finished(); // Try rendering again next frame. - window.request_redraw(); + // TODO(derezzedex) + windows + .values() + .next() + .expect("No window found") + .request_redraw(); } }, } @@ -506,6 +550,8 @@ async fn run_instance( break; } + // TODO(derezzedex) + let window = windows.values().next().expect("No window found"); state.update(window, &window_event, &mut debug); if let Some(event) = conversion::window_event( diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 2d120ca1..009a3698 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -1,10 +1,12 @@ use crate::application::{self, StyleSheet as _}; use crate::conversion; -use crate::multi_window::Application; +use crate::multi_window::{Application, Event}; use crate::{Color, Debug, Point, Size, Viewport}; +use std::collections::HashMap; use std::marker::PhantomData; use winit::event::{Touch, WindowEvent}; +use winit::event_loop::EventLoopProxy; use winit::window::Window; /// The state of a windowed [`Application`]. @@ -181,7 +183,23 @@ where /// and window after calling [`Application::update`]. /// /// [`Application::update`]: crate::Program::update - pub fn synchronize(&mut self, application: &A, window: &Window) { + pub fn synchronize( + &mut self, + application: &A, + windows: &HashMap, + proxy: &EventLoopProxy>, + ) { + let new_windows = application.windows(); + for (id, settings) in new_windows { + if !windows.contains_key(&id) { + proxy + .send_event(Event::NewWindow(id, settings)) + .expect("Failed to send message"); + } + } + + let window = windows.values().next().expect("No window found"); + // Update window title let new_title = application.title(); From ec56c0686df1a200e37af951a3a8eca562c32a5c Mon Sep 17 00:00:00 2001 From: Richard Date: Tue, 21 Jun 2022 15:59:45 -0300 Subject: [PATCH 008/286] Introduce opaque `window::Id` type --- native/src/window.rs | 2 ++ native/src/window/id.rs | 16 ++++++++++++++++ src/multi_window/application.rs | 14 ++++++++++++++ winit/src/multi_window.rs | 23 +++++++++++++---------- winit/src/multi_window/state.rs | 3 ++- winit/src/window.rs | 2 +- 6 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 native/src/window/id.rs diff --git a/native/src/window.rs b/native/src/window.rs index 1b97e655..dc9e2d66 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -1,10 +1,12 @@ //! Build window-based GUI applications. mod action; mod event; +mod id; mod mode; mod user_attention; pub use action::Action; pub use event::Event; +pub use id::Id; pub use mode::Mode; pub use user_attention::UserAttention; diff --git a/native/src/window/id.rs b/native/src/window/id.rs new file mode 100644 index 00000000..56496aaa --- /dev/null +++ b/native/src/window/id.rs @@ -0,0 +1,16 @@ +use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; + +#[derive(Debug, PartialEq, Eq, Hash)] +/// TODO(derezzedex) +pub struct Id(u64); + +impl Id { + /// TODO(derezzedex) + pub fn new(id: impl Hash) -> Id { + let mut hasher = DefaultHasher::new(); + id.hash(&mut hasher); + + Id(hasher.finish()) + } +} diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index fa0c15b1..6b3f4676 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -1,3 +1,4 @@ +use crate::window; use crate::{Command, Element, Executor, Settings, Subscription}; pub use iced_native::application::{Appearance, StyleSheet}; @@ -45,6 +46,9 @@ pub trait Application: Sized { /// title of your application when necessary. fn title(&self) -> String; + /// TODO(derezzedex) + fn windows(&self) -> Vec<(window::Id, window::Settings)>; + /// Handles a __message__ and updates the state of the [`Application`]. /// /// This is where you define your __update logic__. All the __messages__, @@ -160,6 +164,16 @@ where self.0.title() } + fn windows(&self) -> Vec<(window::Id, iced_winit::settings::Window)> { + self.0 + .windows() + .into_iter() + .map(|(id, settings)| { + (id, iced_winit::settings::Window::from(settings)) + }) + .collect() + } + fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 900ee92a..14be4de3 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -9,6 +9,7 @@ use crate::mouse; use crate::renderer; use crate::settings; use crate::widget::operation; +use crate::window; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, Settings, Size, Subscription, @@ -17,7 +18,6 @@ use crate::{ use iced_futures::futures::channel::mpsc; use iced_futures::futures::{self, FutureExt}; use iced_graphics::compositor; -use iced_graphics::window; use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; @@ -37,9 +37,9 @@ pub enum Event { /// TODO(derezzedex) // Create a wrapper variant of `window::Event` type instead // (maybe we should also allow users to listen/react to those internal messages?) - NewWindow(usize, settings::Window), + NewWindow(window::Id, settings::Window), /// TODO(derezzedex) - WindowCreated(usize, winit::window::Window), + WindowCreated(window::Id, winit::window::Window), } /// An interactive, native cross-platform application. @@ -66,6 +66,9 @@ where /// The type of __messages__ your [`Program`] will produce. type Message: std::fmt::Debug + Send; + /// TODO(derezzedex) + fn windows(&self) -> Vec<(window::Id, settings::Window)>; + /// Handles a __message__ and updates the state of the [`Program`]. /// /// This is where you define your __update logic__. All the __messages__, @@ -150,7 +153,7 @@ pub fn run( where A: Application + 'static, E: Executor + 'static, - C: window::Compositor + 'static, + C: iced_graphics::window::Compositor + 'static, ::Theme: StyleSheet, { use futures::task; @@ -188,8 +191,8 @@ where .build(&event_loop) .map_err(Error::WindowCreationFailed)?; - let windows: HashMap = - HashMap::from([(0usize, window)]); + let windows: HashMap = + HashMap::from([(window::Id::new(0usize), window)]); let window = windows.values().next().expect("No window found"); #[cfg(target_arch = "wasm32")] @@ -287,12 +290,12 @@ async fn run_instance( winit::event::Event<'_, Event>, >, init_command: Command, - mut windows: HashMap, + mut windows: HashMap, exit_on_close_request: bool, ) where A: Application + 'static, E: Executor + 'static, - C: window::Compositor + 'static, + C: iced_graphics::window::Compositor + 'static, ::Theme: StyleSheet, { use iced_futures::futures::stream::StreamExt; @@ -629,7 +632,7 @@ pub fn update( proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, messages: &mut Vec, - windows: &HashMap, + windows: &HashMap, graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where ::Theme: StyleSheet, @@ -671,7 +674,7 @@ pub fn run_command( clipboard: &mut Clipboard, proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, - windows: &HashMap, + windows: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where A: Application, diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 009a3698..dd2d25ce 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -1,6 +1,7 @@ use crate::application::{self, StyleSheet as _}; use crate::conversion; use crate::multi_window::{Application, Event}; +use crate::window; use crate::{Color, Debug, Point, Size, Viewport}; use std::collections::HashMap; @@ -186,7 +187,7 @@ where pub fn synchronize( &mut self, application: &A, - windows: &HashMap, + windows: &HashMap, proxy: &EventLoopProxy>, ) { let new_windows = application.windows(); diff --git a/winit/src/window.rs b/winit/src/window.rs index 89db3262..f2c7037a 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -2,7 +2,7 @@ use crate::command::{self, Command}; use iced_native::window; -pub use window::{Event, Mode, UserAttention}; +pub use window::{Id, Event, Mode, UserAttention}; /// Closes the current window and exits the application. pub fn close() -> Command { From 64e21535c7e5df9a1ff94b9b9036b6ae5b5c82b0 Mon Sep 17 00:00:00 2001 From: Richard Date: Tue, 28 Jun 2022 14:27:06 -0300 Subject: [PATCH 009/286] Fix `multi_window` example --- examples/multi_window/src/main.rs | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 examples/multi_window/src/main.rs diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs new file mode 100644 index 00000000..0ba6a591 --- /dev/null +++ b/examples/multi_window/src/main.rs @@ -0,0 +1,58 @@ +use iced::multi_window::Application; +use iced::pure::{button, column, text, Element}; +use iced::{window, Alignment, Command, Settings}; + +pub fn main() -> iced::Result { + Counter::run(Settings::default()) +} + +struct Counter { + value: i32, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + IncrementPressed, + DecrementPressed, +} + +impl Application for Counter { + type Flags = (); + type Executor = iced::executor::Default; + type Message = Message; + + fn new(_flags: ()) -> (Self, Command) { + (Self { value: 0 }, Command::none()) + } + + fn title(&self) -> String { + String::from("MultiWindow - Iced") + } + + fn windows(&self) -> Vec<(window::Id, iced::window::Settings)> { + todo!() + } + + fn update(&mut self, message: Message) -> Command { + match message { + Message::IncrementPressed => { + self.value += 1; + } + Message::DecrementPressed => { + self.value -= 1; + } + } + + Command::none() + } + + fn view(&self) -> Element { + column() + .padding(20) + .align_items(Alignment::Center) + .push(button("Increment").on_press(Message::IncrementPressed)) + .push(text(self.value.to_string()).size(50)) + .push(button("Decrement").on_press(Message::DecrementPressed)) + .into() + } +} From 97914daaab477ce47a8329f07958332b5caa4ed0 Mon Sep 17 00:00:00 2001 From: Richard Date: Tue, 12 Jul 2022 10:26:16 -0300 Subject: [PATCH 010/286] what is this --- native/src/window/id.rs | 2 +- winit/src/multi_window.rs | 437 +++++++++++++++++++++----------- winit/src/multi_window/state.rs | 16 +- 3 files changed, 293 insertions(+), 162 deletions(-) diff --git a/native/src/window/id.rs b/native/src/window/id.rs index 56496aaa..0ba355af 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -1,7 +1,7 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; -#[derive(Debug, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] /// TODO(derezzedex) pub struct Id(u64); diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 14be4de3..82ee30ed 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -301,144 +301,182 @@ async fn run_instance( use iced_futures::futures::stream::StreamExt; use winit::event; - // TODO(derezzedex) let mut clipboard = Clipboard::connect(windows.values().next().expect("No window found")); let mut cache = user_interface::Cache::default(); - let mut surface = compositor - .create_surface(&windows.values().next().expect("No window found")); + let mut window_ids: HashMap<_, _> = windows + .iter() + .map(|(&id, window)| (window.id(), id)) + .collect(); - // TODO(derezzedex) - let mut state = State::new( - &application, - windows.values().next().expect("No window found"), - ); - let mut viewport_version = state.viewport_version(); + let mut states = HashMap::new(); + let mut interfaces = ManuallyDrop::new(HashMap::new()); - let physical_size = state.physical_size(); + for (&id, window) in windows.keys().zip(windows.values()) { + let mut surface = compositor.create_surface(window); - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); + let state = State::new(&application, window); - run_command( - &application, - &mut cache, - &state, - &mut renderer, - init_command, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &windows, - || compositor.fetch_information(), - ); + let physical_size = state.physical_size(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + let user_interface = build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + ); + + let window_state: WindowState = WindowState { surface, state }; + + let _ = states.insert(id, window_state); + let _ = interfaces.insert(id, user_interface); + } + + { + // TODO(derezzedex) + let window_state = states.values().next().expect("No state found"); + + run_command( + &application, + &mut cache, + &window_state.state, + &mut renderer, + init_command, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &windows, + || compositor.fetch_information(), + ); + } runtime.track(application.subscription().map(Event::Application)); - let mut user_interface = ManuallyDrop::new(build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - )); - let mut mouse_interaction = mouse::Interaction::default(); let mut events = Vec::new(); let mut messages = Vec::new(); debug.startup_finished(); - while let Some(event) = receiver.next().await { + 'main: while let Some(event) = receiver.next().await { match event { event::Event::MainEventsCleared => { - if events.is_empty() && messages.is_empty() { - continue; - } + dbg!(states.keys().collect::>()); + for id in states.keys().copied().collect::>() { + let cursor_position = + states.get(&id).unwrap().state.cursor_position(); + let window = windows.get(&id).unwrap(); - debug.event_processing_started(); - - let (interface_state, statuses) = user_interface.update( - &events, - state.cursor_position(), - &mut renderer, - &mut clipboard, - &mut messages, - ); - - debug.event_processing_finished(); - - for event in events.drain(..).zip(statuses.into_iter()) { - runtime.broadcast(event); - } - - if !messages.is_empty() - || matches!( - interface_state, - user_interface::State::Outdated, - ) - { - let mut cache = - ManuallyDrop::into_inner(user_interface).into_cache(); - - // Update application - update( - &mut application, - &mut cache, - &state, - &mut renderer, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &mut messages, - &windows, - || compositor.fetch_information(), - ); - - // Update window - state.synchronize(&application, &windows, &proxy); - - let should_exit = application.should_exit(); - - user_interface = ManuallyDrop::new(build_user_interface( - &application, - cache, - &mut renderer, - state.logical_size(), - &mut debug, - )); - - if should_exit { - break; + if events.is_empty() && messages.is_empty() { + continue; } + + debug.event_processing_started(); + + let (interface_state, statuses) = { + let user_interface = interfaces.get_mut(&id).unwrap(); + user_interface.update( + &events, + cursor_position, + &mut renderer, + &mut clipboard, + &mut messages, + ) + }; + + debug.event_processing_finished(); + + // TODO(derezzedex): only drain events for this window + for event in events.drain(..).zip(statuses.into_iter()) { + runtime.broadcast(event); + } + + if !messages.is_empty() + || matches!( + interface_state, + user_interface::State::Outdated, + ) + { + let state = &mut states.get_mut(&id).unwrap().state; + let pure_states: HashMap<_, _> = + ManuallyDrop::into_inner(interfaces) + .drain() + .map( + |(id, interface): ( + window::Id, + UserInterface<'_, _, _>, + )| { + (id, interface.into_cache()) + }, + ) + .collect(); + + // Update application + update( + &mut application, + &mut cache, + state, + &mut renderer, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &mut messages, + &windows, + || compositor.fetch_information(), + ); + + // Update window + state.synchronize(&application, &windows, &proxy); + + let should_exit = application.should_exit(); + + interfaces = ManuallyDrop::new(build_user_interfaces( + &application, + &mut renderer, + &mut debug, + &states, + pure_states, + )); + + if should_exit { + break 'main; + } + } + + debug.draw_started(); + let new_mouse_interaction = { + let user_interface = interfaces.get_mut(&id).unwrap(); + let state = &states.get(&id).unwrap().state; + + user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ) + }; + debug.draw_finished(); + + if new_mouse_interaction != mouse_interaction { + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + mouse_interaction = new_mouse_interaction; + } + + window.request_redraw(); } - - debug.draw_started(); - let new_mouse_interaction = user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor_position(), - ); - debug.draw_finished(); - - // TODO(derezzedex) - let window = windows.values().next().expect("No window found"); - if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); - - mouse_interaction = new_mouse_interaction; - } - - window.request_redraw(); } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), @@ -456,43 +494,81 @@ async fn run_instance( messages.push(message); } Event::WindowCreated(id, window) => { + let mut surface = compositor.create_surface(&window); + + let state = State::new(&application, &window); + + let physical_size = state.physical_size(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + let user_interface = build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + ); + + let window_state: WindowState = + WindowState { surface, state }; + + let _ = states.insert(id, window_state); + let _ = interfaces.insert(id, user_interface); + let _ = window_ids.insert(window.id(), id); let _ = windows.insert(id, window); } Event::NewWindow(_, _) => unreachable!(), }, - event::Event::RedrawRequested(_) => { - let physical_size = state.physical_size(); + event::Event::RedrawRequested(id) => { + let window_state = window_ids + .get(&id) + .and_then(|id| states.get_mut(id)) + .unwrap(); + + let mut user_interface = window_ids + .get(&id) + .and_then(|id| interfaces.remove(id)) + .unwrap(); + + let physical_size = window_state.state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { continue; } debug.render_started(); - let current_viewport_version = state.viewport_version(); - if viewport_version != current_viewport_version { - let logical_size = state.logical_size(); + if window_state.state.viewport_changed() { + let logical_size = window_state.state.logical_size(); debug.layout_started(); - user_interface = ManuallyDrop::new( - ManuallyDrop::into_inner(user_interface) - .relayout(logical_size, &mut renderer), - ); + user_interface = + user_interface.relayout(logical_size, &mut renderer); debug.layout_finished(); debug.draw_started(); - let new_mouse_interaction = user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor_position(), - ); + let new_mouse_interaction = { + let state = &window_state.state; - // TODO(derezzedex) - let window = - windows.values().next().expect("No window found"); + user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ) + }; + + let window = window_ids + .get(&id) + .and_then(|id| windows.get(id)) + .unwrap(); if new_mouse_interaction != mouse_interaction { window.set_cursor_icon(conversion::mouse_interaction( new_mouse_interaction, @@ -502,20 +578,21 @@ async fn run_instance( } debug.draw_finished(); + let _ = interfaces + .insert(*window_ids.get(&id).unwrap(), user_interface); + compositor.configure_surface( - &mut surface, + &mut window_state.surface, physical_size.width, physical_size.height, ); - - viewport_version = current_viewport_version; } match compositor.present( &mut renderer, - &mut surface, - state.viewport(), - state.background_color(), + &mut window_state.surface, + window_state.state.viewport(), + window_state.state.background_color(), &debug.overlay(), ) { Ok(()) => { @@ -545,22 +622,30 @@ async fn run_instance( } event::Event::WindowEvent { event: window_event, - .. + window_id, } => { - if requests_exit(&window_event, state.modifiers()) + // dbg!(window_id); + let window = window_ids + .get(&window_id) + .and_then(|id| windows.get(id)) + .unwrap(); + let window_state = window_ids + .get(&window_id) + .and_then(|id| states.get_mut(id)) + .unwrap(); + + if requests_exit(&window_event, window_state.state.modifiers()) && exit_on_close_request { break; } - // TODO(derezzedex) - let window = windows.values().next().expect("No window found"); - state.update(window, &window_event, &mut debug); + window_state.state.update(window, &window_event, &mut debug); if let Some(event) = conversion::window_event( &window_event, - state.scale_factor(), - state.modifiers(), + window_state.state.scale_factor(), + window_state.state.modifiers(), ) { events.push(event); } @@ -570,7 +655,7 @@ async fn run_instance( } // Manually drop the user interface - drop(ManuallyDrop::into_inner(user_interface)); + // drop(ManuallyDrop::into_inner(user_interface)); } /// Returns true if the provided event should cause an [`Application`] to @@ -791,6 +876,54 @@ pub fn run_command( } } +struct WindowState +where + A: Application, + C: iced_graphics::window::Compositor, + ::Theme: StyleSheet, +{ + surface: ::Surface, + state: State, +} + +fn build_user_interfaces<'a, A, C>( + application: &'a A, + renderer: &mut A::Renderer, + debug: &mut Debug, + states: &HashMap>, + mut pure_states: HashMap, +) -> HashMap< + window::Id, + UserInterface< + 'a, + ::Message, + ::Renderer, + >, +> +where + A: Application + 'static, + C: iced_graphics::window::Compositor + 'static, + ::Theme: StyleSheet, +{ + let mut interfaces = HashMap::new(); + + for (id, pure_state) in pure_states.drain() { + let state = &states.get(&id).unwrap().state; + + let user_interface = build_user_interface( + application, + pure_state, + renderer, + state.logical_size(), + debug, + ); + + let _ = interfaces.insert(id, user_interface); + } + + interfaces +} + #[cfg(not(target_arch = "wasm32"))] mod platform { pub fn run( diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index dd2d25ce..d22de961 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -19,7 +19,7 @@ where title: String, scale_factor: f64, viewport: Viewport, - viewport_version: usize, + viewport_changed: bool, cursor_position: winit::dpi::PhysicalPosition, modifiers: winit::event::ModifiersState, theme: ::Theme, @@ -51,7 +51,7 @@ where title, scale_factor, viewport, - viewport_version: 0, + viewport_changed: false, // TODO: Encode cursor availability in the type-system cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0), modifiers: winit::event::ModifiersState::default(), @@ -66,11 +66,9 @@ where &self.viewport } - /// Returns the version of the [`Viewport`] of the [`State`]. - /// - /// The version is incremented every time the [`Viewport`] changes. - pub fn viewport_version(&self) -> usize { - self.viewport_version + /// TODO(derezzedex) + pub fn viewport_changed(&self) -> bool { + self.viewport_changed } /// Returns the physical [`Size`] of the [`Viewport`] of the [`State`]. @@ -133,7 +131,7 @@ where window.scale_factor() * self.scale_factor, ); - self.viewport_version = self.viewport_version.wrapping_add(1); + self.viewport_changed = true; } WindowEvent::ScaleFactorChanged { scale_factor: new_scale_factor, @@ -147,7 +145,7 @@ where new_scale_factor * self.scale_factor, ); - self.viewport_version = self.viewport_version.wrapping_add(1); + self.viewport_changed = true; } WindowEvent::CursorMoved { position, .. } | WindowEvent::Touch(Touch { From 8f53df560e1bde33e874977e5115cd0f9301640d Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 14 Jul 2022 10:13:37 -0300 Subject: [PATCH 011/286] fix: temporarily add `window::Id` to events internaly --- winit/src/multi_window.rs | 53 ++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 82ee30ed..6c2dc888 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -368,13 +368,27 @@ async fn run_instance( 'main: while let Some(event) = receiver.next().await { match event { event::Event::MainEventsCleared => { - dbg!(states.keys().collect::>()); for id in states.keys().copied().collect::>() { + let (filtered, remaining): (Vec<_>, Vec<_>) = events + .iter() + .cloned() + .partition( + |(window_id, _event): &( + Option, + iced_native::event::Event, + )| { + *window_id == Some(id) || *window_id == None + }, + ); + + events.retain(|el| remaining.contains(el)); + let filtered: Vec<_> = filtered.into_iter().map(|(_id, event)| event.clone()).collect(); + let cursor_position = states.get(&id).unwrap().state.cursor_position(); let window = windows.get(&id).unwrap(); - if events.is_empty() && messages.is_empty() { + if filtered.is_empty() && messages.is_empty() { continue; } @@ -383,7 +397,7 @@ async fn run_instance( let (interface_state, statuses) = { let user_interface = interfaces.get_mut(&id).unwrap(); user_interface.update( - &events, + &filtered, cursor_position, &mut renderer, &mut clipboard, @@ -393,11 +407,11 @@ async fn run_instance( debug.event_processing_finished(); - // TODO(derezzedex): only drain events for this window - for event in events.drain(..).zip(statuses.into_iter()) { + for event in filtered.into_iter().zip(statuses.into_iter()) { runtime.broadcast(event); } + // TODO(derezzedex): Should we redraw every window? We can't know what changed. if !messages.is_empty() || matches!( interface_state, @@ -475,18 +489,22 @@ async fn run_instance( mouse_interaction = new_mouse_interaction; } - window.request_redraw(); + for window in windows.values(){ + window.request_redraw(); + } } } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), )) => { use iced_native::event; - - events.push(iced_native::Event::PlatformSpecific( - event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl( - url, - )), + events.push(( + None, + iced_native::Event::PlatformSpecific( + event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + ), + ), )); } event::Event::UserEvent(event) => match event { @@ -529,12 +547,6 @@ async fn run_instance( .get(&id) .and_then(|id| states.get_mut(id)) .unwrap(); - - let mut user_interface = window_ids - .get(&id) - .and_then(|id| interfaces.remove(id)) - .unwrap(); - let physical_size = window_state.state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { @@ -544,6 +556,11 @@ async fn run_instance( debug.render_started(); if window_state.state.viewport_changed() { + let mut user_interface = window_ids + .get(&id) + .and_then(|id| interfaces.remove(id)) + .unwrap(); + let logical_size = window_state.state.logical_size(); debug.layout_started(); @@ -647,7 +664,7 @@ async fn run_instance( window_state.state.scale_factor(), window_state.state.modifiers(), ) { - events.push(event); + events.push((window_ids.get(&window_id).cloned(), event)); } } _ => {} From 01bad4f89654d65b0d6a65a8df99c387cbadf7fe Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 14 Jul 2022 10:37:33 -0300 Subject: [PATCH 012/286] duplicate `pane_grid` example to `multi_window` --- examples/multi_window/Cargo.toml | 12 + examples/multi_window/src/main.rs | 370 +++++++++++++++++++++++++++--- 2 files changed, 355 insertions(+), 27 deletions(-) create mode 100644 examples/multi_window/Cargo.toml diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml new file mode 100644 index 00000000..9c3d0f21 --- /dev/null +++ b/examples/multi_window/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "multi_window" +version = "0.1.0" +authors = ["Richard Custodio "] +edition = "2021" +publish = false +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +iced = { path = "../..", features = ["debug", "multi_window"] } +iced_native = { path = "../../native" } +iced_lazy = { path = "../../lazy" } \ No newline at end of file diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 0ba6a591..ae8fa22b 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -1,58 +1,374 @@ -use iced::multi_window::Application; -use iced::pure::{button, column, text, Element}; -use iced::{window, Alignment, Command, Settings}; +use iced::alignment::{self, Alignment}; +use iced::executor; +use iced::keyboard; +use iced::theme::{self, Theme}; +use iced::widget::pane_grid::{self, PaneGrid}; +use iced::widget::{button, column, container, row, scrollable, text}; +use iced::{ + Application, Color, Command, Element, Length, Settings, Size, Subscription, +}; +use iced_lazy::responsive; +use iced_native::{event, subscription, Event}; pub fn main() -> iced::Result { - Counter::run(Settings::default()) + Example::run(Settings::default()) } -struct Counter { - value: i32, +struct Example { + panes: pane_grid::State, + panes_created: usize, + focus: Option, } #[derive(Debug, Clone, Copy)] enum Message { - IncrementPressed, - DecrementPressed, + Split(pane_grid::Axis, pane_grid::Pane), + SplitFocused(pane_grid::Axis), + FocusAdjacent(pane_grid::Direction), + Clicked(pane_grid::Pane), + Dragged(pane_grid::DragEvent), + Resized(pane_grid::ResizeEvent), + TogglePin(pane_grid::Pane), + Close(pane_grid::Pane), + CloseFocused, } -impl Application for Counter { - type Flags = (); - type Executor = iced::executor::Default; +impl Application for Example { type Message = Message; + type Theme = Theme; + type Executor = executor::Default; + type Flags = (); fn new(_flags: ()) -> (Self, Command) { - (Self { value: 0 }, Command::none()) + let (panes, _) = pane_grid::State::new(Pane::new(0)); + + ( + Example { + panes, + panes_created: 1, + focus: None, + }, + Command::none(), + ) } fn title(&self) -> String { - String::from("MultiWindow - Iced") - } - - fn windows(&self) -> Vec<(window::Id, iced::window::Settings)> { - todo!() + String::from("Pane grid - Iced") } fn update(&mut self, message: Message) -> Command { match message { - Message::IncrementPressed => { - self.value += 1; + Message::Split(axis, pane) => { + let result = self.panes.split( + axis, + &pane, + Pane::new(self.panes_created), + ); + + if let Some((pane, _)) = result { + self.focus = Some(pane); + } + + self.panes_created += 1; } - Message::DecrementPressed => { - self.value -= 1; + Message::SplitFocused(axis) => { + if let Some(pane) = self.focus { + let result = self.panes.split( + axis, + &pane, + Pane::new(self.panes_created), + ); + + if let Some((pane, _)) = result { + self.focus = Some(pane); + } + + self.panes_created += 1; + } + } + Message::FocusAdjacent(direction) => { + if let Some(pane) = self.focus { + if let Some(adjacent) = + self.panes.adjacent(&pane, direction) + { + self.focus = Some(adjacent); + } + } + } + Message::Clicked(pane) => { + self.focus = Some(pane); + } + Message::Resized(pane_grid::ResizeEvent { split, ratio }) => { + self.panes.resize(&split, ratio); + } + Message::Dragged(pane_grid::DragEvent::Dropped { + pane, + target, + }) => { + self.panes.swap(&pane, &target); + } + Message::Dragged(_) => {} + Message::TogglePin(pane) => { + if let Some(Pane { is_pinned, .. }) = self.panes.get_mut(&pane) + { + *is_pinned = !*is_pinned; + } + } + Message::Close(pane) => { + if let Some((_, sibling)) = self.panes.close(&pane) { + self.focus = Some(sibling); + } + } + Message::CloseFocused => { + if let Some(pane) = self.focus { + if let Some(Pane { is_pinned, .. }) = self.panes.get(&pane) + { + if !is_pinned { + if let Some((_, sibling)) = self.panes.close(&pane) + { + self.focus = Some(sibling); + } + } + } + } } } Command::none() } + fn subscription(&self) -> Subscription { + subscription::events_with(|event, status| { + if let event::Status::Captured = status { + return None; + } + + match event { + Event::Keyboard(keyboard::Event::KeyPressed { + modifiers, + key_code, + }) if modifiers.command() => handle_hotkey(key_code), + _ => None, + } + }) + } + fn view(&self) -> Element { - column() - .padding(20) - .align_items(Alignment::Center) - .push(button("Increment").on_press(Message::IncrementPressed)) - .push(text(self.value.to_string()).size(50)) - .push(button("Decrement").on_press(Message::DecrementPressed)) + let focus = self.focus; + let total_panes = self.panes.len(); + + let pane_grid = PaneGrid::new(&self.panes, |id, pane| { + let is_focused = focus == Some(id); + + let pin_button = button( + text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), + ) + .on_press(Message::TogglePin(id)) + .padding(3); + + let title = row![ + pin_button, + "Pane", + text(pane.id.to_string()).style(if is_focused { + PANE_ID_COLOR_FOCUSED + } else { + PANE_ID_COLOR_UNFOCUSED + }), + ] + .spacing(5); + + let title_bar = pane_grid::TitleBar::new(title) + .controls(view_controls(id, total_panes, pane.is_pinned)) + .padding(10) + .style(if is_focused { + style::title_bar_focused + } else { + style::title_bar_active + }); + + pane_grid::Content::new(responsive(move |size| { + view_content(id, total_panes, pane.is_pinned, size) + })) + .title_bar(title_bar) + .style(if is_focused { + style::pane_focused + } else { + style::pane_active + }) + }) + .width(Length::Fill) + .height(Length::Fill) + .spacing(10) + .on_click(Message::Clicked) + .on_drag(Message::Dragged) + .on_resize(10, Message::Resized); + + container(pane_grid) + .width(Length::Fill) + .height(Length::Fill) + .padding(10) .into() } } + +const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( + 0xFF as f32 / 255.0, + 0xC7 as f32 / 255.0, + 0xC7 as f32 / 255.0, +); +const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( + 0xFF as f32 / 255.0, + 0x47 as f32 / 255.0, + 0x47 as f32 / 255.0, +); + +fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { + use keyboard::KeyCode; + use pane_grid::{Axis, Direction}; + + let direction = match key_code { + KeyCode::Up => Some(Direction::Up), + KeyCode::Down => Some(Direction::Down), + KeyCode::Left => Some(Direction::Left), + KeyCode::Right => Some(Direction::Right), + _ => None, + }; + + match key_code { + KeyCode::V => Some(Message::SplitFocused(Axis::Vertical)), + KeyCode::H => Some(Message::SplitFocused(Axis::Horizontal)), + KeyCode::W => Some(Message::CloseFocused), + _ => direction.map(Message::FocusAdjacent), + } +} + +struct Pane { + id: usize, + pub is_pinned: bool, +} + +impl Pane { + fn new(id: usize) -> Self { + Self { + id, + is_pinned: false, + } + } +} + +fn view_content<'a>( + pane: pane_grid::Pane, + total_panes: usize, + is_pinned: bool, + size: Size, +) -> Element<'a, Message> { + let button = |label, message| { + button( + text(label) + .width(Length::Fill) + .horizontal_alignment(alignment::Horizontal::Center) + .size(16), + ) + .width(Length::Fill) + .padding(8) + .on_press(message) + }; + + let mut controls = column![ + button( + "Split horizontally", + Message::Split(pane_grid::Axis::Horizontal, pane), + ), + button( + "Split vertically", + Message::Split(pane_grid::Axis::Vertical, pane), + ) + ] + .spacing(5) + .max_width(150); + + if total_panes > 1 && !is_pinned { + controls = controls.push( + button("Close", Message::Close(pane)) + .style(theme::Button::Destructive), + ); + } + + let content = column![ + text(format!("{}x{}", size.width, size.height)).size(24), + controls, + ] + .width(Length::Fill) + .spacing(10) + .align_items(Alignment::Center); + + container(scrollable(content)) + .width(Length::Fill) + .height(Length::Fill) + .padding(5) + .center_y() + .into() +} + +fn view_controls<'a>( + pane: pane_grid::Pane, + total_panes: usize, + is_pinned: bool, +) -> Element<'a, Message> { + let mut button = button(text("Close").size(14)) + .style(theme::Button::Destructive) + .padding(3); + + if total_panes > 1 && !is_pinned { + button = button.on_press(Message::Close(pane)); + } + + button.into() +} + +mod style { + use iced::widget::container; + use iced::Theme; + + pub fn title_bar_active(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + text_color: Some(palette.background.strong.text), + background: Some(palette.background.strong.color.into()), + ..Default::default() + } + } + + pub fn title_bar_focused(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + text_color: Some(palette.primary.strong.text), + background: Some(palette.primary.strong.color.into()), + ..Default::default() + } + } + + pub fn pane_active(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + background: Some(palette.background.weak.color.into()), + border_width: 2.0, + border_color: palette.background.strong.color, + ..Default::default() + } + } + + pub fn pane_focused(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + background: Some(palette.background.weak.color.into()), + border_width: 2.0, + border_color: palette.primary.strong.color, + ..Default::default() + } + } +} From 2fe58e12619186eb3755491db2bdaf02de297afb Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 21 Jul 2022 09:52:32 -0300 Subject: [PATCH 013/286] add `window::Id` to `view` --- src/multi_window/application.rs | 12 ++++++++--- winit/src/multi_window.rs | 35 ++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 6b3f4676..e849bf2b 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -88,7 +88,10 @@ pub trait Application: Sized { /// Returns the widgets to display in the [`Application`]. /// /// These widgets can produce __messages__ based on user interaction. - fn view(&self) -> Element<'_, Self::Message, crate::Renderer>; + fn view( + &self, + window: window::Id, + ) -> Element<'_, Self::Message, crate::Renderer>; /// Returns the scale factor of the [`Application`]. /// @@ -178,8 +181,11 @@ where self.0.update(message) } - fn view(&self) -> Element<'_, Self::Message, Self::Renderer> { - self.0.view() + fn view( + &self, + window: window::Id, + ) -> Element<'_, Self::Message, Self::Renderer> { + self.0.view(window) } fn theme(&self) -> A::Theme { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 6c2dc888..dc00d737 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -82,7 +82,10 @@ where /// Returns the widgets to display in the [`Program`]. /// /// These widgets can produce __messages__ based on user interaction. - fn view(&self) -> Element<'_, Self::Message, Self::Renderer>; + fn view( + &self, + window: window::Id, + ) -> Element<'_, Self::Message, Self::Renderer>; /// Initializes the [`Application`] with the flags provided to /// [`run`] as part of the [`Settings`]. @@ -331,6 +334,7 @@ async fn run_instance( &mut renderer, state.logical_size(), &mut debug, + id, ); let window_state: WindowState = WindowState { surface, state }; @@ -354,6 +358,7 @@ async fn run_instance( &mut proxy, &mut debug, &windows, + &window_ids, || compositor.fetch_information(), ); } @@ -369,10 +374,8 @@ async fn run_instance( match event { event::Event::MainEventsCleared => { for id in states.keys().copied().collect::>() { - let (filtered, remaining): (Vec<_>, Vec<_>) = events - .iter() - .cloned() - .partition( + let (filtered, remaining): (Vec<_>, Vec<_>) = + events.iter().cloned().partition( |(window_id, _event): &( Option, iced_native::event::Event, @@ -382,7 +385,10 @@ async fn run_instance( ); events.retain(|el| remaining.contains(el)); - let filtered: Vec<_> = filtered.into_iter().map(|(_id, event)| event.clone()).collect(); + let filtered: Vec<_> = filtered + .into_iter() + .map(|(_id, event)| event) + .collect(); let cursor_position = states.get(&id).unwrap().state.cursor_position(); @@ -407,7 +413,8 @@ async fn run_instance( debug.event_processing_finished(); - for event in filtered.into_iter().zip(statuses.into_iter()) { + for event in filtered.into_iter().zip(statuses.into_iter()) + { runtime.broadcast(event); } @@ -444,6 +451,7 @@ async fn run_instance( &mut debug, &mut messages, &windows, + &window_ids, || compositor.fetch_information(), ); @@ -489,7 +497,7 @@ async fn run_instance( mouse_interaction = new_mouse_interaction; } - for window in windows.values(){ + for window in windows.values() { window.request_redraw(); } } @@ -530,6 +538,7 @@ async fn run_instance( &mut renderer, state.logical_size(), &mut debug, + id, ); let window_state: WindowState = @@ -707,12 +716,13 @@ pub fn build_user_interface<'a, A: Application>( renderer: &mut A::Renderer, size: Size, debug: &mut Debug, + id: window::Id, ) -> UserInterface<'a, A::Message, A::Renderer> where ::Theme: StyleSheet, { debug.view_started(); - let view = application.view(); + let view = application.view(id); debug.view_finished(); debug.layout_started(); @@ -735,6 +745,7 @@ pub fn update( debug: &mut Debug, messages: &mut Vec, windows: &HashMap, + window_ids: &HashMap, graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where ::Theme: StyleSheet, @@ -757,6 +768,7 @@ pub fn update( proxy, debug, windows, + window_ids, graphics_info, ); } @@ -777,6 +789,7 @@ pub fn run_command( proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, windows: &HashMap, + window_ids: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where A: Application, @@ -787,7 +800,9 @@ pub fn run_command( use iced_native::system; use iced_native::window; + // TODO(derezzedex) let window = windows.values().next().expect("No window found"); + let id = *window_ids.get(&window.id()).unwrap(); for action in command.actions() { match action { @@ -868,6 +883,7 @@ pub fn run_command( renderer, state.logical_size(), debug, + id, ); while let Some(mut operation) = current_operation.take() { @@ -933,6 +949,7 @@ where renderer, state.logical_size(), debug, + id, ); let _ = interfaces.insert(id, user_interface); From 3d901d5f1f8e496651a6f9881fec92bc8998d910 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 21 Jul 2022 09:52:55 -0300 Subject: [PATCH 014/286] create multi-windowed `pane_grid` example --- examples/multi_window/src/main.rs | 375 ++++++++++++++++++++++-------- 1 file changed, 276 insertions(+), 99 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index ae8fa22b..4ad92adb 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -1,36 +1,55 @@ use iced::alignment::{self, Alignment}; use iced::executor; use iced::keyboard; +use iced::multi_window::Application; use iced::theme::{self, Theme}; use iced::widget::pane_grid::{self, PaneGrid}; -use iced::widget::{button, column, container, row, scrollable, text}; -use iced::{ - Application, Color, Command, Element, Length, Settings, Size, Subscription, +use iced::widget::{ + button, column, container, pick_list, row, scrollable, text, text_input, }; +use iced::window; +use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; use iced_lazy::responsive; use iced_native::{event, subscription, Event}; +use std::collections::HashMap; + pub fn main() -> iced::Result { Example::run(Settings::default()) } struct Example { - panes: pane_grid::State, + windows: HashMap, panes_created: usize, + _focused: window::Id, +} + +struct Window { + title: String, + panes: pane_grid::State, focus: Option, } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] enum Message { + Window(window::Id, WindowMessage), +} + +#[derive(Debug, Clone)] +enum WindowMessage { Split(pane_grid::Axis, pane_grid::Pane), SplitFocused(pane_grid::Axis), FocusAdjacent(pane_grid::Direction), Clicked(pane_grid::Pane), Dragged(pane_grid::DragEvent), + PopOut(pane_grid::Pane), Resized(pane_grid::ResizeEvent), + TitleChanged(String), + ToggleMoving(pane_grid::Pane), TogglePin(pane_grid::Pane), Close(pane_grid::Pane), CloseFocused, + SelectedWindow(pane_grid::Pane, SelectableWindow), } impl Application for Example { @@ -40,93 +59,158 @@ impl Application for Example { type Flags = (); fn new(_flags: ()) -> (Self, Command) { - let (panes, _) = pane_grid::State::new(Pane::new(0)); + let (panes, _) = + pane_grid::State::new(Pane::new(0, pane_grid::Axis::Horizontal)); + let window = Window { + panes, + focus: None, + title: String::from("Default window"), + }; ( Example { - panes, + windows: HashMap::from([(window::Id::new(0usize), window)]), panes_created: 1, - focus: None, + _focused: window::Id::new(0usize), }, Command::none(), ) } fn title(&self) -> String { - String::from("Pane grid - Iced") + String::from("Multi windowed pane grid - Iced") } fn update(&mut self, message: Message) -> Command { + let Message::Window(id, message) = message; match message { - Message::Split(axis, pane) => { - let result = self.panes.split( + WindowMessage::Split(axis, pane) => { + let window = self.windows.get_mut(&id).unwrap(); + let result = window.panes.split( axis, &pane, - Pane::new(self.panes_created), + Pane::new(self.panes_created, axis), ); if let Some((pane, _)) = result { - self.focus = Some(pane); + window.focus = Some(pane); } self.panes_created += 1; } - Message::SplitFocused(axis) => { - if let Some(pane) = self.focus { - let result = self.panes.split( + WindowMessage::SplitFocused(axis) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + let result = window.panes.split( axis, &pane, - Pane::new(self.panes_created), + Pane::new(self.panes_created, axis), ); if let Some((pane, _)) = result { - self.focus = Some(pane); + window.focus = Some(pane); } self.panes_created += 1; } } - Message::FocusAdjacent(direction) => { - if let Some(pane) = self.focus { + WindowMessage::FocusAdjacent(direction) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { if let Some(adjacent) = - self.panes.adjacent(&pane, direction) + window.panes.adjacent(&pane, direction) { - self.focus = Some(adjacent); + window.focus = Some(adjacent); } } } - Message::Clicked(pane) => { - self.focus = Some(pane); + WindowMessage::Clicked(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + window.focus = Some(pane); } - Message::Resized(pane_grid::ResizeEvent { split, ratio }) => { - self.panes.resize(&split, ratio); + WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { + let window = self.windows.get_mut(&id).unwrap(); + window.panes.resize(&split, ratio); } - Message::Dragged(pane_grid::DragEvent::Dropped { + WindowMessage::SelectedWindow(pane, selected) => { + let window = self.windows.get_mut(&id).unwrap(); + let (mut pane, _) = window.panes.close(&pane).unwrap(); + pane.is_moving = false; + + if let Some(window) = self.windows.get_mut(&selected.0) { + let (&first_pane, _) = window.panes.iter().next().unwrap(); + let result = + window.panes.split(pane.axis, &first_pane, pane); + + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + + self.panes_created += 1; + } + } + WindowMessage::ToggleMoving(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.panes.get_mut(&pane) { + pane.is_moving = !pane.is_moving; + } + } + WindowMessage::TitleChanged(title) => { + let window = self.windows.get_mut(&id).unwrap(); + window.title = title; + } + WindowMessage::PopOut(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((popped, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); + + let (panes, _) = pane_grid::State::new(popped); + let window = Window { + panes, + focus: None, + title: format!("New window ({})", self.windows.len()), + }; + + self.windows + .insert(window::Id::new(self.windows.len()), window); + } + } + WindowMessage::Dragged(pane_grid::DragEvent::Dropped { pane, target, }) => { - self.panes.swap(&pane, &target); + let window = self.windows.get_mut(&id).unwrap(); + window.panes.swap(&pane, &target); } - Message::Dragged(_) => {} - Message::TogglePin(pane) => { - if let Some(Pane { is_pinned, .. }) = self.panes.get_mut(&pane) + // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { + // println!("Picked {pane:?}"); + // } + WindowMessage::Dragged(_) => {} + WindowMessage::TogglePin(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(Pane { is_pinned, .. }) = + window.panes.get_mut(&pane) { *is_pinned = !*is_pinned; } } - Message::Close(pane) => { - if let Some((_, sibling)) = self.panes.close(&pane) { - self.focus = Some(sibling); + WindowMessage::Close(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((_, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); } } - Message::CloseFocused => { - if let Some(pane) = self.focus { - if let Some(Pane { is_pinned, .. }) = self.panes.get(&pane) + WindowMessage::CloseFocused => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + if let Some(Pane { is_pinned, .. }) = + window.panes.get(&pane) { if !is_pinned { - if let Some((_, sibling)) = self.panes.close(&pane) + if let Some((_, sibling)) = + window.panes.close(&pane) { - self.focus = Some(sibling); + window.focus = Some(sibling); } } } @@ -147,66 +231,106 @@ impl Application for Example { Event::Keyboard(keyboard::Event::KeyPressed { modifiers, key_code, - }) if modifiers.command() => handle_hotkey(key_code), + }) if modifiers.command() => { + handle_hotkey(key_code).map(|message| { + Message::Window(window::Id::new(0usize), message) + }) + } // TODO(derezzedex) _ => None, } }) } - fn view(&self) -> Element { - let focus = self.focus; - let total_panes = self.panes.len(); + fn windows(&self) -> Vec<(window::Id, iced::window::Settings)> { + self.windows + .iter() + .map(|(&id, _window)| (id, iced::window::Settings::default())) + .collect() + } - let pane_grid = PaneGrid::new(&self.panes, |id, pane| { - let is_focused = focus == Some(id); + fn view(&self, window_id: window::Id) -> Element { + if let Some(window) = self.windows.get(&window_id) { + let focus = window.focus; + let total_panes = window.panes.len(); - let pin_button = button( - text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), - ) - .on_press(Message::TogglePin(id)) - .padding(3); - - let title = row![ - pin_button, - "Pane", - text(pane.id.to_string()).style(if is_focused { - PANE_ID_COLOR_FOCUSED - } else { - PANE_ID_COLOR_UNFOCUSED - }), + let window_controls = row![ + text_input( + "Window title", + &window.title, + WindowMessage::TitleChanged, + ), + button(text("Apply")).style(theme::Button::Primary), ] - .spacing(5); + .spacing(5) + .align_items(Alignment::Center); - let title_bar = pane_grid::TitleBar::new(title) - .controls(view_controls(id, total_panes, pane.is_pinned)) - .padding(10) + let pane_grid = PaneGrid::new(&window.panes, |id, pane| { + let is_focused = focus == Some(id); + + let pin_button = button( + text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), + ) + .on_press(WindowMessage::TogglePin(id)) + .padding(3); + + let title = row![ + pin_button, + "Pane", + text(pane.id.to_string()).style(if is_focused { + PANE_ID_COLOR_FOCUSED + } else { + PANE_ID_COLOR_UNFOCUSED + }), + ] + .spacing(5); + + let title_bar = pane_grid::TitleBar::new(title) + .controls(view_controls( + id, + total_panes, + pane.is_pinned, + pane.is_moving, + &window.title, + window_id, + &self.windows, + )) + .padding(10) + .style(if is_focused { + style::title_bar_focused + } else { + style::title_bar_active + }); + + pane_grid::Content::new(responsive(move |size| { + view_content(id, total_panes, pane.is_pinned, size) + })) + .title_bar(title_bar) .style(if is_focused { - style::title_bar_focused + style::pane_focused } else { - style::title_bar_active - }); - - pane_grid::Content::new(responsive(move |size| { - view_content(id, total_panes, pane.is_pinned, size) - })) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active + style::pane_active + }) }) - }) - .width(Length::Fill) - .height(Length::Fill) - .spacing(10) - .on_click(Message::Clicked) - .on_drag(Message::Dragged) - .on_resize(10, Message::Resized); - - container(pane_grid) .width(Length::Fill) .height(Length::Fill) - .padding(10) + .spacing(10) + .on_click(WindowMessage::Clicked) + .on_drag(WindowMessage::Dragged) + .on_resize(10, WindowMessage::Resized); + + let content: Element<_> = column![window_controls, pane_grid] + .width(Length::Fill) + .height(Length::Fill) + .padding(10) + .into(); + + return content + .map(move |message| Message::Window(window_id, message)); + } + + container(text("This shouldn't be possible!").size(20)) + .center_x() + .center_y() .into() } } @@ -222,7 +346,7 @@ const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( 0x47 as f32 / 255.0, ); -fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { +fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { use keyboard::KeyCode; use pane_grid::{Axis, Direction}; @@ -235,23 +359,44 @@ fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { }; match key_code { - KeyCode::V => Some(Message::SplitFocused(Axis::Vertical)), - KeyCode::H => Some(Message::SplitFocused(Axis::Horizontal)), - KeyCode::W => Some(Message::CloseFocused), - _ => direction.map(Message::FocusAdjacent), + KeyCode::V => Some(WindowMessage::SplitFocused(Axis::Vertical)), + KeyCode::H => Some(WindowMessage::SplitFocused(Axis::Horizontal)), + KeyCode::W => Some(WindowMessage::CloseFocused), + _ => direction.map(WindowMessage::FocusAdjacent), + } +} + +#[derive(Debug, Clone)] +struct SelectableWindow(window::Id, String); + +impl PartialEq for SelectableWindow { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl Eq for SelectableWindow {} + +impl std::fmt::Display for SelectableWindow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.1.fmt(f) } } struct Pane { id: usize, + pub axis: pane_grid::Axis, pub is_pinned: bool, + pub is_moving: bool, } impl Pane { - fn new(id: usize) -> Self { + fn new(id: usize, axis: pane_grid::Axis) -> Self { Self { id, + axis, is_pinned: false, + is_moving: false, } } } @@ -261,7 +406,7 @@ fn view_content<'a>( total_panes: usize, is_pinned: bool, size: Size, -) -> Element<'a, Message> { +) -> Element<'a, WindowMessage> { let button = |label, message| { button( text(label) @@ -277,11 +422,11 @@ fn view_content<'a>( let mut controls = column![ button( "Split horizontally", - Message::Split(pane_grid::Axis::Horizontal, pane), + WindowMessage::Split(pane_grid::Axis::Horizontal, pane), ), button( "Split vertically", - Message::Split(pane_grid::Axis::Vertical, pane), + WindowMessage::Split(pane_grid::Axis::Vertical, pane), ) ] .spacing(5) @@ -289,7 +434,7 @@ fn view_content<'a>( if total_panes > 1 && !is_pinned { controls = controls.push( - button("Close", Message::Close(pane)) + button("Close", WindowMessage::Close(pane)) .style(theme::Button::Destructive), ); } @@ -314,16 +459,48 @@ fn view_controls<'a>( pane: pane_grid::Pane, total_panes: usize, is_pinned: bool, -) -> Element<'a, Message> { - let mut button = button(text("Close").size(14)) + is_moving: bool, + window_title: &'a str, + window_id: window::Id, + windows: &HashMap, +) -> Element<'a, WindowMessage> { + let window_selector = { + let options: Vec<_> = windows + .iter() + .map(|(id, window)| SelectableWindow(*id, window.title.clone())) + .collect(); + pick_list( + options, + Some(SelectableWindow(window_id, window_title.to_string())), + move |window| WindowMessage::SelectedWindow(pane, window), + ) + }; + + let mut move_to = button(text("Move to").size(14)).padding(3); + + let mut pop_out = button(text("Pop Out").size(14)).padding(3); + + let mut close = button(text("Close").size(14)) .style(theme::Button::Destructive) .padding(3); if total_panes > 1 && !is_pinned { - button = button.on_press(Message::Close(pane)); + close = close.on_press(WindowMessage::Close(pane)); + pop_out = pop_out.on_press(WindowMessage::PopOut(pane)); } - button.into() + if windows.len() > 1 && total_panes > 1 && !is_pinned { + move_to = move_to.on_press(WindowMessage::ToggleMoving(pane)); + } + + let mut content = row![].spacing(10); + if is_moving { + content = content.push(pop_out).push(window_selector).push(close); + } else { + content = content.push(pop_out).push(move_to).push(close); + } + + content.into() } mod style { From 35331d0a41a53b8ff5c642b8274c7377ae6c6182 Mon Sep 17 00:00:00 2001 From: Richard Date: Tue, 26 Jul 2022 16:46:12 -0300 Subject: [PATCH 015/286] Allow closing the window from user code --- examples/multi_window/src/main.rs | 9 +++- native/src/window/id.rs | 2 +- winit/src/multi_window.rs | 77 +++++++++++++++++++++++-------- winit/src/multi_window/state.rs | 11 +++++ 4 files changed, 76 insertions(+), 23 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 4ad92adb..ca137d48 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -50,6 +50,7 @@ enum WindowMessage { Close(pane_grid::Pane), CloseFocused, SelectedWindow(pane_grid::Pane, SelectableWindow), + CloseWindow, } impl Application for Example { @@ -128,6 +129,9 @@ impl Application for Example { let window = self.windows.get_mut(&id).unwrap(); window.focus = Some(pane); } + WindowMessage::CloseWindow => { + let _ = self.windows.remove(&id); + } WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { let window = self.windows.get_mut(&id).unwrap(); window.panes.resize(&split, ratio); @@ -145,8 +149,6 @@ impl Application for Example { if let Some((pane, _)) = result { window.focus = Some(pane); } - - self.panes_created += 1; } } WindowMessage::ToggleMoving(pane) => { @@ -260,6 +262,9 @@ impl Application for Example { WindowMessage::TitleChanged, ), button(text("Apply")).style(theme::Button::Primary), + button(text("Close")) + .on_press(WindowMessage::CloseWindow) + .style(theme::Button::Destructive), ] .spacing(5) .align_items(Alignment::Center); diff --git a/native/src/window/id.rs b/native/src/window/id.rs index 0ba355af..059cf4e7 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -1,7 +1,7 @@ use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] /// TODO(derezzedex) pub struct Id(u64); diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index dc00d737..3c720a69 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -39,6 +39,8 @@ pub enum Event { // (maybe we should also allow users to listen/react to those internal messages?) NewWindow(window::Id, settings::Window), /// TODO(derezzedex) + CloseWindow(window::Id), + /// TODO(derezzedex) WindowCreated(window::Id, winit::window::Window), } @@ -549,6 +551,27 @@ async fn run_instance( let _ = window_ids.insert(window.id(), id); let _ = windows.insert(id, window); } + Event::CloseWindow(id) => { + // TODO(derezzedex): log errors + if let Some(window) = windows.get(&id) { + if window_ids.remove(&window.id()).is_none() { + println!("Failed to remove from `window_ids`!"); + } + } + if states.remove(&id).is_none() { + println!("Failed to remove from `states`!") + } + if interfaces.remove(&id).is_none() { + println!("Failed to remove from `interfaces`!"); + } + if windows.remove(&id).is_none() { + println!("Failed to remove from `windows`!") + } + + if windows.is_empty() { + break 'main; + } + } Event::NewWindow(_, _) => unreachable!(), }, event::Event::RedrawRequested(id) => { @@ -651,29 +674,43 @@ async fn run_instance( window_id, } => { // dbg!(window_id); - let window = window_ids - .get(&window_id) - .and_then(|id| windows.get(id)) - .unwrap(); - let window_state = window_ids - .get(&window_id) - .and_then(|id| states.get_mut(id)) - .unwrap(); - - if requests_exit(&window_event, window_state.state.modifiers()) - && exit_on_close_request + if let Some(window) = + window_ids.get(&window_id).and_then(|id| windows.get(id)) { - break; - } + if let Some(window_state) = window_ids + .get(&window_id) + .and_then(|id| states.get_mut(id)) + { + if requests_exit( + &window_event, + window_state.state.modifiers(), + ) && exit_on_close_request + { + break; + } - window_state.state.update(window, &window_event, &mut debug); + window_state.state.update( + window, + &window_event, + &mut debug, + ); - if let Some(event) = conversion::window_event( - &window_event, - window_state.state.scale_factor(), - window_state.state.modifiers(), - ) { - events.push((window_ids.get(&window_id).cloned(), event)); + if let Some(event) = conversion::window_event( + &window_event, + window_state.state.scale_factor(), + window_state.state.modifiers(), + ) { + events.push(( + window_ids.get(&window_id).cloned(), + event, + )); + } + } else { + // TODO(derezzedex): log error + } + } else { + // TODO(derezzedex): log error + // println!("{:?}: {:?}", window_id, window_event); } } _ => {} diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index d22de961..ae353e3b 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -189,6 +189,17 @@ where proxy: &EventLoopProxy>, ) { let new_windows = application.windows(); + + // Check for windows to close + for window_id in windows.keys() { + if !new_windows.iter().any(|(id, _)| id == window_id) { + proxy + .send_event(Event::CloseWindow(*window_id)) + .expect("Failed to send message"); + } + } + + // Check for windows to spawn for (id, settings) in new_windows { if !windows.contains_key(&id) { proxy From dc86bd03733969033df7389c3d21e78ecc6291bb Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 27 Jul 2022 15:37:48 -0300 Subject: [PATCH 016/286] Introduce `close_requested` for `multi-window` --- examples/multi_window/src/main.rs | 4 ++++ src/multi_window/application.rs | 7 +++++++ winit/src/multi_window.rs | 15 +++++++++++---- winit/src/settings.rs | 4 ++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index ca137d48..88ddf46f 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -250,6 +250,10 @@ impl Application for Example { .collect() } + fn close_requested(&self, window: window::Id) -> Self::Message { + Message::Window(window, WindowMessage::CloseWindow) + } + fn view(&self, window_id: window::Id) -> Element { if let Some(window) = self.windows.get(&window_id) { let focus = window.focus; diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index e849bf2b..df45ca1e 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -113,6 +113,9 @@ pub trait Application: Sized { false } + /// TODO(derezzedex) + fn close_requested(&self, window: window::Id) -> Self::Message; + /// Runs the [`Application`]. /// /// On native platforms, this method will take control of the current thread @@ -207,4 +210,8 @@ where fn should_exit(&self) -> bool { self.0.should_exit() } + + fn close_requested(&self, window: window::Id) -> Self::Message { + self.0.close_requested(window) + } } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 3c720a69..6fbedc55 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -147,6 +147,9 @@ where fn should_exit(&self) -> bool { false } + + /// TODO(derezzedex) + fn close_requested(&self, window: window::Id) -> Self::Message; } /// Runs an [`Application`] with an executor, compositor, and the provided @@ -296,7 +299,7 @@ async fn run_instance( >, init_command: Command, mut windows: HashMap, - exit_on_close_request: bool, + _exit_on_close_request: bool, ) where A: Application + 'static, E: Executor + 'static, @@ -684,9 +687,13 @@ async fn run_instance( if requests_exit( &window_event, window_state.state.modifiers(), - ) && exit_on_close_request - { - break; + ) { + if let Some(id) = + window_ids.get(&window_id).cloned() + { + let message = application.close_requested(id); + messages.push(message); + } } window_state.state.update( diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 94d243a7..ea0ba361 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -46,6 +46,10 @@ pub struct Settings { /// Whether the [`Application`] should exit when the user requests the /// window to close (e.g. the user presses the close button). /// + /// NOTE: This is not used for `multi-window`, instead check [`Application::close_requested`]. + /// + /// [`close_requested`]: crate::multi_window::Application::close_requested + /// /// [`Application`]: crate::Application pub exit_on_close_request: bool, From 7f35256573db789fa6552c2cfd8aa16dde2a1a4d Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 15 Sep 2022 05:02:18 -0300 Subject: [PATCH 017/286] Split `Surface` and `Window` --- winit/src/multi_window.rs | 82 +++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 47 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 6fbedc55..3e7fecd0 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -318,6 +318,7 @@ async fn run_instance( .collect(); let mut states = HashMap::new(); + let mut surfaces = HashMap::new(); let mut interfaces = ManuallyDrop::new(HashMap::new()); for (&id, window) in windows.keys().zip(windows.values()) { @@ -342,20 +343,19 @@ async fn run_instance( id, ); - let window_state: WindowState = WindowState { surface, state }; - - let _ = states.insert(id, window_state); + let _ = states.insert(id, state); + let _ = surfaces.insert(id, surface); let _ = interfaces.insert(id, user_interface); } { // TODO(derezzedex) - let window_state = states.values().next().expect("No state found"); + let state = states.values().next().expect("No state found"); run_command( &application, &mut cache, - &window_state.state, + state, &mut renderer, init_command, &mut runtime, @@ -396,7 +396,7 @@ async fn run_instance( .collect(); let cursor_position = - states.get(&id).unwrap().state.cursor_position(); + states.get(&id).unwrap().cursor_position(); let window = windows.get(&id).unwrap(); if filtered.is_empty() && messages.is_empty() { @@ -430,7 +430,7 @@ async fn run_instance( user_interface::State::Outdated, ) { - let state = &mut states.get_mut(&id).unwrap().state; + let state = &mut states.get_mut(&id).unwrap(); let pure_states: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() @@ -481,7 +481,7 @@ async fn run_instance( debug.draw_started(); let new_mouse_interaction = { let user_interface = interfaces.get_mut(&id).unwrap(); - let state = &states.get(&id).unwrap().state; + let state = states.get(&id).unwrap(); user_interface.draw( &mut renderer, @@ -546,10 +546,8 @@ async fn run_instance( id, ); - let window_state: WindowState = - WindowState { surface, state }; - - let _ = states.insert(id, window_state); + let _ = states.insert(id, state); + let _ = surfaces.insert(id, surface); let _ = interfaces.insert(id, user_interface); let _ = window_ids.insert(window.id(), id); let _ = windows.insert(id, window); @@ -570,6 +568,9 @@ async fn run_instance( if windows.remove(&id).is_none() { println!("Failed to remove from `windows`!") } + if surfaces.remove(&id).is_none() { + println!("Failed to remove from `surfaces`!") + } if windows.is_empty() { break 'main; @@ -578,11 +579,15 @@ async fn run_instance( Event::NewWindow(_, _) => unreachable!(), }, event::Event::RedrawRequested(id) => { - let window_state = window_ids + let state = window_ids .get(&id) .and_then(|id| states.get_mut(id)) .unwrap(); - let physical_size = window_state.state.physical_size(); + let surface = window_ids + .get(&id) + .and_then(|id| surfaces.get_mut(id)) + .unwrap(); + let physical_size = state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { continue; @@ -590,13 +595,13 @@ async fn run_instance( debug.render_started(); - if window_state.state.viewport_changed() { + if state.viewport_changed() { let mut user_interface = window_ids .get(&id) .and_then(|id| interfaces.remove(id)) .unwrap(); - let logical_size = window_state.state.logical_size(); + let logical_size = state.logical_size(); debug.layout_started(); user_interface = @@ -605,7 +610,7 @@ async fn run_instance( debug.draw_started(); let new_mouse_interaction = { - let state = &window_state.state; + let state = &state; user_interface.draw( &mut renderer, @@ -634,7 +639,7 @@ async fn run_instance( .insert(*window_ids.get(&id).unwrap(), user_interface); compositor.configure_surface( - &mut window_state.surface, + surface, physical_size.width, physical_size.height, ); @@ -642,9 +647,9 @@ async fn run_instance( match compositor.present( &mut renderer, - &mut window_state.surface, - window_state.state.viewport(), - window_state.state.background_color(), + surface, + state.viewport(), + state.background_color(), &debug.overlay(), ) { Ok(()) => { @@ -680,14 +685,11 @@ async fn run_instance( if let Some(window) = window_ids.get(&window_id).and_then(|id| windows.get(id)) { - if let Some(window_state) = window_ids + if let Some(state) = window_ids .get(&window_id) .and_then(|id| states.get_mut(id)) { - if requests_exit( - &window_event, - window_state.state.modifiers(), - ) { + if requests_exit(&window_event, state.modifiers()) { if let Some(id) = window_ids.get(&window_id).cloned() { @@ -696,16 +698,12 @@ async fn run_instance( } } - window_state.state.update( - window, - &window_event, - &mut debug, - ); + state.update(window, &window_event, &mut debug); if let Some(event) = conversion::window_event( &window_event, - window_state.state.scale_factor(), - window_state.state.modifiers(), + state.scale_factor(), + state.modifiers(), ) { events.push(( window_ids.get(&window_id).cloned(), @@ -953,21 +951,12 @@ pub fn run_command( } } -struct WindowState -where - A: Application, - C: iced_graphics::window::Compositor, - ::Theme: StyleSheet, -{ - surface: ::Surface, - state: State, -} - -fn build_user_interfaces<'a, A, C>( +/// TODO(derezzedex) +pub fn build_user_interfaces<'a, A>( application: &'a A, renderer: &mut A::Renderer, debug: &mut Debug, - states: &HashMap>, + states: &HashMap>, mut pure_states: HashMap, ) -> HashMap< window::Id, @@ -979,13 +968,12 @@ fn build_user_interfaces<'a, A, C>( > where A: Application + 'static, - C: iced_graphics::window::Compositor + 'static, ::Theme: StyleSheet, { let mut interfaces = HashMap::new(); for (id, pure_state) in pure_states.drain() { - let state = &states.get(&id).unwrap().state; + let state = &states.get(&id).unwrap(); let user_interface = build_user_interface( application, From 974cc6b6f55178976b0ace626ba03bdd88cde5e0 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 19 Sep 2022 16:01:50 -0300 Subject: [PATCH 018/286] Introduce `multi_window` to `iced_glutin` --- Cargo.toml | 2 +- glutin/Cargo.toml | 1 + glutin/src/lib.rs | 3 +++ glutin/src/multi_window.rs | 21 +++++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 glutin/src/multi_window.rs diff --git a/Cargo.toml b/Cargo.toml index 41f5af2f..36465a29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ chrome-trace = [ "iced_glow?/tracing", ] # Enables experimental multi-window support -multi_window = ["iced_winit/multi_window"] +multi_window = ["iced_winit/multi_window", "iced_glutin/multi_window"] [badges] maintenance = { status = "actively-developed" } diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 304170cd..2960a0bd 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -14,6 +14,7 @@ categories = ["gui"] trace = ["iced_winit/trace"] debug = ["iced_winit/debug"] system = ["iced_winit/system"] +multi_window = ["iced_winit/multi_window"] [dependencies.log] version = "0.4" diff --git a/glutin/src/lib.rs b/glutin/src/lib.rs index 33afd664..45d6cb5b 100644 --- a/glutin/src/lib.rs +++ b/glutin/src/lib.rs @@ -29,5 +29,8 @@ pub use iced_winit::*; pub mod application; +#[cfg(feature = "multi_window")] +pub mod multi_window; + #[doc(no_inline)] pub use application::Application; diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs new file mode 100644 index 00000000..46d00d81 --- /dev/null +++ b/glutin/src/multi_window.rs @@ -0,0 +1,21 @@ +//! Create interactive, native cross-platform applications. +use crate::{Error, Executor}; + +pub use iced_winit::multi_window::{Application, StyleSheet}; + +use iced_winit::Settings; + +/// Runs an [`Application`] with an executor, compositor, and the provided +/// settings. +pub fn run( + _settings: Settings, + _compositor_settings: C::Settings, +) -> Result<(), Error> +where + A: Application + 'static, + E: Executor + 'static, + C: iced_graphics::window::GLCompositor + 'static, + ::Theme: StyleSheet, +{ + unimplemented!("iced_glutin not implemented!") +} From 0ad53a3d5c7b5fb5785a64102ee1ad7df9a5fb2b Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 19 Sep 2022 20:59:37 -0300 Subject: [PATCH 019/286] add `window::Id` to `Event` and `Action` --- examples/events/src/main.rs | 2 +- examples/integration_opengl/src/main.rs | 2 + examples/integration_wgpu/src/main.rs | 5 +- glutin/src/application.rs | 1 + native/src/command/action.rs | 8 ++- native/src/event.rs | 2 +- native/src/window/id.rs | 3 + winit/src/application.rs | 3 +- winit/src/conversion.rs | 46 +++++++++------ winit/src/multi_window.rs | 75 ++++++++++++------------- winit/src/window.rs | 30 ++++++---- 11 files changed, 99 insertions(+), 78 deletions(-) diff --git a/examples/events/src/main.rs b/examples/events/src/main.rs index 234e1423..e9709377 100644 --- a/examples/events/src/main.rs +++ b/examples/events/src/main.rs @@ -52,7 +52,7 @@ impl Application for Events { } } Message::EventOccurred(event) => { - if let Event::Window(window::Event::CloseRequested) = event { + if let Event::Window(_, window::Event::CloseRequested) = event { self.should_exit = true; } } diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs index f161c8a0..56470190 100644 --- a/examples/integration_opengl/src/main.rs +++ b/examples/integration_opengl/src/main.rs @@ -13,6 +13,7 @@ use iced_glow::{Backend, Renderer, Settings, Viewport}; use iced_glutin::conversion; use iced_glutin::glutin; use iced_glutin::renderer; +use iced_glutin::window; use iced_glutin::{program, Clipboard, Color, Debug, Size}; pub fn main() { @@ -107,6 +108,7 @@ pub fn main() { // Map window event to iced event if let Some(event) = iced_winit::conversion::window_event( + window::Id::MAIN, &event, windowed_context.window().scale_factor(), modifiers, diff --git a/examples/integration_wgpu/src/main.rs b/examples/integration_wgpu/src/main.rs index 70f9a48b..219573ea 100644 --- a/examples/integration_wgpu/src/main.rs +++ b/examples/integration_wgpu/src/main.rs @@ -6,8 +6,8 @@ use scene::Scene; use iced_wgpu::{wgpu, Backend, Renderer, Settings, Viewport}; use iced_winit::{ - conversion, futures, program, renderer, winit, Clipboard, Color, Debug, - Size, + conversion, futures, program, renderer, window, winit, Clipboard, Color, + Debug, Size, }; use winit::{ @@ -169,6 +169,7 @@ pub fn main() { // 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/glutin/src/application.rs b/glutin/src/application.rs index 1464bb2d..108d7ffa 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -435,6 +435,7 @@ async fn run_instance( state.update(context.window(), &window_event, &mut debug); if let Some(event) = conversion::window_event( + crate::window::Id::MAIN, &window_event, state.scale_factor(), state.modifiers(), diff --git a/native/src/command/action.rs b/native/src/command/action.rs index a6954f8f..924f95e6 100644 --- a/native/src/command/action.rs +++ b/native/src/command/action.rs @@ -20,7 +20,7 @@ pub enum Action { Clipboard(clipboard::Action), /// Run a window action. - Window(window::Action), + Window(window::Id, window::Action), /// Run a system action. System(system::Action), @@ -46,7 +46,7 @@ impl Action { match self { Self::Future(future) => Action::Future(Box::pin(future.map(f))), Self::Clipboard(action) => Action::Clipboard(action.map(f)), - Self::Window(window) => Action::Window(window.map(f)), + Self::Window(id, window) => Action::Window(id, window.map(f)), Self::System(system) => Action::System(system.map(f)), Self::Widget(widget) => Action::Widget(widget.map(f)), } @@ -60,7 +60,9 @@ impl fmt::Debug for Action { Self::Clipboard(action) => { write!(f, "Action::Clipboard({:?})", action) } - Self::Window(action) => write!(f, "Action::Window({:?})", action), + Self::Window(id, action) => { + write!(f, "Action::Window({:?}, {:?})", id, action) + } Self::System(action) => write!(f, "Action::System({:?})", action), Self::Widget(_action) => write!(f, "Action::Widget"), } diff --git a/native/src/event.rs b/native/src/event.rs index bcfaf891..eb826399 100644 --- a/native/src/event.rs +++ b/native/src/event.rs @@ -19,7 +19,7 @@ pub enum Event { Mouse(mouse::Event), /// A window event - Window(window::Event), + Window(window::Id, window::Event), /// A touch event Touch(touch::Event), diff --git a/native/src/window/id.rs b/native/src/window/id.rs index 059cf4e7..5060e162 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -6,6 +6,9 @@ use std::hash::{Hash, Hasher}; pub struct Id(u64); impl Id { + /// TODO(derezzedex): maybe change `u64` to an enum `Type::{Single, Multi(u64)}` + pub const MAIN: Self = Id(0); + /// TODO(derezzedex) pub fn new(id: impl Hash) -> Id { let mut hasher = DefaultHasher::new(); diff --git a/winit/src/application.rs b/winit/src/application.rs index 74c73815..4486f5d9 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -502,6 +502,7 @@ async fn run_instance( state.update(&window, &window_event, &mut debug); if let Some(event) = conversion::window_event( + crate::window::Id::MAIN, &window_event, state.scale_factor(), state.modifiers(), @@ -667,7 +668,7 @@ pub fn run_command( clipboard.write(contents); } }, - command::Action::Window(action) => match action { + command::Action::Window(_id, action) => match action { window::Action::Close => { *should_exit = true; } diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 1418e346..6c809d19 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -10,6 +10,7 @@ use crate::{Event, Point, Position}; /// Converts a winit window event into an iced event. pub fn window_event( + id: window::Id, event: &winit::event::WindowEvent<'_>, scale_factor: f64, modifiers: winit::event::ModifiersState, @@ -20,21 +21,27 @@ pub fn window_event( WindowEvent::Resized(new_size) => { let logical_size = new_size.to_logical(scale_factor); - Some(Event::Window(window::Event::Resized { - width: logical_size.width, - height: logical_size.height, - })) + Some(Event::Window( + id, + window::Event::Resized { + width: logical_size.width, + height: logical_size.height, + }, + )) } WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { let logical_size = new_inner_size.to_logical(scale_factor); - Some(Event::Window(window::Event::Resized { - width: logical_size.width, - height: logical_size.height, - })) + Some(Event::Window( + id, + window::Event::Resized { + width: logical_size.width, + height: logical_size.height, + }, + )) } WindowEvent::CloseRequested => { - Some(Event::Window(window::Event::CloseRequested)) + Some(Event::Window(id, window::Event::CloseRequested)) } WindowEvent::CursorMoved { position, .. } => { let position = position.to_logical::(scale_factor); @@ -112,19 +119,22 @@ pub fn window_event( WindowEvent::ModifiersChanged(new_modifiers) => Some(Event::Keyboard( keyboard::Event::ModifiersChanged(self::modifiers(*new_modifiers)), )), - WindowEvent::Focused(focused) => Some(Event::Window(if *focused { - window::Event::Focused - } else { - window::Event::Unfocused - })), + WindowEvent::Focused(focused) => Some(Event::Window( + id, + if *focused { + window::Event::Focused + } else { + window::Event::Unfocused + }, + )), WindowEvent::HoveredFile(path) => { - Some(Event::Window(window::Event::FileHovered(path.clone()))) + Some(Event::Window(id, window::Event::FileHovered(path.clone()))) } WindowEvent::DroppedFile(path) => { - Some(Event::Window(window::Event::FileDropped(path.clone()))) + Some(Event::Window(id, window::Event::FileDropped(path.clone()))) } WindowEvent::HoveredFileCancelled => { - Some(Event::Window(window::Event::FilesHoveredLeft)) + Some(Event::Window(id, window::Event::FilesHoveredLeft)) } WindowEvent::Touch(touch) => { Some(Event::Touch(touch_event(*touch, scale_factor))) @@ -133,7 +143,7 @@ pub fn window_event( let winit::dpi::LogicalPosition { x, y } = position.to_logical(scale_factor); - Some(Event::Window(window::Event::Moved { x, y })) + Some(Event::Window(id, window::Event::Moved { x, y })) } _ => None, } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 3e7fecd0..9f46b88d 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -363,7 +363,6 @@ async fn run_instance( &mut proxy, &mut debug, &windows, - &window_ids, || compositor.fetch_information(), ); } @@ -456,7 +455,6 @@ async fn run_instance( &mut debug, &mut messages, &windows, - &window_ids, || compositor.fetch_information(), ); @@ -701,6 +699,7 @@ async fn run_instance( state.update(window, &window_event, &mut debug); if let Some(event) = conversion::window_event( + *window_ids.get(&window_id).unwrap(), &window_event, state.scale_factor(), state.modifiers(), @@ -787,7 +786,6 @@ pub fn update( debug: &mut Debug, messages: &mut Vec, windows: &HashMap, - window_ids: &HashMap, graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where ::Theme: StyleSheet, @@ -810,7 +808,6 @@ pub fn update( proxy, debug, windows, - window_ids, graphics_info, ); } @@ -831,7 +828,6 @@ pub fn run_command( proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, windows: &HashMap, - window_ids: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where A: Application, @@ -842,10 +838,6 @@ pub fn run_command( use iced_native::system; use iced_native::window; - // TODO(derezzedex) - let window = windows.values().next().expect("No window found"); - let id = *window_ids.get(&window.id()).unwrap(); - for action in command.actions() { match action { command::Action::Future(future) => { @@ -863,38 +855,41 @@ pub fn run_command( clipboard.write(contents); } }, - command::Action::Window(action) => match action { - window::Action::Resize { width, height } => { - window.set_inner_size(winit::dpi::LogicalSize { - width, - height, - }); - } - window::Action::Move { x, y } => { - window.set_outer_position(winit::dpi::LogicalPosition { - x, - y, - }); - } - window::Action::SetMode(mode) => { - window.set_visible(conversion::visible(mode)); - window.set_fullscreen(conversion::fullscreen( - window.primary_monitor(), - mode, - )); - } - window::Action::FetchMode(tag) => { - let mode = if window.is_visible().unwrap_or(true) { - conversion::mode(window.fullscreen()) - } else { - window::Mode::Hidden - }; + command::Action::Window(id, action) => { + let window = windows.get(&id).expect("No window found"); - proxy - .send_event(Event::Application(tag(mode))) - .expect("Send message to event loop"); + match action { + window::Action::Resize { width, height } => { + window.set_inner_size(winit::dpi::LogicalSize { + width, + height, + }); + } + window::Action::Move { x, y } => { + window.set_outer_position( + winit::dpi::LogicalPosition { x, y }, + ); + } + window::Action::SetMode(mode) => { + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let mode = if window.is_visible().unwrap_or(true) { + conversion::mode(window.fullscreen()) + } else { + window::Mode::Hidden + }; + + proxy + .send_event(Event::Application(tag(mode))) + .expect("Send message to event loop"); + } } - }, + } command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { #[cfg(feature = "system")] @@ -925,7 +920,7 @@ pub fn run_command( renderer, state.logical_size(), debug, - id, + window::Id::MAIN, // TODO(derezzedex): run the operation on every widget tree ); while let Some(mut operation) = current_operation.take() { diff --git a/winit/src/window.rs b/winit/src/window.rs index f2c7037a..d9bc0d83 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -15,11 +15,15 @@ pub fn drag() -> Command { } /// Resizes the window to the given logical dimensions. -pub fn resize(width: u32, height: u32) -> Command { - Command::single(command::Action::Window(window::Action::Resize { - width, - height, - })) +pub fn resize( + id: window::Id, + width: u32, + height: u32, +) -> Command { + Command::single(command::Action::Window( + id, + window::Action::Resize { width, height }, + )) } /// Sets the window to maximized or back. @@ -33,13 +37,13 @@ pub fn minimize(value: bool) -> Command { } /// Moves a window to the given logical coordinates. -pub fn move_to(x: i32, y: i32) -> Command { - Command::single(command::Action::Window(window::Action::Move { x, y })) +pub fn move_to(id: window::Id, x: i32, y: i32) -> Command { + Command::single(command::Action::Window(id, window::Action::Move { x, y })) } /// Sets the [`Mode`] of the window. -pub fn set_mode(mode: Mode) -> Command { - Command::single(command::Action::Window(window::Action::SetMode(mode))) +pub fn set_mode(id: window::Id, mode: Mode) -> Command { + Command::single(command::Action::Window(id, window::Action::SetMode(mode))) } /// Sets the window to maximized or back. @@ -49,9 +53,11 @@ pub fn toggle_maximize() -> Command { /// Fetches the current [`Mode`] of the window. pub fn fetch_mode( + id: window::Id, f: impl FnOnce(Mode) -> Message + 'static, ) -> Command { - Command::single(command::Action::Window(window::Action::FetchMode( - Box::new(f), - ))) + Command::single(command::Action::Window( + id, + window::Action::FetchMode(Box::new(f)), + )) } From 064407635a0f9d79a067bad62f6f1042acaed18d Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 21 Sep 2022 19:17:25 -0300 Subject: [PATCH 020/286] implement `multi_window` for `iced_glutin` --- examples/multi_window/src/main.rs | 4 +- glutin/src/multi_window.rs | 564 ++++++++++++++++++++++++++- graphics/src/window/gl_compositor.rs | 2 +- 3 files changed, 561 insertions(+), 9 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 88ddf46f..0dda1804 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -70,9 +70,9 @@ impl Application for Example { ( Example { - windows: HashMap::from([(window::Id::new(0usize), window)]), + windows: HashMap::from([(window::Id::MAIN, window)]), panes_created: 1, - _focused: window::Id::new(0usize), + _focused: window::Id::MAIN, }, Command::none(), ) diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 46d00d81..c3b9e74f 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -1,15 +1,28 @@ //! Create interactive, native cross-platform applications. -use crate::{Error, Executor}; +use crate::mouse; +use crate::{Error, Executor, Runtime}; -pub use iced_winit::multi_window::{Application, StyleSheet}; +pub use iced_winit::multi_window::{ + self, Application, Event, State, StyleSheet, +}; -use iced_winit::Settings; +use iced_winit::conversion; +use iced_winit::futures; +use iced_winit::futures::channel::mpsc; +use iced_winit::renderer; +use iced_winit::user_interface; +use iced_winit::window; +use iced_winit::{Clipboard, Command, Debug, Proxy, Settings}; + +use glutin::window::Window; +use std::collections::HashMap; +use std::mem::ManuallyDrop; /// Runs an [`Application`] with an executor, compositor, and the provided /// settings. pub fn run( - _settings: Settings, - _compositor_settings: C::Settings, + settings: Settings, + compositor_settings: C::Settings, ) -> Result<(), Error> where A: Application + 'static, @@ -17,5 +30,544 @@ where C: iced_graphics::window::GLCompositor + 'static, ::Theme: StyleSheet, { - unimplemented!("iced_glutin not implemented!") + use futures::task; + use futures::Future; + use glutin::event_loop::EventLoopBuilder; + use glutin::platform::run_return::EventLoopExtRunReturn; + use glutin::ContextBuilder; + + let mut debug = Debug::new(); + debug.startup_started(); + + let mut event_loop = EventLoopBuilder::with_user_event().build(); + let proxy = event_loop.create_proxy(); + + let runtime = { + let executor = E::new().map_err(Error::ExecutorCreationFailed)?; + let proxy = Proxy::new(event_loop.create_proxy()); + + Runtime::new(executor, proxy) + }; + + let (application, init_command) = { + let flags = settings.flags; + + runtime.enter(|| A::new(flags)) + }; + + let context = { + let builder = settings.window.into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ); + + log::info!("Window builder: {:#?}", builder); + + let opengl_builder = ContextBuilder::new() + .with_vsync(true) + .with_multisampling(C::sample_count(&compositor_settings) as u16); + + let opengles_builder = opengl_builder.clone().with_gl( + glutin::GlRequest::Specific(glutin::Api::OpenGlEs, (2, 0)), + ); + + let (first_builder, second_builder) = if settings.try_opengles_first { + (opengles_builder, opengl_builder) + } else { + (opengl_builder, opengles_builder) + }; + + log::info!("Trying first builder: {:#?}", first_builder); + + let context = first_builder + .build_windowed(builder.clone(), &event_loop) + .or_else(|_| { + log::info!("Trying second builder: {:#?}", second_builder); + second_builder.build_windowed(builder, &event_loop) + }) + .map_err(|error| { + use glutin::CreationError; + use iced_graphics::Error as ContextError; + + match error { + CreationError::Window(error) => { + Error::WindowCreationFailed(error) + } + CreationError::OpenGlVersionNotSupported => { + Error::GraphicsCreationFailed( + ContextError::VersionNotSupported, + ) + } + CreationError::NoAvailablePixelFormat => { + Error::GraphicsCreationFailed( + ContextError::NoAvailablePixelFormat, + ) + } + error => Error::GraphicsCreationFailed( + ContextError::BackendError(error.to_string()), + ), + } + })?; + + #[allow(unsafe_code)] + unsafe { + context.make_current().expect("Make OpenGL context current") + } + }; + + #[allow(unsafe_code)] + let (compositor, renderer) = unsafe { + C::new(compositor_settings, |address| { + context.get_proc_address(address) + })? + }; + + let (mut sender, receiver) = mpsc::unbounded(); + + let mut instance = Box::pin(run_instance::( + application, + compositor, + renderer, + runtime, + proxy, + debug, + receiver, + context, + init_command, + settings.exit_on_close_request, + )); + + let mut context = task::Context::from_waker(task::noop_waker_ref()); + + let _ = event_loop.run_return(move |event, event_loop, control_flow| { + use glutin::event_loop::ControlFlow; + + if let ControlFlow::ExitWithCode(_) = control_flow { + return; + } + + let event = match event { + glutin::event::Event::WindowEvent { + event: + glutin::event::WindowEvent::ScaleFactorChanged { + new_inner_size, + .. + }, + window_id, + } => Some(glutin::event::Event::WindowEvent { + event: glutin::event::WindowEvent::Resized(*new_inner_size), + window_id, + }), + glutin::event::Event::UserEvent(Event::NewWindow(id, settings)) => { + // TODO(derezzedex) + let window = settings + .into_builder( + "fix window title", + event_loop.primary_monitor(), + None, + ) + .build(event_loop) + .expect("Failed to build window"); + + Some(glutin::event::Event::UserEvent(Event::WindowCreated( + id, window, + ))) + } + _ => event.to_static(), + }; + + if let Some(event) = event { + sender.start_send(event).expect("Send event"); + + let poll = instance.as_mut().poll(&mut context); + + *control_flow = match poll { + task::Poll::Pending => ControlFlow::Wait, + task::Poll::Ready(_) => ControlFlow::Exit, + }; + } + }); + + Ok(()) +} + +async fn run_instance( + mut application: A, + mut compositor: C, + mut renderer: A::Renderer, + mut runtime: Runtime>, Event>, + mut proxy: glutin::event_loop::EventLoopProxy>, + mut debug: Debug, + mut receiver: mpsc::UnboundedReceiver< + glutin::event::Event<'_, Event>, + >, + context: glutin::ContextWrapper, + init_command: Command, + _exit_on_close_request: bool, +) where + A: Application + 'static, + E: Executor + 'static, + C: iced_graphics::window::GLCompositor + 'static, + ::Theme: StyleSheet, +{ + use glutin::event; + use iced_winit::futures::stream::StreamExt; + + let mut clipboard = Clipboard::connect(context.window()); + let mut cache = user_interface::Cache::default(); + let state = State::new(&application, context.window()); + let user_interface = multi_window::build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + window::Id::MAIN, + ); + + #[allow(unsafe_code)] + let (mut context, window) = unsafe { context.split() }; + + let mut window_ids = HashMap::from([(window.id(), window::Id::MAIN)]); + let mut windows = HashMap::from([(window::Id::MAIN, window)]); + let mut states = HashMap::from([(window::Id::MAIN, state)]); + let mut interfaces = + ManuallyDrop::new(HashMap::from([(window::Id::MAIN, user_interface)])); + + { + let state = states.get(&window::Id::MAIN).unwrap(); + + multi_window::run_command( + &application, + &mut cache, + state, + &mut renderer, + init_command, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &windows, + || compositor.fetch_information(), + ); + } + runtime.track(application.subscription().map(Event::Application)); + + let mut mouse_interaction = mouse::Interaction::default(); + let mut events = Vec::new(); + let mut messages = Vec::new(); + + debug.startup_finished(); + + 'main: while let Some(event) = receiver.next().await { + match event { + event::Event::MainEventsCleared => { + for id in windows.keys().copied() { + let (filtered, remaining): (Vec<_>, Vec<_>) = + events.iter().cloned().partition( + |(window_id, _event): &( + Option, + iced_native::event::Event, + )| { + *window_id == Some(id) || *window_id == None + }, + ); + + events.retain(|el| remaining.contains(el)); + let filtered: Vec<_> = filtered + .into_iter() + .map(|(_id, event)| event) + .collect(); + + let cursor_position = + states.get(&id).unwrap().cursor_position(); + let window = windows.get(&id).unwrap(); + + if filtered.is_empty() && messages.is_empty() { + continue; + } + + debug.event_processing_started(); + + let (interface_state, statuses) = { + let user_interface = interfaces.get_mut(&id).unwrap(); + user_interface.update( + &filtered, + cursor_position, + &mut renderer, + &mut clipboard, + &mut messages, + ) + }; + + debug.event_processing_finished(); + + for event in filtered.into_iter().zip(statuses.into_iter()) + { + runtime.broadcast(event); + } + + if !messages.is_empty() + || matches!( + interface_state, + user_interface::State::Outdated + ) + { + let state = &mut states.get_mut(&id).unwrap(); + let pure_states: HashMap<_, _> = + ManuallyDrop::into_inner(interfaces) + .drain() + .map(|(id, interface)| { + (id, interface.into_cache()) + }) + .collect(); + + // Update application + multi_window::update( + &mut application, + &mut cache, + state, + &mut renderer, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &mut messages, + &windows, + || compositor.fetch_information(), + ); + + // Update window + state.synchronize(&application, &windows, &proxy); + + let should_exit = application.should_exit(); + + interfaces = ManuallyDrop::new( + multi_window::build_user_interfaces( + &application, + &mut renderer, + &mut debug, + &states, + pure_states, + ), + ); + + if should_exit { + break 'main; + } + } + + debug.draw_started(); + let new_mouse_interaction = { + let user_interface = interfaces.get_mut(&id).unwrap(); + let state = states.get(&id).unwrap(); + + user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ) + }; + debug.draw_finished(); + + if new_mouse_interaction != mouse_interaction { + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + mouse_interaction = new_mouse_interaction; + } + + window.request_redraw(); + } + } + event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + )) => { + use iced_native::event; + events.push(( + None, + iced_native::Event::PlatformSpecific( + event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + ), + ), + )); + } + event::Event::UserEvent(event) => match event { + Event::Application(message) => messages.push(message), + Event::WindowCreated(id, window) => { + let state = State::new(&application, &window); + let user_interface = multi_window::build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + id, + ); + + let _ = states.insert(id, state); + let _ = interfaces.insert(id, user_interface); + let _ = window_ids.insert(window.id(), id); + let _ = windows.insert(id, window); + } + Event::CloseWindow(id) => { + // TODO(derezzedex): log errors + if let Some(window) = windows.get(&id) { + if window_ids.remove(&window.id()).is_none() { + println!("Failed to remove from `window_ids`!"); + } + } + if states.remove(&id).is_none() { + println!("Failed to remove from `states`!") + } + if interfaces.remove(&id).is_none() { + println!("Failed to remove from `interfaces`!"); + } + if windows.remove(&id).is_none() { + println!("Failed to remove from `windows`!") + } + + if windows.is_empty() { + break 'main; + } + } + Event::NewWindow(_, _) => unreachable!(), + }, + event::Event::RedrawRequested(id) => { + let state = window_ids + .get(&id) + .and_then(|id| states.get_mut(id)) + .unwrap(); + + debug.render_started(); + + #[allow(unsafe_code)] + unsafe { + if !context.is_current() { + context = context + .make_current() + .expect("Make OpenGL context current"); + } + } + + if state.viewport_changed() { + let physical_size = state.physical_size(); + let logical_size = state.logical_size(); + + let mut user_interface = window_ids + .get(&id) + .and_then(|id| interfaces.remove(id)) + .unwrap(); + + debug.layout_started(); + user_interface = + user_interface.relayout(logical_size, &mut renderer); + debug.layout_finished(); + + debug.draw_started(); + let new_mouse_interaction = user_interface.draw( + &mut renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor_position(), + ); + debug.draw_finished(); + + if new_mouse_interaction != mouse_interaction { + let window = window_ids + .get(&id) + .and_then(|id| windows.get_mut(id)) + .unwrap(); + + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + mouse_interaction = new_mouse_interaction; + } + + context.resize(glutin::dpi::PhysicalSize::new( + physical_size.width, + physical_size.height, + )); + + compositor.resize_viewport(physical_size); + + let _ = interfaces + .insert(*window_ids.get(&id).unwrap(), user_interface); + } + + compositor.present( + &mut renderer, + state.viewport(), + state.background_color(), + &debug.overlay(), + ); + + context.swap_buffers().expect("Swap buffers"); + + debug.render_finished(); + + // TODO: Handle animations! + // Maybe we can use `ControlFlow::WaitUntil` for this. + } + event::Event::WindowEvent { + event: window_event, + window_id, + } => { + // dbg!(window_id); + if let Some(window) = + window_ids.get(&window_id).and_then(|id| windows.get(id)) + { + if let Some(state) = window_ids + .get(&window_id) + .and_then(|id| states.get_mut(id)) + { + if multi_window::requests_exit( + &window_event, + state.modifiers(), + ) { + if let Some(id) = + window_ids.get(&window_id).cloned() + { + let message = application.close_requested(id); + messages.push(message); + } + } + + state.update(window, &window_event, &mut debug); + + if let Some(event) = conversion::window_event( + *window_ids.get(&window_id).unwrap(), + &window_event, + state.scale_factor(), + state.modifiers(), + ) { + events.push(( + window_ids.get(&window_id).cloned(), + event, + )); + } + } else { + // TODO(derezzedex): log error + } + } else { + // TODO(derezzedex): log error + // println!("{:?}: {:?}", window_id, window_event); + } + } + _ => {} + } + } + + // Manually drop the user interface + // drop(ManuallyDrop::into_inner(user_interface)); } diff --git a/graphics/src/window/gl_compositor.rs b/graphics/src/window/gl_compositor.rs index a45a7ca1..e6ae2364 100644 --- a/graphics/src/window/gl_compositor.rs +++ b/graphics/src/window/gl_compositor.rs @@ -30,7 +30,7 @@ pub trait GLCompositor: Sized { /// The settings of the [`GLCompositor`]. /// /// It's up to you to decide the configuration supported by your renderer! - type Settings: Default; + type Settings: Default + Clone; /// Creates a new [`GLCompositor`] and [`Renderer`] with the given /// [`Settings`] and an OpenGL address loader function. From ce43514eaca0e892ad2f646a63fc29af2150d79c Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 21 Sep 2022 19:37:28 -0300 Subject: [PATCH 021/286] copy `multi_window::Event` from `iced_winit` --- glutin/src/multi_window.rs | 264 +++++++++++++++++++++++++++++-- glutin/src/multi_window/state.rs | 241 ++++++++++++++++++++++++++++ 2 files changed, 491 insertions(+), 14 deletions(-) create mode 100644 glutin/src/multi_window/state.rs diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index c3b9e74f..4949219f 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -1,15 +1,18 @@ //! Create interactive, native cross-platform applications. +mod state; + +pub use state::State; + use crate::mouse; use crate::{Error, Executor, Runtime}; -pub use iced_winit::multi_window::{ - self, Application, Event, State, StyleSheet, -}; +pub use iced_winit::multi_window::{self, Application, StyleSheet}; use iced_winit::conversion; use iced_winit::futures; use iced_winit::futures::channel::mpsc; use iced_winit::renderer; +use iced_winit::settings; use iced_winit::user_interface; use iced_winit::window; use iced_winit::{Clipboard, Command, Debug, Proxy, Settings}; @@ -238,7 +241,7 @@ async fn run_instance( { let state = states.get(&window::Id::MAIN).unwrap(); - multi_window::run_command( + run_command( &application, &mut cache, state, @@ -324,7 +327,7 @@ async fn run_instance( .collect(); // Update application - multi_window::update( + update( &mut application, &mut cache, state, @@ -343,15 +346,13 @@ async fn run_instance( let should_exit = application.should_exit(); - interfaces = ManuallyDrop::new( - multi_window::build_user_interfaces( - &application, - &mut renderer, - &mut debug, - &states, - pure_states, - ), - ); + interfaces = ManuallyDrop::new(build_user_interfaces( + &application, + &mut renderer, + &mut debug, + &states, + pure_states, + )); if should_exit { break 'main; @@ -571,3 +572,238 @@ async fn run_instance( // Manually drop the user interface // drop(ManuallyDrop::into_inner(user_interface)); } + +/// TODO(derezzedex): +// This is the an wrapper around the `Application::Message` associate type +// to allows the `shell` to create internal messages, while still having +// the current user specified custom messages. +#[derive(Debug)] +pub enum Event { + /// An [`Application`] generated message + Application(Message), + + /// TODO(derezzedex) + // Create a wrapper variant of `window::Event` type instead + // (maybe we should also allow users to listen/react to those internal messages?) + NewWindow(window::Id, settings::Window), + /// TODO(derezzedex) + CloseWindow(window::Id), + /// TODO(derezzedex) + WindowCreated(window::Id, glutin::window::Window), +} + +/// Updates an [`Application`] by feeding it the provided messages, spawning any +/// resulting [`Command`], and tracking its [`Subscription`]. +pub fn update( + application: &mut A, + cache: &mut user_interface::Cache, + state: &State, + renderer: &mut A::Renderer, + runtime: &mut Runtime>, Event>, + clipboard: &mut Clipboard, + proxy: &mut glutin::event_loop::EventLoopProxy>, + debug: &mut Debug, + messages: &mut Vec, + windows: &HashMap, + graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, +) where + ::Theme: StyleSheet, +{ + for message in messages.drain(..) { + debug.log_message(&message); + + debug.update_started(); + let command = runtime.enter(|| application.update(message)); + debug.update_finished(); + + run_command( + application, + cache, + state, + renderer, + command, + runtime, + clipboard, + proxy, + debug, + windows, + graphics_info, + ); + } + + let subscription = application.subscription().map(Event::Application); + runtime.track(subscription); +} + +/// Runs the actions of a [`Command`]. +pub fn run_command( + application: &A, + cache: &mut user_interface::Cache, + state: &State, + renderer: &mut A::Renderer, + command: Command, + runtime: &mut Runtime>, Event>, + clipboard: &mut Clipboard, + proxy: &mut glutin::event_loop::EventLoopProxy>, + debug: &mut Debug, + windows: &HashMap, + _graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, +) where + A: Application, + E: Executor, + ::Theme: StyleSheet, +{ + use iced_native::command; + use iced_native::system; + use iced_native::window; + use iced_winit::clipboard; + use iced_winit::futures::FutureExt; + + for action in command.actions() { + match action { + command::Action::Future(future) => { + runtime.spawn(Box::pin(future.map(Event::Application))); + } + command::Action::Clipboard(action) => match action { + clipboard::Action::Read(tag) => { + let message = tag(clipboard.read()); + + proxy + .send_event(Event::Application(message)) + .expect("Send message to event loop"); + } + clipboard::Action::Write(contents) => { + clipboard.write(contents); + } + }, + command::Action::Window(id, action) => { + let window = windows.get(&id).expect("No window found"); + + match action { + window::Action::Resize { width, height } => { + window.set_inner_size(glutin::dpi::LogicalSize { + width, + height, + }); + } + window::Action::Move { x, y } => { + window.set_outer_position( + glutin::dpi::LogicalPosition { x, y }, + ); + } + window::Action::SetMode(mode) => { + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let mode = if window.is_visible().unwrap_or(true) { + conversion::mode(window.fullscreen()) + } else { + window::Mode::Hidden + }; + + proxy + .send_event(Event::Application(tag(mode))) + .expect("Send message to event loop"); + } + } + } + command::Action::System(action) => match action { + system::Action::QueryInformation(_tag) => { + #[cfg(feature = "iced_winit/system")] + { + let graphics_info = _graphics_info(); + let proxy = proxy.clone(); + + let _ = std::thread::spawn(move || { + let information = + crate::system::information(graphics_info); + + let message = _tag(information); + + proxy + .send_event(Event::Application(message)) + .expect("Send message to event loop") + }); + } + } + }, + command::Action::Widget(action) => { + use crate::widget::operation; + + let mut current_cache = std::mem::take(cache); + let mut current_operation = Some(action.into_operation()); + + let mut user_interface = multi_window::build_user_interface( + application, + current_cache, + renderer, + state.logical_size(), + debug, + window::Id::MAIN, // TODO(derezzedex): run the operation on every widget tree + ); + + while let Some(mut operation) = current_operation.take() { + user_interface.operate(renderer, operation.as_mut()); + + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + proxy + .send_event(Event::Application(message)) + .expect("Send message to event loop"); + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } + } + } + + current_cache = user_interface.into_cache(); + *cache = current_cache; + } + } + } +} + +/// TODO(derezzedex) +pub fn build_user_interfaces<'a, A>( + application: &'a A, + renderer: &mut A::Renderer, + debug: &mut Debug, + states: &HashMap>, + mut pure_states: HashMap, +) -> HashMap< + window::Id, + iced_winit::UserInterface< + 'a, + ::Message, + ::Renderer, + >, +> +where + A: Application + 'static, + ::Theme: StyleSheet, +{ + let mut interfaces = HashMap::new(); + + for (id, pure_state) in pure_states.drain() { + let state = &states.get(&id).unwrap(); + + let user_interface = multi_window::build_user_interface( + application, + pure_state, + renderer, + state.logical_size(), + debug, + id, + ); + + let _ = interfaces.insert(id, user_interface); + } + + interfaces +} diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs new file mode 100644 index 00000000..163f46bd --- /dev/null +++ b/glutin/src/multi_window/state.rs @@ -0,0 +1,241 @@ +use crate::application::{self, StyleSheet as _}; +use crate::conversion; +use crate::multi_window::{Application, Event}; +use crate::window; +use crate::{Color, Debug, Point, Size, Viewport}; + +use glutin::event::{Touch, WindowEvent}; +use glutin::event_loop::EventLoopProxy; +use glutin::window::Window; +use std::collections::HashMap; +use std::marker::PhantomData; + +/// The state of a windowed [`Application`]. +#[allow(missing_debug_implementations)] +pub struct State +where + ::Theme: application::StyleSheet, +{ + title: String, + scale_factor: f64, + viewport: Viewport, + viewport_changed: bool, + cursor_position: glutin::dpi::PhysicalPosition, + modifiers: glutin::event::ModifiersState, + theme: ::Theme, + appearance: iced_winit::application::Appearance, + application: PhantomData, +} + +impl State +where + ::Theme: application::StyleSheet, +{ + /// Creates a new [`State`] for the provided [`Application`] and window. + pub fn new(application: &A, window: &Window) -> Self { + let title = application.title(); + let scale_factor = application.scale_factor(); + let theme = application.theme(); + let appearance = theme.appearance(application.style()); + + let viewport = { + let physical_size = window.inner_size(); + + Viewport::with_physical_size( + Size::new(physical_size.width, physical_size.height), + window.scale_factor() * scale_factor, + ) + }; + + Self { + title, + scale_factor, + viewport, + viewport_changed: false, + // TODO: Encode cursor availability in the type-system + cursor_position: glutin::dpi::PhysicalPosition::new(-1.0, -1.0), + modifiers: glutin::event::ModifiersState::default(), + theme, + appearance, + application: PhantomData, + } + } + + /// Returns the current [`Viewport`] of the [`State`]. + pub fn viewport(&self) -> &Viewport { + &self.viewport + } + + /// TODO(derezzedex) + pub fn viewport_changed(&self) -> bool { + self.viewport_changed + } + + /// Returns the physical [`Size`] of the [`Viewport`] of the [`State`]. + pub fn physical_size(&self) -> Size { + self.viewport.physical_size() + } + + /// Returns the logical [`Size`] of the [`Viewport`] of the [`State`]. + pub fn logical_size(&self) -> Size { + self.viewport.logical_size() + } + + /// Returns the current scale factor of the [`Viewport`] of the [`State`]. + pub fn scale_factor(&self) -> f64 { + self.viewport.scale_factor() + } + + /// Returns the current cursor position of the [`State`]. + pub fn cursor_position(&self) -> Point { + conversion::cursor_position( + self.cursor_position, + self.viewport.scale_factor(), + ) + } + + /// Returns the current keyboard modifiers of the [`State`]. + pub fn modifiers(&self) -> glutin::event::ModifiersState { + self.modifiers + } + + /// Returns the current theme of the [`State`]. + pub fn theme(&self) -> &::Theme { + &self.theme + } + + /// Returns the current background [`Color`] of the [`State`]. + pub fn background_color(&self) -> Color { + self.appearance.background_color + } + + /// Returns the current text [`Color`] of the [`State`]. + pub fn text_color(&self) -> Color { + self.appearance.text_color + } + + /// Processes the provided window event and updates the [`State`] + /// accordingly. + pub fn update( + &mut self, + window: &Window, + event: &WindowEvent<'_>, + _debug: &mut Debug, + ) { + match event { + WindowEvent::Resized(new_size) => { + let size = Size::new(new_size.width, new_size.height); + + self.viewport = Viewport::with_physical_size( + size, + window.scale_factor() * self.scale_factor, + ); + + self.viewport_changed = true; + } + WindowEvent::ScaleFactorChanged { + scale_factor: new_scale_factor, + new_inner_size, + } => { + let size = + Size::new(new_inner_size.width, new_inner_size.height); + + self.viewport = Viewport::with_physical_size( + size, + new_scale_factor * self.scale_factor, + ); + + self.viewport_changed = true; + } + WindowEvent::CursorMoved { position, .. } + | WindowEvent::Touch(Touch { + location: position, .. + }) => { + self.cursor_position = *position; + } + WindowEvent::CursorLeft { .. } => { + // TODO: Encode cursor availability in the type-system + self.cursor_position = + glutin::dpi::PhysicalPosition::new(-1.0, -1.0); + } + WindowEvent::ModifiersChanged(new_modifiers) => { + self.modifiers = *new_modifiers; + } + #[cfg(feature = "debug")] + WindowEvent::KeyboardInput { + input: + glutin::event::KeyboardInput { + virtual_keycode: + Some(glutin::event::VirtualKeyCode::F12), + state: glutin::event::ElementState::Pressed, + .. + }, + .. + } => _debug.toggle(), + _ => {} + } + } + + /// Synchronizes the [`State`] with its [`Application`] and its respective + /// window. + /// + /// Normally an [`Application`] should be synchronized with its [`State`] + /// and window after calling [`Application::update`]. + /// + /// [`Application::update`]: crate::Program::update + pub fn synchronize( + &mut self, + application: &A, + windows: &HashMap, + proxy: &EventLoopProxy>, + ) { + let new_windows = application.windows(); + + // Check for windows to close + for window_id in windows.keys() { + if !new_windows.iter().any(|(id, _)| id == window_id) { + proxy + .send_event(Event::CloseWindow(*window_id)) + .expect("Failed to send message"); + } + } + + // Check for windows to spawn + for (id, settings) in new_windows { + if !windows.contains_key(&id) { + proxy + .send_event(Event::NewWindow(id, settings)) + .expect("Failed to send message"); + } + } + + let window = windows.values().next().expect("No window found"); + + // Update window title + let new_title = application.title(); + + if self.title != new_title { + window.set_title(&new_title); + + self.title = new_title; + } + + // Update scale factor + let new_scale_factor = application.scale_factor(); + + if self.scale_factor != new_scale_factor { + let size = window.inner_size(); + + self.viewport = Viewport::with_physical_size( + Size::new(size.width, size.height), + window.scale_factor() * new_scale_factor, + ); + + self.scale_factor = new_scale_factor; + } + + // Update theme and appearance + self.theme = application.theme(); + self.appearance = self.theme.appearance(application.style()); + } +} From a386788b67bf4e008916e79a8c7dd7289a3ab3cd Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 28 Sep 2022 19:10:47 -0300 Subject: [PATCH 022/286] use `glutin/multi_window` branch --- examples/integration_opengl/src/main.rs | 4 +-- glutin/Cargo.toml | 4 +-- glutin/src/application.rs | 6 ++-- glutin/src/multi_window.rs | 38 ++++++++++++++----------- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs index 56470190..a9e9c732 100644 --- a/examples/integration_opengl/src/main.rs +++ b/examples/integration_opengl/src/main.rs @@ -31,7 +31,7 @@ pub fn main() { .unwrap(); unsafe { - let windowed_context = windowed_context.make_current().unwrap(); + let windowed_context = windowed_context.make_current(todo!("derezzedex")).unwrap(); let gl = glow::Context::from_loader_function(|s| { windowed_context.get_proc_address(s) as *const _ @@ -181,7 +181,7 @@ pub fn main() { ), ); - windowed_context.swap_buffers().unwrap(); + windowed_context.swap_buffers(todo!("derezzedex")).unwrap(); } _ => (), } diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 2960a0bd..75a38d22 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -21,8 +21,8 @@ version = "0.4" [dependencies.glutin] version = "0.29" -git = "https://github.com/iced-rs/glutin" -rev = "da8d291486b4c9bec12487a46c119c4b1d386abf" +git = "https://github.com/derezzedex/glutin" +rev = "e72ea919f95106cfdfdce3e7dcfdbf71a432840a" [dependencies.iced_native] version = "0.7" diff --git a/glutin/src/application.rs b/glutin/src/application.rs index 108d7ffa..7ff6216e 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -120,7 +120,7 @@ where #[allow(unsafe_code)] unsafe { - context.make_current().expect("Make OpenGL context current") + context.make_current(todo!()).expect("Make OpenGL context current") } }; @@ -359,7 +359,7 @@ async fn run_instance( unsafe { if !context.is_current() { context = context - .make_current() + .make_current(todo!()) .expect("Make OpenGL context current"); } } @@ -415,7 +415,7 @@ async fn run_instance( &debug.overlay(), ); - context.swap_buffers().expect("Swap buffers"); + context.swap_buffers(todo!()).expect("Swap buffers"); debug.render_finished(); diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 4949219f..ce34aa31 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -58,7 +58,7 @@ where runtime.enter(|| A::new(flags)) }; - let context = { + let (context, window) = { let builder = settings.window.into_builder( &application.title(), event_loop.primary_monitor(), @@ -115,7 +115,14 @@ where #[allow(unsafe_code)] unsafe { - context.make_current().expect("Make OpenGL context current") + let (context, window) = context.split(); + + ( + context + .make_current(&window) + .expect("Make OpenGL context current"), + window, + ) } }; @@ -137,6 +144,7 @@ where debug, receiver, context, + window, init_command, settings.exit_on_close_request, )); @@ -205,7 +213,8 @@ async fn run_instance( mut receiver: mpsc::UnboundedReceiver< glutin::event::Event<'_, Event>, >, - context: glutin::ContextWrapper, + mut context: glutin::RawContext, + window: Window, init_command: Command, _exit_on_close_request: bool, ) where @@ -217,9 +226,9 @@ async fn run_instance( use glutin::event; use iced_winit::futures::stream::StreamExt; - let mut clipboard = Clipboard::connect(context.window()); + let mut clipboard = Clipboard::connect(&window); let mut cache = user_interface::Cache::default(); - let state = State::new(&application, context.window()); + let state = State::new(&application, &window); let user_interface = multi_window::build_user_interface( &application, user_interface::Cache::default(), @@ -229,9 +238,7 @@ async fn run_instance( window::Id::MAIN, ); - #[allow(unsafe_code)] - let (mut context, window) = unsafe { context.split() }; - + let mut current_context_window = window.id(); let mut window_ids = HashMap::from([(window.id(), window::Id::MAIN)]); let mut windows = HashMap::from([(window::Id::MAIN, window)]); let mut states = HashMap::from([(window::Id::MAIN, state)]); @@ -445,15 +452,19 @@ async fn run_instance( .get(&id) .and_then(|id| states.get_mut(id)) .unwrap(); + let window = + window_ids.get(&id).and_then(|id| windows.get(id)).unwrap(); debug.render_started(); #[allow(unsafe_code)] unsafe { - if !context.is_current() { + if current_context_window != id { context = context - .make_current() + .make_current(window) .expect("Make OpenGL context current"); + + current_context_window = id; } } @@ -483,11 +494,6 @@ async fn run_instance( debug.draw_finished(); if new_mouse_interaction != mouse_interaction { - let window = window_ids - .get(&id) - .and_then(|id| windows.get_mut(id)) - .unwrap(); - window.set_cursor_icon(conversion::mouse_interaction( new_mouse_interaction, )); @@ -513,7 +519,7 @@ async fn run_instance( &debug.overlay(), ); - context.swap_buffers().expect("Swap buffers"); + context.swap_buffers(window).expect("Swap buffers"); debug.render_finished(); From 1bc0c480f9747826b244c30e92d8c4a29b576e4a Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 19 Oct 2022 22:56:00 -0300 Subject: [PATCH 023/286] move window settings to `iced_native` --- examples/integration_opengl/src/main.rs | 3 +- glutin/src/application.rs | 4 ++- native/src/window.rs | 4 +++ native/src/window/icon.rs | 12 ++++++++ {winit/src => native/src/window}/position.rs | 0 {src => native/src}/window/settings.rs | 18 ----------- src/window.rs | 11 ++----- src/window/position.rs | 32 -------------------- {src/window => winit/src}/icon.rs | 21 ++++++++----- winit/src/lib.rs | 5 +-- winit/src/settings.rs | 21 +++++++++++++ 11 files changed, 62 insertions(+), 69 deletions(-) create mode 100644 native/src/window/icon.rs rename {winit/src => native/src/window}/position.rs (100%) rename {src => native/src}/window/settings.rs (67%) delete mode 100644 src/window/position.rs rename {src/window => winit/src}/icon.rs (90%) diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs index a9e9c732..fdbd7369 100644 --- a/examples/integration_opengl/src/main.rs +++ b/examples/integration_opengl/src/main.rs @@ -31,7 +31,8 @@ pub fn main() { .unwrap(); unsafe { - let windowed_context = windowed_context.make_current(todo!("derezzedex")).unwrap(); + let windowed_context = + windowed_context.make_current(todo!("derezzedex")).unwrap(); let gl = glow::Context::from_loader_function(|s| { windowed_context.get_proc_address(s) as *const _ diff --git a/glutin/src/application.rs b/glutin/src/application.rs index 7ff6216e..cbb23891 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -120,7 +120,9 @@ where #[allow(unsafe_code)] unsafe { - context.make_current(todo!()).expect("Make OpenGL context current") + context + .make_current(todo!()) + .expect("Make OpenGL context current") } }; diff --git a/native/src/window.rs b/native/src/window.rs index dc9e2d66..1c03fcdf 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -1,12 +1,16 @@ //! Build window-based GUI applications. mod action; mod event; +mod icon; mod id; mod mode; mod user_attention; pub use action::Action; pub use event::Event; +pub use icon::Icon; pub use id::Id; pub use mode::Mode; pub use user_attention::UserAttention; +pub use position::Position; +pub use settings::Settings; diff --git a/native/src/window/icon.rs b/native/src/window/icon.rs new file mode 100644 index 00000000..e89baf03 --- /dev/null +++ b/native/src/window/icon.rs @@ -0,0 +1,12 @@ +//! Attach an icon to the window of your application. + +/// The icon of a window. +#[derive(Debug, Clone)] +pub struct Icon { + /// TODO(derezzedex) + pub rgba: Vec, + /// TODO(derezzedex) + pub width: u32, + /// TODO(derezzedex) + pub height: u32, +} diff --git a/winit/src/position.rs b/native/src/window/position.rs similarity index 100% rename from winit/src/position.rs rename to native/src/window/position.rs diff --git a/src/window/settings.rs b/native/src/window/settings.rs similarity index 67% rename from src/window/settings.rs rename to native/src/window/settings.rs index 24d0f4f9..67798fbe 100644 --- a/src/window/settings.rs +++ b/native/src/window/settings.rs @@ -50,21 +50,3 @@ impl Default for Settings { } } } - -impl From for iced_winit::settings::Window { - fn from(settings: Settings) -> Self { - Self { - size: settings.size, - position: iced_winit::Position::from(settings.position), - min_size: settings.min_size, - max_size: settings.max_size, - visible: settings.visible, - resizable: settings.resizable, - decorations: settings.decorations, - transparent: settings.transparent, - always_on_top: settings.always_on_top, - icon: settings.icon.map(Icon::into), - platform_specific: Default::default(), - } - } -} diff --git a/src/window.rs b/src/window.rs index 2018053f..73e90243 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,12 +1,7 @@ //! Configure the window of your application in native platforms. -mod position; -mod settings; - -pub mod icon; - -pub use icon::Icon; -pub use position::Position; -pub use settings::Settings; +pub use iced_native::window::Icon; +pub use iced_native::window::Position; +pub use iced_native::window::Settings; #[cfg(not(target_arch = "wasm32"))] pub use crate::runtime::window::*; diff --git a/src/window/position.rs b/src/window/position.rs deleted file mode 100644 index 6b9fac41..00000000 --- a/src/window/position.rs +++ /dev/null @@ -1,32 +0,0 @@ -/// The position of a window in a given screen. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Position { - /// The platform-specific default position for a new window. - Default, - /// The window is completely centered on the screen. - Centered, - /// The window is positioned with specific coordinates: `(X, Y)`. - /// - /// When the decorations of the window are enabled, Windows 10 will add some - /// invisible padding to the window. This padding gets included in the - /// position. So if you have decorations enabled and want the window to be - /// at (0, 0) you would have to set the position to - /// `(PADDING_X, PADDING_Y)`. - Specific(i32, i32), -} - -impl Default for Position { - fn default() -> Self { - Self::Default - } -} - -impl From for iced_winit::Position { - fn from(position: Position) -> Self { - match position { - Position::Default => Self::Default, - Position::Centered => Self::Centered, - Position::Specific(x, y) => Self::Specific(x, y), - } - } -} diff --git a/src/window/icon.rs b/winit/src/icon.rs similarity index 90% rename from src/window/icon.rs rename to winit/src/icon.rs index bacad41a..84b88b39 100644 --- a/src/window/icon.rs +++ b/winit/src/icon.rs @@ -7,7 +7,7 @@ use std::path::Path; /// The icon of a window. #[derive(Debug, Clone)] -pub struct Icon(iced_winit::winit::window::Icon); +pub struct Icon(winit::window::Icon); impl Icon { /// Creates an icon from 32bpp RGBA data. @@ -16,8 +16,7 @@ impl Icon { width: u32, height: u32, ) -> Result { - let raw = - iced_winit::winit::window::Icon::from_rgba(rgba, width, height)?; + let raw = winit::window::Icon::from_rgba(rgba, width, height)?; Ok(Icon(raw)) } @@ -91,9 +90,9 @@ impl From for Error { } } -impl From for Error { - fn from(error: iced_winit::winit::window::BadIcon) -> Self { - use iced_winit::winit::window::BadIcon; +impl From for Error { + fn from(error: winit::window::BadIcon) -> Self { + use winit::window::BadIcon; match error { BadIcon::ByteCountNotDivisibleBy4 { byte_count } => { @@ -114,7 +113,7 @@ impl From for Error { } } -impl From for iced_winit::winit::window::Icon { +impl From for winit::window::Icon { fn from(icon: Icon) -> Self { icon.0 } @@ -170,3 +169,11 @@ impl std::error::Error for Error { Some(self) } } + +impl TryFrom for Icon { + type Error = Error; + + fn try_from(icon: iced_native::window::Icon) -> Result { + Icon::from_rgba(icon.rgba, icon.width, icon.height) + } +} diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 9b3c0a02..eb58482b 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -49,7 +49,7 @@ pub mod window; pub mod system; mod error; -mod position; +mod icon; mod proxy; #[cfg(feature = "application")] @@ -58,8 +58,9 @@ pub use application::Application; pub use application::Profiler; pub use clipboard::Clipboard; pub use error::Error; -pub use position::Position; +pub use icon::Icon; pub use proxy::Proxy; pub use settings::Settings; pub use iced_graphics::Viewport; +pub use iced_native::window::Position; diff --git a/winit/src/settings.rs b/winit/src/settings.rs index ea0ba361..78c8c156 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -22,6 +22,7 @@ mod platform; pub use platform::PlatformSpecific; use crate::conversion; +use crate::Icon; use crate::Position; use winit::monitor::MonitorHandle; use winit::window::WindowBuilder; @@ -201,3 +202,23 @@ impl Default for Window { } } } + +impl From for Window { + fn from(settings: iced_native::window::Settings) -> Self { + Self { + size: settings.size, + position: Position::from(settings.position), + min_size: settings.min_size, + max_size: settings.max_size, + visible: settings.visible, + resizable: settings.resizable, + decorations: settings.decorations, + transparent: settings.transparent, + always_on_top: settings.always_on_top, + icon: settings.icon.and_then(|icon| { + Icon::try_from(icon).map(winit::window::Icon::from).ok() + }), + platform_specific: Default::default(), + } + } +} From f93fa0254329ebddca21ea1a79bd8ee6d8b4bdaf Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 19 Oct 2022 23:33:20 -0300 Subject: [PATCH 024/286] introduce `window::spawn` and `window::close` --- glutin/src/multi_window.rs | 79 +++++++++++++++++++++---------------- native/src/window/action.rs | 15 +++++-- winit/src/application.rs | 5 +++ winit/src/multi_window.rs | 79 +++++++++++++++++++++---------------- winit/src/window.rs | 16 ++++++++ 5 files changed, 123 insertions(+), 71 deletions(-) diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index ce34aa31..2a66a816 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -682,41 +682,52 @@ pub fn run_command( clipboard.write(contents); } }, - command::Action::Window(id, action) => { - let window = windows.get(&id).expect("No window found"); - - match action { - window::Action::Resize { width, height } => { - window.set_inner_size(glutin::dpi::LogicalSize { - width, - height, - }); - } - window::Action::Move { x, y } => { - window.set_outer_position( - glutin::dpi::LogicalPosition { x, y }, - ); - } - window::Action::SetMode(mode) => { - window.set_visible(conversion::visible(mode)); - window.set_fullscreen(conversion::fullscreen( - window.primary_monitor(), - mode, - )); - } - window::Action::FetchMode(tag) => { - let mode = if window.is_visible().unwrap_or(true) { - conversion::mode(window.fullscreen()) - } else { - window::Mode::Hidden - }; - - proxy - .send_event(Event::Application(tag(mode))) - .expect("Send message to event loop"); - } + command::Action::Window(id, action) => match action { + window::Action::Spawn { settings } => { + proxy + .send_event(Event::NewWindow(id, settings.into())) + .expect("Send message to event loop"); } - } + window::Action::Close => { + proxy + .send_event(Event::CloseWindow(id)) + .expect("Send message to event loop"); + } + window::Action::Resize { width, height } => { + let window = windows.get(&id).expect("No window found"); + window.set_inner_size(glutin::dpi::LogicalSize { + width, + height, + }); + } + window::Action::Move { x, y } => { + let window = windows.get(&id).expect("No window found"); + window.set_outer_position(glutin::dpi::LogicalPosition { + x, + y, + }); + } + window::Action::SetMode(mode) => { + let window = windows.get(&id).expect("No window found"); + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let window = windows.get(&id).expect("No window found"); + let mode = if window.is_visible().unwrap_or(true) { + conversion::mode(window.fullscreen()) + } else { + window::Mode::Hidden + }; + + proxy + .send_event(Event::Application(tag(mode))) + .expect("Send message to event loop"); + } + }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { #[cfg(feature = "iced_winit/system")] diff --git a/native/src/window/action.rs b/native/src/window/action.rs index 37fcc273..0587f25c 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::window::{Mode, UserAttention}; +use crate::window::{self, Mode, UserAttention}; use iced_futures::MaybeSend; use std::fmt; @@ -13,6 +13,11 @@ pub enum Action { /// There’s no guarantee that this will work unless the left mouse /// button was pressed immediately before this function is called. Drag, + /// TODO(derezzedex) + Spawn { + /// TODO(derezzedex) + settings: window::Settings, + }, /// Resize the window. Resize { /// The new logical width of the window @@ -34,9 +39,9 @@ pub enum Action { y: i32, }, /// Set the [`Mode`] of the window. - SetMode(Mode), + SetMode(window::Mode), /// Fetch the current [`Mode`] of the window. - FetchMode(Box T + 'static>), + FetchMode(Box T + 'static>), /// Sets the window to maximized or back ToggleMaximize, /// Toggles whether window has decorations @@ -81,6 +86,7 @@ impl Action { T: 'static, { match self { + Self::Spawn { settings } => Action::Spawn { settings }, Self::Close => Action::Close, Self::Drag => Action::Drag, Self::Resize { width, height } => Action::Resize { width, height }, @@ -104,6 +110,9 @@ impl fmt::Debug for Action { match self { Self::Close => write!(f, "Action::Close"), Self::Drag => write!(f, "Action::Drag"), + Self::Spawn { settings } => { + write!(f, "Action::Spawn {{ settings: {:?} }}", settings) + } Self::Resize { width, height } => write!( f, "Action::Resize {{ widget: {}, height: {} }}", diff --git a/winit/src/application.rs b/winit/src/application.rs index 4486f5d9..910f3d94 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -675,6 +675,11 @@ pub fn run_command( window::Action::Drag => { let _res = window.drag_window(); } + window::Action::Spawn { .. } | window::Action::Close => { + log::info!( + "This is only available on `multi_window::Application`" + ) + } window::Action::Resize { width, height } => { window.set_inner_size(winit::dpi::LogicalSize { width, diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 9f46b88d..1d71d801 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -855,41 +855,52 @@ pub fn run_command( clipboard.write(contents); } }, - command::Action::Window(id, action) => { - let window = windows.get(&id).expect("No window found"); - - match action { - window::Action::Resize { width, height } => { - window.set_inner_size(winit::dpi::LogicalSize { - width, - height, - }); - } - window::Action::Move { x, y } => { - window.set_outer_position( - winit::dpi::LogicalPosition { x, y }, - ); - } - window::Action::SetMode(mode) => { - window.set_visible(conversion::visible(mode)); - window.set_fullscreen(conversion::fullscreen( - window.primary_monitor(), - mode, - )); - } - window::Action::FetchMode(tag) => { - let mode = if window.is_visible().unwrap_or(true) { - conversion::mode(window.fullscreen()) - } else { - window::Mode::Hidden - }; - - proxy - .send_event(Event::Application(tag(mode))) - .expect("Send message to event loop"); - } + command::Action::Window(id, action) => match action { + window::Action::Spawn { settings } => { + proxy + .send_event(Event::NewWindow(id, settings.into())) + .expect("Send message to event loop"); } - } + window::Action::Close => { + proxy + .send_event(Event::CloseWindow(id)) + .expect("Send message to event loop"); + } + window::Action::Resize { width, height } => { + let window = windows.get(&id).expect("No window found"); + window.set_inner_size(winit::dpi::LogicalSize { + width, + height, + }); + } + window::Action::Move { x, y } => { + let window = windows.get(&id).expect("No window found"); + window.set_outer_position(winit::dpi::LogicalPosition { + x, + y, + }); + } + window::Action::SetMode(mode) => { + let window = windows.get(&id).expect("No window found"); + window.set_visible(conversion::visible(mode)); + window.set_fullscreen(conversion::fullscreen( + window.primary_monitor(), + mode, + )); + } + window::Action::FetchMode(tag) => { + let window = windows.get(&id).expect("No window found"); + let mode = if window.is_visible().unwrap_or(true) { + conversion::mode(window.fullscreen()) + } else { + window::Mode::Hidden + }; + + proxy + .send_event(Event::Application(tag(mode))) + .expect("Send message to event loop"); + } + }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { #[cfg(feature = "system")] diff --git a/winit/src/window.rs b/winit/src/window.rs index d9bc0d83..fba863ef 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -14,6 +14,22 @@ pub fn drag() -> Command { Command::single(command::Action::Window(window::Action::Drag)) } +/// TODO(derezzedex) +pub fn spawn( + id: window::Id, + settings: window::Settings, +) -> Command { + Command::single(command::Action::Window( + id, + window::Action::Spawn { settings }, + )) +} + +/// TODO(derezzedex) +pub fn close(id: window::Id) -> Command { + Command::single(command::Action::Window(id, window::Action::Close)) +} + /// Resizes the window to the given logical dimensions. pub fn resize( id: window::Id, From aa7164fdde0cf879139e457555c3985d4e9111f0 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 31 Oct 2022 16:57:57 -0300 Subject: [PATCH 025/286] update `glutin` to 0.30 --- glutin/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 75a38d22..addaa16c 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -20,9 +20,9 @@ multi_window = ["iced_winit/multi_window"] version = "0.4" [dependencies.glutin] -version = "0.29" +version = "0.30" git = "https://github.com/derezzedex/glutin" -rev = "e72ea919f95106cfdfdce3e7dcfdbf71a432840a" +rev = "2a2a97209c49929027beced68e1989b8486bdec9" [dependencies.iced_native] version = "0.7" From 0553062be1898873fb057c0446b772ab07b551e5 Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 31 Oct 2022 20:23:24 -0300 Subject: [PATCH 026/286] update `iced_glutin` to use new surface api --- glutin/Cargo.toml | 3 + glutin/src/application.rs | 346 ++++++++++++++++++++++++++++---------- 2 files changed, 258 insertions(+), 91 deletions(-) diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index addaa16c..70820780 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -16,6 +16,9 @@ debug = ["iced_winit/debug"] system = ["iced_winit/system"] multi_window = ["iced_winit/multi_window"] +[dependencies.raw-window-handle] +version = "0.5.0" + [dependencies.log] version = "0.4" diff --git a/glutin/src/application.rs b/glutin/src/application.rs index cbb23891..45ff37f0 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -12,14 +12,33 @@ use iced_winit::futures; use iced_winit::futures::channel::mpsc; use iced_winit::renderer; use iced_winit::user_interface; +use iced_winit::winit; use iced_winit::{Clipboard, Command, Debug, Proxy, Settings}; -use glutin::window::Window; +use glutin::config::{ + Config, ConfigSurfaceTypes, ConfigTemplateBuilder, GlConfig, +}; +use glutin::context::{ + ContextApi, ContextAttributesBuilder, NotCurrentContext, + NotCurrentGlContextSurfaceAccessor, + PossiblyCurrentContextGlSurfaceAccessor, PossiblyCurrentGlContext, +}; +use glutin::display::{Display, DisplayApiPreference, GlDisplay}; +use glutin::surface::{ + GlSurface, Surface, SurfaceAttributesBuilder, WindowSurface, +}; +use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; + +use std::ffi::CString; use std::mem::ManuallyDrop; +use std::num::NonZeroU32; #[cfg(feature = "tracing")] use tracing::{info_span, instrument::Instrument}; +#[allow(unsafe_code)] +const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; + /// Runs an [`Application`] with an executor, compositor, and the provided /// settings. pub fn run( @@ -34,9 +53,8 @@ where { use futures::task; use futures::Future; - use glutin::event_loop::EventLoopBuilder; - use glutin::platform::run_return::EventLoopExtRunReturn; - use glutin::ContextBuilder; + use winit::event_loop::EventLoopBuilder; + use winit::platform::run_return::EventLoopExtRunReturn; #[cfg(feature = "trace")] let _guard = iced_winit::Profiler::init(); @@ -63,76 +81,216 @@ where runtime.enter(|| A::new(flags)) }; - let context = { - let builder = settings.window.into_builder( - &application.title(), - event_loop.primary_monitor(), - settings.id, - ); + let builder = settings.window.into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ); - log::info!("Window builder: {:#?}", builder); + log::info!("Window builder: {:#?}", builder); - let opengl_builder = ContextBuilder::new() - .with_vsync(true) - .with_multisampling(C::sample_count(&compositor_settings) as u16); + #[allow(unsafe_code)] + let (display, window, surface, context) = unsafe { + struct Configuration(Config); + use std::fmt; + impl fmt::Debug for Configuration { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let config = &self.0; - let opengles_builder = opengl_builder.clone().with_gl( - glutin::GlRequest::Specific(glutin::Api::OpenGlEs, (2, 0)), - ); + f.debug_struct("Configuration") + .field("raw", &config) + .field("samples", &config.num_samples()) + .field("buffer_type", &config.color_buffer_type()) + .field("surface_type", &config.config_surface_types()) + .field("depth", &config.depth_size()) + .field("alpha", &config.alpha_size()) + .field("stencil", &config.stencil_size()) + .field("float_pixels", &config.float_pixels()) + .field("srgb", &config.srgb_capable()) + .field("api", &config.api()) + .finish() + } + } - let (first_builder, second_builder) = if settings.try_opengles_first { - (opengles_builder, opengl_builder) - } else { - (opengl_builder, opengles_builder) + impl AsRef for Configuration { + fn as_ref(&self) -> &Config { + &self.0 + } + } + + let display_handle = event_loop.raw_display_handle(); + + #[cfg(all( + any(windows, target_os = "macos"), + not(target_arch = "wasm32") + ))] + let (window, window_handle) = { + let window = builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?; + + let handle = window.raw_window_handle(); + + (window, handle) }; - log::info!("Trying first builder: {:#?}", first_builder); + #[cfg(target_arch = "wasm32")] + let preference = Err(Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "target not supported by backend" + )), + ))?; - let context = first_builder - .build_windowed(builder.clone(), &event_loop) - .or_else(|_| { - log::info!("Trying second builder: {:#?}", second_builder); - second_builder.build_windowed(builder, &event_loop) - }) - .map_err(|error| { - use glutin::CreationError; - use iced_graphics::Error as ContextError; + #[cfg(all(windows, not(target_arch = "wasm32")))] + let preference = DisplayApiPreference::WglThenEgl(Some(window_handle)); - match error { - CreationError::Window(error) => { - Error::WindowCreationFailed(error) - } - CreationError::OpenGlVersionNotSupported => { - Error::GraphicsCreationFailed( - ContextError::VersionNotSupported, - ) - } - CreationError::NoAvailablePixelFormat => { - Error::GraphicsCreationFailed( - ContextError::NoAvailablePixelFormat, - ) - } - error => Error::GraphicsCreationFailed( - ContextError::BackendError(error.to_string()), - ), - } + #[cfg(all(target_os = "macos", not(target_arch = "wasm32")))] + let preference = DisplayApiPreference::Cgl; + + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_arch = "wasm32") + ))] + let preference = DisplayApiPreference::GlxThenEgl(Box::new( + winit::platform::unix::register_xlib_error_hook, + )); + + let display = + Display::new(display_handle, preference).map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create display: {error}" + )), + ) })?; - #[allow(unsafe_code)] - unsafe { - context - .make_current(todo!()) - .expect("Make OpenGL context current") + log::debug!("Display: {}", display.version_string()); + + let samples = C::sample_count(&compositor_settings) as u8; + let mut template = ConfigTemplateBuilder::new() + .with_surface_type(ConfigSurfaceTypes::WINDOW); + + if samples != 0 { + template = template.with_multisampling(samples); } + + #[cfg(all(windows, not(target_arch = "wasm32")))] + let template = template.compatible_with_native_window(window_handle); + + log::debug!("Searching for display configurations"); + let configuration = display + .find_configs(template.build()) + .map_err(|_| { + Error::GraphicsCreationFailed( + iced_graphics::Error::NoAvailablePixelFormat, + ) + })? + .map(Configuration) + .inspect(|config| { + log::trace!("{config:#?}"); + }) + .min_by_key(|config| { + config.as_ref().num_samples().saturating_sub(samples) + }) + .ok_or(Error::GraphicsCreationFailed( + iced_graphics::Error::NoAvailablePixelFormat, + ))?; + + log::debug!("Selected: {configuration:#?}"); + + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_arch = "wasm32") + ))] + let (window, window_handle) = { + use glutin::platform::x11::X11GlConfigExt; + let builder = + if let Some(visual) = configuration.as_ref().x11_visual() { + use winit::platform::unix::WindowBuilderExtUnix; + builder.with_x11_visual(visual.into_raw()) + } else { + builder + }; + + let window = builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?; + + let handle = window.raw_window_handle(); + + (window, handle) + }; + + let attributes = + ContextAttributesBuilder::new().build(Some(window_handle)); + let fallback_attributes = ContextAttributesBuilder::new() + .with_context_api(ContextApi::Gles(None)) + .build(Some(window_handle)); + + let context = display + .create_context(configuration.as_ref(), &attributes) + .or_else(|_| { + display.create_context( + configuration.as_ref(), + &fallback_attributes, + ) + }) + .map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create context: {error}" + )), + ) + })?; + + let (width, height) = window.inner_size().into(); + let surface_attributes = + SurfaceAttributesBuilder::::new() + .with_srgb(Some(true)) + .build( + window_handle, + NonZeroU32::new(width).unwrap_or(ONE), + NonZeroU32::new(height).unwrap_or(ONE), + ); + + let surface = display + .create_window_surface(configuration.as_ref(), &surface_attributes) + .map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create surface: {error}" + )), + ) + })?; + + let context = { + context + .make_current(&surface) + .expect("make context current") + }; + + if let Err(error) = surface.set_swap_interval( + &context, + glutin::surface::SwapInterval::Wait(ONE), + ) { + log::error!("set swap interval failed: {}", error); + } + + (display, window, surface, context) }; #[allow(unsafe_code)] let (compositor, renderer) = unsafe { C::new(compositor_settings, |address| { - context.get_proc_address(address) + let address = CString::new(address).expect("address error"); + display.get_proc_address(address.as_c_str()) })? }; + let context = { context.make_not_current().expect("make context current") }; + let (mut sender, receiver) = mpsc::unbounded(); let mut instance = Box::pin({ @@ -144,6 +302,8 @@ where proxy, debug, receiver, + window, + surface, context, init_command, settings.exit_on_close_request, @@ -159,22 +319,22 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); let _ = event_loop.run_return(move |event, _, control_flow| { - use glutin::event_loop::ControlFlow; + use winit::event_loop::ControlFlow; if let ControlFlow::ExitWithCode(_) = control_flow { return; } let event = match event { - glutin::event::Event::WindowEvent { + winit::event::Event::WindowEvent { event: - glutin::event::WindowEvent::ScaleFactorChanged { + winit::event::WindowEvent::ScaleFactorChanged { new_inner_size, .. }, window_id, - } => Some(glutin::event::Event::WindowEvent { - event: glutin::event::WindowEvent::Resized(*new_inner_size), + } => Some(winit::event::Event::WindowEvent { + event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), _ => event.to_static(), @@ -200,10 +360,12 @@ async fn run_instance( mut compositor: C, mut renderer: A::Renderer, mut runtime: Runtime, A::Message>, - mut proxy: glutin::event_loop::EventLoopProxy, + mut proxy: winit::event_loop::EventLoopProxy, mut debug: Debug, - mut receiver: mpsc::UnboundedReceiver>, - mut context: glutin::ContextWrapper, + mut receiver: mpsc::UnboundedReceiver>, + window: winit::window::Window, + surface: Surface, + context: NotCurrentContext, init_command: Command, exit_on_close_request: bool, ) where @@ -212,12 +374,18 @@ async fn run_instance( C: window::GLCompositor + 'static, ::Theme: StyleSheet, { - use glutin::event; use iced_winit::futures::stream::StreamExt; + use winit::event; - let mut clipboard = Clipboard::connect(context.window()); + let context = { + context + .make_current(&surface) + .expect("make context current") + }; + + let mut clipboard = Clipboard::connect(&window); let mut cache = user_interface::Cache::default(); - let mut state = application::State::new(&application, context.window()); + let mut state = application::State::new(&application, &window); let mut viewport_version = state.viewport_version(); let mut should_exit = false; @@ -232,7 +400,7 @@ async fn run_instance( &mut should_exit, &mut proxy, &mut debug, - context.window(), + &window, || compositor.fetch_information(), ); runtime.track(application.subscription()); @@ -296,12 +464,12 @@ async fn run_instance( &mut proxy, &mut debug, &mut messages, - context.window(), + &window, || compositor.fetch_information(), ); // Update window - state.synchronize(&application, context.window()); + state.synchronize(&application, &window); user_interface = ManuallyDrop::new(application::build_user_interface( @@ -329,14 +497,14 @@ async fn run_instance( debug.draw_finished(); if new_mouse_interaction != mouse_interaction { - context.window().set_cursor_icon( - conversion::mouse_interaction(new_mouse_interaction), - ); + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); mouse_interaction = new_mouse_interaction; } - context.window().request_redraw(); + window.request_redraw(); } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), @@ -357,13 +525,10 @@ async fn run_instance( debug.render_started(); - #[allow(unsafe_code)] - unsafe { - if !context.is_current() { - context = context - .make_current(todo!()) - .expect("Make OpenGL context current"); - } + if !context.is_current() { + context + .make_current(&surface) + .expect("Make OpenGL context current"); } let current_viewport_version = state.viewport_version(); @@ -391,19 +556,18 @@ async fn run_instance( debug.draw_finished(); if new_mouse_interaction != mouse_interaction { - context.window().set_cursor_icon( - conversion::mouse_interaction( - new_mouse_interaction, - ), - ); + window.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); mouse_interaction = new_mouse_interaction; } - context.resize(glutin::dpi::PhysicalSize::new( - physical_size.width, - physical_size.height, - )); + surface.resize( + &context, + NonZeroU32::new(physical_size.width).unwrap_or(ONE), + NonZeroU32::new(physical_size.height).unwrap_or(ONE), + ); compositor.resize_viewport(physical_size); @@ -417,7 +581,7 @@ async fn run_instance( &debug.overlay(), ); - context.swap_buffers(todo!()).expect("Swap buffers"); + surface.swap_buffers(&context).expect("Swap buffers"); debug.render_finished(); @@ -434,7 +598,7 @@ async fn run_instance( break; } - state.update(context.window(), &window_event, &mut debug); + state.update(&window, &window_event, &mut debug); if let Some(event) = conversion::window_event( crate::window::Id::MAIN, From ac20f35c6245bbafffd4d047764fb04e66dcfe75 Mon Sep 17 00:00:00 2001 From: Richard Date: Wed, 2 Nov 2022 10:17:49 -0300 Subject: [PATCH 027/286] update `glutin\multi_window` to new surface api --- glutin/src/multi_window.rs | 378 +++++++++++++++++++++++-------- glutin/src/multi_window/state.rs | 20 +- 2 files changed, 297 insertions(+), 101 deletions(-) diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 2a66a816..095e0e2c 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -15,11 +15,30 @@ use iced_winit::renderer; use iced_winit::settings; use iced_winit::user_interface; use iced_winit::window; +use iced_winit::winit; use iced_winit::{Clipboard, Command, Debug, Proxy, Settings}; -use glutin::window::Window; +use glutin::config::{ + Config, ConfigSurfaceTypes, ConfigTemplateBuilder, GlConfig, +}; +use glutin::context::{ + ContextApi, ContextAttributesBuilder, NotCurrentContext, + NotCurrentGlContextSurfaceAccessor, + PossiblyCurrentContextGlSurfaceAccessor, PossiblyCurrentGlContext, +}; +use glutin::display::{Display, DisplayApiPreference, GlDisplay}; +use glutin::surface::{ + GlSurface, Surface, SurfaceAttributesBuilder, WindowSurface, +}; +use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; + use std::collections::HashMap; +use std::ffi::CString; use std::mem::ManuallyDrop; +use std::num::NonZeroU32; + +#[allow(unsafe_code)] +const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; /// Runs an [`Application`] with an executor, compositor, and the provided /// settings. @@ -35,9 +54,8 @@ where { use futures::task; use futures::Future; - use glutin::event_loop::EventLoopBuilder; - use glutin::platform::run_return::EventLoopExtRunReturn; - use glutin::ContextBuilder; + use winit::event_loop::EventLoopBuilder; + use winit::platform::run_return::EventLoopExtRunReturn; let mut debug = Debug::new(); debug.startup_started(); @@ -58,81 +76,216 @@ where runtime.enter(|| A::new(flags)) }; - let (context, window) = { - let builder = settings.window.into_builder( - &application.title(), - event_loop.primary_monitor(), - settings.id, - ); + let builder = settings.window.into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ); - log::info!("Window builder: {:#?}", builder); + log::info!("Window builder: {:#?}", builder); - let opengl_builder = ContextBuilder::new() - .with_vsync(true) - .with_multisampling(C::sample_count(&compositor_settings) as u16); + #[allow(unsafe_code)] + let (display, window, configuration, surface, context) = unsafe { + struct Configuration(Config); + use std::fmt; + impl fmt::Debug for Configuration { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let config = &self.0; - let opengles_builder = opengl_builder.clone().with_gl( - glutin::GlRequest::Specific(glutin::Api::OpenGlEs, (2, 0)), - ); + f.debug_struct("Configuration") + .field("raw", &config) + .field("samples", &config.num_samples()) + .field("buffer_type", &config.color_buffer_type()) + .field("surface_type", &config.config_surface_types()) + .field("depth", &config.depth_size()) + .field("alpha", &config.alpha_size()) + .field("stencil", &config.stencil_size()) + .field("float_pixels", &config.float_pixels()) + .field("srgb", &config.srgb_capable()) + .field("api", &config.api()) + .finish() + } + } - let (first_builder, second_builder) = if settings.try_opengles_first { - (opengles_builder, opengl_builder) - } else { - (opengl_builder, opengles_builder) + impl AsRef for Configuration { + fn as_ref(&self) -> &Config { + &self.0 + } + } + + let display_handle = event_loop.raw_display_handle(); + + #[cfg(all( + any(windows, target_os = "macos"), + not(target_arch = "wasm32") + ))] + let (window, window_handle) = { + let window = builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?; + + let handle = window.raw_window_handle(); + + (window, handle) }; - log::info!("Trying first builder: {:#?}", first_builder); + #[cfg(target_arch = "wasm32")] + let preference = Err(Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "target not supported by backend" + )), + ))?; - let context = first_builder - .build_windowed(builder.clone(), &event_loop) - .or_else(|_| { - log::info!("Trying second builder: {:#?}", second_builder); - second_builder.build_windowed(builder, &event_loop) - }) - .map_err(|error| { - use glutin::CreationError; - use iced_graphics::Error as ContextError; + #[cfg(all(windows, not(target_arch = "wasm32")))] + let preference = DisplayApiPreference::WglThenEgl(Some(window_handle)); - match error { - CreationError::Window(error) => { - Error::WindowCreationFailed(error) - } - CreationError::OpenGlVersionNotSupported => { - Error::GraphicsCreationFailed( - ContextError::VersionNotSupported, - ) - } - CreationError::NoAvailablePixelFormat => { - Error::GraphicsCreationFailed( - ContextError::NoAvailablePixelFormat, - ) - } - error => Error::GraphicsCreationFailed( - ContextError::BackendError(error.to_string()), - ), - } + #[cfg(all(target_os = "macos", not(target_arch = "wasm32")))] + let preference = DisplayApiPreference::Cgl; + + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_arch = "wasm32") + ))] + let preference = DisplayApiPreference::GlxThenEgl(Box::new( + winit::platform::unix::register_xlib_error_hook, + )); + + let display = + Display::new(display_handle, preference).map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create display: {error}" + )), + ) })?; - #[allow(unsafe_code)] - unsafe { - let (context, window) = context.split(); + log::debug!("Display: {}", display.version_string()); - ( - context - .make_current(&window) - .expect("Make OpenGL context current"), - window, - ) + let samples = C::sample_count(&compositor_settings) as u8; + let mut template = ConfigTemplateBuilder::new() + .with_surface_type(ConfigSurfaceTypes::WINDOW); + + if samples != 0 { + template = template.with_multisampling(samples); } + + #[cfg(all(windows, not(target_arch = "wasm32")))] + let template = template.compatible_with_native_window(window_handle); + + log::debug!("Searching for display configurations"); + let configuration = display + .find_configs(template.build()) + .map_err(|_| { + Error::GraphicsCreationFailed( + iced_graphics::Error::NoAvailablePixelFormat, + ) + })? + .map(Configuration) + .inspect(|config| { + log::trace!("{config:#?}"); + }) + .min_by_key(|config| { + config.as_ref().num_samples().saturating_sub(samples) + }) + .ok_or(Error::GraphicsCreationFailed( + iced_graphics::Error::NoAvailablePixelFormat, + ))?; + + log::debug!("Selected: {configuration:#?}"); + + #[cfg(all( + unix, + not(target_os = "macos"), + not(target_arch = "wasm32") + ))] + let (window, window_handle) = { + use glutin::platform::x11::X11GlConfigExt; + let builder = + if let Some(visual) = configuration.as_ref().x11_visual() { + use winit::platform::unix::WindowBuilderExtUnix; + builder.with_x11_visual(visual.into_raw()) + } else { + builder + }; + + let window = builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?; + + let handle = window.raw_window_handle(); + + (window, handle) + }; + + let attributes = + ContextAttributesBuilder::new().build(Some(window_handle)); + let fallback_attributes = ContextAttributesBuilder::new() + .with_context_api(ContextApi::Gles(None)) + .build(Some(window_handle)); + + let context = display + .create_context(configuration.as_ref(), &attributes) + .or_else(|_| { + display.create_context( + configuration.as_ref(), + &fallback_attributes, + ) + }) + .map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create context: {error}" + )), + ) + })?; + + let (width, height) = window.inner_size().into(); + let surface_attributes = + SurfaceAttributesBuilder::::new() + .with_srgb(Some(true)) + .build( + window_handle, + NonZeroU32::new(width).unwrap_or(ONE), + NonZeroU32::new(height).unwrap_or(ONE), + ); + + let surface = display + .create_window_surface(configuration.as_ref(), &surface_attributes) + .map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create surface: {error}" + )), + ) + })?; + + let context = { + context + .make_current(&surface) + .expect("make context current") + }; + + if let Err(error) = surface.set_swap_interval( + &context, + glutin::surface::SwapInterval::Wait(ONE), + ) { + log::error!("set swap interval failed: {}", error); + } + + (display, window, configuration.0, surface, context) }; #[allow(unsafe_code)] let (compositor, renderer) = unsafe { C::new(compositor_settings, |address| { - context.get_proc_address(address) + let address = CString::new(address).expect("address error"); + display.get_proc_address(address.as_c_str()) })? }; + let context = { context.make_not_current().expect("make context current") }; + let (mut sender, receiver) = mpsc::unbounded(); let mut instance = Box::pin(run_instance::( @@ -143,8 +296,11 @@ where proxy, debug, receiver, - context, + display, window, + configuration, + surface, + context, init_command, settings.exit_on_close_request, )); @@ -152,25 +308,25 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); let _ = event_loop.run_return(move |event, event_loop, control_flow| { - use glutin::event_loop::ControlFlow; + use winit::event_loop::ControlFlow; if let ControlFlow::ExitWithCode(_) = control_flow { return; } let event = match event { - glutin::event::Event::WindowEvent { + winit::event::Event::WindowEvent { event: - glutin::event::WindowEvent::ScaleFactorChanged { + winit::event::WindowEvent::ScaleFactorChanged { new_inner_size, .. }, window_id, - } => Some(glutin::event::Event::WindowEvent { - event: glutin::event::WindowEvent::Resized(*new_inner_size), + } => Some(winit::event::Event::WindowEvent { + event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), - glutin::event::Event::UserEvent(Event::NewWindow(id, settings)) => { + winit::event::Event::UserEvent(Event::NewWindow(id, settings)) => { // TODO(derezzedex) let window = settings .into_builder( @@ -181,7 +337,7 @@ where .build(event_loop) .expect("Failed to build window"); - Some(glutin::event::Event::UserEvent(Event::WindowCreated( + Some(winit::event::Event::UserEvent(Event::WindowCreated( id, window, ))) } @@ -208,13 +364,16 @@ async fn run_instance( mut compositor: C, mut renderer: A::Renderer, mut runtime: Runtime>, Event>, - mut proxy: glutin::event_loop::EventLoopProxy>, + mut proxy: winit::event_loop::EventLoopProxy>, mut debug: Debug, mut receiver: mpsc::UnboundedReceiver< - glutin::event::Event<'_, Event>, + winit::event::Event<'_, Event>, >, - mut context: glutin::RawContext, - window: Window, + display: Display, + window: winit::window::Window, + configuration: Config, + surface: Surface, + context: NotCurrentContext, init_command: Command, _exit_on_close_request: bool, ) where @@ -223,8 +382,14 @@ async fn run_instance( C: iced_graphics::window::GLCompositor + 'static, ::Theme: StyleSheet, { - use glutin::event; use iced_winit::futures::stream::StreamExt; + use winit::event; + + let context = { + context + .make_current(&surface) + .expect("make context current") + }; let mut clipboard = Clipboard::connect(&window); let mut cache = user_interface::Cache::default(); @@ -241,6 +406,7 @@ async fn run_instance( let mut current_context_window = window.id(); let mut window_ids = HashMap::from([(window.id(), window::Id::MAIN)]); let mut windows = HashMap::from([(window::Id::MAIN, window)]); + let mut surfaces = HashMap::from([(window::Id::MAIN, surface)]); let mut states = HashMap::from([(window::Id::MAIN, state)]); let mut interfaces = ManuallyDrop::new(HashMap::from([(window::Id::MAIN, user_interface)])); @@ -419,10 +585,32 @@ async fn run_instance( id, ); + let window_handle = window.raw_window_handle(); + let (width, height) = window.inner_size().into(); + let surface_attributes = + SurfaceAttributesBuilder::::new() + .with_srgb(Some(true)) + .build( + window_handle, + NonZeroU32::new(width).unwrap_or(ONE), + NonZeroU32::new(height).unwrap_or(ONE), + ); + + #[allow(unsafe_code)] + let surface = unsafe { + display + .create_window_surface( + &configuration, + &surface_attributes, + ) + .expect("failed to create surface") + }; + let _ = states.insert(id, state); let _ = interfaces.insert(id, user_interface); let _ = window_ids.insert(window.id(), id); let _ = windows.insert(id, window); + let _ = surfaces.insert(id, surface); } Event::CloseWindow(id) => { // TODO(derezzedex): log errors @@ -437,6 +625,9 @@ async fn run_instance( if interfaces.remove(&id).is_none() { println!("Failed to remove from `interfaces`!"); } + if surfaces.remove(&id).is_none() { + println!("Failed to remove from `surfaces`!") + } if windows.remove(&id).is_none() { println!("Failed to remove from `windows`!") } @@ -455,17 +646,19 @@ async fn run_instance( let window = window_ids.get(&id).and_then(|id| windows.get(id)).unwrap(); + let surface = window_ids + .get(&id) + .and_then(|id| surfaces.get(id)) + .unwrap(); + debug.render_started(); - #[allow(unsafe_code)] - unsafe { - if current_context_window != id { - context = context - .make_current(window) - .expect("Make OpenGL context current"); + if current_context_window != id { + context + .make_current(&surface) + .expect("Make OpenGL context current"); - current_context_window = id; - } + current_context_window = id; } if state.viewport_changed() { @@ -501,10 +694,11 @@ async fn run_instance( mouse_interaction = new_mouse_interaction; } - context.resize(glutin::dpi::PhysicalSize::new( - physical_size.width, - physical_size.height, - )); + surface.resize( + &context, + NonZeroU32::new(physical_size.width).unwrap_or(ONE), + NonZeroU32::new(physical_size.height).unwrap_or(ONE), + ); compositor.resize_viewport(physical_size); @@ -519,7 +713,7 @@ async fn run_instance( &debug.overlay(), ); - context.swap_buffers(window).expect("Swap buffers"); + surface.swap_buffers(&context).expect("Swap buffers"); debug.render_finished(); @@ -595,7 +789,7 @@ pub enum Event { /// TODO(derezzedex) CloseWindow(window::Id), /// TODO(derezzedex) - WindowCreated(window::Id, glutin::window::Window), + WindowCreated(window::Id, winit::window::Window), } /// Updates an [`Application`] by feeding it the provided messages, spawning any @@ -607,10 +801,10 @@ pub fn update( renderer: &mut A::Renderer, runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, - proxy: &mut glutin::event_loop::EventLoopProxy>, + proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, messages: &mut Vec, - windows: &HashMap, + windows: &HashMap, graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, ) where ::Theme: StyleSheet, @@ -650,9 +844,9 @@ pub fn run_command( command: Command, runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, - proxy: &mut glutin::event_loop::EventLoopProxy>, + proxy: &mut winit::event_loop::EventLoopProxy>, debug: &mut Debug, - windows: &HashMap, + windows: &HashMap, _graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, ) where A: Application, @@ -695,14 +889,14 @@ pub fn run_command( } window::Action::Resize { width, height } => { let window = windows.get(&id).expect("No window found"); - window.set_inner_size(glutin::dpi::LogicalSize { + window.set_inner_size(winit::dpi::LogicalSize { width, height, }); } window::Action::Move { x, y } => { let window = windows.get(&id).expect("No window found"); - window.set_outer_position(glutin::dpi::LogicalPosition { + window.set_outer_position(winit::dpi::LogicalPosition { x, y, }); diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs index 163f46bd..321fc4d1 100644 --- a/glutin/src/multi_window/state.rs +++ b/glutin/src/multi_window/state.rs @@ -4,9 +4,11 @@ use crate::multi_window::{Application, Event}; use crate::window; use crate::{Color, Debug, Point, Size, Viewport}; -use glutin::event::{Touch, WindowEvent}; -use glutin::event_loop::EventLoopProxy; -use glutin::window::Window; +use iced_winit::winit; +use winit::event::{Touch, WindowEvent}; +use winit::event_loop::EventLoopProxy; +use winit::window::Window; + use std::collections::HashMap; use std::marker::PhantomData; @@ -20,8 +22,8 @@ where scale_factor: f64, viewport: Viewport, viewport_changed: bool, - cursor_position: glutin::dpi::PhysicalPosition, - modifiers: glutin::event::ModifiersState, + cursor_position: winit::dpi::PhysicalPosition, + modifiers: winit::event::ModifiersState, theme: ::Theme, appearance: iced_winit::application::Appearance, application: PhantomData, @@ -53,8 +55,8 @@ where viewport, viewport_changed: false, // TODO: Encode cursor availability in the type-system - cursor_position: glutin::dpi::PhysicalPosition::new(-1.0, -1.0), - modifiers: glutin::event::ModifiersState::default(), + cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0), + modifiers: winit::event::ModifiersState::default(), theme, appearance, application: PhantomData, @@ -95,7 +97,7 @@ where } /// Returns the current keyboard modifiers of the [`State`]. - pub fn modifiers(&self) -> glutin::event::ModifiersState { + pub fn modifiers(&self) -> winit::event::ModifiersState { self.modifiers } @@ -156,7 +158,7 @@ where WindowEvent::CursorLeft { .. } => { // TODO: Encode cursor availability in the type-system self.cursor_position = - glutin::dpi::PhysicalPosition::new(-1.0, -1.0); + winit::dpi::PhysicalPosition::new(-1.0, -1.0); } WindowEvent::ModifiersChanged(new_modifiers) => { self.modifiers = *new_modifiers; From 5e4e410b18eb744cf70ae1f18b9ef08611f59150 Mon Sep 17 00:00:00 2001 From: Richard Date: Thu, 3 Nov 2022 14:53:05 -0300 Subject: [PATCH 028/286] remove `windows` method (use commands instead) --- examples/multi_window/src/main.rs | 13 ++++--------- glutin/src/multi_window.rs | 2 +- glutin/src/multi_window/state.rs | 24 +----------------------- src/multi_window/application.rs | 13 ------------- winit/src/multi_window.rs | 5 +---- winit/src/multi_window/state.rs | 24 +----------------------- 6 files changed, 8 insertions(+), 73 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 0dda1804..2771d728 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -131,6 +131,7 @@ impl Application for Example { } WindowMessage::CloseWindow => { let _ = self.windows.remove(&id); + return window::close(id); } WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { let window = self.windows.get_mut(&id).unwrap(); @@ -173,8 +174,9 @@ impl Application for Example { title: format!("New window ({})", self.windows.len()), }; - self.windows - .insert(window::Id::new(self.windows.len()), window); + let window_id = window::Id::new(self.windows.len()); + self.windows.insert(window_id, window); + return window::spawn(window_id, Default::default()); } } WindowMessage::Dragged(pane_grid::DragEvent::Dropped { @@ -243,13 +245,6 @@ impl Application for Example { }) } - fn windows(&self) -> Vec<(window::Id, iced::window::Settings)> { - self.windows - .iter() - .map(|(&id, _window)| (id, iced::window::Settings::default())) - .collect() - } - fn close_requested(&self, window: window::Id) -> Self::Message { Message::Window(window, WindowMessage::CloseWindow) } diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 095e0e2c..2ac7f636 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -515,7 +515,7 @@ async fn run_instance( ); // Update window - state.synchronize(&application, &windows, &proxy); + state.synchronize(&application, &windows); let should_exit = application.should_exit(); diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs index 321fc4d1..28f4a895 100644 --- a/glutin/src/multi_window/state.rs +++ b/glutin/src/multi_window/state.rs @@ -1,12 +1,11 @@ use crate::application::{self, StyleSheet as _}; use crate::conversion; -use crate::multi_window::{Application, Event}; +use crate::multi_window::Application; use crate::window; use crate::{Color, Debug, Point, Size, Viewport}; use iced_winit::winit; use winit::event::{Touch, WindowEvent}; -use winit::event_loop::EventLoopProxy; use winit::window::Window; use std::collections::HashMap; @@ -189,28 +188,7 @@ where &mut self, application: &A, windows: &HashMap, - proxy: &EventLoopProxy>, ) { - let new_windows = application.windows(); - - // Check for windows to close - for window_id in windows.keys() { - if !new_windows.iter().any(|(id, _)| id == window_id) { - proxy - .send_event(Event::CloseWindow(*window_id)) - .expect("Failed to send message"); - } - } - - // Check for windows to spawn - for (id, settings) in new_windows { - if !windows.contains_key(&id) { - proxy - .send_event(Event::NewWindow(id, settings)) - .expect("Failed to send message"); - } - } - let window = windows.values().next().expect("No window found"); // Update window title diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index df45ca1e..7d559397 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -46,9 +46,6 @@ pub trait Application: Sized { /// title of your application when necessary. fn title(&self) -> String; - /// TODO(derezzedex) - fn windows(&self) -> Vec<(window::Id, window::Settings)>; - /// Handles a __message__ and updates the state of the [`Application`]. /// /// This is where you define your __update logic__. All the __messages__, @@ -170,16 +167,6 @@ where self.0.title() } - fn windows(&self) -> Vec<(window::Id, iced_winit::settings::Window)> { - self.0 - .windows() - .into_iter() - .map(|(id, settings)| { - (id, iced_winit::settings::Window::from(settings)) - }) - .collect() - } - fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 1d71d801..c0c233c5 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -68,9 +68,6 @@ where /// The type of __messages__ your [`Program`] will produce. type Message: std::fmt::Debug + Send; - /// TODO(derezzedex) - fn windows(&self) -> Vec<(window::Id, settings::Window)>; - /// Handles a __message__ and updates the state of the [`Program`]. /// /// This is where you define your __update logic__. All the __messages__, @@ -459,7 +456,7 @@ async fn run_instance( ); // Update window - state.synchronize(&application, &windows, &proxy); + state.synchronize(&application, &windows); let should_exit = application.should_exit(); diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index ae353e3b..a7d51df4 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -1,13 +1,12 @@ use crate::application::{self, StyleSheet as _}; use crate::conversion; -use crate::multi_window::{Application, Event}; +use crate::multi_window::Application; use crate::window; use crate::{Color, Debug, Point, Size, Viewport}; use std::collections::HashMap; use std::marker::PhantomData; use winit::event::{Touch, WindowEvent}; -use winit::event_loop::EventLoopProxy; use winit::window::Window; /// The state of a windowed [`Application`]. @@ -186,28 +185,7 @@ where &mut self, application: &A, windows: &HashMap, - proxy: &EventLoopProxy>, ) { - let new_windows = application.windows(); - - // Check for windows to close - for window_id in windows.keys() { - if !new_windows.iter().any(|(id, _)| id == window_id) { - proxy - .send_event(Event::CloseWindow(*window_id)) - .expect("Failed to send message"); - } - } - - // Check for windows to spawn - for (id, settings) in new_windows { - if !windows.contains_key(&id) { - proxy - .send_event(Event::NewWindow(id, settings)) - .expect("Failed to send message"); - } - } - let window = windows.values().next().expect("No window found"); // Update window title From 942f1c91afb8257e289af8d0c229f74819f68361 Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Mon, 2 Jan 2023 10:58:07 -0800 Subject: [PATCH 029/286] merged in iced master --- examples/multi_window/src/main.rs | 2 +- glutin/src/multi_window.rs | 20 ++++++++++++++++++++ glutin/src/multi_window/state.rs | 4 ++-- winit/src/multi_window.rs | 20 ++++++++++++++++++++ winit/src/multi_window/state.rs | 4 ++-- 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 2771d728..9b93eea6 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -268,7 +268,7 @@ impl Application for Example { .spacing(5) .align_items(Alignment::Center); - let pane_grid = PaneGrid::new(&window.panes, |id, pane| { + let pane_grid = PaneGrid::new(&window.panes, |id, pane, _| { let is_focused = focus == Some(id); let pin_button = button( diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 2ac7f636..746da159 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -887,6 +887,10 @@ pub fn run_command( .send_event(Event::CloseWindow(id)) .expect("Send message to event loop"); } + window::Action::Drag => { + let window = windows.get(&id).expect("No window found"); + let _res = window.drag_window(); + } window::Action::Resize { width, height } => { let window = windows.get(&id).expect("No window found"); window.set_inner_size(winit::dpi::LogicalSize { @@ -921,6 +925,22 @@ pub fn run_command( .send_event(Event::Application(tag(mode))) .expect("Send message to event loop"); } + window::Action::Maximize(value) => { + let window = windows.get(&id).expect("No window found!"); + window.set_maximized(value); + } + window::Action::Minimize(value) => { + let window = windows.get(&id).expect("No window found!"); + window.set_minimized(value); + } + window::Action::ToggleMaximize => { + let window = windows.get(&id).expect("No window found!"); + window.set_maximized(!window.is_maximized()); + } + window::Action::ToggleDecorations => { + let window = windows.get(&id).expect("No window found!"); + window.set_decorations(!window.is_decorated()); + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs index 28f4a895..e7e82876 100644 --- a/glutin/src/multi_window/state.rs +++ b/glutin/src/multi_window/state.rs @@ -37,7 +37,7 @@ where let title = application.title(); let scale_factor = application.scale_factor(); let theme = application.theme(); - let appearance = theme.appearance(application.style()); + let appearance = theme.appearance(&application.style()); let viewport = { let physical_size = window.inner_size(); @@ -216,6 +216,6 @@ where // Update theme and appearance self.theme = application.theme(); - self.appearance = self.theme.appearance(application.style()); + self.appearance = self.theme.appearance(&application.style()); } } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index c0c233c5..0a2f71ad 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -863,6 +863,10 @@ pub fn run_command( .send_event(Event::CloseWindow(id)) .expect("Send message to event loop"); } + window::Action::Drag => { + let window = windows.get(&id).expect("No window found"); + let _res = window.drag_window(); + } window::Action::Resize { width, height } => { let window = windows.get(&id).expect("No window found"); window.set_inner_size(winit::dpi::LogicalSize { @@ -897,6 +901,22 @@ pub fn run_command( .send_event(Event::Application(tag(mode))) .expect("Send message to event loop"); } + window::Action::Maximize(value) => { + let window = windows.get(&id).expect("No window found!"); + window.set_maximized(value); + } + window::Action::Minimize(value) => { + let window = windows.get(&id).expect("No window found!"); + window.set_minimized(value); + } + window::Action::ToggleMaximize => { + let window = windows.get(&id).expect("No window found!"); + window.set_maximized(!window.is_maximized()); + } + window::Action::ToggleDecorations => { + let window = windows.get(&id).expect("No window found!"); + window.set_decorations(!window.is_decorated()); + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index a7d51df4..eebdcdf1 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -35,7 +35,7 @@ where let title = application.title(); let scale_factor = application.scale_factor(); let theme = application.theme(); - let appearance = theme.appearance(application.style()); + let appearance = theme.appearance(&application.style()); let viewport = { let physical_size = window.inner_size(); @@ -213,6 +213,6 @@ where // Update theme and appearance self.theme = application.theme(); - self.appearance = self.theme.appearance(application.style()); + self.appearance = self.theme.appearance(&application.style()); } } From f43419d4752fe18065c0e1b7c2a26e65b9d6e253 Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Mon, 2 Jan 2023 18:14:31 -0800 Subject: [PATCH 030/286] Fixed issue with window ID on winit --- examples/multi_window/Cargo.toml | 1 + examples/multi_window/src/main.rs | 2 + winit/src/multi_window.rs | 112 ++++++++++++++++-------------- 3 files changed, 63 insertions(+), 52 deletions(-) diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml index 9c3d0f21..6de895d7 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -8,5 +8,6 @@ publish = false [dependencies] iced = { path = "../..", features = ["debug", "multi_window"] } +env_logger = "0.10.0" iced_native = { path = "../../native" } iced_lazy = { path = "../../lazy" } \ No newline at end of file diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 9b93eea6..9fe6b481 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -15,6 +15,8 @@ use iced_native::{event, subscription, Event}; use std::collections::HashMap; pub fn main() -> iced::Result { + env_logger::init(); + Example::run(Settings::default()) } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 0a2f71ad..7d8bbc39 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -33,7 +33,6 @@ use std::mem::ManuallyDrop; pub enum Event { /// An [`Application`] generated message Application(Message), - /// TODO(derezzedex) // Create a wrapper variant of `window::Event` type instead // (maybe we should also allow users to listen/react to those internal messages?) @@ -197,7 +196,8 @@ where .map_err(Error::WindowCreationFailed)?; let windows: HashMap = - HashMap::from([(window::Id::new(0usize), window)]); + HashMap::from([(window::Id::MAIN, window)]); + let window = windows.values().next().expect("No window found"); #[cfg(target_arch = "wasm32")] @@ -515,64 +515,72 @@ async fn run_instance( ), )); } - event::Event::UserEvent(event) => match event { - Event::Application(message) => { - messages.push(message); - } - Event::WindowCreated(id, window) => { - let mut surface = compositor.create_surface(&window); + event::Event::UserEvent(event) => { + match event { + Event::Application(message) => { + messages.push(message); + } + Event::WindowCreated(id, window) => { + let mut surface = compositor.create_surface(&window); - let state = State::new(&application, &window); + let state = State::new(&application, &window); - let physical_size = state.physical_size(); + let physical_size = state.physical_size(); - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); - let user_interface = build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - id, - ); + let user_interface = build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + id, + ); - let _ = states.insert(id, state); - let _ = surfaces.insert(id, surface); - let _ = interfaces.insert(id, user_interface); - let _ = window_ids.insert(window.id(), id); - let _ = windows.insert(id, window); - } - Event::CloseWindow(id) => { - // TODO(derezzedex): log errors - if let Some(window) = windows.get(&id) { - if window_ids.remove(&window.id()).is_none() { - println!("Failed to remove from `window_ids`!"); + let _ = states.insert(id, state); + let _ = surfaces.insert(id, surface); + let _ = interfaces.insert(id, user_interface); + let _ = window_ids.insert(window.id(), id); + let _ = windows.insert(id, window); + } + Event::CloseWindow(id) => { + println!("Closing window {:?}. Total: {}", id, windows.len()); + + if let Some(window) = windows.get(&id) { + if window_ids.remove(&window.id()).is_none() { + log::error!("Failed to remove window with id {:?} from window_ids.", window.id()); + } + } else { + log::error!("Could not find window with id {:?} in windows.", id); + } + if states.remove(&id).is_none() { + log::error!("Failed to remove window {:?} from states.", id); + } + if interfaces.remove(&id).is_none() { + log::error!("Failed to remove window {:?} from interfaces.", id); + } + if windows.remove(&id).is_none() { + log::error!("Failed to remove window {:?} from windows.", id); + } + if surfaces.remove(&id).is_none() { + log::error!("Failed to remove window {:?} from surfaces.", id); + } + + if windows.is_empty() { + log::info!("All windows are closed. Terminating program."); + break 'main; + } else { + log::info!("Remaining windows: {:?}", windows.len()); } } - if states.remove(&id).is_none() { - println!("Failed to remove from `states`!") - } - if interfaces.remove(&id).is_none() { - println!("Failed to remove from `interfaces`!"); - } - if windows.remove(&id).is_none() { - println!("Failed to remove from `windows`!") - } - if surfaces.remove(&id).is_none() { - println!("Failed to remove from `surfaces`!") - } - - if windows.is_empty() { - break 'main; - } + Event::NewWindow(_, _) => unreachable!(), } - Event::NewWindow(_, _) => unreachable!(), - }, + } event::Event::RedrawRequested(id) => { let state = window_ids .get(&id) From 1944e98f82b7efd5b268e04ba5ced065e55a218e Mon Sep 17 00:00:00 2001 From: Bingus Date: Mon, 2 Jan 2023 21:06:59 -0800 Subject: [PATCH 031/286] Fix multi-window example for Glutin on MacOS --- glutin/Cargo.toml | 2 - glutin/src/multi_window.rs | 162 ++++++++++++++++++++----------------- winit/src/multi_window.rs | 1 + 3 files changed, 90 insertions(+), 75 deletions(-) diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 70820780..3f902d20 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -24,8 +24,6 @@ version = "0.4" [dependencies.glutin] version = "0.30" -git = "https://github.com/derezzedex/glutin" -rev = "2a2a97209c49929027beced68e1989b8486bdec9" [dependencies.iced_native] version = "0.7" diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 746da159..35eeeb36 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -23,12 +23,11 @@ use glutin::config::{ }; use glutin::context::{ ContextApi, ContextAttributesBuilder, NotCurrentContext, - NotCurrentGlContextSurfaceAccessor, - PossiblyCurrentContextGlSurfaceAccessor, PossiblyCurrentGlContext, + NotCurrentGlContextSurfaceAccessor, PossiblyCurrentGlContext, }; use glutin::display::{Display, DisplayApiPreference, GlDisplay}; use glutin::surface::{ - GlSurface, Surface, SurfaceAttributesBuilder, WindowSurface, + GlSurface, Surface, SurfaceAttributesBuilder, SwapInterval, WindowSurface, }; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; @@ -240,42 +239,19 @@ where ) })?; - let (width, height) = window.inner_size().into(); - let surface_attributes = - SurfaceAttributesBuilder::::new() - .with_srgb(Some(true)) - .build( - window_handle, - NonZeroU32::new(width).unwrap_or(ONE), - NonZeroU32::new(height).unwrap_or(ONE), - ); - - let surface = display - .create_window_surface(configuration.as_ref(), &surface_attributes) - .map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create surface: {error}" - )), - ) - })?; - - let context = { - context - .make_current(&surface) - .expect("make context current") - }; - - if let Err(error) = surface.set_swap_interval( - &context, - glutin::surface::SwapInterval::Wait(ONE), - ) { - log::error!("set swap interval failed: {}", error); - } + let surface = gl_surface(&display, configuration.as_ref(), &window); (display, window, configuration.0, surface, context) }; + let windows: HashMap = + HashMap::from([(window::Id::MAIN, window)]); + + // need to make context current before trying to load GL functions + let context = context + .make_current(&surface) + .expect("Make context current."); + #[allow(unsafe_code)] let (compositor, renderer) = unsafe { C::new(compositor_settings, |address| { @@ -284,7 +260,7 @@ where })? }; - let context = { context.make_not_current().expect("make context current") }; + let context = context.make_not_current().expect("Make not current."); let (mut sender, receiver) = mpsc::unbounded(); @@ -297,9 +273,8 @@ where debug, receiver, display, - window, + windows, configuration, - surface, context, init_command, settings.exit_on_close_request, @@ -370,10 +345,9 @@ async fn run_instance( winit::event::Event<'_, Event>, >, display: Display, - window: winit::window::Window, + mut windows: HashMap, configuration: Config, - surface: Surface, - context: NotCurrentContext, + mut context: NotCurrentContext, init_command: Command, _exit_on_close_request: bool, ) where @@ -385,34 +359,48 @@ async fn run_instance( use iced_winit::futures::stream::StreamExt; use winit::event; - let context = { - context - .make_current(&surface) - .expect("make context current") - }; - - let mut clipboard = Clipboard::connect(&window); + let mut clipboard = + Clipboard::connect(windows.values().next().expect("No window found")); let mut cache = user_interface::Cache::default(); - let state = State::new(&application, &window); - let user_interface = multi_window::build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - window::Id::MAIN, - ); + let mut current_context_window = None; + let mut window_ids: HashMap<_, _> = windows + .iter() + .map(|(&id, window)| (window.id(), id)) + .collect(); + let mut states = HashMap::new(); + let mut surfaces = HashMap::new(); + let mut interfaces = ManuallyDrop::new(HashMap::new()); - let mut current_context_window = window.id(); - let mut window_ids = HashMap::from([(window.id(), window::Id::MAIN)]); - let mut windows = HashMap::from([(window::Id::MAIN, window)]); - let mut surfaces = HashMap::from([(window::Id::MAIN, surface)]); - let mut states = HashMap::from([(window::Id::MAIN, state)]); - let mut interfaces = - ManuallyDrop::new(HashMap::from([(window::Id::MAIN, user_interface)])); + for (&id, window) in windows.keys().zip(windows.values()) { + let surface = gl_surface(&display, &configuration, &window); + let current_context = context.make_current(&surface).expect("Make current."); + let state = State::new(&application, &window); + let physical_size = state.physical_size(); + + surface.resize( + ¤t_context, + NonZeroU32::new(physical_size.width).unwrap_or(ONE), + NonZeroU32::new(physical_size.height).unwrap_or(ONE), + ); + + let user_interface = multi_window::build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + id, + ); + + context = current_context.make_not_current().expect("Make not current."); + + let _ = states.insert(id, state); + let _ = surfaces.insert(id, surface); + let _ = interfaces.insert(id, user_interface); + } { - let state = states.get(&window::Id::MAIN).unwrap(); + let state = states.values().next().expect("No state found."); run_command( &application, @@ -653,12 +641,11 @@ async fn run_instance( debug.render_started(); - if current_context_window != id { - context - .make_current(&surface) - .expect("Make OpenGL context current"); + let current_context = + context.make_current(&surface).expect("Make current."); - current_context_window = id; + if current_context_window != Some(id) { + current_context_window = Some(id); } if state.viewport_changed() { @@ -695,11 +682,17 @@ async fn run_instance( } surface.resize( - &context, + ¤t_context, NonZeroU32::new(physical_size.width).unwrap_or(ONE), NonZeroU32::new(physical_size.height).unwrap_or(ONE), ); + if let Err(error) = + surface.set_swap_interval(¤t_context, SwapInterval::Wait(ONE)) + { + log::error!("Could not set swap interval for surface attached to window id: {:?}", id); + } + compositor.resize_viewport(physical_size); let _ = interfaces @@ -713,10 +706,10 @@ async fn run_instance( &debug.overlay(), ); - surface.swap_buffers(&context).expect("Swap buffers"); + surface.swap_buffers(¤t_context).expect("Swap buffers"); + context = current_context.make_not_current().expect("Make not current."); debug.render_finished(); - // TODO: Handle animations! // Maybe we can use `ControlFlow::WaitUntil` for this. } @@ -1038,3 +1031,26 @@ where interfaces } + +#[allow(unsafe_code)] +fn gl_surface( + display: &Display, + gl_config: &Config, + window: &winit::window::Window, +) -> Surface { + let (width, height) = window.inner_size().into(); + + let surface_attributes = SurfaceAttributesBuilder::::new() + .with_srgb(Some(true)) + .build( + window.raw_window_handle(), + NonZeroU32::new(width).unwrap_or(ONE), + NonZeroU32::new(height).unwrap_or(ONE), + ); + + unsafe { + display + .create_window_surface(gl_config, &surface_attributes) + .expect("failed to create surface") + } +} diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 7d8bbc39..43455148 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -320,6 +320,7 @@ async fn run_instance( for (&id, window) in windows.keys().zip(windows.values()) { let mut surface = compositor.create_surface(window); + println!("Creating surface for window: {:?}", window); let state = State::new(&application, window); From ec41918ec40bddaba81235372f1566da59fd09f2 Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Thu, 5 Jan 2023 15:26:28 -0800 Subject: [PATCH 032/286] Implemented window title update functionality for multiwindow. --- examples/multi_window/Cargo.toml | 2 +- examples/multi_window/src/main.rs | 10 +- glutin/src/application.rs | 33 +++-- glutin/src/multi_window.rs | 156 ++++++++++------------ glutin/src/multi_window/state.rs | 14 +- native/src/window.rs | 4 +- native/src/window/action.rs | 8 +- native/src/window/icon.rs | 6 +- native/src/window/id.rs | 13 +- src/multi_window/application.rs | 8 +- winit/src/application.rs | 2 +- winit/src/multi_window.rs | 206 +++++++++++++++++------------- winit/src/multi_window/state.rs | 14 +- winit/src/window.rs | 37 +++--- 14 files changed, 270 insertions(+), 243 deletions(-) diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml index 6de895d7..62198595 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -10,4 +10,4 @@ publish = false iced = { path = "../..", features = ["debug", "multi_window"] } env_logger = "0.10.0" iced_native = { path = "../../native" } -iced_lazy = { path = "../../lazy" } \ No newline at end of file +iced_lazy = { path = "../../lazy" } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 9fe6b481..b9f0514c 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -26,6 +26,7 @@ struct Example { _focused: window::Id, } +#[derive(Debug)] struct Window { title: String, panes: pane_grid::State, @@ -80,8 +81,11 @@ impl Application for Example { ) } - fn title(&self) -> String { - String::from("Multi windowed pane grid - Iced") + fn title(&self, window: window::Id) -> String { + self.windows + .get(&window) + .map(|w| w.title.clone()) + .unwrap_or(String::from("New Window")) } fn update(&mut self, message: Message) -> Command { @@ -262,7 +266,6 @@ impl Application for Example { &window.title, WindowMessage::TitleChanged, ), - button(text("Apply")).style(theme::Button::Primary), button(text("Close")) .on_press(WindowMessage::CloseWindow) .style(theme::Button::Destructive), @@ -389,6 +392,7 @@ impl std::fmt::Display for SelectableWindow { } } +#[derive(Debug)] struct Pane { id: usize, pub axis: pane_grid::Axis, diff --git a/glutin/src/application.rs b/glutin/src/application.rs index 45ff37f0..f43a47b9 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -245,18 +245,7 @@ where ) })?; - let (width, height) = window.inner_size().into(); - let surface_attributes = - SurfaceAttributesBuilder::::new() - .with_srgb(Some(true)) - .build( - window_handle, - NonZeroU32::new(width).unwrap_or(ONE), - NonZeroU32::new(height).unwrap_or(ONE), - ); - - let surface = display - .create_window_surface(configuration.as_ref(), &surface_attributes) + let surface = gl_surface(&display, configuration.as_ref(), &window) .map_err(|error| { Error::GraphicsCreationFailed( iced_graphics::Error::BackendError(format!( @@ -616,3 +605,23 @@ async fn run_instance( // Manually drop the user interface drop(ManuallyDrop::into_inner(user_interface)); } + +#[allow(unsafe_code)] +/// Creates a new [`glutin::Surface`]. +pub fn gl_surface( + display: &Display, + gl_config: &Config, + window: &winit::window::Window, +) -> Result, glutin::error::Error> { + let (width, height) = window.inner_size().into(); + + let surface_attributes = SurfaceAttributesBuilder::::new() + .with_srgb(Some(true)) + .build( + window.raw_window_handle(), + NonZeroU32::new(width).unwrap_or(ONE), + NonZeroU32::new(height).unwrap_or(ONE), + ); + + unsafe { display.create_window_surface(gl_config, &surface_attributes) } +} diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 35eeeb36..e79ec77d 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -12,7 +12,6 @@ use iced_winit::conversion; use iced_winit::futures; use iced_winit::futures::channel::mpsc; use iced_winit::renderer; -use iced_winit::settings; use iced_winit::user_interface; use iced_winit::window; use iced_winit::winit; @@ -26,11 +25,12 @@ use glutin::context::{ NotCurrentGlContextSurfaceAccessor, PossiblyCurrentGlContext, }; use glutin::display::{Display, DisplayApiPreference, GlDisplay}; -use glutin::surface::{ - GlSurface, Surface, SurfaceAttributesBuilder, SwapInterval, WindowSurface, -}; +use glutin::surface::{GlSurface, SwapInterval}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use crate::application::gl_surface; +use iced_native::window::Action; +use iced_winit::multi_window::Event; use std::collections::HashMap; use std::ffi::CString; use std::mem::ManuallyDrop; @@ -76,7 +76,7 @@ where }; let builder = settings.window.into_builder( - &application.title(), + &application.title(window::Id::MAIN), event_loop.primary_monitor(), settings.id, ); @@ -239,7 +239,14 @@ where ) })?; - let surface = gl_surface(&display, configuration.as_ref(), &window); + let surface = gl_surface(&display, configuration.as_ref(), &window) + .map_err(|error| { + Error::GraphicsCreationFailed( + iced_graphics::Error::BackendError(format!( + "failed to create surface: {error}" + )), + ) + })?; (display, window, configuration.0, surface, context) }; @@ -301,14 +308,13 @@ where event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), - winit::event::Event::UserEvent(Event::NewWindow(id, settings)) => { - // TODO(derezzedex) + winit::event::Event::UserEvent(Event::NewWindow { + id, + settings, + title, + }) => { let window = settings - .into_builder( - "fix window title", - event_loop.primary_monitor(), - None, - ) + .into_builder(&title, event_loop.primary_monitor(), None) .build(event_loop) .expect("Failed to build window"); @@ -372,9 +378,11 @@ async fn run_instance( let mut interfaces = ManuallyDrop::new(HashMap::new()); for (&id, window) in windows.keys().zip(windows.values()) { - let surface = gl_surface(&display, &configuration, &window); - let current_context = context.make_current(&surface).expect("Make current."); - let state = State::new(&application, &window); + let surface = gl_surface(&display, &configuration, &window) + .expect("Create surface."); + let current_context = + context.make_current(&surface).expect("Make current."); + let state = State::new(&application, id, &window); let physical_size = state.physical_size(); surface.resize( @@ -392,7 +400,9 @@ async fn run_instance( id, ); - context = current_context.make_not_current().expect("Make not current."); + context = current_context + .make_not_current() + .expect("Make not current."); let _ = states.insert(id, state); let _ = surfaces.insert(id, surface); @@ -431,7 +441,7 @@ async fn run_instance( let (filtered, remaining): (Vec<_>, Vec<_>) = events.iter().cloned().partition( |(window_id, _event): &( - Option, + Option, iced_native::event::Event, )| { *window_id == Some(id) || *window_id == None @@ -503,7 +513,11 @@ async fn run_instance( ); // Update window - state.synchronize(&application, &windows); + state.synchronize( + &application, + id, + windows.get(&id).expect("No window found with ID."), + ); let should_exit = application.should_exit(); @@ -563,7 +577,7 @@ async fn run_instance( event::Event::UserEvent(event) => match event { Event::Application(message) => messages.push(message), Event::WindowCreated(id, window) => { - let state = State::new(&application, &window); + let state = State::new(&application, id, &window); let user_interface = multi_window::build_user_interface( &application, user_interface::Cache::default(), @@ -573,26 +587,8 @@ async fn run_instance( id, ); - let window_handle = window.raw_window_handle(); - let (width, height) = window.inner_size().into(); - let surface_attributes = - SurfaceAttributesBuilder::::new() - .with_srgb(Some(true)) - .build( - window_handle, - NonZeroU32::new(width).unwrap_or(ONE), - NonZeroU32::new(height).unwrap_or(ONE), - ); - - #[allow(unsafe_code)] - let surface = unsafe { - display - .create_window_surface( - &configuration, - &surface_attributes, - ) - .expect("failed to create surface") - }; + let surface = gl_surface(&display, &configuration, &window) + .expect("Create surface."); let _ = states.insert(id, state); let _ = interfaces.insert(id, user_interface); @@ -624,7 +620,7 @@ async fn run_instance( break 'main; } } - Event::NewWindow(_, _) => unreachable!(), + Event::NewWindow { .. } => unreachable!(), }, event::Event::RedrawRequested(id) => { let state = window_ids @@ -687,9 +683,10 @@ async fn run_instance( NonZeroU32::new(physical_size.height).unwrap_or(ONE), ); - if let Err(error) = - surface.set_swap_interval(¤t_context, SwapInterval::Wait(ONE)) - { + if let Err(_) = surface.set_swap_interval( + ¤t_context, + SwapInterval::Wait(ONE), + ) { log::error!("Could not set swap interval for surface attached to window id: {:?}", id); } @@ -706,9 +703,13 @@ async fn run_instance( &debug.overlay(), ); - surface.swap_buffers(¤t_context).expect("Swap buffers"); + surface + .swap_buffers(¤t_context) + .expect("Swap buffers"); - context = current_context.make_not_current().expect("Make not current."); + context = current_context + .make_not_current() + .expect("Make not current."); debug.render_finished(); // TODO: Handle animations! // Maybe we can use `ControlFlow::WaitUntil` for this. @@ -751,11 +752,10 @@ async fn run_instance( )); } } else { - // TODO(derezzedex): log error + log::error!("Window state not found for id: {:?}", window_id); } } else { - // TODO(derezzedex): log error - // println!("{:?}: {:?}", window_id, window_event); + log::error!("Window not found for id: {:?}", window_id); } } _ => {} @@ -766,25 +766,6 @@ async fn run_instance( // drop(ManuallyDrop::into_inner(user_interface)); } -/// TODO(derezzedex): -// This is the an wrapper around the `Application::Message` associate type -// to allows the `shell` to create internal messages, while still having -// the current user specified custom messages. -#[derive(Debug)] -pub enum Event { - /// An [`Application`] generated message - Application(Message), - - /// TODO(derezzedex) - // Create a wrapper variant of `window::Event` type instead - // (maybe we should also allow users to listen/react to those internal messages?) - NewWindow(window::Id, settings::Window), - /// TODO(derezzedex) - CloseWindow(window::Id), - /// TODO(derezzedex) - WindowCreated(window::Id, winit::window::Window), -} - /// Updates an [`Application`] by feeding it the provided messages, spawning any /// resulting [`Command`], and tracking its [`Subscription`]. pub fn update( @@ -872,7 +853,11 @@ pub fn run_command( command::Action::Window(id, action) => match action { window::Action::Spawn { settings } => { proxy - .send_event(Event::NewWindow(id, settings.into())) + .send_event(Event::NewWindow { + id, + settings: settings.into(), + title: application.title(id), + }) .expect("Send message to event loop"); } window::Action::Close => { @@ -934,6 +919,16 @@ pub fn run_command( let window = windows.get(&id).expect("No window found!"); window.set_decorations(!window.is_decorated()); } + Action::RequestUserAttention(attention_type) => { + let window = windows.get(&id).expect("No window found!"); + window.request_user_attention( + attention_type.map(conversion::user_attention), + ); + } + Action::GainFocus => { + let window = windows.get(&id).expect("No window found!"); + window.focus_window(); + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { @@ -1031,26 +1026,3 @@ where interfaces } - -#[allow(unsafe_code)] -fn gl_surface( - display: &Display, - gl_config: &Config, - window: &winit::window::Window, -) -> Surface { - let (width, height) = window.inner_size().into(); - - let surface_attributes = SurfaceAttributesBuilder::::new() - .with_srgb(Some(true)) - .build( - window.raw_window_handle(), - NonZeroU32::new(width).unwrap_or(ONE), - NonZeroU32::new(height).unwrap_or(ONE), - ); - - unsafe { - display - .create_window_surface(gl_config, &surface_attributes) - .expect("failed to create surface") - } -} diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs index e7e82876..04ec5083 100644 --- a/glutin/src/multi_window/state.rs +++ b/glutin/src/multi_window/state.rs @@ -8,7 +8,6 @@ use iced_winit::winit; use winit::event::{Touch, WindowEvent}; use winit::window::Window; -use std::collections::HashMap; use std::marker::PhantomData; /// The state of a windowed [`Application`]. @@ -33,8 +32,8 @@ where ::Theme: application::StyleSheet, { /// Creates a new [`State`] for the provided [`Application`] and window. - pub fn new(application: &A, window: &Window) -> Self { - let title = application.title(); + pub fn new(application: &A, window_id: window::Id, window: &Window) -> Self { + let title = application.title(window_id); let scale_factor = application.scale_factor(); let theme = application.theme(); let appearance = theme.appearance(&application.style()); @@ -67,7 +66,7 @@ where &self.viewport } - /// TODO(derezzedex) + /// Returns whether or not the current [`Viewport`] has changed. pub fn viewport_changed(&self) -> bool { self.viewport_changed } @@ -187,12 +186,11 @@ where pub fn synchronize( &mut self, application: &A, - windows: &HashMap, + window_id: window::Id, + window: &Window, ) { - let window = windows.values().next().expect("No window found"); - // Update window title - let new_title = application.title(); + let new_title = application.title(window_id); if self.title != new_title { window.set_title(&new_title); diff --git a/native/src/window.rs b/native/src/window.rs index 1c03fcdf..96a5fe61 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -4,6 +4,8 @@ mod event; mod icon; mod id; mod mode; +mod position; +mod settings; mod user_attention; pub use action::Action; @@ -11,6 +13,6 @@ pub use event::Event; pub use icon::Icon; pub use id::Id; pub use mode::Mode; -pub use user_attention::UserAttention; pub use position::Position; pub use settings::Settings; +pub use user_attention::UserAttention; diff --git a/native/src/window/action.rs b/native/src/window/action.rs index 0587f25c..929663ec 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::window::{self, Mode, UserAttention}; +use crate::window; use iced_futures::MaybeSend; use std::fmt; @@ -13,9 +13,9 @@ pub enum Action { /// There’s no guarantee that this will work unless the left mouse /// button was pressed immediately before this function is called. Drag, - /// TODO(derezzedex) + /// Spawns a new window with the provided [`window::Settings`]. Spawn { - /// TODO(derezzedex) + /// The settings of the [`Window`]. settings: window::Settings, }, /// Resize the window. @@ -62,7 +62,7 @@ pub enum Action { /// - **macOS:** `None` has no effect. /// - **X11:** Requests for user attention must be manually cleared. /// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect. - RequestUserAttention(Option), + RequestUserAttention(Option), /// Brings the window to the front and sets input focus. Has no effect if the window is /// already in focus, minimized, or not visible. /// diff --git a/native/src/window/icon.rs b/native/src/window/icon.rs index e89baf03..08a6acfd 100644 --- a/native/src/window/icon.rs +++ b/native/src/window/icon.rs @@ -3,10 +3,10 @@ /// The icon of a window. #[derive(Debug, Clone)] pub struct Icon { - /// TODO(derezzedex) + /// The __rgba__ color data of the window [`Icon`]. pub rgba: Vec, - /// TODO(derezzedex) + /// The width of the window [`Icon`]. pub width: u32, - /// TODO(derezzedex) + /// The height of the window [`Icon`]. pub height: u32, } diff --git a/native/src/window/id.rs b/native/src/window/id.rs index 5060e162..fa9761f5 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -1,15 +1,18 @@ use std::collections::hash_map::DefaultHasher; +use std::fmt::{Display, Formatter}; use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] -/// TODO(derezzedex) +/// The ID of the window. +/// +/// This is not necessarily the same as the window ID fetched from `winit::window::Window`. pub struct Id(u64); impl Id { /// TODO(derezzedex): maybe change `u64` to an enum `Type::{Single, Multi(u64)}` pub const MAIN: Self = Id(0); - /// TODO(derezzedex) + /// Creates a new unique window ID. pub fn new(id: impl Hash) -> Id { let mut hasher = DefaultHasher::new(); id.hash(&mut hasher); @@ -17,3 +20,9 @@ impl Id { Id(hasher.finish()) } } + +impl Display for Id { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "Id({})", self.0) + } +} diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 7d559397..dc1ac5b0 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -44,7 +44,7 @@ pub trait Application: Sized { /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. - fn title(&self) -> String; + fn title(&self, window: window::Id) -> String; /// Handles a __message__ and updates the state of the [`Application`]. /// @@ -110,7 +110,7 @@ pub trait Application: Sized { false } - /// TODO(derezzedex) + /// Requests that the [`window`] be closed. fn close_requested(&self, window: window::Id) -> Self::Message; /// Runs the [`Application`]. @@ -163,8 +163,8 @@ where (Instance(app), command) } - fn title(&self) -> String { - self.0.title() + fn title(&self, window: window::Id) -> String { + self.0.title(window) } fn update(&mut self, message: Self::Message) -> Command { diff --git a/winit/src/application.rs b/winit/src/application.rs index 910f3d94..eef6833c 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -675,7 +675,7 @@ pub fn run_command( window::Action::Drag => { let _res = window.drag_window(); } - window::Action::Spawn { .. } | window::Action::Close => { + window::Action::Spawn { .. } => { log::info!( "This is only available on `multi_window::Application`" ) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 43455148..6a2bdca9 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -22,6 +22,7 @@ use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; +use iced_native::window::Action; use std::collections::HashMap; use std::mem::ManuallyDrop; @@ -36,7 +37,14 @@ pub enum Event { /// TODO(derezzedex) // Create a wrapper variant of `window::Event` type instead // (maybe we should also allow users to listen/react to those internal messages?) - NewWindow(window::Id, settings::Window), + NewWindow { + /// The [window::Id] of the newly spawned [`Window`]. + id: window::Id, + /// The [settings::Window] of the newly spawned [`Window`]. + settings: settings::Window, + /// The title of the newly spawned [`Window`]. + title: String, + }, /// TODO(derezzedex) CloseWindow(window::Id), /// TODO(derezzedex) @@ -95,11 +103,11 @@ where /// load state from a file, perform an initial HTTP request, etc. fn new(flags: Self::Flags) -> (Self, Command); - /// Returns the current title of the [`Application`]. + /// Returns the current title of the current [`Application`] window. /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. - fn title(&self) -> String; + fn title(&self, window_id: window::Id) -> String; /// Returns the current [`Theme`] of the [`Application`]. fn theme(&self) -> ::Theme; @@ -144,7 +152,7 @@ where false } - /// TODO(derezzedex) + /// Requests that the [`window`] be closed. fn close_requested(&self, window: window::Id) -> Self::Message; } @@ -184,7 +192,7 @@ where }; let builder = settings.window.into_builder( - &application.title(), + &application.title(window::Id::MAIN), event_loop.primary_monitor(), settings.id, ); @@ -253,14 +261,13 @@ where event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), - winit::event::Event::UserEvent(Event::NewWindow(id, settings)) => { - // TODO(derezzedex) + winit::event::Event::UserEvent(Event::NewWindow { + id, + settings, + title, + }) => { let window = settings - .into_builder( - "fix window title", - event_loop.primary_monitor(), - None, - ) + .into_builder(&title, event_loop.primary_monitor(), None) .build(event_loop) .expect("Failed to build window"); @@ -320,10 +327,7 @@ async fn run_instance( for (&id, window) in windows.keys().zip(windows.values()) { let mut surface = compositor.create_surface(window); - println!("Creating surface for window: {:?}", window); - - let state = State::new(&application, window); - + let state = State::new(&application, id, window); let physical_size = state.physical_size(); compositor.configure_surface( @@ -457,7 +461,11 @@ async fn run_instance( ); // Update window - state.synchronize(&application, &windows); + state.synchronize( + &application, + id, + windows.get(&id).expect("No window found with ID."), + ); let should_exit = application.should_exit(); @@ -516,72 +524,85 @@ async fn run_instance( ), )); } - event::Event::UserEvent(event) => { - match event { - Event::Application(message) => { - messages.push(message); - } - Event::WindowCreated(id, window) => { - let mut surface = compositor.create_surface(&window); - - let state = State::new(&application, &window); - - let physical_size = state.physical_size(); - - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); - - let user_interface = build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - id, - ); - - let _ = states.insert(id, state); - let _ = surfaces.insert(id, surface); - let _ = interfaces.insert(id, user_interface); - let _ = window_ids.insert(window.id(), id); - let _ = windows.insert(id, window); - } - Event::CloseWindow(id) => { - println!("Closing window {:?}. Total: {}", id, windows.len()); - - if let Some(window) = windows.get(&id) { - if window_ids.remove(&window.id()).is_none() { - log::error!("Failed to remove window with id {:?} from window_ids.", window.id()); - } - } else { - log::error!("Could not find window with id {:?} in windows.", id); - } - if states.remove(&id).is_none() { - log::error!("Failed to remove window {:?} from states.", id); - } - if interfaces.remove(&id).is_none() { - log::error!("Failed to remove window {:?} from interfaces.", id); - } - if windows.remove(&id).is_none() { - log::error!("Failed to remove window {:?} from windows.", id); - } - if surfaces.remove(&id).is_none() { - log::error!("Failed to remove window {:?} from surfaces.", id); - } - - if windows.is_empty() { - log::info!("All windows are closed. Terminating program."); - break 'main; - } else { - log::info!("Remaining windows: {:?}", windows.len()); - } - } - Event::NewWindow(_, _) => unreachable!(), + event::Event::UserEvent(event) => match event { + Event::Application(message) => { + messages.push(message); } - } + Event::WindowCreated(id, window) => { + let mut surface = compositor.create_surface(&window); + + let state = State::new(&application, id, &window); + + let physical_size = state.physical_size(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + let user_interface = build_user_interface( + &application, + user_interface::Cache::default(), + &mut renderer, + state.logical_size(), + &mut debug, + id, + ); + + let _ = states.insert(id, state); + let _ = surfaces.insert(id, surface); + let _ = interfaces.insert(id, user_interface); + let _ = window_ids.insert(window.id(), id); + let _ = windows.insert(id, window); + } + Event::CloseWindow(id) => { + if let Some(window) = windows.get(&id) { + if window_ids.remove(&window.id()).is_none() { + log::error!("Failed to remove window with id {:?} from window_ids.", window.id()); + } + } else { + log::error!( + "Could not find window with id {:?} in windows.", + id + ); + } + if states.remove(&id).is_none() { + log::error!( + "Failed to remove window {:?} from states.", + id + ); + } + if interfaces.remove(&id).is_none() { + log::error!( + "Failed to remove window {:?} from interfaces.", + id + ); + } + if windows.remove(&id).is_none() { + log::error!( + "Failed to remove window {:?} from windows.", + id + ); + } + if surfaces.remove(&id).is_none() { + log::error!( + "Failed to remove window {:?} from surfaces.", + id + ); + } + + if windows.is_empty() { + log::info!( + "All windows are closed. Terminating program." + ); + break 'main; + } else { + log::info!("Remaining windows: {:?}", windows.len()); + } + } + Event::NewWindow { .. } => unreachable!(), + }, event::Event::RedrawRequested(id) => { let state = window_ids .get(&id) @@ -716,11 +737,10 @@ async fn run_instance( )); } } else { - // TODO(derezzedex): log error + log::error!("No window state found for id: {:?}", window_id); } } else { - // TODO(derezzedex): log error - // println!("{:?}: {:?}", window_id, window_event); + log::error!("No window found with id: {:?}", window_id); } } _ => {} @@ -864,7 +884,11 @@ pub fn run_command( command::Action::Window(id, action) => match action { window::Action::Spawn { settings } => { proxy - .send_event(Event::NewWindow(id, settings.into())) + .send_event(Event::NewWindow { + id, + settings: settings.into(), + title: application.title(id), + }) .expect("Send message to event loop"); } window::Action::Close => { @@ -926,6 +950,16 @@ pub fn run_command( let window = windows.get(&id).expect("No window found!"); window.set_decorations(!window.is_decorated()); } + window::Action::RequestUserAttention(attention_type) => { + let window = windows.get(&id).expect("No window found!"); + window.request_user_attention( + attention_type.map(conversion::user_attention), + ); + } + Action::GainFocus => { + let window = windows.get(&id).expect("No window found!"); + window.focus_window(); + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index eebdcdf1..7a598b98 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -4,7 +4,6 @@ use crate::multi_window::Application; use crate::window; use crate::{Color, Debug, Point, Size, Viewport}; -use std::collections::HashMap; use std::marker::PhantomData; use winit::event::{Touch, WindowEvent}; use winit::window::Window; @@ -31,8 +30,8 @@ where ::Theme: application::StyleSheet, { /// Creates a new [`State`] for the provided [`Application`] and window. - pub fn new(application: &A, window: &Window) -> Self { - let title = application.title(); + pub fn new(application: &A, window_id: window::Id, window: &Window) -> Self { + let title = application.title(window_id); let scale_factor = application.scale_factor(); let theme = application.theme(); let appearance = theme.appearance(&application.style()); @@ -65,7 +64,7 @@ where &self.viewport } - /// TODO(derezzedex) + /// Returns whether or not the viewport changed. pub fn viewport_changed(&self) -> bool { self.viewport_changed } @@ -184,12 +183,11 @@ where pub fn synchronize( &mut self, application: &A, - windows: &HashMap, + window_id: window::Id, + window: &Window, ) { - let window = windows.values().next().expect("No window found"); - // Update window title - let new_title = application.title(); + let new_title = application.title(window_id); if self.title != new_title { window.set_title(&new_title); diff --git a/winit/src/window.rs b/winit/src/window.rs index fba863ef..5a8ff6df 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -2,19 +2,19 @@ use crate::command::{self, Command}; use iced_native::window; -pub use window::{Id, Event, Mode, UserAttention}; +pub use window::{Event, Id, Mode, UserAttention}; -/// Closes the current window and exits the application. -pub fn close() -> Command { - Command::single(command::Action::Window(window::Action::Close)) +/// Closes the window. +pub fn close(id: window::Id) -> Command { + Command::single(command::Action::Window(id, window::Action::Close)) } /// Begins dragging the window while the left mouse button is held. -pub fn drag() -> Command { - Command::single(command::Action::Window(window::Action::Drag)) +pub fn drag(id: window::Id) -> Command { + Command::single(command::Action::Window(id, window::Action::Drag)) } -/// TODO(derezzedex) +/// Spawns a new window. pub fn spawn( id: window::Id, settings: window::Settings, @@ -25,11 +25,6 @@ pub fn spawn( )) } -/// TODO(derezzedex) -pub fn close(id: window::Id) -> Command { - Command::single(command::Action::Window(id, window::Action::Close)) -} - /// Resizes the window to the given logical dimensions. pub fn resize( id: window::Id, @@ -43,13 +38,19 @@ pub fn resize( } /// Sets the window to maximized or back. -pub fn maximize(value: bool) -> Command { - Command::single(command::Action::Window(window::Action::Maximize(value))) +pub fn maximize(id: window::Id, value: bool) -> Command { + Command::single(command::Action::Window( + id, + window::Action::Maximize(value), + )) } /// Set the window to minimized or back. -pub fn minimize(value: bool) -> Command { - Command::single(command::Action::Window(window::Action::Minimize(value))) +pub fn minimize(id: window::Id, value: bool) -> Command { + Command::single(command::Action::Window( + id, + window::Action::Minimize(value), + )) } /// Moves a window to the given logical coordinates. @@ -63,8 +64,8 @@ pub fn set_mode(id: window::Id, mode: Mode) -> Command { } /// Sets the window to maximized or back. -pub fn toggle_maximize() -> Command { - Command::single(command::Action::Window(window::Action::ToggleMaximize)) +pub fn toggle_maximize(id: window::Id) -> Command { + Command::single(command::Action::Window(id, window::Action::ToggleMaximize)) } /// Fetches the current [`Mode`] of the window. From 3e5d34f25fa07fa99f57b686bbde87d73b8ed548 Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Mon, 9 Jan 2023 10:19:12 -0800 Subject: [PATCH 033/286] Formatting --- examples/multi_window/src/main.rs | 10 ++-- glutin/src/multi_window/state.rs | 8 +++- src/multi_window/application.rs | 79 +++++++++++++++++++++++++------ winit/src/multi_window/state.rs | 9 ++-- 4 files changed, 81 insertions(+), 25 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index b9f0514c..18536bdf 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -57,9 +57,9 @@ enum WindowMessage { } impl Application for Example { + type Executor = executor::Default; type Message = Message; type Theme = Theme; - type Executor = executor::Default; type Flags = (); fn new(_flags: ()) -> (Self, Command) { @@ -251,10 +251,6 @@ impl Application for Example { }) } - fn close_requested(&self, window: window::Id) -> Self::Message { - Message::Window(window, WindowMessage::CloseWindow) - } - fn view(&self, window_id: window::Id) -> Element { if let Some(window) = self.windows.get(&window_id) { let focus = window.focus; @@ -342,6 +338,10 @@ impl Application for Example { .center_y() .into() } + + fn close_requested(&self, window: window::Id) -> Self::Message { + Message::Window(window, WindowMessage::CloseWindow) + } } const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs index 04ec5083..8ed134b2 100644 --- a/glutin/src/multi_window/state.rs +++ b/glutin/src/multi_window/state.rs @@ -31,8 +31,12 @@ impl State where ::Theme: application::StyleSheet, { - /// Creates a new [`State`] for the provided [`Application`] and window. - pub fn new(application: &A, window_id: window::Id, window: &Window) -> Self { + /// Creates a new [`State`] for the provided [`Application`]'s window. + pub fn new( + application: &A, + window_id: window::Id, + window: &Window, + ) -> Self { let title = application.title(window_id); let scale_factor = application.scale_factor(); let theme = application.theme(); diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index dc1ac5b0..3f20382c 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -3,13 +3,62 @@ use crate::{Command, Element, Executor, Settings, Subscription}; pub use iced_native::application::{Appearance, StyleSheet}; -/// A pure version of [`Application`]. +/// An interactive cross-platform multi-window application. /// -/// Unlike the impure version, the `view` method of this trait takes an -/// immutable reference to `self` and returns a pure [`Element`]. +/// This trait is the main entrypoint of Iced. Once implemented, you can run +/// your GUI application by simply calling [`run`](#method.run). /// -/// [`Application`]: crate::Application -/// [`Element`]: pure::Element +/// An [`Application`] can execute asynchronous actions by returning a +/// [`Command`] in some of its methods. For example, to spawn a new window, you +/// can use the `iced_winit::window::spawn()` [`Command`]. +/// +/// When using an [`Application`] with the `debug` feature enabled, a debug view +/// can be toggled by pressing `F12`. +/// +/// ## A simple "Hello, world!" +/// +/// If you just want to get started, here is a simple [`Application`] that +/// says "Hello, world!": +/// +/// ```no_run +/// use iced::executor; +/// use iced::multi_window::Application; +/// use iced::window; +/// use iced::{Command, Element, Settings, Theme}; +/// +/// pub fn main() -> iced::Result { +/// Hello::run(Settings::default()) +/// } +/// +/// struct Hello; +/// +/// impl Application for Hello { +/// type Executor = executor::Default; +/// type Message = (); +/// type Theme = Theme; +/// type Flags = (); +/// +/// fn new(_flags: ()) -> (Hello, Command) { +/// (Hello, Command::none()) +/// } +/// +/// fn title(&self, window: window::Id) -> String { +/// String::from("A cool application") +/// } +/// +/// fn update(&mut self, _message: Self::Message) -> Command { +/// Command::none() +/// } +/// +/// fn view(&self, window: window::Id) -> Element { +/// "Hello, world!".into() +/// } +/// +/// fn close_requested(&self, window: window::Id) -> Self::Message { +/// () +/// } +/// } +/// ``` pub trait Application: Sized { /// The [`Executor`] that will run commands and subscriptions. /// @@ -157,16 +206,6 @@ where type Renderer = crate::Renderer; type Message = A::Message; - fn new(flags: Self::Flags) -> (Self, Command) { - let (app, command) = A::new(flags); - - (Instance(app), command) - } - - fn title(&self, window: window::Id) -> String { - self.0.title(window) - } - fn update(&mut self, message: Self::Message) -> Command { self.0.update(message) } @@ -178,6 +217,16 @@ where self.0.view(window) } + fn new(flags: Self::Flags) -> (Self, Command) { + let (app, command) = A::new(flags); + + (Instance(app), command) + } + + fn title(&self, window: window::Id) -> String { + self.0.title(window) + } + fn theme(&self) -> A::Theme { self.0.theme() } diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 7a598b98..2c2a4693 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -29,8 +29,12 @@ impl State where ::Theme: application::StyleSheet, { - /// Creates a new [`State`] for the provided [`Application`] and window. - pub fn new(application: &A, window_id: window::Id, window: &Window) -> Self { + /// Creates a new [`State`] for the provided [`Application`]'s window. + pub fn new( + application: &A, + window_id: window::Id, + window: &Window, + ) -> Self { let title = application.title(window_id); let scale_factor = application.scale_factor(); let theme = application.theme(); @@ -191,7 +195,6 @@ where if self.title != new_title { window.set_title(&new_title); - self.title = new_title; } From f78ccd9af9ced4c18ed4b56cbf838c6c5a5119ad Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Mon, 9 Jan 2023 11:48:34 -0800 Subject: [PATCH 034/286] Removed glutin's individual multi_window state since 0.30+ doesn't have its own event crate anymore --- glutin/src/multi_window.rs | 14 +- glutin/src/multi_window/state.rs | 223 ------------------------------- 2 files changed, 5 insertions(+), 232 deletions(-) delete mode 100644 glutin/src/multi_window/state.rs diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index e79ec77d..2b456543 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -1,8 +1,4 @@ //! Create interactive, native cross-platform applications. -mod state; - -pub use state::State; - use crate::mouse; use crate::{Error, Executor, Runtime}; @@ -382,7 +378,7 @@ async fn run_instance( .expect("Create surface."); let current_context = context.make_current(&surface).expect("Make current."); - let state = State::new(&application, id, &window); + let state = multi_window::State::new(&application, id, &window); let physical_size = state.physical_size(); surface.resize( @@ -577,7 +573,7 @@ async fn run_instance( event::Event::UserEvent(event) => match event { Event::Application(message) => messages.push(message), Event::WindowCreated(id, window) => { - let state = State::new(&application, id, &window); + let state = multi_window::State::new(&application, id, &window); let user_interface = multi_window::build_user_interface( &application, user_interface::Cache::default(), @@ -771,7 +767,7 @@ async fn run_instance( pub fn update( application: &mut A, cache: &mut user_interface::Cache, - state: &State, + state: &multi_window::State, renderer: &mut A::Renderer, runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, @@ -813,7 +809,7 @@ pub fn update( pub fn run_command( application: &A, cache: &mut user_interface::Cache, - state: &State, + state: &multi_window::State, renderer: &mut A::Renderer, command: Command, runtime: &mut Runtime>, Event>, @@ -993,7 +989,7 @@ pub fn build_user_interfaces<'a, A>( application: &'a A, renderer: &mut A::Renderer, debug: &mut Debug, - states: &HashMap>, + states: &HashMap>, mut pure_states: HashMap, ) -> HashMap< window::Id, diff --git a/glutin/src/multi_window/state.rs b/glutin/src/multi_window/state.rs deleted file mode 100644 index 8ed134b2..00000000 --- a/glutin/src/multi_window/state.rs +++ /dev/null @@ -1,223 +0,0 @@ -use crate::application::{self, StyleSheet as _}; -use crate::conversion; -use crate::multi_window::Application; -use crate::window; -use crate::{Color, Debug, Point, Size, Viewport}; - -use iced_winit::winit; -use winit::event::{Touch, WindowEvent}; -use winit::window::Window; - -use std::marker::PhantomData; - -/// The state of a windowed [`Application`]. -#[allow(missing_debug_implementations)] -pub struct State -where - ::Theme: application::StyleSheet, -{ - title: String, - scale_factor: f64, - viewport: Viewport, - viewport_changed: bool, - cursor_position: winit::dpi::PhysicalPosition, - modifiers: winit::event::ModifiersState, - theme: ::Theme, - appearance: iced_winit::application::Appearance, - application: PhantomData, -} - -impl State -where - ::Theme: application::StyleSheet, -{ - /// Creates a new [`State`] for the provided [`Application`]'s window. - pub fn new( - application: &A, - window_id: window::Id, - window: &Window, - ) -> Self { - let title = application.title(window_id); - let scale_factor = application.scale_factor(); - let theme = application.theme(); - let appearance = theme.appearance(&application.style()); - - let viewport = { - let physical_size = window.inner_size(); - - Viewport::with_physical_size( - Size::new(physical_size.width, physical_size.height), - window.scale_factor() * scale_factor, - ) - }; - - Self { - title, - scale_factor, - viewport, - viewport_changed: false, - // TODO: Encode cursor availability in the type-system - cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0), - modifiers: winit::event::ModifiersState::default(), - theme, - appearance, - application: PhantomData, - } - } - - /// Returns the current [`Viewport`] of the [`State`]. - pub fn viewport(&self) -> &Viewport { - &self.viewport - } - - /// Returns whether or not the current [`Viewport`] has changed. - pub fn viewport_changed(&self) -> bool { - self.viewport_changed - } - - /// Returns the physical [`Size`] of the [`Viewport`] of the [`State`]. - pub fn physical_size(&self) -> Size { - self.viewport.physical_size() - } - - /// Returns the logical [`Size`] of the [`Viewport`] of the [`State`]. - pub fn logical_size(&self) -> Size { - self.viewport.logical_size() - } - - /// Returns the current scale factor of the [`Viewport`] of the [`State`]. - pub fn scale_factor(&self) -> f64 { - self.viewport.scale_factor() - } - - /// Returns the current cursor position of the [`State`]. - pub fn cursor_position(&self) -> Point { - conversion::cursor_position( - self.cursor_position, - self.viewport.scale_factor(), - ) - } - - /// Returns the current keyboard modifiers of the [`State`]. - pub fn modifiers(&self) -> winit::event::ModifiersState { - self.modifiers - } - - /// Returns the current theme of the [`State`]. - pub fn theme(&self) -> &::Theme { - &self.theme - } - - /// Returns the current background [`Color`] of the [`State`]. - pub fn background_color(&self) -> Color { - self.appearance.background_color - } - - /// Returns the current text [`Color`] of the [`State`]. - pub fn text_color(&self) -> Color { - self.appearance.text_color - } - - /// Processes the provided window event and updates the [`State`] - /// accordingly. - pub fn update( - &mut self, - window: &Window, - event: &WindowEvent<'_>, - _debug: &mut Debug, - ) { - match event { - WindowEvent::Resized(new_size) => { - let size = Size::new(new_size.width, new_size.height); - - self.viewport = Viewport::with_physical_size( - size, - window.scale_factor() * self.scale_factor, - ); - - self.viewport_changed = true; - } - WindowEvent::ScaleFactorChanged { - scale_factor: new_scale_factor, - new_inner_size, - } => { - let size = - Size::new(new_inner_size.width, new_inner_size.height); - - self.viewport = Viewport::with_physical_size( - size, - new_scale_factor * self.scale_factor, - ); - - self.viewport_changed = true; - } - WindowEvent::CursorMoved { position, .. } - | WindowEvent::Touch(Touch { - location: position, .. - }) => { - self.cursor_position = *position; - } - WindowEvent::CursorLeft { .. } => { - // TODO: Encode cursor availability in the type-system - self.cursor_position = - winit::dpi::PhysicalPosition::new(-1.0, -1.0); - } - WindowEvent::ModifiersChanged(new_modifiers) => { - self.modifiers = *new_modifiers; - } - #[cfg(feature = "debug")] - WindowEvent::KeyboardInput { - input: - glutin::event::KeyboardInput { - virtual_keycode: - Some(glutin::event::VirtualKeyCode::F12), - state: glutin::event::ElementState::Pressed, - .. - }, - .. - } => _debug.toggle(), - _ => {} - } - } - - /// Synchronizes the [`State`] with its [`Application`] and its respective - /// window. - /// - /// Normally an [`Application`] should be synchronized with its [`State`] - /// and window after calling [`Application::update`]. - /// - /// [`Application::update`]: crate::Program::update - pub fn synchronize( - &mut self, - application: &A, - window_id: window::Id, - window: &Window, - ) { - // Update window title - let new_title = application.title(window_id); - - if self.title != new_title { - window.set_title(&new_title); - - self.title = new_title; - } - - // Update scale factor - let new_scale_factor = application.scale_factor(); - - if self.scale_factor != new_scale_factor { - let size = window.inner_size(); - - self.viewport = Viewport::with_physical_size( - Size::new(size.width, size.height), - window.scale_factor() * new_scale_factor, - ); - - self.scale_factor = new_scale_factor; - } - - // Update theme and appearance - self.theme = application.theme(); - self.appearance = self.theme.appearance(&application.style()); - } -} From 790fa3e7a01a790aa3f07083fe9abf6b68fa7ba1 Mon Sep 17 00:00:00 2001 From: Bingus Date: Fri, 13 Jan 2023 11:56:28 -0800 Subject: [PATCH 035/286] Added tracing to multi_window applications --- glutin/Cargo.toml | 2 +- glutin/src/application.rs | 8 ++-- glutin/src/multi_window.rs | 50 ++++++++++++++------ winit/src/application.rs | 4 +- winit/src/lib.rs | 4 +- winit/src/multi_window.rs | 61 ++++++++++++++++++++----- winit/src/{application => }/profiler.rs | 1 + 7 files changed, 94 insertions(+), 36 deletions(-) rename winit/src/{application => }/profiler.rs (98%) diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 3f902d20..5197b076 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -11,7 +11,7 @@ keywords = ["gui", "ui", "graphics", "interface", "widgets"] categories = ["gui"] [features] -trace = ["iced_winit/trace"] +trace = ["iced_winit/trace", "tracing"] debug = ["iced_winit/debug"] system = ["iced_winit/system"] multi_window = ["iced_winit/multi_window"] diff --git a/glutin/src/application.rs b/glutin/src/application.rs index f43a47b9..a6479597 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -33,7 +33,7 @@ use std::ffi::CString; use std::mem::ManuallyDrop; use std::num::NonZeroU32; -#[cfg(feature = "tracing")] +#[cfg(feature = "trace")] use tracing::{info_span, instrument::Instrument}; #[allow(unsafe_code)] @@ -62,7 +62,7 @@ where let mut debug = Debug::new(); debug.startup_started(); - #[cfg(feature = "tracing")] + #[cfg(feature = "trace")] let _ = info_span!("Application::Glutin", "RUN").entered(); let mut event_loop = EventLoopBuilder::with_user_event().build(); @@ -298,7 +298,7 @@ where settings.exit_on_close_request, ); - #[cfg(feature = "tracing")] + #[cfg(feature = "trace")] let run_instance = run_instance.instrument(info_span!("Application", "LOOP")); @@ -509,7 +509,7 @@ async fn run_instance( messages.push(message); } event::Event::RedrawRequested(_) => { - #[cfg(feature = "tracing")] + #[cfg(feature = "trace")] let _ = info_span!("Application", "FRAME").entered(); debug.render_started(); diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 2b456543..a2e0581a 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -32,6 +32,9 @@ use std::ffi::CString; use std::mem::ManuallyDrop; use std::num::NonZeroU32; +#[cfg(feature = "tracing")] +use tracing::{info_span, instrument::Instrument}; + #[allow(unsafe_code)] const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; @@ -52,9 +55,15 @@ where use winit::event_loop::EventLoopBuilder; use winit::platform::run_return::EventLoopExtRunReturn; + #[cfg(feature = "trace")] + let _guard = iced_winit::Profiler::init(); + let mut debug = Debug::new(); debug.startup_started(); + #[cfg(feature = "tracing")] + let _ = info_span!("Application::Glutin", "RUN").entered(); + let mut event_loop = EventLoopBuilder::with_user_event().build(); let proxy = event_loop.create_proxy(); @@ -267,21 +276,29 @@ where let (mut sender, receiver) = mpsc::unbounded(); - let mut instance = Box::pin(run_instance::( - application, - compositor, - renderer, - runtime, - proxy, - debug, - receiver, - display, - windows, - configuration, - context, - init_command, - settings.exit_on_close_request, - )); + let mut instance = Box::pin({ + let run_instance = run_instance::( + application, + compositor, + renderer, + runtime, + proxy, + debug, + receiver, + display, + windows, + configuration, + context, + init_command, + settings.exit_on_close_request, + ); + + #[cfg(feature = "tracing")] + let run_instance = + run_instance.instrument(info_span!("Application", "LOOP")); + + run_instance + }); let mut context = task::Context::from_waker(task::noop_waker_ref()); @@ -619,6 +636,9 @@ async fn run_instance( Event::NewWindow { .. } => unreachable!(), }, event::Event::RedrawRequested(id) => { + #[cfg(feature = "tracing")] + let _ = info_span!("Application", "FRAME").entered(); + let state = window_ids .get(&id) .and_then(|id| states.get_mut(id)) diff --git a/winit/src/application.rs b/winit/src/application.rs index eef6833c..76553988 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -1,6 +1,4 @@ //! Create interactive, native cross-platform applications. -#[cfg(feature = "trace")] -mod profiler; mod state; pub use state::State; @@ -27,7 +25,7 @@ pub use iced_native::application::{Appearance, StyleSheet}; use std::mem::ManuallyDrop; #[cfg(feature = "trace")] -pub use profiler::Profiler; +pub use crate::Profiler; #[cfg(feature = "trace")] use tracing::{info_span, instrument::Instrument}; diff --git a/winit/src/lib.rs b/winit/src/lib.rs index eb58482b..99a46850 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -51,11 +51,13 @@ pub mod system; mod error; mod icon; mod proxy; +#[cfg(feature = "trace")] +mod profiler; #[cfg(feature = "application")] pub use application::Application; #[cfg(feature = "trace")] -pub use application::Profiler; +pub use profiler::Profiler; pub use clipboard::Clipboard; pub use error::Error; pub use icon::Icon; diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 6a2bdca9..d7378a1d 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -26,6 +26,11 @@ use iced_native::window::Action; use std::collections::HashMap; use std::mem::ManuallyDrop; +#[cfg(feature = "trace")] +pub use crate::Profiler; +#[cfg(feature = "trace")] +use tracing::{info_span, instrument::Instrument}; + /// TODO(derezzedex) // This is the an wrapper around the `Application::Message` associate type // to allows the `shell` to create internal messages, while still having @@ -172,9 +177,15 @@ where use futures::Future; use winit::event_loop::EventLoopBuilder; + #[cfg(feature = "trace")] + let _guard = Profiler::init(); + let mut debug = Debug::new(); debug.startup_started(); + #[cfg(feature = "trace")] + let _ = info_span!("Application", "RUN").entered(); + let event_loop = EventLoopBuilder::with_user_event().build(); let proxy = event_loop.create_proxy(); @@ -227,18 +238,26 @@ where let (mut sender, receiver) = mpsc::unbounded(); - let mut instance = Box::pin(run_instance::( - application, - compositor, - renderer, - runtime, - proxy, - debug, - receiver, - init_command, - windows, - settings.exit_on_close_request, - )); + let mut instance = Box::pin({ + let run_instance = run_instance::( + application, + compositor, + renderer, + runtime, + proxy, + debug, + receiver, + init_command, + windows, + settings.exit_on_close_request, + ); + + #[cfg(feature = "trace")] + let run_instance = + run_instance.instrument(info_span!("Application", "LOOP")); + + run_instance + }); let mut context = task::Context::from_waker(task::noop_waker_ref()); @@ -604,6 +623,9 @@ async fn run_instance( Event::NewWindow { .. } => unreachable!(), }, event::Event::RedrawRequested(id) => { + #[cfg(feature = "trace")] + let _ = info_span!("Application", "FRAME").entered(); + let state = window_ids .get(&id) .and_then(|id| states.get_mut(id)) @@ -788,12 +810,22 @@ pub fn build_user_interface<'a, A: Application>( where ::Theme: StyleSheet, { + #[cfg(feature = "trace")] + let view_span = info_span!("Application", "VIEW").entered(); + debug.view_started(); let view = application.view(id); + + #[cfg(feature = "trace")] + let _ = view_span.exit(); debug.view_finished(); + #[cfg(feature = "trace")] + let layout_span = info_span!("Application", "LAYOUT").entered(); debug.layout_started(); let user_interface = UserInterface::build(view, size, cache, renderer); + #[cfg(feature = "trace")] + let _ = layout_span.exit(); debug.layout_finished(); user_interface @@ -817,10 +849,15 @@ pub fn update( ::Theme: StyleSheet, { for message in messages.drain(..) { + #[cfg(feature = "trace")] + let update_span = info_span!("Application", "UPDATE").entered(); + debug.log_message(&message); debug.update_started(); let command = runtime.enter(|| application.update(message)); + #[cfg(feature = "trace")] + let _ = update_span.exit(); debug.update_finished(); run_command( diff --git a/winit/src/application/profiler.rs b/winit/src/profiler.rs similarity index 98% rename from winit/src/application/profiler.rs rename to winit/src/profiler.rs index 23eaa390..1f638de8 100644 --- a/winit/src/application/profiler.rs +++ b/winit/src/profiler.rs @@ -21,6 +21,7 @@ pub struct Profiler { impl Profiler { /// Initializes the [`Profiler`]. pub fn init() -> Self { + log::info!("Capturing trace.."); // Registry stores the spans & generates unique span IDs let subscriber = Registry::default(); From 7e9a12a4aa64deda193dfc0f18c34f93e3adc852 Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 18 Jan 2023 15:17:20 -0800 Subject: [PATCH 036/286] New iced changes --- native/src/subscription.rs | 2 +- native/src/widget/text_input.rs | 2 +- native/src/window.rs | 6 +++--- winit/src/application.rs | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/native/src/subscription.rs b/native/src/subscription.rs index 8c92efad..f517fc70 100644 --- a/native/src/subscription.rs +++ b/native/src/subscription.rs @@ -70,7 +70,7 @@ where events.filter_map(move |(event, status)| { future::ready(match event { - Event::Window(window::Event::RedrawRequested(_)) => None, + Event::Window(_, window::Event::RedrawRequested(_)) => None, _ => f(event, status), }) }) diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 8755b85d..a62d9f35 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -782,7 +782,7 @@ where state.keyboard_modifiers = modifiers; } - Event::Window(window::Event::RedrawRequested(now)) => { + Event::Window(_, window::Event::RedrawRequested(now)) => { let state = state(); if let Some(focus) = &mut state.is_focused { diff --git a/native/src/window.rs b/native/src/window.rs index d3c8c96f..660cd54f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -5,8 +5,8 @@ mod icon; mod id; mod mode; mod position; -mod settings; mod redraw_request; +mod settings; mod user_attention; pub use action::Action; @@ -15,8 +15,8 @@ pub use icon::Icon; pub use id::Id; pub use mode::Mode; pub use position::Position; -pub use settings::Settings; pub use redraw_request::RedrawRequest; +pub use settings::Settings; pub use user_attention::UserAttention; use crate::subscription::{self, Subscription}; @@ -32,7 +32,7 @@ use crate::time::Instant; /// animations without missing any frames. pub fn frames() -> Subscription { subscription::raw_events(|event, _status| match event { - crate::Event::Window(Event::RedrawRequested(at)) => Some(at), + crate::Event::Window(_, Event::RedrawRequested(at)) => Some(at), _ => None, }) } diff --git a/winit/src/application.rs b/winit/src/application.rs index c66e08b2..d586fd21 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -402,6 +402,7 @@ async fn run_instance( // Then, we can use the `interface_state` here to decide if a redraw // is needed right away, or simply wait until a specific time. let redraw_event = Event::Window( + crate::window::Id::MAIN, crate::window::Event::RedrawRequested(Instant::now()), ); From 0a643287deece9234b64cc843a9f6ae3e6e4806e Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 18 Jan 2023 17:04:11 -0800 Subject: [PATCH 037/286] Added window::Id to multi_window application's scale_factor --- examples/multi_window/src/main.rs | 8 ++++++++ src/multi_window/application.rs | 6 +++--- winit/src/multi_window.rs | 2 +- winit/src/multi_window/state.rs | 4 ++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 18536bdf..0d0a809b 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -12,6 +12,7 @@ use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; use iced_lazy::responsive; use iced_native::{event, subscription, Event}; +use iced_native::window::Id; use std::collections::HashMap; pub fn main() -> iced::Result { @@ -29,6 +30,7 @@ struct Example { #[derive(Debug)] struct Window { title: String, + scale: f64, panes: pane_grid::State, focus: Option, } @@ -69,6 +71,7 @@ impl Application for Example { panes, focus: None, title: String::from("Default window"), + scale: 1.0, }; ( @@ -178,6 +181,7 @@ impl Application for Example { panes, focus: None, title: format!("New window ({})", self.windows.len()), + scale: 1.0 + (self.windows.len() as f64 / 10.0), }; let window_id = window::Id::new(self.windows.len()); @@ -342,6 +346,10 @@ impl Application for Example { fn close_requested(&self, window: window::Id) -> Self::Message { Message::Window(window, WindowMessage::CloseWindow) } + + fn scale_factor(&self, window: Id) -> f64 { + self.windows.get(&window).map(|w| w.scale).unwrap_or(1.0) + } } const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 3f20382c..3af1d8d5 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -148,7 +148,7 @@ pub trait Application: Sized { /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. - fn scale_factor(&self) -> f64 { + fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } @@ -239,8 +239,8 @@ where self.0.subscription() } - fn scale_factor(&self) -> f64 { - self.0.scale_factor() + fn scale_factor(&self, window: window::Id) -> f64 { + self.0.scale_factor(window) } fn should_exit(&self) -> bool { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index d7378a1d..ad65e6a5 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -146,7 +146,7 @@ where /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. - fn scale_factor(&self) -> f64 { + fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 2c2a4693..35c69924 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -36,7 +36,7 @@ where window: &Window, ) -> Self { let title = application.title(window_id); - let scale_factor = application.scale_factor(); + let scale_factor = application.scale_factor(window_id); let theme = application.theme(); let appearance = theme.appearance(&application.style()); @@ -199,7 +199,7 @@ where } // Update scale factor - let new_scale_factor = application.scale_factor(); + let new_scale_factor = application.scale_factor(window_id); if self.scale_factor != new_scale_factor { let size = window.inner_size(); From 367fea5dc8e94584334e880970126b40a046bfa6 Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 15 Feb 2023 11:28:36 -0800 Subject: [PATCH 038/286] Redraw request events for multiwindow. --- examples/solar_system/src/main.rs | 2 +- native/src/window.rs | 13 +++++++++++-- winit/src/multi_window.rs | 11 ++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 9a4ee754..eb461bb0 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -89,7 +89,7 @@ impl Application for SolarSystem { } fn subscription(&self) -> Subscription { - window::frames().map(Message::Tick) + window::frames().map(|frame| Message::Tick(frame.at)) } } diff --git a/native/src/window.rs b/native/src/window.rs index 660cd54f..aa11756f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -30,9 +30,18 @@ use crate::time::Instant; /// /// In any case, this [`Subscription`] is useful to smoothly draw application-driven /// animations without missing any frames. -pub fn frames() -> Subscription { +pub fn frames() -> Subscription { subscription::raw_events(|event, _status| match event { - crate::Event::Window(_, Event::RedrawRequested(at)) => Some(at), + crate::Event::Window(id, Event::RedrawRequested(at)) => { + Some(Frame { id, at }) + } _ => None, }) } + +/// The returned `Frame` for a framerate subscription. +#[derive(Debug)] +pub struct Frame { + pub id: Id, + pub at: Instant, +} diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index ad65e6a5..430e6706 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -25,6 +25,7 @@ pub use iced_native::application::{Appearance, StyleSheet}; use iced_native::window::Action; use std::collections::HashMap; use std::mem::ManuallyDrop; +use std::time::Instant; #[cfg(feature = "trace")] pub use crate::Profiler; @@ -402,7 +403,7 @@ async fn run_instance( let (filtered, remaining): (Vec<_>, Vec<_>) = events.iter().cloned().partition( |(window_id, _event): &( - Option, + Option, iced_native::event::Event, )| { *window_id == Some(id) || *window_id == None @@ -410,10 +411,14 @@ async fn run_instance( ); events.retain(|el| remaining.contains(el)); - let filtered: Vec<_> = filtered + let mut filtered: Vec<_> = filtered .into_iter() .map(|(_id, event)| event) .collect(); + filtered.push(iced_native::Event::Window( + id, + window::Event::RedrawRequested(Instant::now()), + )); let cursor_position = states.get(&id).unwrap().cursor_position(); @@ -450,7 +455,7 @@ async fn run_instance( user_interface::State::Outdated, ) { - let state = &mut states.get_mut(&id).unwrap(); + let state = states.get_mut(&id).unwrap(); let pure_states: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() From 64e0e817c27d720dc954ee94de58ded35b3f9f9a Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 15 Feb 2023 14:31:16 -0800 Subject: [PATCH 039/286] Widget operations for multi-window. --- examples/multi_window/src/main.rs | 50 +++++++++++-- glutin/src/multi_window.rs | 114 +++++++++++++++-------------- native/src/window.rs | 3 + winit/src/multi_window.rs | 115 ++++++++++++++++-------------- 4 files changed, 169 insertions(+), 113 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 0d0a809b..23f08217 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -12,6 +12,7 @@ use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; use iced_lazy::responsive; use iced_native::{event, subscription, Event}; +use iced_native::widget::scrollable::{Properties, RelativeOffset}; use iced_native::window::Id; use std::collections::HashMap; @@ -56,6 +57,7 @@ enum WindowMessage { CloseFocused, SelectedWindow(pane_grid::Pane, SelectableWindow), CloseWindow, + SnapToggle, } impl Application for Example { @@ -94,6 +96,25 @@ impl Application for Example { fn update(&mut self, message: Message) -> Command { let Message::Window(id, message) = message; match message { + WindowMessage::SnapToggle => { + let window = self.windows.get_mut(&id).unwrap(); + + if let Some(focused) = &window.focus { + let pane = window.panes.get_mut(focused).unwrap(); + + let cmd = scrollable::snap_to( + pane.scrollable_id.clone(), + if pane.snapped { + RelativeOffset::START + } else { + RelativeOffset::END + }, + ); + + pane.snapped = !pane.snapped; + return cmd; + } + } WindowMessage::Split(axis, pane) => { let window = self.windows.get_mut(&id).unwrap(); let result = window.panes.split( @@ -311,7 +332,13 @@ impl Application for Example { }); pane_grid::Content::new(responsive(move |size| { - view_content(id, total_panes, pane.is_pinned, size) + view_content( + id, + pane.scrollable_id.clone(), + total_panes, + pane.is_pinned, + size, + ) })) .title_bar(title_bar) .style(if is_focused { @@ -403,24 +430,29 @@ impl std::fmt::Display for SelectableWindow { #[derive(Debug)] struct Pane { id: usize, + pub scrollable_id: scrollable::Id, pub axis: pane_grid::Axis, pub is_pinned: bool, pub is_moving: bool, + pub snapped: bool, } impl Pane { fn new(id: usize, axis: pane_grid::Axis) -> Self { Self { id, + scrollable_id: scrollable::Id::new(format!("{:?}", id)), axis, is_pinned: false, is_moving: false, + snapped: false, } } } fn view_content<'a>( pane: pane_grid::Pane, + scrollable_id: scrollable::Id, total_panes: usize, is_pinned: bool, size: Size, @@ -445,7 +477,8 @@ fn view_content<'a>( button( "Split vertically", WindowMessage::Split(pane_grid::Axis::Vertical, pane), - ) + ), + button("Snap", WindowMessage::SnapToggle,) ] .spacing(5) .max_width(150); @@ -462,15 +495,22 @@ fn view_content<'a>( controls, ] .width(Length::Fill) + .height(Length::Units(800)) .spacing(10) .align_items(Alignment::Center); - container(scrollable(content)) + Element::from( + container( + scrollable(content) + .vertical_scroll(Properties::new()) + .id(scrollable_id), + ) .width(Length::Fill) .height(Length::Fill) .padding(5) - .center_y() - .into() + .center_y(), + ) + .explain(Color::default()) } fn view_controls<'a>( diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index a2e0581a..33fe60ff 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -34,6 +34,7 @@ use std::num::NonZeroU32; #[cfg(feature = "tracing")] use tracing::{info_span, instrument::Instrument}; +use iced_native::widget::operation; #[allow(unsafe_code)] const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; @@ -294,7 +295,7 @@ where ); #[cfg(feature = "tracing")] - let run_instance = + let run_instance = run_instance.instrument(info_span!("Application", "LOOP")); run_instance @@ -380,7 +381,7 @@ async fn run_instance( let mut clipboard = Clipboard::connect(windows.values().next().expect("No window found")); - let mut cache = user_interface::Cache::default(); + let mut caches = HashMap::new(); let mut current_context_window = None; let mut window_ids: HashMap<_, _> = windows .iter() @@ -422,23 +423,20 @@ async fn run_instance( let _ = interfaces.insert(id, user_interface); } - { - let state = states.values().next().expect("No state found."); + run_command( + &application, + &mut caches, + &states, + &mut renderer, + init_command, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &windows, + || compositor.fetch_information(), + ); - run_command( - &application, - &mut cache, - state, - &mut renderer, - init_command, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &windows, - || compositor.fetch_information(), - ); - } runtime.track(application.subscription().map(Event::Application)); let mut mouse_interaction = mouse::Interaction::default(); @@ -501,8 +499,7 @@ async fn run_instance( user_interface::State::Outdated ) { - let state = &mut states.get_mut(&id).unwrap(); - let pure_states: HashMap<_, _> = + let user_interfaces: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() .map(|(id, interface)| { @@ -513,8 +510,8 @@ async fn run_instance( // Update application update( &mut application, - &mut cache, - state, + &mut caches, + &states, &mut renderer, &mut runtime, &mut clipboard, @@ -526,7 +523,7 @@ async fn run_instance( ); // Update window - state.synchronize( + states.get_mut(&id).unwrap().synchronize( &application, id, windows.get(&id).expect("No window found with ID."), @@ -539,7 +536,7 @@ async fn run_instance( &mut renderer, &mut debug, &states, - pure_states, + user_interfaces, )); if should_exit { @@ -590,7 +587,8 @@ async fn run_instance( event::Event::UserEvent(event) => match event { Event::Application(message) => messages.push(message), Event::WindowCreated(id, window) => { - let state = multi_window::State::new(&application, id, &window); + let state = + multi_window::State::new(&application, id, &window); let user_interface = multi_window::build_user_interface( &application, user_interface::Cache::default(), @@ -768,7 +766,10 @@ async fn run_instance( )); } } else { - log::error!("Window state not found for id: {:?}", window_id); + log::error!( + "Window state not found for id: {:?}", + window_id + ); } } else { log::error!("Window not found for id: {:?}", window_id); @@ -786,8 +787,8 @@ async fn run_instance( /// resulting [`Command`], and tracking its [`Subscription`]. pub fn update( application: &mut A, - cache: &mut user_interface::Cache, - state: &multi_window::State, + caches: &mut HashMap, + states: &HashMap>, renderer: &mut A::Renderer, runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, @@ -797,6 +798,7 @@ pub fn update( windows: &HashMap, graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, ) where + A: Application + 'static, ::Theme: StyleSheet, { for message in messages.drain(..) { @@ -808,8 +810,8 @@ pub fn update( run_command( application, - cache, - state, + caches, + &states, renderer, command, runtime, @@ -828,8 +830,8 @@ pub fn update( /// Runs the actions of a [`Command`]. pub fn run_command( application: &A, - cache: &mut user_interface::Cache, - state: &multi_window::State, + caches: &mut HashMap, + states: &HashMap>, renderer: &mut A::Renderer, command: Command, runtime: &mut Runtime>, Event>, @@ -839,7 +841,7 @@ pub fn run_command( windows: &HashMap, _graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, ) where - A: Application, + A: Application + 'static, E: Executor, ::Theme: StyleSheet, { @@ -967,38 +969,42 @@ pub fn run_command( } }, command::Action::Widget(action) => { - use crate::widget::operation; - - let mut current_cache = std::mem::take(cache); + let mut current_caches = std::mem::take(caches); let mut current_operation = Some(action.into_operation()); - let mut user_interface = multi_window::build_user_interface( + let mut user_interfaces = multi_window::build_user_interfaces( application, - current_cache, renderer, - state.logical_size(), debug, - window::Id::MAIN, // TODO(derezzedex): run the operation on every widget tree + states, + current_caches, ); while let Some(mut operation) = current_operation.take() { - user_interface.operate(renderer, operation.as_mut()); + for user_interface in user_interfaces.values_mut() { + user_interface.operate(renderer, operation.as_mut()); - match operation.finish() { - operation::Outcome::None => {} - operation::Outcome::Some(message) => { - proxy - .send_event(Event::Application(message)) - .expect("Send message to event loop"); - } - operation::Outcome::Chain(next) => { - current_operation = Some(next); + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + proxy + .send_event(Event::Application(message)) + .expect("Send message to event loop"); + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } } } } - current_cache = user_interface.into_cache(); - *cache = current_cache; + let user_interfaces: HashMap<_, _> = user_interfaces + .drain() + .map(|(id, interface)| (id, interface.into_cache())) + .collect(); + + current_caches = user_interfaces; + *caches = current_caches; } } } @@ -1010,7 +1016,7 @@ pub fn build_user_interfaces<'a, A>( renderer: &mut A::Renderer, debug: &mut Debug, states: &HashMap>, - mut pure_states: HashMap, + mut user_interfaces: HashMap, ) -> HashMap< window::Id, iced_winit::UserInterface< @@ -1025,7 +1031,7 @@ where { let mut interfaces = HashMap::new(); - for (id, pure_state) in pure_states.drain() { + for (id, pure_state) in user_interfaces.drain() { let state = &states.get(&id).unwrap(); let user_interface = multi_window::build_user_interface( diff --git a/native/src/window.rs b/native/src/window.rs index aa11756f..e768ed6d 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -21,6 +21,7 @@ pub use user_attention::UserAttention; use crate::subscription::{self, Subscription}; use crate::time::Instant; +use crate::window; /// Subscribes to the frames of the window of the running application. /// @@ -42,6 +43,8 @@ pub fn frames() -> Subscription { /// The returned `Frame` for a framerate subscription. #[derive(Debug)] pub struct Frame { + /// The `window::Id` that the `Frame` was produced in. pub id: Id, + /// The `Instant` at which the frame was produced. pub at: Instant, } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 430e6706..bd7e9d44 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -4,12 +4,12 @@ mod state; pub use state::State; use crate::clipboard::{self, Clipboard}; -use crate::conversion; use crate::mouse; use crate::renderer; use crate::settings; use crate::widget::operation; use crate::window; +use crate::{conversion, multi_window}; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, Settings, Size, Subscription, @@ -254,7 +254,7 @@ where ); #[cfg(feature = "trace")] - let run_instance = + let run_instance = run_instance.instrument(info_span!("Application", "LOOP")); run_instance @@ -335,7 +335,7 @@ async fn run_instance( let mut clipboard = Clipboard::connect(windows.values().next().expect("No window found")); - let mut cache = user_interface::Cache::default(); + let mut caches = HashMap::new(); let mut window_ids: HashMap<_, _> = windows .iter() .map(|(&id, window)| (window.id(), id)) @@ -368,26 +368,23 @@ async fn run_instance( let _ = states.insert(id, state); let _ = surfaces.insert(id, surface); let _ = interfaces.insert(id, user_interface); + let _ = caches.insert(id, user_interface::Cache::default()); } - { - // TODO(derezzedex) - let state = states.values().next().expect("No state found"); + run_command( + &application, + &mut caches, + &states, + &mut renderer, + init_command, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &windows, + || compositor.fetch_information(), + ); - run_command( - &application, - &mut cache, - state, - &mut renderer, - init_command, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &windows, - || compositor.fetch_information(), - ); - } runtime.track(application.subscription().map(Event::Application)); let mut mouse_interaction = mouse::Interaction::default(); @@ -455,8 +452,7 @@ async fn run_instance( user_interface::State::Outdated, ) { - let state = states.get_mut(&id).unwrap(); - let pure_states: HashMap<_, _> = + let user_interfaces: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() .map( @@ -472,8 +468,8 @@ async fn run_instance( // Update application update( &mut application, - &mut cache, - state, + &mut caches, + &states, &mut renderer, &mut runtime, &mut clipboard, @@ -485,7 +481,7 @@ async fn run_instance( ); // Update window - state.synchronize( + states.get_mut(&id).unwrap().synchronize( &application, id, windows.get(&id).expect("No window found with ID."), @@ -498,7 +494,7 @@ async fn run_instance( &mut renderer, &mut debug, &states, - pure_states, + user_interfaces, )); if should_exit { @@ -579,6 +575,7 @@ async fn run_instance( let _ = interfaces.insert(id, user_interface); let _ = window_ids.insert(window.id(), id); let _ = windows.insert(id, window); + let _ = caches.insert(id, user_interface::Cache::default()); } Event::CloseWindow(id) => { if let Some(window) = windows.get(&id) { @@ -764,7 +761,10 @@ async fn run_instance( )); } } else { - log::error!("No window state found for id: {:?}", window_id); + log::error!( + "No window state found for id: {:?}", + window_id + ); } } else { log::error!("No window found with id: {:?}", window_id); @@ -840,8 +840,8 @@ where /// resulting [`Command`], and tracking its [`Subscription`]. pub fn update( application: &mut A, - cache: &mut user_interface::Cache, - state: &State, + caches: &mut HashMap, + states: &HashMap>, renderer: &mut A::Renderer, runtime: &mut Runtime>, Event>, clipboard: &mut Clipboard, @@ -851,6 +851,7 @@ pub fn update( windows: &HashMap, graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where + A: Application + 'static, ::Theme: StyleSheet, { for message in messages.drain(..) { @@ -867,8 +868,8 @@ pub fn update( run_command( application, - cache, - state, + caches, + states, renderer, command, runtime, @@ -887,8 +888,8 @@ pub fn update( /// Runs the actions of a [`Command`]. pub fn run_command( application: &A, - cache: &mut user_interface::Cache, - state: &State, + caches: &mut HashMap, + states: &HashMap>, renderer: &mut A::Renderer, command: Command, runtime: &mut Runtime>, Event>, @@ -898,7 +899,7 @@ pub fn run_command( windows: &HashMap, _graphics_info: impl FnOnce() -> compositor::Information + Copy, ) where - A: Application, + A: Application + 'static, E: Executor, ::Theme: StyleSheet, { @@ -1024,36 +1025,42 @@ pub fn run_command( } }, command::Action::Widget(action) => { - let mut current_cache = std::mem::take(cache); + let mut current_caches = std::mem::take(caches); let mut current_operation = Some(action.into_operation()); - let mut user_interface = build_user_interface( + let mut user_interfaces = build_user_interfaces( application, - current_cache, renderer, - state.logical_size(), debug, - window::Id::MAIN, // TODO(derezzedex): run the operation on every widget tree + states, + current_caches, ); while let Some(mut operation) = current_operation.take() { - user_interface.operate(renderer, operation.as_mut()); + for user_interface in user_interfaces.values_mut() { + user_interface.operate(renderer, operation.as_mut()); - match operation.finish() { - operation::Outcome::None => {} - operation::Outcome::Some(message) => { - proxy - .send_event(Event::Application(message)) - .expect("Send message to event loop"); - } - operation::Outcome::Chain(next) => { - current_operation = Some(next); + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + proxy + .send_event(Event::Application(message)) + .expect("Send message to event loop"); + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } } } } - current_cache = user_interface.into_cache(); - *cache = current_cache; + let user_interfaces: HashMap<_, _> = user_interfaces + .drain() + .map(|(id, interface)| (id, interface.into_cache())) + .collect(); + + current_caches = user_interfaces; + *caches = current_caches; } } } @@ -1065,7 +1072,7 @@ pub fn build_user_interfaces<'a, A>( renderer: &mut A::Renderer, debug: &mut Debug, states: &HashMap>, - mut pure_states: HashMap, + mut cached_user_interfaces: HashMap, ) -> HashMap< window::Id, UserInterface< @@ -1080,12 +1087,12 @@ where { let mut interfaces = HashMap::new(); - for (id, pure_state) in pure_states.drain() { + for (id, cache) in cached_user_interfaces.drain() { let state = &states.get(&id).unwrap(); let user_interface = build_user_interface( application, - pure_state, + cache, renderer, state.logical_size(), debug, From 3c095aa3f09f28c6fd9d2a7ba220ced407693e0b Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 15 Feb 2023 14:56:15 -0800 Subject: [PATCH 040/286] Merged in iced master --- glutin/src/multi_window.rs | 2 +- native/src/window/action.rs | 4 ++-- winit/src/multi_window.rs | 2 +- winit/src/window.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index 33fe60ff..da450dee 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -901,7 +901,7 @@ pub fn run_command( y, }); } - window::Action::SetMode(mode) => { + window::Action::ChangeMode(mode) => { let window = windows.get(&id).expect("No window found"); window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( diff --git a/native/src/window/action.rs b/native/src/window/action.rs index 63858bc8..e345cdfc 100644 --- a/native/src/window/action.rs +++ b/native/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::window::{Mode, UserAttention}; +use crate::window::{Mode, UserAttention, Settings}; use iced_futures::MaybeSend; use std::fmt; @@ -16,7 +16,7 @@ pub enum Action { /// Spawns a new window with the provided [`window::Settings`]. Spawn { /// The settings of the [`Window`]. - settings: window::Settings, + settings: Settings, }, /// Resize the window. Resize { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index bd7e9d44..f846e124 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -957,7 +957,7 @@ pub fn run_command( y, }); } - window::Action::SetMode(mode) => { + window::Action::ChangeMode(mode) => { let window = windows.get(&id).expect("No window found"); window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( diff --git a/winit/src/window.rs b/winit/src/window.rs index fa31dca1..97d80c38 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -60,7 +60,7 @@ pub fn move_to(id: window::Id, x: i32, y: i32) -> Command { /// Changes the [`Mode`] of the window. pub fn change_mode(id: window::Id, mode: Mode) -> Command { - Command::single(command::Action::Window(id, window::Action::SetMode(mode))) + Command::single(command::Action::Window(id, window::Action::ChangeMode(mode))) } /// Fetches the current [`Mode`] of the window. From 8da098330b58542cc929f4f24d02e26bd654bae4 Mon Sep 17 00:00:00 2001 From: Bingus Date: Fri, 17 Feb 2023 11:42:49 -0800 Subject: [PATCH 041/286] Fixed widget animations implementation --- examples/multi_window/src/main.rs | 21 +++--- native/src/widget/tree.rs | 2 +- native/src/window.rs | 1 - winit/src/multi_window.rs | 110 +++++++++++++++++++++++------- 4 files changed, 95 insertions(+), 39 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 23f08217..17d662b4 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -499,18 +499,17 @@ fn view_content<'a>( .spacing(10) .align_items(Alignment::Center); - Element::from( - container( - scrollable(content) - .vertical_scroll(Properties::new()) - .id(scrollable_id), - ) - .width(Length::Fill) - .height(Length::Fill) - .padding(5) - .center_y(), + container( + scrollable(content) + .height(Length::Fill) + .vertical_scroll(Properties::new()) + .id(scrollable_id), ) - .explain(Color::default()) + .width(Length::Fill) + .height(Length::Fill) + .padding(5) + .center_y() + .into() } fn view_controls<'a>( diff --git a/native/src/widget/tree.rs b/native/src/widget/tree.rs index 0af40c33..da269632 100644 --- a/native/src/widget/tree.rs +++ b/native/src/widget/tree.rs @@ -67,7 +67,7 @@ impl Tree { } } - /// Reconciliates the children of the tree with the provided list of widgets. + /// Reconciles the children of the tree with the provided list of widgets. pub fn diff_children<'a, Message, Renderer>( &mut self, new_children: &[impl Borrow + 'a>], diff --git a/native/src/window.rs b/native/src/window.rs index e768ed6d..a8f8b10f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -21,7 +21,6 @@ pub use user_attention::UserAttention; use crate::subscription::{self, Subscription}; use crate::time::Instant; -use crate::window; /// Subscribes to the frames of the window of the running application. /// diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index f846e124..17eaa6fe 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -9,7 +9,7 @@ use crate::renderer; use crate::settings; use crate::widget::operation; use crate::window; -use crate::{conversion, multi_window}; +use crate::conversion; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, Settings, Size, Subscription, @@ -237,7 +237,8 @@ where let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; - let (mut sender, receiver) = mpsc::unbounded(); + let (mut event_sender, event_receiver) = mpsc::unbounded(); + let (control_sender, mut control_receiver) = mpsc::unbounded(); let mut instance = Box::pin({ let run_instance = run_instance::( @@ -247,7 +248,8 @@ where runtime, proxy, debug, - receiver, + event_receiver, + control_sender, init_command, windows, settings.exit_on_close_request, @@ -299,13 +301,19 @@ where }; if let Some(event) = event { - sender.start_send(event).expect("Send event"); + event_sender.start_send(event).expect("Send event"); let poll = instance.as_mut().poll(&mut context); - *control_flow = match poll { - task::Poll::Pending => ControlFlow::Wait, - task::Poll::Ready(_) => ControlFlow::Exit, + match poll { + task::Poll::Pending => { + if let Ok(Some(flow)) = control_receiver.try_next() { + *control_flow = flow; + } + } + task::Poll::Ready(_) => { + *control_flow = ControlFlow::Exit; + } }; } }) @@ -318,9 +326,10 @@ async fn run_instance( mut runtime: Runtime>, Event>, mut proxy: winit::event_loop::EventLoopProxy>, mut debug: Debug, - mut receiver: mpsc::UnboundedReceiver< + mut event_receiver: mpsc::UnboundedReceiver< winit::event::Event<'_, Event>, >, + mut control_sender: mpsc::UnboundedSender, init_command: Command, mut windows: HashMap, _exit_on_close_request: bool, @@ -332,6 +341,7 @@ async fn run_instance( { use iced_futures::futures::stream::StreamExt; use winit::event; + use winit::event_loop::ControlFlow; let mut clipboard = Clipboard::connect(windows.values().next().expect("No window found")); @@ -390,11 +400,20 @@ async fn run_instance( let mut mouse_interaction = mouse::Interaction::default(); let mut events = Vec::new(); let mut messages = Vec::new(); + let mut redraw_pending = false; debug.startup_finished(); - 'main: while let Some(event) = receiver.next().await { + 'main: while let Some(event) = event_receiver.next().await { match event { + event::Event::NewEvents(start_cause) => { + redraw_pending = matches!( + start_cause, + event::StartCause::Init + | event::StartCause::Poll + | event::StartCause::ResumeTimeReached { .. } + ); + } event::Event::MainEventsCleared => { for id in states.keys().copied().collect::>() { let (filtered, remaining): (Vec<_>, Vec<_>) = @@ -408,29 +427,27 @@ async fn run_instance( ); events.retain(|el| remaining.contains(el)); - let mut filtered: Vec<_> = filtered + let window_events: Vec<_> = filtered .into_iter() .map(|(_id, event)| event) .collect(); - filtered.push(iced_native::Event::Window( - id, - window::Event::RedrawRequested(Instant::now()), - )); - let cursor_position = - states.get(&id).unwrap().cursor_position(); - let window = windows.get(&id).unwrap(); - - if filtered.is_empty() && messages.is_empty() { + if !redraw_pending + && window_events.is_empty() + && messages.is_empty() + { continue; } debug.event_processing_started(); + let cursor_position = + states.get(&id).unwrap().cursor_position(); + let (interface_state, statuses) = { let user_interface = interfaces.get_mut(&id).unwrap(); user_interface.update( - &filtered, + &window_events, cursor_position, &mut renderer, &mut clipboard, @@ -440,7 +457,8 @@ async fn run_instance( debug.event_processing_finished(); - for event in filtered.into_iter().zip(statuses.into_iter()) + for event in + window_events.into_iter().zip(statuses.into_iter()) { runtime.broadcast(event); } @@ -487,8 +505,6 @@ async fn run_instance( windows.get(&id).expect("No window found with ID."), ); - let should_exit = application.should_exit(); - interfaces = ManuallyDrop::new(build_user_interfaces( &application, &mut renderer, @@ -497,17 +513,35 @@ async fn run_instance( user_interfaces, )); - if should_exit { + if application.should_exit() { break 'main; } } + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = iced_native::Event::Window( + id, + window::Event::RedrawRequested(Instant::now()), + ); + + let (interface_state, _) = + interfaces.get_mut(&id).unwrap().update( + &[redraw_event.clone()], + cursor_position, + &mut renderer, + &mut clipboard, + &mut messages, + ); + debug.draw_started(); let new_mouse_interaction = { - let user_interface = interfaces.get_mut(&id).unwrap(); let state = states.get(&id).unwrap(); - user_interface.draw( + interfaces.get_mut(&id).unwrap().draw( &mut renderer, state.theme(), &renderer::Style { @@ -518,6 +552,8 @@ async fn run_instance( }; debug.draw_finished(); + let window = windows.get(&id).unwrap(); + if new_mouse_interaction != mouse_interaction { window.set_cursor_icon(conversion::mouse_interaction( new_mouse_interaction, @@ -528,6 +564,28 @@ async fn run_instance( for window in windows.values() { window.request_redraw(); + + runtime.broadcast(( + redraw_event.clone(), + crate::event::Status::Ignored, + )); + + let _ = + control_sender.start_send(match interface_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => { + ControlFlow::Poll + } + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }); + + redraw_pending = false; } } } From 2d427455ce8f9627da7c09eb80f38a615f0ddcb7 Mon Sep 17 00:00:00 2001 From: Bingus Date: Fri, 17 Feb 2023 11:50:52 -0800 Subject: [PATCH 042/286] Iced master merge (again) --- examples/multi_window/src/main.rs | 4 ++-- glutin/src/multi_window.rs | 18 ++++++++++++++---- src/multi_window/application.rs | 1 + winit/src/multi_window.rs | 21 ++++++++++++++++----- winit/src/window.rs | 2 +- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 17d662b4..c2687ee6 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -441,7 +441,7 @@ impl Pane { fn new(id: usize, axis: pane_grid::Axis) -> Self { Self { id, - scrollable_id: scrollable::Id::new(format!("{:?}", id)), + scrollable_id: scrollable::Id::unique(), axis, is_pinned: false, is_moving: false, @@ -495,7 +495,7 @@ fn view_content<'a>( controls, ] .width(Length::Fill) - .height(Length::Units(800)) + .height(800) .spacing(10) .align_items(Alignment::Center); diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs index da450dee..620d01d8 100644 --- a/glutin/src/multi_window.rs +++ b/glutin/src/multi_window.rs @@ -25,16 +25,15 @@ use glutin::surface::{GlSurface, SwapInterval}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; use crate::application::gl_surface; -use iced_native::window::Action; use iced_winit::multi_window::Event; use std::collections::HashMap; use std::ffi::CString; use std::mem::ManuallyDrop; use std::num::NonZeroU32; +use iced_native::widget::operation; #[cfg(feature = "tracing")] use tracing::{info_span, instrument::Instrument}; -use iced_native::widget::operation; #[allow(unsafe_code)] const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; @@ -937,16 +936,27 @@ pub fn run_command( let window = windows.get(&id).expect("No window found!"); window.set_decorations(!window.is_decorated()); } - Action::RequestUserAttention(attention_type) => { + window::Action::RequestUserAttention(attention_type) => { let window = windows.get(&id).expect("No window found!"); window.request_user_attention( attention_type.map(conversion::user_attention), ); } - Action::GainFocus => { + window::Action::GainFocus => { let window = windows.get(&id).expect("No window found!"); window.focus_window(); } + window::Action::ChangeAlwaysOnTop(on_top) => { + let window = windows.get(&id).expect("No window found!"); + window.set_always_on_top(on_top); + } + window::Action::FetchId(tag) => { + let window = windows.get(&id).expect("No window found!"); + + proxy + .send_event(Event::Application(tag(window.id().into()))) + .expect("Send message to event loop.") + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 3af1d8d5..d0b515ab 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -148,6 +148,7 @@ pub trait Application: Sized { /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. + #[allow(unused_variables)] fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 17eaa6fe..96dd1c8b 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -4,12 +4,12 @@ mod state; pub use state::State; use crate::clipboard::{self, Clipboard}; +use crate::conversion; use crate::mouse; use crate::renderer; use crate::settings; use crate::widget::operation; use crate::window; -use crate::conversion; use crate::{ Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, Settings, Size, Subscription, @@ -22,7 +22,6 @@ use iced_native::user_interface::{self, UserInterface}; pub use iced_native::application::{Appearance, StyleSheet}; -use iced_native::window::Action; use std::collections::HashMap; use std::mem::ManuallyDrop; use std::time::Instant; @@ -147,6 +146,7 @@ where /// while a scale factor of `0.5` will shrink them to half their size. /// /// By default, it returns `1.0`. + #[allow(unused_variables)] fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } @@ -470,7 +470,7 @@ async fn run_instance( user_interface::State::Outdated, ) { - let user_interfaces: HashMap<_, _> = + let cached_interfaces: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() .map( @@ -510,7 +510,7 @@ async fn run_instance( &mut renderer, &mut debug, &states, - user_interfaces, + cached_interfaces, )); if application.should_exit() { @@ -1057,10 +1057,21 @@ pub fn run_command( attention_type.map(conversion::user_attention), ); } - Action::GainFocus => { + window::Action::GainFocus => { let window = windows.get(&id).expect("No window found!"); window.focus_window(); } + window::Action::ChangeAlwaysOnTop(on_top) => { + let window = windows.get(&id).expect("No window found!"); + window.set_always_on_top(on_top); + } + window::Action::FetchId(tag) => { + let window = windows.get(&id).expect("No window found!"); + + proxy + .send_event(Event::Application(tag(window.id().into()))) + .expect("Send message to event loop.") + } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { diff --git a/winit/src/window.rs b/winit/src/window.rs index 88cd3f14..8fd415ef 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -122,7 +122,7 @@ pub fn fetch_id( id: window::Id, f: impl FnOnce(u64) -> Message + 'static, ) -> Command { - Command::single(command::Action::Window(id: window::Id, window::Action::FetchId(Box::new( + Command::single(command::Action::Window(id, window::Action::FetchId(Box::new( f, )))) } From 3aaf5d8873b16302badb14dc5508329c943862fb Mon Sep 17 00:00:00 2001 From: Bingus Date: Fri, 17 Feb 2023 13:26:31 -0800 Subject: [PATCH 043/286] Fixed widget operations --- winit/src/multi_window.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 96dd1c8b..fc91f41b 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -470,7 +470,7 @@ async fn run_instance( user_interface::State::Outdated, ) { - let cached_interfaces: HashMap<_, _> = + let mut cached_interfaces: HashMap<_, _> = ManuallyDrop::into_inner(interfaces) .drain() .map( @@ -486,7 +486,7 @@ async fn run_instance( // Update application update( &mut application, - &mut caches, + &mut cached_interfaces, &states, &mut renderer, &mut runtime, From bd58d5fe25182908e99fdb0ced07b86666e45081 Mon Sep 17 00:00:00 2001 From: Bingus Date: Mon, 20 Feb 2023 12:34:04 -0800 Subject: [PATCH 044/286] Cargo fix --- Cargo.toml | 2 +- examples/multi_window/Cargo.toml | 2 +- examples/multi_window/src/main.rs | 294 ++++++++++++++++-------------- winit/src/multi_window.rs | 58 +++--- 4 files changed, 187 insertions(+), 169 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e4da8b2c..1a615da2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,7 +47,7 @@ chrome-trace = [ "iced_glow?/tracing", ] # Enables experimental multi-window support -multi_window = ["iced_winit/multi_window", "iced_glutin/multi_window"] +multi_window = ["iced_winit/multi_window", "iced_glutin?/multi_window"] [badges] maintenance = { status = "actively-developed" } diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml index 62198595..0bb83f37 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -7,7 +7,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -iced = { path = "../..", features = ["debug", "multi_window"] } +iced = { path = "../..", features = ["debug", "multi_window", "tokio"] } env_logger = "0.10.0" iced_native = { path = "../../native" } iced_lazy = { path = "../../lazy" } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index c2687ee6..60f32a7d 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -1,5 +1,5 @@ use iced::alignment::{self, Alignment}; -use iced::executor; +use iced::{executor, time}; use iced::keyboard; use iced::multi_window::Application; use iced::theme::{self, Theme}; @@ -15,6 +15,7 @@ use iced_native::{event, subscription, Event}; use iced_native::widget::scrollable::{Properties, RelativeOffset}; use iced_native::window::Id; use std::collections::HashMap; +use std::time::{Duration, Instant}; pub fn main() -> iced::Result { env_logger::init(); @@ -25,6 +26,7 @@ pub fn main() -> iced::Result { struct Example { windows: HashMap, panes_created: usize, + count: usize, _focused: window::Id, } @@ -39,6 +41,7 @@ struct Window { #[derive(Debug, Clone)] enum Message { Window(window::Id, WindowMessage), + CountIncremented(Instant), } #[derive(Debug, Clone)] @@ -80,6 +83,7 @@ impl Application for Example { Example { windows: HashMap::from([(window::Id::MAIN, window)]), panes_created: 1, + count: 0, _focused: window::Id::MAIN, }, Command::none(), @@ -94,44 +98,29 @@ impl Application for Example { } fn update(&mut self, message: Message) -> Command { - let Message::Window(id, message) = message; match message { - WindowMessage::SnapToggle => { - let window = self.windows.get_mut(&id).unwrap(); + Message::Window(id, message) => match message { + WindowMessage::SnapToggle => { + let window = self.windows.get_mut(&id).unwrap(); - if let Some(focused) = &window.focus { - let pane = window.panes.get_mut(focused).unwrap(); + if let Some(focused) = &window.focus { + let pane = window.panes.get_mut(focused).unwrap(); - let cmd = scrollable::snap_to( - pane.scrollable_id.clone(), - if pane.snapped { - RelativeOffset::START - } else { - RelativeOffset::END - }, - ); + let cmd = scrollable::snap_to( + pane.scrollable_id.clone(), + if pane.snapped { + RelativeOffset::START + } else { + RelativeOffset::END + }, + ); - pane.snapped = !pane.snapped; - return cmd; + pane.snapped = !pane.snapped; + return cmd; + } } - } - WindowMessage::Split(axis, pane) => { - let window = self.windows.get_mut(&id).unwrap(); - let result = window.panes.split( - axis, - &pane, - Pane::new(self.panes_created, axis), - ); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - - self.panes_created += 1; - } - WindowMessage::SplitFocused(axis) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { + WindowMessage::Split(axis, pane) => { + let window = self.windows.get_mut(&id).unwrap(); let result = window.panes.split( axis, &pane, @@ -144,112 +133,131 @@ impl Application for Example { self.panes_created += 1; } - } - WindowMessage::FocusAdjacent(direction) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - if let Some(adjacent) = - window.panes.adjacent(&pane, direction) - { - window.focus = Some(adjacent); + WindowMessage::SplitFocused(axis) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + let result = window.panes.split( + axis, + &pane, + Pane::new(self.panes_created, axis), + ); + + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + + self.panes_created += 1; } } - } - WindowMessage::Clicked(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - window.focus = Some(pane); - } - WindowMessage::CloseWindow => { - let _ = self.windows.remove(&id); - return window::close(id); - } - WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.resize(&split, ratio); - } - WindowMessage::SelectedWindow(pane, selected) => { - let window = self.windows.get_mut(&id).unwrap(); - let (mut pane, _) = window.panes.close(&pane).unwrap(); - pane.is_moving = false; - - if let Some(window) = self.windows.get_mut(&selected.0) { - let (&first_pane, _) = window.panes.iter().next().unwrap(); - let result = - window.panes.split(pane.axis, &first_pane, pane); - - if let Some((pane, _)) = result { - window.focus = Some(pane); + WindowMessage::FocusAdjacent(direction) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + if let Some(adjacent) = + window.panes.adjacent(&pane, direction) + { + window.focus = Some(adjacent); + } } } - } - WindowMessage::ToggleMoving(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.panes.get_mut(&pane) { - pane.is_moving = !pane.is_moving; + WindowMessage::Clicked(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + window.focus = Some(pane); } - } - WindowMessage::TitleChanged(title) => { - let window = self.windows.get_mut(&id).unwrap(); - window.title = title; - } - WindowMessage::PopOut(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((popped, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); + WindowMessage::CloseWindow => { + let _ = self.windows.remove(&id); + return window::close(id); + } + WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { + let window = self.windows.get_mut(&id).unwrap(); + window.panes.resize(&split, ratio); + } + WindowMessage::SelectedWindow(pane, selected) => { + let window = self.windows.get_mut(&id).unwrap(); + let (mut pane, _) = window.panes.close(&pane).unwrap(); + pane.is_moving = false; - let (panes, _) = pane_grid::State::new(popped); - let window = Window { - panes, - focus: None, - title: format!("New window ({})", self.windows.len()), - scale: 1.0 + (self.windows.len() as f64 / 10.0), - }; + if let Some(window) = self.windows.get_mut(&selected.0) { + let (&first_pane, _) = window.panes.iter().next().unwrap(); + let result = + window.panes.split(pane.axis, &first_pane, pane); - let window_id = window::Id::new(self.windows.len()); - self.windows.insert(window_id, window); - return window::spawn(window_id, Default::default()); + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + } } - } - WindowMessage::Dragged(pane_grid::DragEvent::Dropped { - pane, - target, - }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.swap(&pane, &target); - } - // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { - // println!("Picked {pane:?}"); - // } - WindowMessage::Dragged(_) => {} - WindowMessage::TogglePin(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(Pane { is_pinned, .. }) = - window.panes.get_mut(&pane) - { - *is_pinned = !*is_pinned; + WindowMessage::ToggleMoving(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.panes.get_mut(&pane) { + pane.is_moving = !pane.is_moving; + } } - } - WindowMessage::Close(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((_, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); + WindowMessage::TitleChanged(title) => { + let window = self.windows.get_mut(&id).unwrap(); + window.title = title; } - } - WindowMessage::CloseFocused => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { + WindowMessage::PopOut(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((popped, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); + + let (panes, _) = pane_grid::State::new(popped); + let window = Window { + panes, + focus: None, + title: format!("New window ({})", self.windows.len()), + scale: 1.0 + (self.windows.len() as f64 / 10.0), + }; + + let window_id = window::Id::new(self.windows.len()); + self.windows.insert(window_id, window); + return window::spawn(window_id, Default::default()); + } + } + WindowMessage::Dragged(pane_grid::DragEvent::Dropped { + pane, + target, + }) => { + let window = self.windows.get_mut(&id).unwrap(); + window.panes.swap(&pane, &target); + } + // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { + // println!("Picked {pane:?}"); + // } + WindowMessage::Dragged(_) => {} + WindowMessage::TogglePin(pane) => { + let window = self.windows.get_mut(&id).unwrap(); if let Some(Pane { is_pinned, .. }) = - window.panes.get(&pane) + window.panes.get_mut(&pane) { - if !is_pinned { - if let Some((_, sibling)) = - window.panes.close(&pane) - { - window.focus = Some(sibling); + *is_pinned = !*is_pinned; + } + } + WindowMessage::Close(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((_, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); + } + } + WindowMessage::CloseFocused => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + if let Some(Pane { is_pinned, .. }) = + window.panes.get(&pane) + { + if !is_pinned { + if let Some((_, sibling)) = + window.panes.close(&pane) + { + window.focus = Some(sibling); + } } } } } + }, + Message::CountIncremented(_) => { + self.count += 1; } } @@ -257,23 +265,26 @@ impl Application for Example { } fn subscription(&self) -> Subscription { - subscription::events_with(|event, status| { - if let event::Status::Captured = status { - return None; - } + Subscription::batch(vec![ + subscription::events_with(|event, status| { + if let event::Status::Captured = status { + return None; + } - match event { - Event::Keyboard(keyboard::Event::KeyPressed { - modifiers, - key_code, - }) if modifiers.command() => { - handle_hotkey(key_code).map(|message| { - Message::Window(window::Id::new(0usize), message) - }) - } // TODO(derezzedex) - _ => None, - } - }) + match event { + Event::Keyboard(keyboard::Event::KeyPressed { + modifiers, + key_code, + }) if modifiers.command() => { + handle_hotkey(key_code).map(|message| { + Message::Window(window::Id::new(0usize), message) + }) + } // TODO(derezzedex) + _ => None, + } + }), + time::every(Duration::from_secs(1)).map(Message::CountIncremented), + ]) } fn view(&self, window_id: window::Id) -> Element { @@ -335,6 +346,7 @@ impl Application for Example { view_content( id, pane.scrollable_id.clone(), + self.count, total_panes, pane.is_pinned, size, @@ -453,6 +465,7 @@ impl Pane { fn view_content<'a>( pane: pane_grid::Pane, scrollable_id: scrollable::Id, + count: usize, total_panes: usize, is_pinned: bool, size: Size, @@ -493,6 +506,7 @@ fn view_content<'a>( let content = column![ text(format!("{}x{}", size.width, size.height)).size(24), controls, + text(format!("{count}")).size(48), ] .width(Length::Fill) .height(800) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index fc91f41b..788f39f7 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -416,6 +416,7 @@ async fn run_instance( } event::Event::MainEventsCleared => { for id in states.keys().copied().collect::>() { + // Partition events into only events for this window let (filtered, remaining): (Vec<_>, Vec<_>) = events.iter().cloned().partition( |(window_id, _event): &( @@ -426,7 +427,9 @@ async fn run_instance( }, ); + // Only retain events which have not been processed for next iteration events.retain(|el| remaining.contains(el)); + let window_events: Vec<_> = filtered .into_iter() .map(|(_id, event)| event) @@ -439,8 +442,8 @@ async fn run_instance( continue; } + // Process winit events for window debug.event_processing_started(); - let cursor_position = states.get(&id).unwrap().cursor_position(); @@ -455,15 +458,16 @@ async fn run_instance( ) }; - debug.event_processing_finished(); - for event in window_events.into_iter().zip(statuses.into_iter()) { runtime.broadcast(event); } + debug.event_processing_finished(); - // TODO(derezzedex): Should we redraw every window? We can't know what changed. + // Update application with app message(s) + // Note: without tying an app message to a window ID, we must redraw all windows + // as we cannot know what changed without some kind of damage tracking. if !messages.is_empty() || matches!( interface_state, @@ -498,7 +502,7 @@ async fn run_instance( || compositor.fetch_information(), ); - // Update window + // synchronize window state with application state. states.get_mut(&id).unwrap().synchronize( &application, id, @@ -564,29 +568,29 @@ async fn run_instance( for window in windows.values() { window.request_redraw(); - - runtime.broadcast(( - redraw_event.clone(), - crate::event::Status::Ignored, - )); - - let _ = - control_sender.start_send(match interface_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => { - ControlFlow::Poll - } - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }); - - redraw_pending = false; } + + runtime.broadcast(( + redraw_event.clone(), + crate::event::Status::Ignored, + )); + + let _ = + control_sender.start_send(match interface_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => { + ControlFlow::Poll + } + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }); + + redraw_pending = false; } } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( From 50b9c778b1e49fc83f827a340dce36a09bb291d6 Mon Sep 17 00:00:00 2001 From: Bingus Date: Tue, 21 Feb 2023 16:46:32 -0800 Subject: [PATCH 045/286] Fixed state syncing issue with MW. --- winit/src/multi_window.rs | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 788f39f7..1a9d4a1c 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -502,12 +502,16 @@ async fn run_instance( || compositor.fetch_information(), ); - // synchronize window state with application state. - states.get_mut(&id).unwrap().synchronize( - &application, - id, - windows.get(&id).expect("No window found with ID."), - ); + // synchronize window states with application states. + for (id, state) in states.iter_mut() { + state.synchronize( + &application, + *id, + windows + .get(id) + .expect("No window found with ID."), + ); + } interfaces = ManuallyDrop::new(build_user_interfaces( &application, @@ -575,20 +579,19 @@ async fn run_instance( crate::event::Status::Ignored, )); - let _ = - control_sender.start_send(match interface_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => { - ControlFlow::Poll - } - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }); + let _ = control_sender.start_send(match interface_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => { + ControlFlow::Poll + } + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }); redraw_pending = false; } From e36daa6f937abd7cb2071fd8852a3c12263944ea Mon Sep 17 00:00:00 2001 From: bungoboingo Date: Tue, 28 Feb 2023 13:44:36 -0800 Subject: [PATCH 046/286] Removed glutin MW support and reverted glutin changes back to Iced master since it's being axed as we speak. --- Cargo.toml | 4 +- examples/integration_opengl/src/main.rs | 8 +- glutin/Cargo.toml | 10 +- glutin/src/application.rs | 366 +++----- glutin/src/lib.rs | 3 - glutin/src/multi_window.rs | 1060 ----------------------- graphics/src/window/gl_compositor.rs | 2 +- native/src/window/id.rs | 4 +- src/lib.rs | 2 +- winit/src/application.rs | 2 +- winit/src/multi_window.rs | 25 +- winit/src/multi_window/state.rs | 7 +- winit/src/profiler.rs | 1 - winit/src/settings.rs | 8 +- winit/src/settings/windows.rs | 4 +- 15 files changed, 130 insertions(+), 1376 deletions(-) delete mode 100644 glutin/src/multi_window.rs diff --git a/Cargo.toml b/Cargo.toml index 1a615da2..5276d921 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,8 +46,8 @@ chrome-trace = [ "iced_wgpu?/tracing", "iced_glow?/tracing", ] -# Enables experimental multi-window support -multi_window = ["iced_winit/multi_window", "iced_glutin?/multi_window"] +# Enables experimental multi-window support for iced_winit +multi_window = ["iced_winit/multi_window"] [badges] maintenance = { status = "actively-developed" } diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs index fdbd7369..4dd3a4a9 100644 --- a/examples/integration_opengl/src/main.rs +++ b/examples/integration_opengl/src/main.rs @@ -13,7 +13,6 @@ use iced_glow::{Backend, Renderer, Settings, Viewport}; use iced_glutin::conversion; use iced_glutin::glutin; use iced_glutin::renderer; -use iced_glutin::window; use iced_glutin::{program, Clipboard, Color, Debug, Size}; pub fn main() { @@ -31,8 +30,7 @@ pub fn main() { .unwrap(); unsafe { - let windowed_context = - windowed_context.make_current(todo!("derezzedex")).unwrap(); + let windowed_context = windowed_context.make_current().unwrap(); let gl = glow::Context::from_loader_function(|s| { windowed_context.get_proc_address(s) as *const _ @@ -109,7 +107,7 @@ pub fn main() { // Map window event to iced event if let Some(event) = iced_winit::conversion::window_event( - window::Id::MAIN, + iced_winit::window::Id::MAIN, &event, windowed_context.window().scale_factor(), modifiers, @@ -182,7 +180,7 @@ pub fn main() { ), ); - windowed_context.swap_buffers(todo!("derezzedex")).unwrap(); + windowed_context.swap_buffers().unwrap(); } _ => (), } diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml index 01dd3748..10d3778b 100644 --- a/glutin/Cargo.toml +++ b/glutin/Cargo.toml @@ -11,19 +11,17 @@ keywords = ["gui", "ui", "graphics", "interface", "widgets"] categories = ["gui"] [features] -trace = ["iced_winit/trace", "tracing"] +trace = ["iced_winit/trace"] debug = ["iced_winit/debug"] system = ["iced_winit/system"] -multi_window = ["iced_winit/multi_window"] - -[dependencies.raw-window-handle] -version = "0.5.0" [dependencies] log = "0.4" [dependencies.glutin] -version = "0.30" +version = "0.29" +git = "https://github.com/iced-rs/glutin" +rev = "da8d291486b4c9bec12487a46c119c4b1d386abf" [dependencies.iced_native] version = "0.9" diff --git a/glutin/src/application.rs b/glutin/src/application.rs index c0a8cda4..24f38e7b 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -13,33 +13,14 @@ use iced_winit::futures::channel::mpsc; use iced_winit::renderer; use iced_winit::time::Instant; use iced_winit::user_interface; -use iced_winit::winit; use iced_winit::{Clipboard, Command, Debug, Event, Proxy, Settings}; -use glutin::config::{ - Config, ConfigSurfaceTypes, ConfigTemplateBuilder, GlConfig, -}; -use glutin::context::{ - ContextApi, ContextAttributesBuilder, NotCurrentContext, - NotCurrentGlContextSurfaceAccessor, - PossiblyCurrentContextGlSurfaceAccessor, PossiblyCurrentGlContext, -}; -use glutin::display::{Display, DisplayApiPreference, GlDisplay}; -use glutin::surface::{ - GlSurface, Surface, SurfaceAttributesBuilder, WindowSurface, -}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; - -use std::ffi::CString; +use glutin::window::Window; use std::mem::ManuallyDrop; -use std::num::NonZeroU32; -#[cfg(feature = "trace")] +#[cfg(feature = "tracing")] use tracing::{info_span, instrument::Instrument}; -#[allow(unsafe_code)] -const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; - /// Runs an [`Application`] with an executor, compositor, and the provided /// settings. pub fn run( @@ -54,8 +35,9 @@ where { use futures::task; use futures::Future; - use winit::event_loop::EventLoopBuilder; - use winit::platform::run_return::EventLoopExtRunReturn; + use glutin::event_loop::EventLoopBuilder; + use glutin::platform::run_return::EventLoopExtRunReturn; + use glutin::ContextBuilder; #[cfg(feature = "trace")] let _guard = iced_winit::Profiler::init(); @@ -63,7 +45,7 @@ where let mut debug = Debug::new(); debug.startup_started(); - #[cfg(feature = "trace")] + #[cfg(feature = "tracing")] let _ = info_span!("Application::Glutin", "RUN").entered(); let mut event_loop = EventLoopBuilder::with_user_event().build(); @@ -82,205 +64,74 @@ where runtime.enter(|| A::new(flags)) }; - let builder = settings.window.into_builder( - &application.title(), - event_loop.primary_monitor(), - settings.id, - ); + let context = { + let builder = settings.window.into_builder( + &application.title(), + event_loop.primary_monitor(), + settings.id, + ); - log::debug!("Window builder: {:#?}", builder); + log::debug!("Window builder: {:#?}", builder); - #[allow(unsafe_code)] - let (display, window, surface, context) = unsafe { - struct Configuration(Config); - use std::fmt; - impl fmt::Debug for Configuration { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let config = &self.0; + let opengl_builder = ContextBuilder::new() + .with_vsync(true) + .with_multisampling(C::sample_count(&compositor_settings) as u16); - f.debug_struct("Configuration") - .field("raw", &config) - .field("samples", &config.num_samples()) - .field("buffer_type", &config.color_buffer_type()) - .field("surface_type", &config.config_surface_types()) - .field("depth", &config.depth_size()) - .field("alpha", &config.alpha_size()) - .field("stencil", &config.stencil_size()) - .field("float_pixels", &config.float_pixels()) - .field("srgb", &config.srgb_capable()) - .field("api", &config.api()) - .finish() - } - } + let opengles_builder = opengl_builder.clone().with_gl( + glutin::GlRequest::Specific(glutin::Api::OpenGlEs, (2, 0)), + ); - impl AsRef for Configuration { - fn as_ref(&self) -> &Config { - &self.0 - } - } - - let display_handle = event_loop.raw_display_handle(); - - #[cfg(all( - any(windows, target_os = "macos"), - not(target_arch = "wasm32") - ))] - let (window, window_handle) = { - let window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; - - let handle = window.raw_window_handle(); - - (window, handle) + let (first_builder, second_builder) = if settings.try_opengles_first { + (opengles_builder, opengl_builder) + } else { + (opengl_builder, opengles_builder) }; - #[cfg(target_arch = "wasm32")] - let preference = Err(Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "target not supported by backend" - )), - ))?; + log::info!("Trying first builder: {:#?}", first_builder); - #[cfg(all(windows, not(target_arch = "wasm32")))] - let preference = DisplayApiPreference::WglThenEgl(Some(window_handle)); - - #[cfg(all(target_os = "macos", not(target_arch = "wasm32")))] - let preference = DisplayApiPreference::Cgl; - - #[cfg(all( - unix, - not(target_os = "macos"), - not(target_arch = "wasm32") - ))] - let preference = DisplayApiPreference::GlxThenEgl(Box::new( - winit::platform::unix::register_xlib_error_hook, - )); - - let display = - Display::new(display_handle, preference).map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create display: {error}" - )), - ) - })?; - - log::debug!("Display: {}", display.version_string()); - - let samples = C::sample_count(&compositor_settings) as u8; - let mut template = ConfigTemplateBuilder::new() - .with_surface_type(ConfigSurfaceTypes::WINDOW); - - if samples != 0 { - template = template.with_multisampling(samples); - } - - #[cfg(all(windows, not(target_arch = "wasm32")))] - let template = template.compatible_with_native_window(window_handle); - - log::debug!("Searching for display configurations"); - let configuration = display - .find_configs(template.build()) - .map_err(|_| { - Error::GraphicsCreationFailed( - iced_graphics::Error::NoAvailablePixelFormat, - ) - })? - .map(Configuration) - .inspect(|config| { - log::trace!("{config:#?}"); - }) - .min_by_key(|config| { - config.as_ref().num_samples().saturating_sub(samples) - }) - .ok_or(Error::GraphicsCreationFailed( - iced_graphics::Error::NoAvailablePixelFormat, - ))?; - - log::debug!("Selected: {configuration:#?}"); - - #[cfg(all( - unix, - not(target_os = "macos"), - not(target_arch = "wasm32") - ))] - let (window, window_handle) = { - use glutin::platform::x11::X11GlConfigExt; - let builder = - if let Some(visual) = configuration.as_ref().x11_visual() { - use winit::platform::unix::WindowBuilderExtUnix; - builder.with_x11_visual(visual.into_raw()) - } else { - builder - }; - - let window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; - - let handle = window.raw_window_handle(); - - (window, handle) - }; - - let attributes = - ContextAttributesBuilder::new().build(Some(window_handle)); - let fallback_attributes = ContextAttributesBuilder::new() - .with_context_api(ContextApi::Gles(None)) - .build(Some(window_handle)); - - let context = display - .create_context(configuration.as_ref(), &attributes) + let context = first_builder + .build_windowed(builder.clone(), &event_loop) .or_else(|_| { - display.create_context( - configuration.as_ref(), - &fallback_attributes, - ) + log::info!("Trying second builder: {:#?}", second_builder); + second_builder.build_windowed(builder, &event_loop) }) .map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create context: {error}" - )), - ) + use glutin::CreationError; + use iced_graphics::Error as ContextError; + + match error { + CreationError::Window(error) => { + Error::WindowCreationFailed(error) + } + CreationError::OpenGlVersionNotSupported => { + Error::GraphicsCreationFailed( + ContextError::VersionNotSupported, + ) + } + CreationError::NoAvailablePixelFormat => { + Error::GraphicsCreationFailed( + ContextError::NoAvailablePixelFormat, + ) + } + error => Error::GraphicsCreationFailed( + ContextError::BackendError(error.to_string()), + ), + } })?; - let surface = gl_surface(&display, configuration.as_ref(), &window) - .map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create surface: {error}" - )), - ) - })?; - - let context = { - context - .make_current(&surface) - .expect("make context current") - }; - - if let Err(error) = surface.set_swap_interval( - &context, - glutin::surface::SwapInterval::Wait(ONE), - ) { - log::error!("set swap interval failed: {}", error); + #[allow(unsafe_code)] + unsafe { + context.make_current().expect("Make OpenGL context current") } - - (display, window, surface, context) }; #[allow(unsafe_code)] let (compositor, renderer) = unsafe { C::new(compositor_settings, |address| { - let address = CString::new(address).expect("address error"); - display.get_proc_address(address.as_c_str()) + context.get_proc_address(address) })? }; - let context = { context.make_not_current().expect("make context current") }; - let (mut event_sender, event_receiver) = mpsc::unbounded(); let (control_sender, mut control_receiver) = mpsc::unbounded(); @@ -294,14 +145,12 @@ where debug, event_receiver, control_sender, - window, - surface, context, init_command, settings.exit_on_close_request, ); - #[cfg(feature = "trace")] + #[cfg(feature = "tracing")] let run_instance = run_instance.instrument(info_span!("Application", "LOOP")); @@ -311,22 +160,22 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); let _ = event_loop.run_return(move |event, _, control_flow| { - use winit::event_loop::ControlFlow; + use glutin::event_loop::ControlFlow; if let ControlFlow::ExitWithCode(_) = control_flow { return; } let event = match event { - winit::event::Event::WindowEvent { + glutin::event::Event::WindowEvent { event: - winit::event::WindowEvent::ScaleFactorChanged { + glutin::event::WindowEvent::ScaleFactorChanged { new_inner_size, .. }, window_id, - } => Some(winit::event::Event::WindowEvent { - event: winit::event::WindowEvent::Resized(*new_inner_size), + } => Some(glutin::event::Event::WindowEvent { + event: glutin::event::WindowEvent::Resized(*new_inner_size), window_id, }), _ => event.to_static(), @@ -358,13 +207,13 @@ async fn run_instance( mut compositor: C, mut renderer: A::Renderer, mut runtime: Runtime, A::Message>, - mut proxy: winit::event_loop::EventLoopProxy, + mut proxy: glutin::event_loop::EventLoopProxy, mut debug: Debug, - mut event_receiver: mpsc::UnboundedReceiver, >, - mut control_sender: mpsc::UnboundedSender, - window: winit::window::Window, - surface: Surface, - context: NotCurrentContext, + mut event_receiver: mpsc::UnboundedReceiver< + glutin::event::Event<'_, A::Message>, + >, + mut control_sender: mpsc::UnboundedSender, + mut context: glutin::ContextWrapper, init_command: Command, exit_on_close_request: bool, ) where @@ -373,19 +222,13 @@ async fn run_instance( C: window::GLCompositor + 'static, ::Theme: StyleSheet, { + use glutin::event; + use glutin::event_loop::ControlFlow; use iced_winit::futures::stream::StreamExt; - use winit::event_loop::ControlFlow; - use winit::event; - let context = { - context - .make_current(&surface) - .expect("make context current") - }; - - let mut clipboard = Clipboard::connect(&window); + let mut clipboard = Clipboard::connect(context.window()); let mut cache = user_interface::Cache::default(); - let mut state = application::State::new(&application, &window); + let mut state = application::State::new(&application, context.window()); let mut viewport_version = state.viewport_version(); let mut should_exit = false; @@ -400,7 +243,7 @@ async fn run_instance( &mut should_exit, &mut proxy, &mut debug, - &window, + context.window(), || compositor.fetch_information(), ); runtime.track(application.subscription()); @@ -473,12 +316,12 @@ async fn run_instance( &mut proxy, &mut debug, &mut messages, - &window, + context.window(), || compositor.fetch_information(), ); // Update window - state.synchronize(&application, &window); + state.synchronize(&application, context.window()); user_interface = ManuallyDrop::new(application::build_user_interface( @@ -524,15 +367,16 @@ async fn run_instance( debug.draw_finished(); if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); + context.window().set_cursor_icon( + conversion::mouse_interaction(new_mouse_interaction), + ); mouse_interaction = new_mouse_interaction; } - window.request_redraw(); - runtime.broadcast((redraw_event, crate::event::Status::Ignored)); + context.window().request_redraw(); + runtime + .broadcast((redraw_event, crate::event::Status::Ignored)); let _ = control_sender.start_send(match interface_state { user_interface::State::Updated { @@ -564,15 +408,18 @@ async fn run_instance( messages.push(message); } event::Event::RedrawRequested(_) => { - #[cfg(feature = "trace")] + #[cfg(feature = "tracing")] let _ = info_span!("Application", "FRAME").entered(); debug.render_started(); - if !context.is_current() { - context - .make_current(&surface) - .expect("Make OpenGL context current"); + #[allow(unsafe_code)] + unsafe { + if !context.is_current() { + context = context + .make_current() + .expect("Make OpenGL context current"); + } } let current_viewport_version = state.viewport_version(); @@ -600,18 +447,19 @@ async fn run_instance( debug.draw_finished(); if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); + context.window().set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); mouse_interaction = new_mouse_interaction; } - surface.resize( - &context, - NonZeroU32::new(physical_size.width).unwrap_or(ONE), - NonZeroU32::new(physical_size.height).unwrap_or(ONE), - ); + context.resize(glutin::dpi::PhysicalSize::new( + physical_size.width, + physical_size.height, + )); compositor.resize_viewport(physical_size); @@ -625,7 +473,7 @@ async fn run_instance( &debug.overlay(), ); - surface.swap_buffers(&context).expect("Swap buffers"); + context.swap_buffers().expect("Swap buffers"); debug.render_finished(); @@ -642,7 +490,7 @@ async fn run_instance( break; } - state.update(&window, &window_event, &mut debug); + state.update(context.window(), &window_event, &mut debug); if let Some(event) = conversion::window_event( crate::window::Id::MAIN, @@ -660,23 +508,3 @@ async fn run_instance( // Manually drop the user interface drop(ManuallyDrop::into_inner(user_interface)); } - -#[allow(unsafe_code)] -/// Creates a new [`glutin::Surface`]. -pub fn gl_surface( - display: &Display, - gl_config: &Config, - window: &winit::window::Window, -) -> Result, glutin::error::Error> { - let (width, height) = window.inner_size().into(); - - let surface_attributes = SurfaceAttributesBuilder::::new() - .with_srgb(Some(true)) - .build( - window.raw_window_handle(), - NonZeroU32::new(width).unwrap_or(ONE), - NonZeroU32::new(height).unwrap_or(ONE), - ); - - unsafe { display.create_window_surface(gl_config, &surface_attributes) } -} diff --git a/glutin/src/lib.rs b/glutin/src/lib.rs index 45d6cb5b..33afd664 100644 --- a/glutin/src/lib.rs +++ b/glutin/src/lib.rs @@ -29,8 +29,5 @@ pub use iced_winit::*; pub mod application; -#[cfg(feature = "multi_window")] -pub mod multi_window; - #[doc(no_inline)] pub use application::Application; diff --git a/glutin/src/multi_window.rs b/glutin/src/multi_window.rs deleted file mode 100644 index 620d01d8..00000000 --- a/glutin/src/multi_window.rs +++ /dev/null @@ -1,1060 +0,0 @@ -//! Create interactive, native cross-platform applications. -use crate::mouse; -use crate::{Error, Executor, Runtime}; - -pub use iced_winit::multi_window::{self, Application, StyleSheet}; - -use iced_winit::conversion; -use iced_winit::futures; -use iced_winit::futures::channel::mpsc; -use iced_winit::renderer; -use iced_winit::user_interface; -use iced_winit::window; -use iced_winit::winit; -use iced_winit::{Clipboard, Command, Debug, Proxy, Settings}; - -use glutin::config::{ - Config, ConfigSurfaceTypes, ConfigTemplateBuilder, GlConfig, -}; -use glutin::context::{ - ContextApi, ContextAttributesBuilder, NotCurrentContext, - NotCurrentGlContextSurfaceAccessor, PossiblyCurrentGlContext, -}; -use glutin::display::{Display, DisplayApiPreference, GlDisplay}; -use glutin::surface::{GlSurface, SwapInterval}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; - -use crate::application::gl_surface; -use iced_winit::multi_window::Event; -use std::collections::HashMap; -use std::ffi::CString; -use std::mem::ManuallyDrop; -use std::num::NonZeroU32; - -use iced_native::widget::operation; -#[cfg(feature = "tracing")] -use tracing::{info_span, instrument::Instrument}; - -#[allow(unsafe_code)] -const ONE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; - -/// Runs an [`Application`] with an executor, compositor, and the provided -/// settings. -pub fn run( - settings: Settings, - compositor_settings: C::Settings, -) -> Result<(), Error> -where - A: Application + 'static, - E: Executor + 'static, - C: iced_graphics::window::GLCompositor + 'static, - ::Theme: StyleSheet, -{ - use futures::task; - use futures::Future; - use winit::event_loop::EventLoopBuilder; - use winit::platform::run_return::EventLoopExtRunReturn; - - #[cfg(feature = "trace")] - let _guard = iced_winit::Profiler::init(); - - let mut debug = Debug::new(); - debug.startup_started(); - - #[cfg(feature = "tracing")] - let _ = info_span!("Application::Glutin", "RUN").entered(); - - let mut event_loop = EventLoopBuilder::with_user_event().build(); - let proxy = event_loop.create_proxy(); - - let runtime = { - let executor = E::new().map_err(Error::ExecutorCreationFailed)?; - let proxy = Proxy::new(event_loop.create_proxy()); - - Runtime::new(executor, proxy) - }; - - let (application, init_command) = { - let flags = settings.flags; - - runtime.enter(|| A::new(flags)) - }; - - let builder = settings.window.into_builder( - &application.title(window::Id::MAIN), - event_loop.primary_monitor(), - settings.id, - ); - - log::info!("Window builder: {:#?}", builder); - - #[allow(unsafe_code)] - let (display, window, configuration, surface, context) = unsafe { - struct Configuration(Config); - use std::fmt; - impl fmt::Debug for Configuration { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let config = &self.0; - - f.debug_struct("Configuration") - .field("raw", &config) - .field("samples", &config.num_samples()) - .field("buffer_type", &config.color_buffer_type()) - .field("surface_type", &config.config_surface_types()) - .field("depth", &config.depth_size()) - .field("alpha", &config.alpha_size()) - .field("stencil", &config.stencil_size()) - .field("float_pixels", &config.float_pixels()) - .field("srgb", &config.srgb_capable()) - .field("api", &config.api()) - .finish() - } - } - - impl AsRef for Configuration { - fn as_ref(&self) -> &Config { - &self.0 - } - } - - let display_handle = event_loop.raw_display_handle(); - - #[cfg(all( - any(windows, target_os = "macos"), - not(target_arch = "wasm32") - ))] - let (window, window_handle) = { - let window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; - - let handle = window.raw_window_handle(); - - (window, handle) - }; - - #[cfg(target_arch = "wasm32")] - let preference = Err(Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "target not supported by backend" - )), - ))?; - - #[cfg(all(windows, not(target_arch = "wasm32")))] - let preference = DisplayApiPreference::WglThenEgl(Some(window_handle)); - - #[cfg(all(target_os = "macos", not(target_arch = "wasm32")))] - let preference = DisplayApiPreference::Cgl; - - #[cfg(all( - unix, - not(target_os = "macos"), - not(target_arch = "wasm32") - ))] - let preference = DisplayApiPreference::GlxThenEgl(Box::new( - winit::platform::unix::register_xlib_error_hook, - )); - - let display = - Display::new(display_handle, preference).map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create display: {error}" - )), - ) - })?; - - log::debug!("Display: {}", display.version_string()); - - let samples = C::sample_count(&compositor_settings) as u8; - let mut template = ConfigTemplateBuilder::new() - .with_surface_type(ConfigSurfaceTypes::WINDOW); - - if samples != 0 { - template = template.with_multisampling(samples); - } - - #[cfg(all(windows, not(target_arch = "wasm32")))] - let template = template.compatible_with_native_window(window_handle); - - log::debug!("Searching for display configurations"); - let configuration = display - .find_configs(template.build()) - .map_err(|_| { - Error::GraphicsCreationFailed( - iced_graphics::Error::NoAvailablePixelFormat, - ) - })? - .map(Configuration) - .inspect(|config| { - log::trace!("{config:#?}"); - }) - .min_by_key(|config| { - config.as_ref().num_samples().saturating_sub(samples) - }) - .ok_or(Error::GraphicsCreationFailed( - iced_graphics::Error::NoAvailablePixelFormat, - ))?; - - log::debug!("Selected: {configuration:#?}"); - - #[cfg(all( - unix, - not(target_os = "macos"), - not(target_arch = "wasm32") - ))] - let (window, window_handle) = { - use glutin::platform::x11::X11GlConfigExt; - let builder = - if let Some(visual) = configuration.as_ref().x11_visual() { - use winit::platform::unix::WindowBuilderExtUnix; - builder.with_x11_visual(visual.into_raw()) - } else { - builder - }; - - let window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; - - let handle = window.raw_window_handle(); - - (window, handle) - }; - - let attributes = - ContextAttributesBuilder::new().build(Some(window_handle)); - let fallback_attributes = ContextAttributesBuilder::new() - .with_context_api(ContextApi::Gles(None)) - .build(Some(window_handle)); - - let context = display - .create_context(configuration.as_ref(), &attributes) - .or_else(|_| { - display.create_context( - configuration.as_ref(), - &fallback_attributes, - ) - }) - .map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create context: {error}" - )), - ) - })?; - - let surface = gl_surface(&display, configuration.as_ref(), &window) - .map_err(|error| { - Error::GraphicsCreationFailed( - iced_graphics::Error::BackendError(format!( - "failed to create surface: {error}" - )), - ) - })?; - - (display, window, configuration.0, surface, context) - }; - - let windows: HashMap = - HashMap::from([(window::Id::MAIN, window)]); - - // need to make context current before trying to load GL functions - let context = context - .make_current(&surface) - .expect("Make context current."); - - #[allow(unsafe_code)] - let (compositor, renderer) = unsafe { - C::new(compositor_settings, |address| { - let address = CString::new(address).expect("address error"); - display.get_proc_address(address.as_c_str()) - })? - }; - - let context = context.make_not_current().expect("Make not current."); - - let (mut sender, receiver) = mpsc::unbounded(); - - let mut instance = Box::pin({ - let run_instance = run_instance::( - application, - compositor, - renderer, - runtime, - proxy, - debug, - receiver, - display, - windows, - configuration, - context, - init_command, - settings.exit_on_close_request, - ); - - #[cfg(feature = "tracing")] - let run_instance = - run_instance.instrument(info_span!("Application", "LOOP")); - - run_instance - }); - - let mut context = task::Context::from_waker(task::noop_waker_ref()); - - let _ = event_loop.run_return(move |event, event_loop, control_flow| { - use winit::event_loop::ControlFlow; - - if let ControlFlow::ExitWithCode(_) = control_flow { - return; - } - - let event = match event { - winit::event::Event::WindowEvent { - event: - winit::event::WindowEvent::ScaleFactorChanged { - new_inner_size, - .. - }, - window_id, - } => Some(winit::event::Event::WindowEvent { - event: winit::event::WindowEvent::Resized(*new_inner_size), - window_id, - }), - winit::event::Event::UserEvent(Event::NewWindow { - id, - settings, - title, - }) => { - let window = settings - .into_builder(&title, event_loop.primary_monitor(), None) - .build(event_loop) - .expect("Failed to build window"); - - Some(winit::event::Event::UserEvent(Event::WindowCreated( - id, window, - ))) - } - _ => event.to_static(), - }; - - if let Some(event) = event { - sender.start_send(event).expect("Send event"); - - let poll = instance.as_mut().poll(&mut context); - - *control_flow = match poll { - task::Poll::Pending => ControlFlow::Wait, - task::Poll::Ready(_) => ControlFlow::Exit, - }; - } - }); - - Ok(()) -} - -async fn run_instance( - mut application: A, - mut compositor: C, - mut renderer: A::Renderer, - mut runtime: Runtime>, Event>, - mut proxy: winit::event_loop::EventLoopProxy>, - mut debug: Debug, - mut receiver: mpsc::UnboundedReceiver< - winit::event::Event<'_, Event>, - >, - display: Display, - mut windows: HashMap, - configuration: Config, - mut context: NotCurrentContext, - init_command: Command, - _exit_on_close_request: bool, -) where - A: Application + 'static, - E: Executor + 'static, - C: iced_graphics::window::GLCompositor + 'static, - ::Theme: StyleSheet, -{ - use iced_winit::futures::stream::StreamExt; - use winit::event; - - let mut clipboard = - Clipboard::connect(windows.values().next().expect("No window found")); - let mut caches = HashMap::new(); - let mut current_context_window = None; - let mut window_ids: HashMap<_, _> = windows - .iter() - .map(|(&id, window)| (window.id(), id)) - .collect(); - let mut states = HashMap::new(); - let mut surfaces = HashMap::new(); - let mut interfaces = ManuallyDrop::new(HashMap::new()); - - for (&id, window) in windows.keys().zip(windows.values()) { - let surface = gl_surface(&display, &configuration, &window) - .expect("Create surface."); - let current_context = - context.make_current(&surface).expect("Make current."); - let state = multi_window::State::new(&application, id, &window); - let physical_size = state.physical_size(); - - surface.resize( - ¤t_context, - NonZeroU32::new(physical_size.width).unwrap_or(ONE), - NonZeroU32::new(physical_size.height).unwrap_or(ONE), - ); - - let user_interface = multi_window::build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - id, - ); - - context = current_context - .make_not_current() - .expect("Make not current."); - - let _ = states.insert(id, state); - let _ = surfaces.insert(id, surface); - let _ = interfaces.insert(id, user_interface); - } - - run_command( - &application, - &mut caches, - &states, - &mut renderer, - init_command, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &windows, - || compositor.fetch_information(), - ); - - runtime.track(application.subscription().map(Event::Application)); - - let mut mouse_interaction = mouse::Interaction::default(); - let mut events = Vec::new(); - let mut messages = Vec::new(); - - debug.startup_finished(); - - 'main: while let Some(event) = receiver.next().await { - match event { - event::Event::MainEventsCleared => { - for id in windows.keys().copied() { - let (filtered, remaining): (Vec<_>, Vec<_>) = - events.iter().cloned().partition( - |(window_id, _event): &( - Option, - iced_native::event::Event, - )| { - *window_id == Some(id) || *window_id == None - }, - ); - - events.retain(|el| remaining.contains(el)); - let filtered: Vec<_> = filtered - .into_iter() - .map(|(_id, event)| event) - .collect(); - - let cursor_position = - states.get(&id).unwrap().cursor_position(); - let window = windows.get(&id).unwrap(); - - if filtered.is_empty() && messages.is_empty() { - continue; - } - - debug.event_processing_started(); - - let (interface_state, statuses) = { - let user_interface = interfaces.get_mut(&id).unwrap(); - user_interface.update( - &filtered, - cursor_position, - &mut renderer, - &mut clipboard, - &mut messages, - ) - }; - - debug.event_processing_finished(); - - for event in filtered.into_iter().zip(statuses.into_iter()) - { - runtime.broadcast(event); - } - - if !messages.is_empty() - || matches!( - interface_state, - user_interface::State::Outdated - ) - { - let user_interfaces: HashMap<_, _> = - ManuallyDrop::into_inner(interfaces) - .drain() - .map(|(id, interface)| { - (id, interface.into_cache()) - }) - .collect(); - - // Update application - update( - &mut application, - &mut caches, - &states, - &mut renderer, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &mut messages, - &windows, - || compositor.fetch_information(), - ); - - // Update window - states.get_mut(&id).unwrap().synchronize( - &application, - id, - windows.get(&id).expect("No window found with ID."), - ); - - let should_exit = application.should_exit(); - - interfaces = ManuallyDrop::new(build_user_interfaces( - &application, - &mut renderer, - &mut debug, - &states, - user_interfaces, - )); - - if should_exit { - break 'main; - } - } - - debug.draw_started(); - let new_mouse_interaction = { - let user_interface = interfaces.get_mut(&id).unwrap(); - let state = states.get(&id).unwrap(); - - user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor_position(), - ) - }; - debug.draw_finished(); - - if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); - - mouse_interaction = new_mouse_interaction; - } - - window.request_redraw(); - } - } - event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( - event::MacOS::ReceivedUrl(url), - )) => { - use iced_native::event; - events.push(( - None, - iced_native::Event::PlatformSpecific( - event::PlatformSpecific::MacOS( - event::MacOS::ReceivedUrl(url), - ), - ), - )); - } - event::Event::UserEvent(event) => match event { - Event::Application(message) => messages.push(message), - Event::WindowCreated(id, window) => { - let state = - multi_window::State::new(&application, id, &window); - let user_interface = multi_window::build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - id, - ); - - let surface = gl_surface(&display, &configuration, &window) - .expect("Create surface."); - - let _ = states.insert(id, state); - let _ = interfaces.insert(id, user_interface); - let _ = window_ids.insert(window.id(), id); - let _ = windows.insert(id, window); - let _ = surfaces.insert(id, surface); - } - Event::CloseWindow(id) => { - // TODO(derezzedex): log errors - if let Some(window) = windows.get(&id) { - if window_ids.remove(&window.id()).is_none() { - println!("Failed to remove from `window_ids`!"); - } - } - if states.remove(&id).is_none() { - println!("Failed to remove from `states`!") - } - if interfaces.remove(&id).is_none() { - println!("Failed to remove from `interfaces`!"); - } - if surfaces.remove(&id).is_none() { - println!("Failed to remove from `surfaces`!") - } - if windows.remove(&id).is_none() { - println!("Failed to remove from `windows`!") - } - - if windows.is_empty() { - break 'main; - } - } - Event::NewWindow { .. } => unreachable!(), - }, - event::Event::RedrawRequested(id) => { - #[cfg(feature = "tracing")] - let _ = info_span!("Application", "FRAME").entered(); - - let state = window_ids - .get(&id) - .and_then(|id| states.get_mut(id)) - .unwrap(); - let window = - window_ids.get(&id).and_then(|id| windows.get(id)).unwrap(); - - let surface = window_ids - .get(&id) - .and_then(|id| surfaces.get(id)) - .unwrap(); - - debug.render_started(); - - let current_context = - context.make_current(&surface).expect("Make current."); - - if current_context_window != Some(id) { - current_context_window = Some(id); - } - - if state.viewport_changed() { - let physical_size = state.physical_size(); - let logical_size = state.logical_size(); - - let mut user_interface = window_ids - .get(&id) - .and_then(|id| interfaces.remove(id)) - .unwrap(); - - debug.layout_started(); - user_interface = - user_interface.relayout(logical_size, &mut renderer); - debug.layout_finished(); - - debug.draw_started(); - let new_mouse_interaction = user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor_position(), - ); - debug.draw_finished(); - - if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); - - mouse_interaction = new_mouse_interaction; - } - - surface.resize( - ¤t_context, - NonZeroU32::new(physical_size.width).unwrap_or(ONE), - NonZeroU32::new(physical_size.height).unwrap_or(ONE), - ); - - if let Err(_) = surface.set_swap_interval( - ¤t_context, - SwapInterval::Wait(ONE), - ) { - log::error!("Could not set swap interval for surface attached to window id: {:?}", id); - } - - compositor.resize_viewport(physical_size); - - let _ = interfaces - .insert(*window_ids.get(&id).unwrap(), user_interface); - } - - compositor.present( - &mut renderer, - state.viewport(), - state.background_color(), - &debug.overlay(), - ); - - surface - .swap_buffers(¤t_context) - .expect("Swap buffers"); - - context = current_context - .make_not_current() - .expect("Make not current."); - debug.render_finished(); - // TODO: Handle animations! - // Maybe we can use `ControlFlow::WaitUntil` for this. - } - event::Event::WindowEvent { - event: window_event, - window_id, - } => { - // dbg!(window_id); - if let Some(window) = - window_ids.get(&window_id).and_then(|id| windows.get(id)) - { - if let Some(state) = window_ids - .get(&window_id) - .and_then(|id| states.get_mut(id)) - { - if multi_window::requests_exit( - &window_event, - state.modifiers(), - ) { - if let Some(id) = - window_ids.get(&window_id).cloned() - { - let message = application.close_requested(id); - messages.push(message); - } - } - - state.update(window, &window_event, &mut debug); - - if let Some(event) = conversion::window_event( - *window_ids.get(&window_id).unwrap(), - &window_event, - state.scale_factor(), - state.modifiers(), - ) { - events.push(( - window_ids.get(&window_id).cloned(), - event, - )); - } - } else { - log::error!( - "Window state not found for id: {:?}", - window_id - ); - } - } else { - log::error!("Window not found for id: {:?}", window_id); - } - } - _ => {} - } - } - - // Manually drop the user interface - // drop(ManuallyDrop::into_inner(user_interface)); -} - -/// Updates an [`Application`] by feeding it the provided messages, spawning any -/// resulting [`Command`], and tracking its [`Subscription`]. -pub fn update( - application: &mut A, - caches: &mut HashMap, - states: &HashMap>, - renderer: &mut A::Renderer, - runtime: &mut Runtime>, Event>, - clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy>, - debug: &mut Debug, - messages: &mut Vec, - windows: &HashMap, - graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, -) where - A: Application + 'static, - ::Theme: StyleSheet, -{ - for message in messages.drain(..) { - debug.log_message(&message); - - debug.update_started(); - let command = runtime.enter(|| application.update(message)); - debug.update_finished(); - - run_command( - application, - caches, - &states, - renderer, - command, - runtime, - clipboard, - proxy, - debug, - windows, - graphics_info, - ); - } - - let subscription = application.subscription().map(Event::Application); - runtime.track(subscription); -} - -/// Runs the actions of a [`Command`]. -pub fn run_command( - application: &A, - caches: &mut HashMap, - states: &HashMap>, - renderer: &mut A::Renderer, - command: Command, - runtime: &mut Runtime>, Event>, - clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy>, - debug: &mut Debug, - windows: &HashMap, - _graphics_info: impl FnOnce() -> iced_graphics::compositor::Information + Copy, -) where - A: Application + 'static, - E: Executor, - ::Theme: StyleSheet, -{ - use iced_native::command; - use iced_native::system; - use iced_native::window; - use iced_winit::clipboard; - use iced_winit::futures::FutureExt; - - for action in command.actions() { - match action { - command::Action::Future(future) => { - runtime.spawn(Box::pin(future.map(Event::Application))); - } - command::Action::Clipboard(action) => match action { - clipboard::Action::Read(tag) => { - let message = tag(clipboard.read()); - - proxy - .send_event(Event::Application(message)) - .expect("Send message to event loop"); - } - clipboard::Action::Write(contents) => { - clipboard.write(contents); - } - }, - command::Action::Window(id, action) => match action { - window::Action::Spawn { settings } => { - proxy - .send_event(Event::NewWindow { - id, - settings: settings.into(), - title: application.title(id), - }) - .expect("Send message to event loop"); - } - window::Action::Close => { - proxy - .send_event(Event::CloseWindow(id)) - .expect("Send message to event loop"); - } - window::Action::Drag => { - let window = windows.get(&id).expect("No window found"); - let _res = window.drag_window(); - } - window::Action::Resize { width, height } => { - let window = windows.get(&id).expect("No window found"); - window.set_inner_size(winit::dpi::LogicalSize { - width, - height, - }); - } - window::Action::Move { x, y } => { - let window = windows.get(&id).expect("No window found"); - window.set_outer_position(winit::dpi::LogicalPosition { - x, - y, - }); - } - window::Action::ChangeMode(mode) => { - let window = windows.get(&id).expect("No window found"); - window.set_visible(conversion::visible(mode)); - window.set_fullscreen(conversion::fullscreen( - window.primary_monitor(), - mode, - )); - } - window::Action::FetchMode(tag) => { - let window = windows.get(&id).expect("No window found"); - let mode = if window.is_visible().unwrap_or(true) { - conversion::mode(window.fullscreen()) - } else { - window::Mode::Hidden - }; - - proxy - .send_event(Event::Application(tag(mode))) - .expect("Send message to event loop"); - } - window::Action::Maximize(value) => { - let window = windows.get(&id).expect("No window found!"); - window.set_maximized(value); - } - window::Action::Minimize(value) => { - let window = windows.get(&id).expect("No window found!"); - window.set_minimized(value); - } - window::Action::ToggleMaximize => { - let window = windows.get(&id).expect("No window found!"); - window.set_maximized(!window.is_maximized()); - } - window::Action::ToggleDecorations => { - let window = windows.get(&id).expect("No window found!"); - window.set_decorations(!window.is_decorated()); - } - window::Action::RequestUserAttention(attention_type) => { - let window = windows.get(&id).expect("No window found!"); - window.request_user_attention( - attention_type.map(conversion::user_attention), - ); - } - window::Action::GainFocus => { - let window = windows.get(&id).expect("No window found!"); - window.focus_window(); - } - window::Action::ChangeAlwaysOnTop(on_top) => { - let window = windows.get(&id).expect("No window found!"); - window.set_always_on_top(on_top); - } - window::Action::FetchId(tag) => { - let window = windows.get(&id).expect("No window found!"); - - proxy - .send_event(Event::Application(tag(window.id().into()))) - .expect("Send message to event loop.") - } - }, - command::Action::System(action) => match action { - system::Action::QueryInformation(_tag) => { - #[cfg(feature = "iced_winit/system")] - { - let graphics_info = _graphics_info(); - let proxy = proxy.clone(); - - let _ = std::thread::spawn(move || { - let information = - crate::system::information(graphics_info); - - let message = _tag(information); - - proxy - .send_event(Event::Application(message)) - .expect("Send message to event loop") - }); - } - } - }, - command::Action::Widget(action) => { - let mut current_caches = std::mem::take(caches); - let mut current_operation = Some(action.into_operation()); - - let mut user_interfaces = multi_window::build_user_interfaces( - application, - renderer, - debug, - states, - current_caches, - ); - - while let Some(mut operation) = current_operation.take() { - for user_interface in user_interfaces.values_mut() { - user_interface.operate(renderer, operation.as_mut()); - - match operation.finish() { - operation::Outcome::None => {} - operation::Outcome::Some(message) => { - proxy - .send_event(Event::Application(message)) - .expect("Send message to event loop"); - } - operation::Outcome::Chain(next) => { - current_operation = Some(next); - } - } - } - } - - let user_interfaces: HashMap<_, _> = user_interfaces - .drain() - .map(|(id, interface)| (id, interface.into_cache())) - .collect(); - - current_caches = user_interfaces; - *caches = current_caches; - } - } - } -} - -/// TODO(derezzedex) -pub fn build_user_interfaces<'a, A>( - application: &'a A, - renderer: &mut A::Renderer, - debug: &mut Debug, - states: &HashMap>, - mut user_interfaces: HashMap, -) -> HashMap< - window::Id, - iced_winit::UserInterface< - 'a, - ::Message, - ::Renderer, - >, -> -where - A: Application + 'static, - ::Theme: StyleSheet, -{ - let mut interfaces = HashMap::new(); - - for (id, pure_state) in user_interfaces.drain() { - let state = &states.get(&id).unwrap(); - - let user_interface = multi_window::build_user_interface( - application, - pure_state, - renderer, - state.logical_size(), - debug, - id, - ); - - let _ = interfaces.insert(id, user_interface); - } - - interfaces -} diff --git a/graphics/src/window/gl_compositor.rs b/graphics/src/window/gl_compositor.rs index e6ae2364..a45a7ca1 100644 --- a/graphics/src/window/gl_compositor.rs +++ b/graphics/src/window/gl_compositor.rs @@ -30,7 +30,7 @@ pub trait GLCompositor: Sized { /// The settings of the [`GLCompositor`]. /// /// It's up to you to decide the configuration supported by your renderer! - type Settings: Default + Clone; + type Settings: Default; /// Creates a new [`GLCompositor`] and [`Renderer`] with the given /// [`Settings`] and an OpenGL address loader function. diff --git a/native/src/window/id.rs b/native/src/window/id.rs index fa9761f5..0c3e5272 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -4,12 +4,10 @@ use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] /// The ID of the window. -/// -/// This is not necessarily the same as the window ID fetched from `winit::window::Window`. pub struct Id(u64); impl Id { - /// TODO(derezzedex): maybe change `u64` to an enum `Type::{Single, Multi(u64)}` + /// The reserved window ID for the primary window in an Iced application. pub const MAIN: Self = Id(0); /// Creates a new unique window ID. diff --git a/src/lib.rs b/src/lib.rs index 993e94b1..65fe3b93 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -182,7 +182,7 @@ pub mod touch; pub mod widget; pub mod window; -#[cfg(feature = "multi_window")] +#[cfg(all(not(feature = "glow"), feature = "multi_window"))] pub mod multi_window; #[cfg(all(not(feature = "glow"), feature = "wgpu"))] diff --git a/winit/src/application.rs b/winit/src/application.rs index 58556da4..1310ba1c 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -734,7 +734,7 @@ pub fn run_command( clipboard.write(contents); } }, - command::Action::Window(_id, action) => match action { + command::Action::Window(_, action) => match action { window::Action::Close => { *should_exit = true; } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 1a9d4a1c..eac8b260 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -1,4 +1,4 @@ -//! Create interactive, native cross-platform applications. +//! Create interactive, native cross-platform applications for WGPU. mod state; pub use state::State; @@ -31,17 +31,14 @@ pub use crate::Profiler; #[cfg(feature = "trace")] use tracing::{info_span, instrument::Instrument}; -/// TODO(derezzedex) -// This is the an wrapper around the `Application::Message` associate type -// to allows the `shell` to create internal messages, while still having -// the current user specified custom messages. +/// This is a wrapper around the `Application::Message` associate type +/// to allows the `shell` to create internal messages, while still having +/// the current user specified custom messages. #[derive(Debug)] pub enum Event { /// An [`Application`] generated message Application(Message), - /// TODO(derezzedex) - // Create a wrapper variant of `window::Event` type instead - // (maybe we should also allow users to listen/react to those internal messages?) + /// A message which spawns a new window. NewWindow { /// The [window::Id] of the newly spawned [`Window`]. id: window::Id, @@ -50,9 +47,9 @@ pub enum Event { /// The title of the newly spawned [`Window`]. title: String, }, - /// TODO(derezzedex) + /// Close a window. CloseWindow(window::Id), - /// TODO(derezzedex) + /// A message for when the window has finished being created. WindowCreated(window::Id, winit::window::Window), } @@ -90,7 +87,7 @@ where /// background by shells. fn update(&mut self, message: Self::Message) -> Command; - /// Returns the widgets to display in the [`Program`]. + /// Returns the widgets to display for the `window` in the [`Program`]. /// /// These widgets can produce __messages__ based on user interaction. fn view( @@ -108,7 +105,7 @@ where /// load state from a file, perform an initial HTTP request, etc. fn new(flags: Self::Flags) -> (Self, Command); - /// Returns the current title of the current [`Application`] window. + /// Returns the current title of each [`Application`] window. /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. @@ -137,7 +134,7 @@ where Subscription::none() } - /// Returns the scale factor of the [`Application`]. + /// Returns the scale factor of the window of the [`Application`]. /// /// It can be used to dynamically control the size of the UI at runtime /// (i.e. zooming). @@ -1142,7 +1139,7 @@ pub fn run_command( } } -/// TODO(derezzedex) +/// Build the user interfaces for every window. pub fn build_user_interfaces<'a, A>( application: &'a A, renderer: &mut A::Renderer, diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 35c69924..a7e65de7 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -8,7 +8,7 @@ use std::marker::PhantomData; use winit::event::{Touch, WindowEvent}; use winit::window::Window; -/// The state of a windowed [`Application`]. +/// The state of a multi-windowed [`Application`]. #[allow(missing_debug_implementations)] pub struct State where @@ -29,7 +29,7 @@ impl State where ::Theme: application::StyleSheet, { - /// Creates a new [`State`] for the provided [`Application`]'s window. + /// Creates a new [`State`] for the provided [`Application`]'s `window`. pub fn new( application: &A, window_id: window::Id, @@ -116,8 +116,7 @@ where self.appearance.text_color } - /// Processes the provided window event and updates the [`State`] - /// accordingly. + /// Processes the provided window event and updates the [`State`] accordingly. pub fn update( &mut self, window: &Window, diff --git a/winit/src/profiler.rs b/winit/src/profiler.rs index ff9bbdc0..7031507a 100644 --- a/winit/src/profiler.rs +++ b/winit/src/profiler.rs @@ -21,7 +21,6 @@ pub struct Profiler { impl Profiler { /// Initializes the [`Profiler`]. pub fn init() -> Self { - log::info!("Capturing trace.."); // Registry stores the spans & generates unique span IDs let subscriber = Registry::default(); diff --git a/winit/src/settings.rs b/winit/src/settings.rs index b26de542..88d7c1de 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -179,9 +179,9 @@ impl Window { { use winit::platform::windows::WindowBuilderExtWindows; - // if let Some(parent) = self.platform_specific.parent { - // window_builder = window_builder.with_parent_window(parent); - // } + if let Some(parent) = self.platform_specific.parent { + window_builder = window_builder.with_parent_window(parent); + } window_builder = window_builder .with_drag_and_drop(self.platform_specific.drag_and_drop); @@ -227,7 +227,7 @@ impl From for Window { fn from(settings: iced_native::window::Settings) -> Self { Self { size: settings.size, - position: Position::from(settings.position), + position: settings.position, min_size: settings.min_size, max_size: settings.max_size, visible: settings.visible, diff --git a/winit/src/settings/windows.rs b/winit/src/settings/windows.rs index 0891ec2c..ff03a9c5 100644 --- a/winit/src/settings/windows.rs +++ b/winit/src/settings/windows.rs @@ -4,7 +4,7 @@ #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct PlatformSpecific { /// Parent window - // pub parent: Option, + pub parent: Option, /// Drag and drop support pub drag_and_drop: bool, @@ -13,7 +13,7 @@ pub struct PlatformSpecific { impl Default for PlatformSpecific { fn default() -> Self { Self { - // parent: None, + parent: None, drag_and_drop: true, } } From 8ba18430800142965549077373e2a45d0a3429a1 Mon Sep 17 00:00:00 2001 From: Bingus Date: Mon, 13 Mar 2023 14:16:45 -0700 Subject: [PATCH 047/286] Code cleanup, clearer comments + removed some unnecessary dupe; Removed `Frames` struct return for `window::frames()` since we are just redrawing every window anyways; Interface dropping; --- Cargo.toml | 4 +- examples/multi_window/Cargo.toml | 2 +- examples/solar_system/src/main.rs | 2 +- native/src/window.rs | 15 +--- src/lib.rs | 2 +- src/multi_window/application.rs | 5 +- winit/Cargo.toml | 2 +- winit/src/application.rs | 2 +- winit/src/lib.rs | 2 +- winit/src/multi_window.rs | 124 +++++++++++------------------- winit/src/multi_window/state.rs | 2 +- 11 files changed, 59 insertions(+), 103 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5276d921..7f89b05e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,8 +46,8 @@ chrome-trace = [ "iced_wgpu?/tracing", "iced_glow?/tracing", ] -# Enables experimental multi-window support for iced_winit -multi_window = ["iced_winit/multi_window"] +# Enables experimental multi-window support for iced_winit + wgpu. +multi-window = ["iced_winit/multi-window"] [badges] maintenance = { status = "actively-developed" } diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml index 0bb83f37..a59a0e68 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -7,7 +7,7 @@ publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -iced = { path = "../..", features = ["debug", "multi_window", "tokio"] } +iced = { path = "../..", features = ["debug", "multi-window", "tokio"] } env_logger = "0.10.0" iced_native = { path = "../../native" } iced_lazy = { path = "../../lazy" } diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index eb461bb0..9a4ee754 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -89,7 +89,7 @@ impl Application for SolarSystem { } fn subscription(&self) -> Subscription { - window::frames().map(|frame| Message::Tick(frame.at)) + window::frames().map(Message::Tick) } } diff --git a/native/src/window.rs b/native/src/window.rs index a8f8b10f..660cd54f 100644 --- a/native/src/window.rs +++ b/native/src/window.rs @@ -30,20 +30,9 @@ use crate::time::Instant; /// /// In any case, this [`Subscription`] is useful to smoothly draw application-driven /// animations without missing any frames. -pub fn frames() -> Subscription { +pub fn frames() -> Subscription { subscription::raw_events(|event, _status| match event { - crate::Event::Window(id, Event::RedrawRequested(at)) => { - Some(Frame { id, at }) - } + crate::Event::Window(_, Event::RedrawRequested(at)) => Some(at), _ => None, }) } - -/// The returned `Frame` for a framerate subscription. -#[derive(Debug)] -pub struct Frame { - /// The `window::Id` that the `Frame` was produced in. - pub id: Id, - /// The `Instant` at which the frame was produced. - pub at: Instant, -} diff --git a/src/lib.rs b/src/lib.rs index 65fe3b93..e7481c77 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -182,7 +182,7 @@ pub mod touch; pub mod widget; pub mod window; -#[cfg(all(not(feature = "glow"), feature = "multi_window"))] +#[cfg(all(not(feature = "glow"), feature = "multi-window"))] pub mod multi_window; #[cfg(all(not(feature = "glow"), feature = "wgpu"))] diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index d0b515ab..1fb4bcd4 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -139,7 +139,7 @@ pub trait Application: Sized { window: window::Id, ) -> Element<'_, Self::Message, crate::Renderer>; - /// Returns the scale factor of the [`Application`]. + /// Returns the scale factor of the `window` of the [`Application`]. /// /// It can be used to dynamically control the size of the UI at runtime /// (i.e. zooming). @@ -160,7 +160,8 @@ pub trait Application: Sized { false } - /// Requests that the [`window`] be closed. + /// Returns the `Self::Message` that should be processed when a `window` is requested to + /// be closed. fn close_requested(&self, window: window::Id) -> Self::Message; /// Runs the [`Application`]. diff --git a/winit/Cargo.toml b/winit/Cargo.toml index 7de69528..9efd1890 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -16,7 +16,7 @@ chrome-trace = ["trace", "tracing-chrome"] debug = ["iced_native/debug"] system = ["sysinfo"] application = [] -multi_window = [] +multi-window = [] [dependencies] window_clipboard = "0.2" diff --git a/winit/src/application.rs b/winit/src/application.rs index 906da3c6..fe97486f 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -743,7 +743,7 @@ pub fn run_command( } window::Action::Spawn { .. } => { log::info!( - "This is only available on `multi_window::Application`" + "Spawning a window is only available with `multi_window::Application`s." ) } window::Action::Resize { width, height } => { diff --git a/winit/src/lib.rs b/winit/src/lib.rs index fe5768df..54b9c31f 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -35,7 +35,7 @@ pub use iced_native::*; pub use winit; -#[cfg(feature = "multi_window")] +#[cfg(feature = "multi-window")] pub mod multi_window; #[cfg(feature = "application")] diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index eac8b260..d5da406c 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -33,7 +33,7 @@ use tracing::{info_span, instrument::Instrument}; /// This is a wrapper around the `Application::Message` associate type /// to allows the `shell` to create internal messages, while still having -/// the current user specified custom messages. +/// the current user-specified custom messages. #[derive(Debug)] pub enum Event { /// An [`Application`] generated message @@ -53,9 +53,9 @@ pub enum Event { WindowCreated(window::Id, winit::window::Window), } -/// An interactive, native cross-platform application. +/// An interactive, native, cross-platform, multi-windowed application. /// -/// This trait is the main entrypoint of Iced. Once implemented, you can run +/// This trait is the main entrypoint of multi-window Iced. Once implemented, you can run /// your GUI application by simply calling [`run`]. It will run in /// its own window. /// @@ -105,7 +105,7 @@ where /// load state from a file, perform an initial HTTP request, etc. fn new(flags: Self::Flags) -> (Self, Command); - /// Returns the current title of each [`Application`] window. + /// Returns the current title of each window of the [`Application`]. /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. @@ -155,7 +155,8 @@ where false } - /// Requests that the [`window`] be closed. + /// Returns the `Self::Message` that should be processed when a `window` is requested to + /// be closed. fn close_requested(&self, window: window::Id) -> Self::Message; } @@ -462,9 +463,9 @@ async fn run_instance( } debug.event_processing_finished(); - // Update application with app message(s) - // Note: without tying an app message to a window ID, we must redraw all windows - // as we cannot know what changed without some kind of damage tracking. + // Update application with app messages + // Unless we implement some kind of diffing, we must redraw all windows as we + // cannot know what changed. if !messages.is_empty() || matches!( interface_state, @@ -612,9 +613,7 @@ async fn run_instance( } Event::WindowCreated(id, window) => { let mut surface = compositor.create_surface(&window); - let state = State::new(&application, id, &window); - let physical_size = state.physical_size(); compositor.configure_surface( @@ -776,14 +775,12 @@ async fn run_instance( } _ => { debug.render_finished(); + log::error!("Error {error:?} when presenting surface."); - // Try rendering again next frame. - // TODO(derezzedex) - windows - .values() - .next() - .expect("No window found") - .request_redraw(); + // Try rendering windows again next frame. + for window in windows.values() { + window.request_redraw(); + } } }, } @@ -792,80 +789,45 @@ async fn run_instance( event: window_event, window_id, } => { - // dbg!(window_id); - if let Some(window) = - window_ids.get(&window_id).and_then(|id| windows.get(id)) - { - if let Some(state) = window_ids + if let (Some(window), Some(state)) = ( + window_ids.get(&window_id).and_then(|id| windows.get(id)), + window_ids .get(&window_id) - .and_then(|id| states.get_mut(id)) - { - if requests_exit(&window_event, state.modifiers()) { - if let Some(id) = - window_ids.get(&window_id).cloned() - { - let message = application.close_requested(id); - messages.push(message); - } + .and_then(|id| states.get_mut(id)), + ) { + if crate::application::requests_exit(&window_event, state.modifiers()) { + if let Some(id) = window_ids.get(&window_id).cloned() { + let message = application.close_requested(id); + messages.push(message); } + } - state.update(window, &window_event, &mut debug); + state.update(window, &window_event, &mut debug); - if let Some(event) = conversion::window_event( - *window_ids.get(&window_id).unwrap(), - &window_event, - state.scale_factor(), - state.modifiers(), - ) { - events.push(( - window_ids.get(&window_id).cloned(), - event, - )); - } - } else { - log::error!( - "No window state found for id: {:?}", - window_id - ); + if let Some(event) = conversion::window_event( + *window_ids.get(&window_id).unwrap(), + &window_event, + state.scale_factor(), + state.modifiers(), + ) { + events + .push((window_ids.get(&window_id).cloned(), event)); } } else { - log::error!("No window found with id: {:?}", window_id); + log::error!( + "Could not find window or state for id: {window_id:?}" + ); } } _ => {} } } - // Manually drop the user interface - // drop(ManuallyDrop::into_inner(user_interface)); + // Manually drop the user interfaces + drop(ManuallyDrop::into_inner(interfaces)); } -/// Returns true if the provided event should cause an [`Application`] to -/// exit. -pub fn requests_exit( - event: &winit::event::WindowEvent<'_>, - _modifiers: winit::event::ModifiersState, -) -> bool { - use winit::event::WindowEvent; - - match event { - WindowEvent::CloseRequested => true, - #[cfg(target_os = "macos")] - WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::Q), - state: winit::event::ElementState::Pressed, - .. - }, - .. - } if _modifiers.logo() => true, - _ => false, - } -} - -/// Builds a [`UserInterface`] for the provided [`Application`], logging -/// [`struct@Debug`] information accordingly. +/// Builds a window's [`UserInterface`] for the [`Application`]. pub fn build_user_interface<'a, A: Application>( application: &'a A, cache: user_interface::Cache, @@ -890,7 +852,9 @@ where #[cfg(feature = "trace")] let layout_span = info_span!("Application", "LAYOUT").entered(); debug.layout_started(); + let user_interface = UserInterface::build(view, size, cache, renderer); + #[cfg(feature = "trace")] let _ = layout_span.exit(); debug.layout_finished(); @@ -898,7 +862,7 @@ where user_interface } -/// Updates an [`Application`] by feeding it the provided messages, spawning any +/// Updates an [`Application`] by feeding it messages, spawning any /// resulting [`Command`], and tracking its [`Subscription`]. pub fn update( application: &mut A, @@ -923,7 +887,9 @@ pub fn update( debug.log_message(&message); debug.update_started(); + let command = runtime.enter(|| application.update(message)); + #[cfg(feature = "trace")] let _ = update_span.exit(); debug.update_finished(); @@ -1023,7 +989,7 @@ pub fn run_command( let window = windows.get(&id).expect("No window found"); window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( - window.primary_monitor(), + window.current_monitor(), mode, )); } diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index a7e65de7..d0e442d0 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -179,7 +179,7 @@ where /// Synchronizes the [`State`] with its [`Application`] and its respective /// window. /// - /// Normally an [`Application`] should be synchronized with its [`State`] + /// Normally, an [`Application`] should be synchronized with its [`State`] /// and window after calling [`Application::update`]. /// /// [`Application::update`]: crate::Program::update From ce4b2c93d9802dfb8cd3fc9033d76651d4bbc75b Mon Sep 17 00:00:00 2001 From: Bingus Date: Mon, 13 Mar 2023 18:19:16 -0700 Subject: [PATCH 048/286] Added simpler MW example --- examples/multi_window/Cargo.toml | 8 +- examples/multi_window/src/main.rs | 652 ++++-------------------- examples/multi_window_panes/Cargo.toml | 12 + examples/multi_window_panes/src/main.rs | 624 +++++++++++++++++++++++ native/src/window/id.rs | 2 + winit/src/multi_window.rs | 2 +- 6 files changed, 741 insertions(+), 559 deletions(-) create mode 100644 examples/multi_window_panes/Cargo.toml create mode 100644 examples/multi_window_panes/src/main.rs diff --git a/examples/multi_window/Cargo.toml b/examples/multi_window/Cargo.toml index a59a0e68..0cb5d546 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -1,13 +1,9 @@ [package] name = "multi_window" version = "0.1.0" -authors = ["Richard Custodio "] +authors = ["Bingus "] edition = "2021" publish = false -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -iced = { path = "../..", features = ["debug", "multi-window", "tokio"] } -env_logger = "0.10.0" -iced_native = { path = "../../native" } -iced_lazy = { path = "../../lazy" } +iced = { path = "../..", features = ["debug", "multi-window"] } \ No newline at end of file diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 60f32a7d..5699ece0 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -1,90 +1,50 @@ -use iced::alignment::{self, Alignment}; -use iced::{executor, time}; -use iced::keyboard; -use iced::multi_window::Application; -use iced::theme::{self, Theme}; -use iced::widget::pane_grid::{self, PaneGrid}; -use iced::widget::{ - button, column, container, pick_list, row, scrollable, text, text_input, +use iced::multi_window::{self, Application}; +use iced::widget::{button, column, container, scrollable, text, text_input}; +use iced::{ + executor, window, Alignment, Command, Element, Length, Settings, Theme, }; -use iced::window; -use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; -use iced_lazy::responsive; -use iced_native::{event, subscription, Event}; - -use iced_native::widget::scrollable::{Properties, RelativeOffset}; -use iced_native::window::Id; use std::collections::HashMap; -use std::time::{Duration, Instant}; - -pub fn main() -> iced::Result { - env_logger::init(); +fn main() -> iced::Result { Example::run(Settings::default()) } +#[derive(Default)] struct Example { + windows_count: usize, windows: HashMap, - panes_created: usize, - count: usize, - _focused: window::Id, } -#[derive(Debug)] struct Window { + id: window::Id, title: String, - scale: f64, - panes: pane_grid::State, - focus: Option, + scale_input: String, + current_scale: f64, } #[derive(Debug, Clone)] enum Message { - Window(window::Id, WindowMessage), - CountIncremented(Instant), + ScaleInputChanged(window::Id, String), + ScaleChanged(window::Id, String), + TitleChanged(window::Id, String), + CloseWindow(window::Id), + NewWindow, } -#[derive(Debug, Clone)] -enum WindowMessage { - Split(pane_grid::Axis, pane_grid::Pane), - SplitFocused(pane_grid::Axis), - FocusAdjacent(pane_grid::Direction), - Clicked(pane_grid::Pane), - Dragged(pane_grid::DragEvent), - PopOut(pane_grid::Pane), - Resized(pane_grid::ResizeEvent), - TitleChanged(String), - ToggleMoving(pane_grid::Pane), - TogglePin(pane_grid::Pane), - Close(pane_grid::Pane), - CloseFocused, - SelectedWindow(pane_grid::Pane, SelectableWindow), - CloseWindow, - SnapToggle, -} - -impl Application for Example { +impl multi_window::Application for Example { type Executor = executor::Default; type Message = Message; type Theme = Theme; type Flags = (); fn new(_flags: ()) -> (Self, Command) { - let (panes, _) = - pane_grid::State::new(Pane::new(0, pane_grid::Axis::Horizontal)); - let window = Window { - panes, - focus: None, - title: String::from("Default window"), - scale: 1.0, - }; - ( Example { - windows: HashMap::from([(window::Id::MAIN, window)]), - panes_created: 1, - count: 0, - _focused: window::Id::MAIN, + windows_count: 0, + windows: HashMap::from([( + window::Id::MAIN, + Window::new(window::Id::MAIN), + )]), }, Command::none(), ) @@ -93,530 +53,118 @@ impl Application for Example { fn title(&self, window: window::Id) -> String { self.windows .get(&window) - .map(|w| w.title.clone()) - .unwrap_or(String::from("New Window")) + .map(|window| window.title.clone()) + .unwrap_or("Example".to_string()) } fn update(&mut self, message: Message) -> Command { match message { - Message::Window(id, message) => match message { - WindowMessage::SnapToggle => { - let window = self.windows.get_mut(&id).unwrap(); + 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!"); - if let Some(focused) = &window.focus { - let pane = window.panes.get_mut(focused).unwrap(); + window.current_scale = scale + .parse::() + .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."); - let cmd = scrollable::snap_to( - pane.scrollable_id.clone(), - if pane.snapped { - RelativeOffset::START - } else { - RelativeOffset::END - }, - ); + window.title = title; + } + Message::CloseWindow(id) => { + return window::close(id); + } + Message::NewWindow => { + self.windows_count += 1; + let id = window::Id::new(self.windows_count); + self.windows.insert(id, Window::new(id)); - pane.snapped = !pane.snapped; - return cmd; - } - } - WindowMessage::Split(axis, pane) => { - let window = self.windows.get_mut(&id).unwrap(); - let result = window.panes.split( - axis, - &pane, - Pane::new(self.panes_created, axis), - ); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - - self.panes_created += 1; - } - WindowMessage::SplitFocused(axis) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - let result = window.panes.split( - axis, - &pane, - Pane::new(self.panes_created, axis), - ); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - - self.panes_created += 1; - } - } - WindowMessage::FocusAdjacent(direction) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - if let Some(adjacent) = - window.panes.adjacent(&pane, direction) - { - window.focus = Some(adjacent); - } - } - } - WindowMessage::Clicked(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - window.focus = Some(pane); - } - WindowMessage::CloseWindow => { - let _ = self.windows.remove(&id); - return window::close(id); - } - WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.resize(&split, ratio); - } - WindowMessage::SelectedWindow(pane, selected) => { - let window = self.windows.get_mut(&id).unwrap(); - let (mut pane, _) = window.panes.close(&pane).unwrap(); - pane.is_moving = false; - - if let Some(window) = self.windows.get_mut(&selected.0) { - let (&first_pane, _) = window.panes.iter().next().unwrap(); - let result = - window.panes.split(pane.axis, &first_pane, pane); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - } - } - WindowMessage::ToggleMoving(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.panes.get_mut(&pane) { - pane.is_moving = !pane.is_moving; - } - } - WindowMessage::TitleChanged(title) => { - let window = self.windows.get_mut(&id).unwrap(); - window.title = title; - } - WindowMessage::PopOut(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((popped, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); - - let (panes, _) = pane_grid::State::new(popped); - let window = Window { - panes, - focus: None, - title: format!("New window ({})", self.windows.len()), - scale: 1.0 + (self.windows.len() as f64 / 10.0), - }; - - let window_id = window::Id::new(self.windows.len()); - self.windows.insert(window_id, window); - return window::spawn(window_id, Default::default()); - } - } - WindowMessage::Dragged(pane_grid::DragEvent::Dropped { - pane, - target, - }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.swap(&pane, &target); - } - // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { - // println!("Picked {pane:?}"); - // } - WindowMessage::Dragged(_) => {} - WindowMessage::TogglePin(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(Pane { is_pinned, .. }) = - window.panes.get_mut(&pane) - { - *is_pinned = !*is_pinned; - } - } - WindowMessage::Close(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((_, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); - } - } - WindowMessage::CloseFocused => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - if let Some(Pane { is_pinned, .. }) = - window.panes.get(&pane) - { - if !is_pinned { - if let Some((_, sibling)) = - window.panes.close(&pane) - { - window.focus = Some(sibling); - } - } - } - } - } - }, - Message::CountIncremented(_) => { - self.count += 1; + return window::spawn(id, window::Settings::default()); } } Command::none() } - fn subscription(&self) -> Subscription { - Subscription::batch(vec![ - subscription::events_with(|event, status| { - if let event::Status::Captured = status { - return None; - } + fn view(&self, window: window::Id) -> Element { + let window = self + .windows + .get(&window) + .map(|window| window.view()) + .unwrap(); - match event { - Event::Keyboard(keyboard::Event::KeyPressed { - modifiers, - key_code, - }) if modifiers.command() => { - handle_hotkey(key_code).map(|message| { - Message::Window(window::Id::new(0usize), message) - }) - } // TODO(derezzedex) - _ => None, - } - }), - time::every(Duration::from_secs(1)).map(Message::CountIncremented), - ]) - } - - fn view(&self, window_id: window::Id) -> Element { - if let Some(window) = self.windows.get(&window_id) { - let focus = window.focus; - let total_panes = window.panes.len(); - - let window_controls = row![ - text_input( - "Window title", - &window.title, - WindowMessage::TitleChanged, - ), - button(text("Close")) - .on_press(WindowMessage::CloseWindow) - .style(theme::Button::Destructive), - ] - .spacing(5) - .align_items(Alignment::Center); - - let pane_grid = PaneGrid::new(&window.panes, |id, pane, _| { - let is_focused = focus == Some(id); - - let pin_button = button( - text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), - ) - .on_press(WindowMessage::TogglePin(id)) - .padding(3); - - let title = row![ - pin_button, - "Pane", - text(pane.id.to_string()).style(if is_focused { - PANE_ID_COLOR_FOCUSED - } else { - PANE_ID_COLOR_UNFOCUSED - }), - ] - .spacing(5); - - let title_bar = pane_grid::TitleBar::new(title) - .controls(view_controls( - id, - total_panes, - pane.is_pinned, - pane.is_moving, - &window.title, - window_id, - &self.windows, - )) - .padding(10) - .style(if is_focused { - style::title_bar_focused - } else { - style::title_bar_active - }); - - pane_grid::Content::new(responsive(move |size| { - view_content( - id, - pane.scrollable_id.clone(), - self.count, - total_panes, - pane.is_pinned, - size, - ) - })) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active - }) - }) + container(window) .width(Length::Fill) .height(Length::Fill) - .spacing(10) - .on_click(WindowMessage::Clicked) - .on_drag(WindowMessage::Dragged) - .on_resize(10, WindowMessage::Resized); - - let content: Element<_> = column![window_controls, pane_grid] - .width(Length::Fill) - .height(Length::Fill) - .padding(10) - .into(); - - return content - .map(move |message| Message::Window(window_id, message)); - } - - container(text("This shouldn't be possible!").size(20)) .center_x() .center_y() .into() } + fn scale_factor(&self, window: window::Id) -> f64 { + self.windows + .get(&window) + .map(|window| window.current_scale) + .unwrap_or(1.0) + } + fn close_requested(&self, window: window::Id) -> Self::Message { - Message::Window(window, WindowMessage::CloseWindow) - } - - fn scale_factor(&self, window: Id) -> f64 { - self.windows.get(&window).map(|w| w.scale).unwrap_or(1.0) + Message::CloseWindow(window) } } -const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( - 0xFF as f32 / 255.0, - 0xC7 as f32 / 255.0, - 0xC7 as f32 / 255.0, -); -const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( - 0xFF as f32 / 255.0, - 0x47 as f32 / 255.0, - 0x47 as f32 / 255.0, -); - -fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { - use keyboard::KeyCode; - use pane_grid::{Axis, Direction}; - - let direction = match key_code { - KeyCode::Up => Some(Direction::Up), - KeyCode::Down => Some(Direction::Down), - KeyCode::Left => Some(Direction::Left), - KeyCode::Right => Some(Direction::Right), - _ => None, - }; - - match key_code { - KeyCode::V => Some(WindowMessage::SplitFocused(Axis::Vertical)), - KeyCode::H => Some(WindowMessage::SplitFocused(Axis::Horizontal)), - KeyCode::W => Some(WindowMessage::CloseFocused), - _ => direction.map(WindowMessage::FocusAdjacent), - } -} - -#[derive(Debug, Clone)] -struct SelectableWindow(window::Id, String); - -impl PartialEq for SelectableWindow { - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 - } -} - -impl Eq for SelectableWindow {} - -impl std::fmt::Display for SelectableWindow { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.1.fmt(f) - } -} - -#[derive(Debug)] -struct Pane { - id: usize, - pub scrollable_id: scrollable::Id, - pub axis: pane_grid::Axis, - pub is_pinned: bool, - pub is_moving: bool, - pub snapped: bool, -} - -impl Pane { - fn new(id: usize, axis: pane_grid::Axis) -> Self { +impl Window { + fn new(id: window::Id) -> Self { Self { id, - scrollable_id: scrollable::Id::unique(), - axis, - is_pinned: false, - is_moving: false, - snapped: false, + title: "Window".to_string(), + scale_input: "1.0".to_string(), + current_scale: 1.0, } } + + fn view(&self) -> Element { + window_view(self.id, &self.scale_input, &self.title) + } } -fn view_content<'a>( - pane: pane_grid::Pane, - scrollable_id: scrollable::Id, - count: usize, - total_panes: usize, - is_pinned: bool, - size: Size, -) -> Element<'a, WindowMessage> { - let button = |label, message| { - button( - text(label) - .width(Length::Fill) - .horizontal_alignment(alignment::Horizontal::Center) - .size(16), - ) - .width(Length::Fill) - .padding(8) - .on_press(message) - }; +fn window_view<'a>( + id: window::Id, + scale_input: &'a str, + title: &'a str, +) -> Element<'a, Message> { + let scale_input = column![ + text("Window scale factor:"), + text_input("Window Scale", scale_input, move |msg| { + Message::ScaleInputChanged(id, msg) + }) + .on_submit(Message::ScaleChanged(id, scale_input.to_string())) + ]; - let mut controls = column![ - button( - "Split horizontally", - WindowMessage::Split(pane_grid::Axis::Horizontal, pane), - ), - button( - "Split vertically", - WindowMessage::Split(pane_grid::Axis::Vertical, pane), - ), - button("Snap", WindowMessage::SnapToggle,) - ] - .spacing(5) - .max_width(150); + let title_input = column![ + text("Window title:"), + text_input("Window Title", title, move |msg| { + Message::TitleChanged(id, msg) + }) + ]; - if total_panes > 1 && !is_pinned { - controls = controls.push( - button("Close", WindowMessage::Close(pane)) - .style(theme::Button::Destructive), - ); - } + let new_window_button = + button(text("New Window")).on_press(Message::NewWindow); - let content = column![ - text(format!("{}x{}", size.width, size.height)).size(24), - controls, - text(format!("{count}")).size(48), - ] - .width(Length::Fill) - .height(800) - .spacing(10) - .align_items(Alignment::Center); + let content = scrollable( + column![scale_input, title_input, new_window_button] + .spacing(50) + .width(Length::Fill) + .align_items(Alignment::Center), + ); - container( - scrollable(content) - .height(Length::Fill) - .vertical_scroll(Properties::new()) - .id(scrollable_id), - ) - .width(Length::Fill) - .height(Length::Fill) - .padding(5) - .center_y() - .into() -} - -fn view_controls<'a>( - pane: pane_grid::Pane, - total_panes: usize, - is_pinned: bool, - is_moving: bool, - window_title: &'a str, - window_id: window::Id, - windows: &HashMap, -) -> Element<'a, WindowMessage> { - let window_selector = { - let options: Vec<_> = windows - .iter() - .map(|(id, window)| SelectableWindow(*id, window.title.clone())) - .collect(); - pick_list( - options, - Some(SelectableWindow(window_id, window_title.to_string())), - move |window| WindowMessage::SelectedWindow(pane, window), - ) - }; - - let mut move_to = button(text("Move to").size(14)).padding(3); - - let mut pop_out = button(text("Pop Out").size(14)).padding(3); - - let mut close = button(text("Close").size(14)) - .style(theme::Button::Destructive) - .padding(3); - - if total_panes > 1 && !is_pinned { - close = close.on_press(WindowMessage::Close(pane)); - pop_out = pop_out.on_press(WindowMessage::PopOut(pane)); - } - - if windows.len() > 1 && total_panes > 1 && !is_pinned { - move_to = move_to.on_press(WindowMessage::ToggleMoving(pane)); - } - - let mut content = row![].spacing(10); - if is_moving { - content = content.push(pop_out).push(window_selector).push(close); - } else { - content = content.push(pop_out).push(move_to).push(close); - } - - content.into() -} - -mod style { - use iced::widget::container; - use iced::Theme; - - pub fn title_bar_active(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - text_color: Some(palette.background.strong.text), - background: Some(palette.background.strong.color.into()), - ..Default::default() - } - } - - pub fn title_bar_focused(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - text_color: Some(palette.primary.strong.text), - background: Some(palette.primary.strong.color.into()), - ..Default::default() - } - } - - pub fn pane_active(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - background: Some(palette.background.weak.color.into()), - border_width: 2.0, - border_color: palette.background.strong.color, - ..Default::default() - } - } - - pub fn pane_focused(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - background: Some(palette.background.weak.color.into()), - border_width: 2.0, - border_color: palette.primary.strong.color, - ..Default::default() - } - } + container(content).width(200).center_x().into() } diff --git a/examples/multi_window_panes/Cargo.toml b/examples/multi_window_panes/Cargo.toml new file mode 100644 index 00000000..1b3f3ec6 --- /dev/null +++ b/examples/multi_window_panes/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "multi_window_panes" +version = "0.1.0" +authors = ["Richard Custodio "] +edition = "2021" +publish = false + +[dependencies] +iced = { path = "../..", features = ["debug", "multi-window", "tokio"] } +env_logger = "0.10.0" +iced_native = { path = "../../native" } +iced_lazy = { path = "../../lazy" } diff --git a/examples/multi_window_panes/src/main.rs b/examples/multi_window_panes/src/main.rs new file mode 100644 index 00000000..b8b63769 --- /dev/null +++ b/examples/multi_window_panes/src/main.rs @@ -0,0 +1,624 @@ +use iced::alignment::{self, Alignment}; +use iced::{executor, time}; +use iced::keyboard; +use iced::multi_window::Application; +use iced::theme::{self, Theme}; +use iced::widget::pane_grid::{self, PaneGrid}; +use iced::widget::{ + button, column, container, pick_list, row, scrollable, text, text_input, +}; +use iced::window; +use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; +use iced_lazy::responsive; +use iced_native::{event, subscription, Event}; + +use iced_native::widget::scrollable::{Properties, RelativeOffset}; +use iced_native::window::Id; +use std::collections::HashMap; +use std::time::{Duration, Instant}; + +pub fn main() -> iced::Result { + env_logger::init(); + + Example::run(Settings::default()) +} + +struct Example { + windows: HashMap, + panes_created: usize, + count: usize, + _focused: window::Id, +} + +#[derive(Debug)] +struct Window { + title: String, + scale: f64, + panes: pane_grid::State, + focus: Option, +} + +#[derive(Debug, Clone)] +enum Message { + Window(window::Id, WindowMessage), + CountIncremented(Instant), +} + +#[derive(Debug, Clone)] +enum WindowMessage { + Split(pane_grid::Axis, pane_grid::Pane), + SplitFocused(pane_grid::Axis), + FocusAdjacent(pane_grid::Direction), + Clicked(pane_grid::Pane), + Dragged(pane_grid::DragEvent), + PopOut(pane_grid::Pane), + Resized(pane_grid::ResizeEvent), + TitleChanged(String), + ToggleMoving(pane_grid::Pane), + TogglePin(pane_grid::Pane), + Close(pane_grid::Pane), + CloseFocused, + SelectedWindow(pane_grid::Pane, SelectableWindow), + CloseWindow, + SnapToggle, +} + +impl Application for Example { + type Executor = executor::Default; + type Message = Message; + type Theme = Theme; + type Flags = (); + + fn new(_flags: ()) -> (Self, Command) { + let (panes, _) = + pane_grid::State::new(Pane::new(0, pane_grid::Axis::Horizontal)); + let window = Window { + panes, + focus: None, + title: String::from("Default window"), + scale: 1.0, + }; + + ( + Example { + windows: HashMap::from([(window::Id::MAIN, window)]), + panes_created: 1, + count: 0, + _focused: window::Id::MAIN, + }, + Command::none(), + ) + } + + fn title(&self, window: window::Id) -> String { + self.windows + .get(&window) + .map(|w| w.title.clone()) + .unwrap_or(String::from("New Window")) + } + + fn update(&mut self, message: Message) -> Command { + match message { + Message::Window(id, message) => match message { + WindowMessage::SnapToggle => { + let window = self.windows.get_mut(&id).unwrap(); + + if let Some(focused) = &window.focus { + let pane = window.panes.get_mut(focused).unwrap(); + + let cmd = scrollable::snap_to( + pane.scrollable_id.clone(), + if pane.snapped { + RelativeOffset::START + } else { + RelativeOffset::END + }, + ); + + pane.snapped = !pane.snapped; + return cmd; + } + } + WindowMessage::Split(axis, pane) => { + let window = self.windows.get_mut(&id).unwrap(); + let result = window.panes.split( + axis, + &pane, + Pane::new(self.panes_created, axis), + ); + + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + + self.panes_created += 1; + } + WindowMessage::SplitFocused(axis) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + let result = window.panes.split( + axis, + &pane, + Pane::new(self.panes_created, axis), + ); + + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + + self.panes_created += 1; + } + } + WindowMessage::FocusAdjacent(direction) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + if let Some(adjacent) = + window.panes.adjacent(&pane, direction) + { + window.focus = Some(adjacent); + } + } + } + WindowMessage::Clicked(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + window.focus = Some(pane); + } + WindowMessage::CloseWindow => { + let _ = self.windows.remove(&id); + return window::close(id); + } + WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { + let window = self.windows.get_mut(&id).unwrap(); + window.panes.resize(&split, ratio); + } + WindowMessage::SelectedWindow(pane, selected) => { + let window = self.windows.get_mut(&id).unwrap(); + let (mut pane, _) = window.panes.close(&pane).unwrap(); + pane.is_moving = false; + + if let Some(window) = self.windows.get_mut(&selected.0) { + let (&first_pane, _) = window.panes.iter().next().unwrap(); + let result = + window.panes.split(pane.axis, &first_pane, pane); + + if let Some((pane, _)) = result { + window.focus = Some(pane); + } + } + } + WindowMessage::ToggleMoving(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.panes.get_mut(&pane) { + pane.is_moving = !pane.is_moving; + } + } + WindowMessage::TitleChanged(title) => { + let window = self.windows.get_mut(&id).unwrap(); + window.title = title; + } + WindowMessage::PopOut(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((popped, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); + + let (panes, _) = pane_grid::State::new(popped); + let window = Window { + panes, + focus: None, + title: format!("New window ({})", self.windows.len()), + scale: 1.0 + (self.windows.len() as f64 / 10.0), + }; + + let window_id = window::Id::new(self.windows.len()); + self.windows.insert(window_id, window); + return window::spawn(window_id, Default::default()); + } + } + WindowMessage::Dragged(pane_grid::DragEvent::Dropped { + pane, + target, + }) => { + let window = self.windows.get_mut(&id).unwrap(); + window.panes.swap(&pane, &target); + } + // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { + // println!("Picked {pane:?}"); + // } + WindowMessage::Dragged(_) => {} + WindowMessage::TogglePin(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(Pane { is_pinned, .. }) = + window.panes.get_mut(&pane) + { + *is_pinned = !*is_pinned; + } + } + WindowMessage::Close(pane) => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some((_, sibling)) = window.panes.close(&pane) { + window.focus = Some(sibling); + } + } + WindowMessage::CloseFocused => { + let window = self.windows.get_mut(&id).unwrap(); + if let Some(pane) = window.focus { + if let Some(Pane { is_pinned, .. }) = + window.panes.get(&pane) + { + if !is_pinned { + if let Some((_, sibling)) = + window.panes.close(&pane) + { + window.focus = Some(sibling); + } + } + } + } + } + }, + Message::CountIncremented(_) => { + self.count += 1; + } + } + + Command::none() + } + + fn subscription(&self) -> Subscription { + Subscription::batch(vec![ + subscription::events_with(|event, status| { + if let event::Status::Captured = status { + return None; + } + + match event { + Event::Keyboard(keyboard::Event::KeyPressed { + modifiers, + key_code, + }) if modifiers.command() => { + handle_hotkey(key_code).map(|message| { + Message::Window(window::Id::new(0usize), message) + }) + } // TODO(derezzedex) + _ => None, + } + }), + time::every(Duration::from_secs(1)).map(Message::CountIncremented), + ]) + } + + fn view(&self, window: window::Id) -> Element { + let window_id = window; + + if let Some(window) = self.windows.get(&window) { + let focus = window.focus; + let total_panes = window.panes.len(); + + let window_controls = row![ + text_input( + "Window title", + &window.title, + WindowMessage::TitleChanged, + ), + button(text("Close")) + .on_press(WindowMessage::CloseWindow) + .style(theme::Button::Destructive), + ] + .spacing(5) + .align_items(Alignment::Center); + + let pane_grid = PaneGrid::new(&window.panes, |id, pane, _| { + let is_focused = focus == Some(id); + + let pin_button = button( + text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), + ) + .on_press(WindowMessage::TogglePin(id)) + .padding(3); + + let title = row![ + pin_button, + "Pane", + text(pane.id.to_string()).style(if is_focused { + PANE_ID_COLOR_FOCUSED + } else { + PANE_ID_COLOR_UNFOCUSED + }), + ] + .spacing(5); + + let title_bar = pane_grid::TitleBar::new(title) + .controls(view_controls( + id, + total_panes, + pane.is_pinned, + pane.is_moving, + &window.title, + window_id, + &self.windows, + )) + .padding(10) + .style(if is_focused { + style::title_bar_focused + } else { + style::title_bar_active + }); + + pane_grid::Content::new(responsive(move |size| { + view_content( + id, + pane.scrollable_id.clone(), + self.count, + total_panes, + pane.is_pinned, + size, + ) + })) + .title_bar(title_bar) + .style(if is_focused { + style::pane_focused + } else { + style::pane_active + }) + }) + .width(Length::Fill) + .height(Length::Fill) + .spacing(10) + .on_click(WindowMessage::Clicked) + .on_drag(WindowMessage::Dragged) + .on_resize(10, WindowMessage::Resized); + + let content: Element<_> = column![window_controls, pane_grid] + .width(Length::Fill) + .height(Length::Fill) + .padding(10) + .into(); + + return content + .map(move |message| Message::Window(window_id, message)); + } + + container(text("This shouldn't be possible!").size(20)) + .center_x() + .center_y() + .into() + } + + fn close_requested(&self, window: window::Id) -> Self::Message { + Message::Window(window, WindowMessage::CloseWindow) + } + + fn scale_factor(&self, window: Id) -> f64 { + self.windows.get(&window).map(|w| w.scale).unwrap_or(1.0) + } +} + +const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( + 0xFF as f32 / 255.0, + 0xC7 as f32 / 255.0, + 0xC7 as f32 / 255.0, +); +const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( + 0xFF as f32 / 255.0, + 0x47 as f32 / 255.0, + 0x47 as f32 / 255.0, +); + +fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { + use keyboard::KeyCode; + use pane_grid::{Axis, Direction}; + + let direction = match key_code { + KeyCode::Up => Some(Direction::Up), + KeyCode::Down => Some(Direction::Down), + KeyCode::Left => Some(Direction::Left), + KeyCode::Right => Some(Direction::Right), + _ => None, + }; + + match key_code { + KeyCode::V => Some(WindowMessage::SplitFocused(Axis::Vertical)), + KeyCode::H => Some(WindowMessage::SplitFocused(Axis::Horizontal)), + KeyCode::W => Some(WindowMessage::CloseFocused), + _ => direction.map(WindowMessage::FocusAdjacent), + } +} + +#[derive(Debug, Clone)] +struct SelectableWindow(window::Id, String); + +impl PartialEq for SelectableWindow { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl Eq for SelectableWindow {} + +impl std::fmt::Display for SelectableWindow { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.1.fmt(f) + } +} + +#[derive(Debug)] +struct Pane { + id: usize, + pub scrollable_id: scrollable::Id, + pub axis: pane_grid::Axis, + pub is_pinned: bool, + pub is_moving: bool, + pub snapped: bool, +} + +impl Pane { + fn new(id: usize, axis: pane_grid::Axis) -> Self { + Self { + id, + scrollable_id: scrollable::Id::unique(), + axis, + is_pinned: false, + is_moving: false, + snapped: false, + } + } +} + +fn view_content<'a>( + pane: pane_grid::Pane, + scrollable_id: scrollable::Id, + count: usize, + total_panes: usize, + is_pinned: bool, + size: Size, +) -> Element<'a, WindowMessage> { + let button = |label, message| { + button( + text(label) + .width(Length::Fill) + .horizontal_alignment(alignment::Horizontal::Center) + .size(16), + ) + .width(Length::Fill) + .padding(8) + .on_press(message) + }; + + let mut controls = column![ + button( + "Split horizontally", + WindowMessage::Split(pane_grid::Axis::Horizontal, pane), + ), + button( + "Split vertically", + WindowMessage::Split(pane_grid::Axis::Vertical, pane), + ), + button("Snap", WindowMessage::SnapToggle,) + ] + .spacing(5) + .max_width(150); + + if total_panes > 1 && !is_pinned { + controls = controls.push( + button("Close", WindowMessage::Close(pane)) + .style(theme::Button::Destructive), + ); + } + + let content = column![ + text(format!("{}x{}", size.width, size.height)).size(24), + controls, + text(format!("{count}")).size(48), + ] + .width(Length::Fill) + .height(800) + .spacing(10) + .align_items(Alignment::Center); + + container( + scrollable(content) + .height(Length::Fill) + .vertical_scroll(Properties::new()) + .id(scrollable_id), + ) + .width(Length::Fill) + .height(Length::Fill) + .padding(5) + .center_y() + .into() +} + +fn view_controls<'a>( + pane: pane_grid::Pane, + total_panes: usize, + is_pinned: bool, + is_moving: bool, + window_title: &'a str, + window_id: window::Id, + windows: &HashMap, +) -> Element<'a, WindowMessage> { + let window_selector = { + let options: Vec<_> = windows + .iter() + .map(|(id, window)| SelectableWindow(*id, window.title.clone())) + .collect(); + pick_list( + options, + Some(SelectableWindow(window_id, window_title.to_string())), + move |window| WindowMessage::SelectedWindow(pane, window), + ) + }; + + let mut move_to = button(text("Move to").size(14)).padding(3); + + let mut pop_out = button(text("Pop Out").size(14)).padding(3); + + let mut close = button(text("Close").size(14)) + .style(theme::Button::Destructive) + .padding(3); + + if total_panes > 1 && !is_pinned { + close = close.on_press(WindowMessage::Close(pane)); + pop_out = pop_out.on_press(WindowMessage::PopOut(pane)); + } + + if windows.len() > 1 && total_panes > 1 && !is_pinned { + move_to = move_to.on_press(WindowMessage::ToggleMoving(pane)); + } + + let mut content = row![].spacing(10); + if is_moving { + content = content.push(pop_out).push(window_selector).push(close); + } else { + content = content.push(pop_out).push(move_to).push(close); + } + + content.into() +} + +mod style { + use iced::widget::container; + use iced::Theme; + + pub fn title_bar_active(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + text_color: Some(palette.background.strong.text), + background: Some(palette.background.strong.color.into()), + ..Default::default() + } + } + + pub fn title_bar_focused(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + text_color: Some(palette.primary.strong.text), + background: Some(palette.primary.strong.color.into()), + ..Default::default() + } + } + + pub fn pane_active(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + background: Some(palette.background.weak.color.into()), + border_width: 2.0, + border_color: palette.background.strong.color, + ..Default::default() + } + } + + pub fn pane_focused(theme: &Theme) -> container::Appearance { + let palette = theme.extended_palette(); + + container::Appearance { + background: Some(palette.background.weak.color.into()), + border_width: 2.0, + border_color: palette.primary.strong.color, + ..Default::default() + } + } +} diff --git a/native/src/window/id.rs b/native/src/window/id.rs index 0c3e5272..0a11b1aa 100644 --- a/native/src/window/id.rs +++ b/native/src/window/id.rs @@ -4,6 +4,8 @@ use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] /// The ID of the window. +/// +/// Internally Iced uses `window::Id::MAIN` as the first window spawned. pub struct Id(u64); impl Id { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index d5da406c..6e28f1fa 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -109,7 +109,7 @@ where /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. - fn title(&self, window_id: window::Id) -> String; + fn title(&self, window: window::Id) -> String; /// Returns the current [`Theme`] of the [`Application`]. fn theme(&self) -> ::Theme; From 41836dd80d0534608e7aedfbf2319c540a23de1a Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 15 Mar 2023 18:20:38 -0700 Subject: [PATCH 049/286] Added per-window theme support. --- examples/multi_window_panes/src/main.rs | 41 +++++++++++++++++-------- src/multi_window/application.rs | 7 +++-- winit/src/multi_window.rs | 2 +- winit/src/multi_window/state.rs | 4 +-- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/examples/multi_window_panes/src/main.rs b/examples/multi_window_panes/src/main.rs index b8b63769..b1d0a3bc 100644 --- a/examples/multi_window_panes/src/main.rs +++ b/examples/multi_window_panes/src/main.rs @@ -1,5 +1,4 @@ use iced::alignment::{self, Alignment}; -use iced::{executor, time}; use iced::keyboard; use iced::multi_window::Application; use iced::theme::{self, Theme}; @@ -8,6 +7,7 @@ use iced::widget::{ button, column, container, pick_list, row, scrollable, text, text_input, }; use iced::window; +use iced::{executor, time}; use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; use iced_lazy::responsive; use iced_native::{event, subscription, Event}; @@ -34,6 +34,7 @@ struct Example { struct Window { title: String, scale: f64, + theme: Theme, panes: pane_grid::State, focus: Option, } @@ -77,6 +78,7 @@ impl Application for Example { focus: None, title: String::from("Default window"), scale: 1.0, + theme: Theme::default(), }; ( @@ -167,7 +169,10 @@ impl Application for Example { let _ = self.windows.remove(&id); return window::close(id); } - WindowMessage::Resized(pane_grid::ResizeEvent { split, ratio }) => { + WindowMessage::Resized(pane_grid::ResizeEvent { + split, + ratio, + }) => { let window = self.windows.get_mut(&id).unwrap(); window.panes.resize(&split, ratio); } @@ -177,7 +182,8 @@ impl Application for Example { pane.is_moving = false; if let Some(window) = self.windows.get_mut(&selected.0) { - let (&first_pane, _) = window.panes.iter().next().unwrap(); + let (&first_pane, _) = + window.panes.iter().next().unwrap(); let result = window.panes.split(pane.axis, &first_pane, pane); @@ -205,8 +211,16 @@ impl Application for Example { let window = Window { panes, focus: None, - title: format!("New window ({})", self.windows.len()), + title: format!( + "New window ({})", + self.windows.len() + ), scale: 1.0 + (self.windows.len() as f64 / 10.0), + theme: if self.windows.len() % 2 == 0 { + Theme::Light + } else { + Theme::Dark + }, }; let window_id = window::Id::new(self.windows.len()); @@ -215,15 +229,12 @@ impl Application for Example { } } WindowMessage::Dragged(pane_grid::DragEvent::Dropped { - pane, - target, - }) => { + pane, + target, + }) => { let window = self.windows.get_mut(&id).unwrap(); window.panes.swap(&pane, &target); } - // WindowMessage::Dragged(pane_grid::DragEvent::Picked { pane }) => { - // println!("Picked {pane:?}"); - // } WindowMessage::Dragged(_) => {} WindowMessage::TogglePin(pane) => { let window = self.windows.get_mut(&id).unwrap(); @@ -273,9 +284,9 @@ impl Application for Example { match event { Event::Keyboard(keyboard::Event::KeyPressed { - modifiers, - key_code, - }) if modifiers.command() => { + modifiers, + key_code, + }) if modifiers.command() => { handle_hotkey(key_code).map(|message| { Message::Window(window::Id::new(0usize), message) }) @@ -391,6 +402,10 @@ impl Application for Example { fn scale_factor(&self, window: Id) -> f64 { self.windows.get(&window).map(|w| w.scale).unwrap_or(1.0) } + + fn theme(&self, window: Id) -> Theme { + self.windows.get(&window).expect("Window not found!").theme.clone() + } } const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 1fb4bcd4..9974128c 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -107,7 +107,8 @@ pub trait Application: Sized { /// Returns the current [`Theme`] of the [`Application`]. /// /// [`Theme`]: Self::Theme - fn theme(&self) -> Self::Theme { + #[allow(unused_variables)] + fn theme(&self, window: window::Id) -> Self::Theme { Self::Theme::default() } @@ -229,8 +230,8 @@ where self.0.title(window) } - fn theme(&self) -> A::Theme { - self.0.theme() + fn theme(&self, window: window::Id) -> A::Theme { + self.0.theme(window) } fn style(&self) -> ::Style { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 6e28f1fa..9b395c1d 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -112,7 +112,7 @@ where fn title(&self, window: window::Id) -> String; /// Returns the current [`Theme`] of the [`Application`]. - fn theme(&self) -> ::Theme; + fn theme(&self, window: window::Id) -> ::Theme; /// Returns the [`Style`] variation of the [`Theme`]. fn style( diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index d0e442d0..54a114ad 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -37,7 +37,7 @@ where ) -> Self { let title = application.title(window_id); let scale_factor = application.scale_factor(window_id); - let theme = application.theme(); + let theme = application.theme(window_id); let appearance = theme.appearance(&application.style()); let viewport = { @@ -212,7 +212,7 @@ where } // Update theme and appearance - self.theme = application.theme(); + self.theme = application.theme(window_id); self.appearance = self.theme.appearance(&application.style()); } } From d53ccc857da4d4cda769904342aeb5a82a64f146 Mon Sep 17 00:00:00 2001 From: Bingus Date: Wed, 12 Jul 2023 19:21:05 -0700 Subject: [PATCH 050/286] refactored window storage; new helper window events (Destroyed, Created); clippy + fmt; --- .github/ISSUE_TEMPLATE/BUG-REPORT.yml | 1 - Cargo.toml | 2 +- ECOSYSTEM.md | 8 +- core/Cargo.toml | 3 + core/src/window.rs | 6 + core/src/window/event.rs | 17 + core/src/window/id.rs | 15 +- core/src/window/position.rs | 22 + core/src/window/settings.rs | 40 +- .../src => core/src/window}/settings/macos.rs | 0 .../src => core/src/window}/settings/other.rs | 0 .../src => core/src/window}/settings/wasm.rs | 0 .../src/window}/settings/windows.rs | 0 examples/events/src/main.rs | 7 +- examples/exit/src/main.rs | 2 +- examples/integration/src/main.rs | 2 +- examples/integration_opengl/src/main.rs | 0 examples/loading_spinners/src/circular.rs | 2 +- examples/loading_spinners/src/linear.rs | 2 +- examples/multi_window/Cargo.toml | 2 +- examples/multi_window/src/main.rs | 162 ++- examples/multi_window_panes/Cargo.toml | 12 - examples/multi_window_panes/src/main.rs | 639 ---------- examples/screenshot/src/main.rs | 7 +- examples/toast/src/main.rs | 4 +- examples/todos/src/main.rs | 2 +- futures/src/subscription.rs | 2 +- glutin/src/application.rs | 0 graphics/Cargo.toml | 1 - graphics/src/compositor.rs | 3 + native/src/subscription.rs | 0 native/src/window.rs | 0 renderer/src/compositor.rs | 16 + runtime/Cargo.toml | 1 + runtime/src/lib.rs | 3 + runtime/src/multi_window.rs | 6 + runtime/src/multi_window/program.rs | 32 + runtime/src/multi_window/state.rs | 280 +++++ runtime/src/window.rs | 102 +- runtime/src/window/action.rs | 4 +- src/multi_window/application.rs | 96 +- src/settings.rs | 2 +- src/window.rs | 4 - {winit/src => src/window}/icon.rs | 0 tiny_skia/src/window/compositor.rs | 6 + wgpu/src/window/compositor.rs | 4 + winit/Cargo.toml | 22 +- winit/src/application.rs | 86 +- winit/src/conversion.rs | 9 +- winit/src/lib.rs | 8 +- winit/src/multi_window.rs | 1064 ++++++++--------- winit/src/multi_window/state.rs | 96 +- winit/src/multi_window/windows.rs | 170 +++ winit/src/profiler.rs | 101 -- winit/src/settings.rs | 252 ++-- winit/src/window.rs | 0 56 files changed, 1508 insertions(+), 1819 deletions(-) rename {winit/src => core/src/window}/settings/macos.rs (100%) rename {winit/src => core/src/window}/settings/other.rs (100%) rename {winit/src => core/src/window}/settings/wasm.rs (100%) rename {winit/src => core/src/window}/settings/windows.rs (100%) delete mode 100644 examples/integration_opengl/src/main.rs delete mode 100644 examples/multi_window_panes/Cargo.toml delete mode 100644 examples/multi_window_panes/src/main.rs delete mode 100644 glutin/src/application.rs delete mode 100644 native/src/subscription.rs delete mode 100644 native/src/window.rs create mode 100644 runtime/src/multi_window.rs create mode 100644 runtime/src/multi_window/program.rs create mode 100644 runtime/src/multi_window/state.rs rename {winit/src => src/window}/icon.rs (100%) create mode 100644 winit/src/multi_window/windows.rs delete mode 100644 winit/src/profiler.rs delete mode 100644 winit/src/window.rs diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml index d4c94fcd..09b31697 100644 --- a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -25,7 +25,6 @@ body: Before filing an issue... - If you are using `wgpu`, you need an environment that supports Vulkan, Metal, or DirectX 12. Please, make sure you can run [the `wgpu` examples]. - - If you are using `glow`, you need support for OpenGL 2.1+. Please, make sure you can run [the `glow` examples]. If you have any issues running any of the examples, make sure your graphics drivers are up-to-date. If the issues persist, please report them to the authors of the libraries directly! diff --git a/Cargo.toml b/Cargo.toml index 4a82c923..a7f02055 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ system = ["iced_winit/system"] web-colors = ["iced_renderer/web-colors"] # Enables the advanced module advanced = [] -# Enables experimental multi-window support for iced_winit + wgpu. +# Enables experimental multi-window support. multi-window = ["iced_winit/multi-window"] [badges] diff --git a/ECOSYSTEM.md b/ECOSYSTEM.md index 86581e4a..da3066d8 100644 --- a/ECOSYSTEM.md +++ b/ECOSYSTEM.md @@ -45,7 +45,7 @@ The widgets of a _graphical_ user interface produce some primitives that eventua Currently, there are two different official renderers: - [`iced_wgpu`] is powered by [`wgpu`] and supports Vulkan, DirectX 12, and Metal. -- [`iced_glow`] is powered by [`glow`] and supports OpenGL 2.1+ and OpenGL ES 2.0+. +- [`tiny-skia`] is used as a fallback software renderer when `wgpu` is not supported. Additionally, the [`iced_graphics`] subcrate contains a bunch of backend-agnostic types that can be leveraged to build renderers. Both of the renderers rely on the graphical foundations provided by this crate. @@ -54,10 +54,7 @@ The widgets of a graphical user _interface_ are interactive. __Shells__ gather a Normally, a shell will be responsible of creating a window and managing the lifecycle of a user interface, implementing a runtime of [The Elm Architecture]. -As of now, there are two official shells: - -- [`iced_winit`] implements a shell runtime on top of [`winit`]. -- [`iced_glutin`] is similar to [`iced_winit`], but it also deals with [OpenGL context creation]. +As of now, there is one official shell: [`iced_winit`] implements a shell runtime on top of [`winit`]. ## The web target The Web platform provides all the abstractions necessary to draw widgets and gather users interactions. @@ -91,5 +88,4 @@ Finally, [`iced`] unifies everything into a simple abstraction to create cross-p [`winit`]: https://github.com/rust-windowing/winit [`glutin`]: https://github.com/rust-windowing/glutin [`dodrio`]: https://github.com/fitzgen/dodrio -[OpenGL context creation]: https://www.khronos.org/opengl/wiki/Creating_an_OpenGL_Context [The Elm Architecture]: https://guide.elm-lang.org/architecture/ diff --git a/core/Cargo.toml b/core/Cargo.toml index 55f2e85f..edf9e7c8 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -20,5 +20,8 @@ optional = true [target.'cfg(target_arch = "wasm32")'.dependencies] instant = "0.1" +[target.'cfg(windows)'.dependencies.raw-window-handle] +version = "0.5.2" + [dev-dependencies] approx = "0.5" diff --git a/core/src/window.rs b/core/src/window.rs index a6dbdfb4..10db31b6 100644 --- a/core/src/window.rs +++ b/core/src/window.rs @@ -2,14 +2,20 @@ pub mod icon; mod event; +mod id; mod level; mod mode; +mod position; mod redraw_request; +mod settings; mod user_attention; pub use event::Event; pub use icon::Icon; +pub use id::Id; pub use level::Level; pub use mode::Mode; +pub use position::Position; pub use redraw_request::RedrawRequest; +pub use settings::Settings; pub use user_attention::UserAttention; diff --git a/core/src/window/event.rs b/core/src/window/event.rs index e2fb5e66..3efce05e 100644 --- a/core/src/window/event.rs +++ b/core/src/window/event.rs @@ -1,4 +1,5 @@ use crate::time::Instant; +use crate::Size; use std::path::PathBuf; @@ -32,6 +33,22 @@ pub enum Event { /// occurs. CloseRequested, + /// A window was destroyed by the runtime. + Destroyed, + + /// A window was created. + /// + /// **Note:** this event is not supported on Wayland. + Created { + /// The position of the created window. This is relative to the top-left corner of the desktop + /// the window is on, including virtual desktops. Refers to window's "inner" position, + /// or the client area, in logical pixels. + position: (i32, i32), + /// The size of the created window. This is its "inner" size, or the size of the + /// client area, in logical pixels. + size: Size, + }, + /// A window was focused. Focused, diff --git a/core/src/window/id.rs b/core/src/window/id.rs index 0a11b1aa..65002d43 100644 --- a/core/src/window/id.rs +++ b/core/src/window/id.rs @@ -1,18 +1,17 @@ use std::collections::hash_map::DefaultHasher; -use std::fmt::{Display, Formatter}; use std::hash::{Hash, Hasher}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] -/// The ID of the window. +/// The id of the window. /// -/// Internally Iced uses `window::Id::MAIN` as the first window spawned. +/// Internally Iced reserves `window::Id::MAIN` for the first window spawned. pub struct Id(u64); impl Id { - /// The reserved window ID for the primary window in an Iced application. + /// The reserved window [`Id`] for the first window in an Iced application. pub const MAIN: Self = Id(0); - /// Creates a new unique window ID. + /// Creates a new unique window [`Id`]. pub fn new(id: impl Hash) -> Id { let mut hasher = DefaultHasher::new(); id.hash(&mut hasher); @@ -20,9 +19,3 @@ impl Id { Id(hasher.finish()) } } - -impl Display for Id { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "Id({})", self.0) - } -} diff --git a/core/src/window/position.rs b/core/src/window/position.rs index e69de29b..c260c29e 100644 --- a/core/src/window/position.rs +++ b/core/src/window/position.rs @@ -0,0 +1,22 @@ +/// The position of a window in a given screen. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Position { + /// The platform-specific default position for a new window. + Default, + /// The window is completely centered on the screen. + Centered, + /// The window is positioned with specific coordinates: `(X, Y)`. + /// + /// When the decorations of the window are enabled, Windows 10 will add some + /// invisible padding to the window. This padding gets included in the + /// position. So if you have decorations enabled and want the window to be + /// at (0, 0) you would have to set the position to + /// `(PADDING_X, PADDING_Y)`. + Specific(i32, i32), +} + +impl Default for Position { + fn default() -> Self { + Self::Default + } +} diff --git a/core/src/window/settings.rs b/core/src/window/settings.rs index 458b9232..20811e83 100644 --- a/core/src/window/settings.rs +++ b/core/src/window/settings.rs @@ -1,6 +1,26 @@ use crate::window::{Icon, Level, Position}; -pub use iced_winit::settings::PlatformSpecific; +#[cfg(target_os = "windows")] +#[path = "settings/windows.rs"] +mod platform; + +#[cfg(target_os = "macos")] +#[path = "settings/macos.rs"] +mod platform; + +#[cfg(target_arch = "wasm32")] +#[path = "settings/wasm.rs"] +mod platform; + +#[cfg(not(any( + target_os = "windows", + target_os = "macos", + target_arch = "wasm32" +)))] +#[path = "settings/other.rs"] +mod platform; + +pub use platform::PlatformSpecific; /// The window settings of an application. #[derive(Debug, Clone)] @@ -56,21 +76,3 @@ impl Default for Settings { } } } - -impl From for iced_winit::settings::Window { - fn from(settings: Settings) -> Self { - Self { - size: settings.size, - position: iced_winit::Position::from(settings.position), - min_size: settings.min_size, - max_size: settings.max_size, - visible: settings.visible, - resizable: settings.resizable, - decorations: settings.decorations, - transparent: settings.transparent, - level: settings.level, - icon: settings.icon.map(Icon::into), - platform_specific: settings.platform_specific, - } - } -} diff --git a/winit/src/settings/macos.rs b/core/src/window/settings/macos.rs similarity index 100% rename from winit/src/settings/macos.rs rename to core/src/window/settings/macos.rs diff --git a/winit/src/settings/other.rs b/core/src/window/settings/other.rs similarity index 100% rename from winit/src/settings/other.rs rename to core/src/window/settings/other.rs diff --git a/winit/src/settings/wasm.rs b/core/src/window/settings/wasm.rs similarity index 100% rename from winit/src/settings/wasm.rs rename to core/src/window/settings/wasm.rs diff --git a/winit/src/settings/windows.rs b/core/src/window/settings/windows.rs similarity index 100% rename from winit/src/settings/windows.rs rename to core/src/window/settings/windows.rs diff --git a/examples/events/src/main.rs b/examples/events/src/main.rs index 70659f52..c3ac6fd1 100644 --- a/examples/events/src/main.rs +++ b/examples/events/src/main.rs @@ -26,7 +26,7 @@ struct Events { enum Message { EventOccurred(Event), Toggled(bool), - Exit(window::Id), + Exit, } impl Application for Events { @@ -55,7 +55,8 @@ impl Application for Events { Command::none() } Message::EventOccurred(event) => { - if let Event::Window(id, window::Event::CloseRequested) = event { + if let Event::Window(id, window::Event::CloseRequested) = event + { window::close(id) } else { Command::none() @@ -66,7 +67,7 @@ impl Application for Events { Command::none() } - Message::Exit(id) => window::close(id), + 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 { 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 a560959a..90beb097 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -6,8 +6,8 @@ use scene::Scene; use iced_wgpu::graphics::Viewport; use iced_wgpu::{wgpu, Backend, Renderer, Settings}; -use iced_winit::core::mouse; use iced_winit::core::renderer; +use iced_winit::core::{mouse, window}; use iced_winit::core::{Color, Size}; use iced_winit::runtime::program; use iced_winit::runtime::Debug; diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index 3a35e029..ff599231 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -277,7 +277,7 @@ where let state = tree.state.downcast_mut::(); - 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 3d95729b..8e07c12b 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -198,7 +198,7 @@ where let state = tree.state.downcast_mut::(); - 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 index 0cb5d546..2e222dfb 100644 --- a/examples/multi_window/Cargo.toml +++ b/examples/multi_window/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" publish = false [dependencies] -iced = { path = "../..", features = ["debug", "multi-window"] } \ No newline at end of file +iced = { path = "../..", features = ["debug", "multi-window"] } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 5699ece0..58604702 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -1,25 +1,32 @@ use iced::multi_window::{self, Application}; use iced::widget::{button, column, container, scrollable, text, text_input}; +use iced::window::{Id, Position}; use iced::{ - executor, window, Alignment, Command, Element, Length, Settings, Theme, + executor, subscription, window, Alignment, Command, Element, Length, + Settings, Subscription, Theme, }; use std::collections::HashMap; fn main() -> iced::Result { - Example::run(Settings::default()) + Example::run(Settings { + exit_on_close_request: false, + ..Default::default() + }) } #[derive(Default)] struct Example { - windows_count: usize, windows: HashMap, + next_window_pos: window::Position, } +#[derive(Debug)] struct Window { - id: window::Id, title: String, scale_input: String, current_scale: f64, + theme: Theme, + input_id: iced::widget::text_input::Id, } #[derive(Debug, Clone)] @@ -28,6 +35,8 @@ enum Message { ScaleChanged(window::Id, String), TitleChanged(window::Id, String), CloseWindow(window::Id), + WindowDestroyed(window::Id), + WindowCreated(window::Id, (i32, i32)), NewWindow, } @@ -40,11 +49,8 @@ impl multi_window::Application for Example { fn new(_flags: ()) -> (Self, Command) { ( Example { - windows_count: 0, - windows: HashMap::from([( - window::Id::MAIN, - Window::new(window::Id::MAIN), - )]), + windows: HashMap::from([(window::Id::MAIN, Window::new(1))]), + next_window_pos: Position::Default, }, Command::none(), ) @@ -82,12 +88,32 @@ impl multi_window::Application for Example { Message::CloseWindow(id) => { return window::close(id); } - Message::NewWindow => { - self.windows_count += 1; - let id = window::Id::new(self.windows_count); - self.windows.insert(id, Window::new(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, + ); - return window::spawn(id, window::Settings::default()); + 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, + ..Default::default() + }, + ); } } @@ -95,13 +121,9 @@ impl multi_window::Application for Example { } fn view(&self, window: window::Id) -> Element { - let window = self - .windows - .get(&window) - .map(|window| window.view()) - .unwrap(); + let content = self.windows.get(&window).unwrap().view(window); - container(window) + container(content) .width(Length::Fill) .height(Length::Fill) .center_x() @@ -109,6 +131,10 @@ impl multi_window::Application for Example { .into() } + fn theme(&self, window: Id) -> Self::Theme { + self.windows.get(&window).unwrap().theme.clone() + } + fn scale_factor(&self, window: window::Id) -> f64 { self.windows .get(&window) @@ -116,55 +142,71 @@ impl multi_window::Application for Example { .unwrap_or(1.0) } - fn close_requested(&self, window: window::Id) -> Self::Message { - Message::CloseWindow(window) + fn subscription(&self) -> Subscription { + subscription::events_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(id: window::Id) -> Self { + fn new(count: usize) -> Self { Self { - id, - title: "Window".to_string(), + 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) -> Element { - window_view(self.id, &self.scale_input, &self.title) + fn view(&self, id: window::Id) -> Element { + 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() } } - -fn window_view<'a>( - id: window::Id, - scale_input: &'a str, - title: &'a str, -) -> Element<'a, Message> { - let scale_input = column![ - text("Window scale factor:"), - text_input("Window Scale", scale_input, move |msg| { - Message::ScaleInputChanged(id, msg) - }) - .on_submit(Message::ScaleChanged(id, scale_input.to_string())) - ]; - - let title_input = column![ - text("Window title:"), - text_input("Window Title", title, move |msg| { - Message::TitleChanged(id, msg) - }) - ]; - - 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/multi_window_panes/Cargo.toml b/examples/multi_window_panes/Cargo.toml deleted file mode 100644 index 1b3f3ec6..00000000 --- a/examples/multi_window_panes/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "multi_window_panes" -version = "0.1.0" -authors = ["Richard Custodio "] -edition = "2021" -publish = false - -[dependencies] -iced = { path = "../..", features = ["debug", "multi-window", "tokio"] } -env_logger = "0.10.0" -iced_native = { path = "../../native" } -iced_lazy = { path = "../../lazy" } diff --git a/examples/multi_window_panes/src/main.rs b/examples/multi_window_panes/src/main.rs deleted file mode 100644 index b1d0a3bc..00000000 --- a/examples/multi_window_panes/src/main.rs +++ /dev/null @@ -1,639 +0,0 @@ -use iced::alignment::{self, Alignment}; -use iced::keyboard; -use iced::multi_window::Application; -use iced::theme::{self, Theme}; -use iced::widget::pane_grid::{self, PaneGrid}; -use iced::widget::{ - button, column, container, pick_list, row, scrollable, text, text_input, -}; -use iced::window; -use iced::{executor, time}; -use iced::{Color, Command, Element, Length, Settings, Size, Subscription}; -use iced_lazy::responsive; -use iced_native::{event, subscription, Event}; - -use iced_native::widget::scrollable::{Properties, RelativeOffset}; -use iced_native::window::Id; -use std::collections::HashMap; -use std::time::{Duration, Instant}; - -pub fn main() -> iced::Result { - env_logger::init(); - - Example::run(Settings::default()) -} - -struct Example { - windows: HashMap, - panes_created: usize, - count: usize, - _focused: window::Id, -} - -#[derive(Debug)] -struct Window { - title: String, - scale: f64, - theme: Theme, - panes: pane_grid::State, - focus: Option, -} - -#[derive(Debug, Clone)] -enum Message { - Window(window::Id, WindowMessage), - CountIncremented(Instant), -} - -#[derive(Debug, Clone)] -enum WindowMessage { - Split(pane_grid::Axis, pane_grid::Pane), - SplitFocused(pane_grid::Axis), - FocusAdjacent(pane_grid::Direction), - Clicked(pane_grid::Pane), - Dragged(pane_grid::DragEvent), - PopOut(pane_grid::Pane), - Resized(pane_grid::ResizeEvent), - TitleChanged(String), - ToggleMoving(pane_grid::Pane), - TogglePin(pane_grid::Pane), - Close(pane_grid::Pane), - CloseFocused, - SelectedWindow(pane_grid::Pane, SelectableWindow), - CloseWindow, - SnapToggle, -} - -impl Application for Example { - type Executor = executor::Default; - type Message = Message; - type Theme = Theme; - type Flags = (); - - fn new(_flags: ()) -> (Self, Command) { - let (panes, _) = - pane_grid::State::new(Pane::new(0, pane_grid::Axis::Horizontal)); - let window = Window { - panes, - focus: None, - title: String::from("Default window"), - scale: 1.0, - theme: Theme::default(), - }; - - ( - Example { - windows: HashMap::from([(window::Id::MAIN, window)]), - panes_created: 1, - count: 0, - _focused: window::Id::MAIN, - }, - Command::none(), - ) - } - - fn title(&self, window: window::Id) -> String { - self.windows - .get(&window) - .map(|w| w.title.clone()) - .unwrap_or(String::from("New Window")) - } - - fn update(&mut self, message: Message) -> Command { - match message { - Message::Window(id, message) => match message { - WindowMessage::SnapToggle => { - let window = self.windows.get_mut(&id).unwrap(); - - if let Some(focused) = &window.focus { - let pane = window.panes.get_mut(focused).unwrap(); - - let cmd = scrollable::snap_to( - pane.scrollable_id.clone(), - if pane.snapped { - RelativeOffset::START - } else { - RelativeOffset::END - }, - ); - - pane.snapped = !pane.snapped; - return cmd; - } - } - WindowMessage::Split(axis, pane) => { - let window = self.windows.get_mut(&id).unwrap(); - let result = window.panes.split( - axis, - &pane, - Pane::new(self.panes_created, axis), - ); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - - self.panes_created += 1; - } - WindowMessage::SplitFocused(axis) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - let result = window.panes.split( - axis, - &pane, - Pane::new(self.panes_created, axis), - ); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - - self.panes_created += 1; - } - } - WindowMessage::FocusAdjacent(direction) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - if let Some(adjacent) = - window.panes.adjacent(&pane, direction) - { - window.focus = Some(adjacent); - } - } - } - WindowMessage::Clicked(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - window.focus = Some(pane); - } - WindowMessage::CloseWindow => { - let _ = self.windows.remove(&id); - return window::close(id); - } - WindowMessage::Resized(pane_grid::ResizeEvent { - split, - ratio, - }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.resize(&split, ratio); - } - WindowMessage::SelectedWindow(pane, selected) => { - let window = self.windows.get_mut(&id).unwrap(); - let (mut pane, _) = window.panes.close(&pane).unwrap(); - pane.is_moving = false; - - if let Some(window) = self.windows.get_mut(&selected.0) { - let (&first_pane, _) = - window.panes.iter().next().unwrap(); - let result = - window.panes.split(pane.axis, &first_pane, pane); - - if let Some((pane, _)) = result { - window.focus = Some(pane); - } - } - } - WindowMessage::ToggleMoving(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.panes.get_mut(&pane) { - pane.is_moving = !pane.is_moving; - } - } - WindowMessage::TitleChanged(title) => { - let window = self.windows.get_mut(&id).unwrap(); - window.title = title; - } - WindowMessage::PopOut(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((popped, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); - - let (panes, _) = pane_grid::State::new(popped); - let window = Window { - panes, - focus: None, - title: format!( - "New window ({})", - self.windows.len() - ), - scale: 1.0 + (self.windows.len() as f64 / 10.0), - theme: if self.windows.len() % 2 == 0 { - Theme::Light - } else { - Theme::Dark - }, - }; - - let window_id = window::Id::new(self.windows.len()); - self.windows.insert(window_id, window); - return window::spawn(window_id, Default::default()); - } - } - WindowMessage::Dragged(pane_grid::DragEvent::Dropped { - pane, - target, - }) => { - let window = self.windows.get_mut(&id).unwrap(); - window.panes.swap(&pane, &target); - } - WindowMessage::Dragged(_) => {} - WindowMessage::TogglePin(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(Pane { is_pinned, .. }) = - window.panes.get_mut(&pane) - { - *is_pinned = !*is_pinned; - } - } - WindowMessage::Close(pane) => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some((_, sibling)) = window.panes.close(&pane) { - window.focus = Some(sibling); - } - } - WindowMessage::CloseFocused => { - let window = self.windows.get_mut(&id).unwrap(); - if let Some(pane) = window.focus { - if let Some(Pane { is_pinned, .. }) = - window.panes.get(&pane) - { - if !is_pinned { - if let Some((_, sibling)) = - window.panes.close(&pane) - { - window.focus = Some(sibling); - } - } - } - } - } - }, - Message::CountIncremented(_) => { - self.count += 1; - } - } - - Command::none() - } - - fn subscription(&self) -> Subscription { - Subscription::batch(vec![ - subscription::events_with(|event, status| { - if let event::Status::Captured = status { - return None; - } - - match event { - Event::Keyboard(keyboard::Event::KeyPressed { - modifiers, - key_code, - }) if modifiers.command() => { - handle_hotkey(key_code).map(|message| { - Message::Window(window::Id::new(0usize), message) - }) - } // TODO(derezzedex) - _ => None, - } - }), - time::every(Duration::from_secs(1)).map(Message::CountIncremented), - ]) - } - - fn view(&self, window: window::Id) -> Element { - let window_id = window; - - if let Some(window) = self.windows.get(&window) { - let focus = window.focus; - let total_panes = window.panes.len(); - - let window_controls = row![ - text_input( - "Window title", - &window.title, - WindowMessage::TitleChanged, - ), - button(text("Close")) - .on_press(WindowMessage::CloseWindow) - .style(theme::Button::Destructive), - ] - .spacing(5) - .align_items(Alignment::Center); - - let pane_grid = PaneGrid::new(&window.panes, |id, pane, _| { - let is_focused = focus == Some(id); - - let pin_button = button( - text(if pane.is_pinned { "Unpin" } else { "Pin" }).size(14), - ) - .on_press(WindowMessage::TogglePin(id)) - .padding(3); - - let title = row![ - pin_button, - "Pane", - text(pane.id.to_string()).style(if is_focused { - PANE_ID_COLOR_FOCUSED - } else { - PANE_ID_COLOR_UNFOCUSED - }), - ] - .spacing(5); - - let title_bar = pane_grid::TitleBar::new(title) - .controls(view_controls( - id, - total_panes, - pane.is_pinned, - pane.is_moving, - &window.title, - window_id, - &self.windows, - )) - .padding(10) - .style(if is_focused { - style::title_bar_focused - } else { - style::title_bar_active - }); - - pane_grid::Content::new(responsive(move |size| { - view_content( - id, - pane.scrollable_id.clone(), - self.count, - total_panes, - pane.is_pinned, - size, - ) - })) - .title_bar(title_bar) - .style(if is_focused { - style::pane_focused - } else { - style::pane_active - }) - }) - .width(Length::Fill) - .height(Length::Fill) - .spacing(10) - .on_click(WindowMessage::Clicked) - .on_drag(WindowMessage::Dragged) - .on_resize(10, WindowMessage::Resized); - - let content: Element<_> = column![window_controls, pane_grid] - .width(Length::Fill) - .height(Length::Fill) - .padding(10) - .into(); - - return content - .map(move |message| Message::Window(window_id, message)); - } - - container(text("This shouldn't be possible!").size(20)) - .center_x() - .center_y() - .into() - } - - fn close_requested(&self, window: window::Id) -> Self::Message { - Message::Window(window, WindowMessage::CloseWindow) - } - - fn scale_factor(&self, window: Id) -> f64 { - self.windows.get(&window).map(|w| w.scale).unwrap_or(1.0) - } - - fn theme(&self, window: Id) -> Theme { - self.windows.get(&window).expect("Window not found!").theme.clone() - } -} - -const PANE_ID_COLOR_UNFOCUSED: Color = Color::from_rgb( - 0xFF as f32 / 255.0, - 0xC7 as f32 / 255.0, - 0xC7 as f32 / 255.0, -); -const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( - 0xFF as f32 / 255.0, - 0x47 as f32 / 255.0, - 0x47 as f32 / 255.0, -); - -fn handle_hotkey(key_code: keyboard::KeyCode) -> Option { - use keyboard::KeyCode; - use pane_grid::{Axis, Direction}; - - let direction = match key_code { - KeyCode::Up => Some(Direction::Up), - KeyCode::Down => Some(Direction::Down), - KeyCode::Left => Some(Direction::Left), - KeyCode::Right => Some(Direction::Right), - _ => None, - }; - - match key_code { - KeyCode::V => Some(WindowMessage::SplitFocused(Axis::Vertical)), - KeyCode::H => Some(WindowMessage::SplitFocused(Axis::Horizontal)), - KeyCode::W => Some(WindowMessage::CloseFocused), - _ => direction.map(WindowMessage::FocusAdjacent), - } -} - -#[derive(Debug, Clone)] -struct SelectableWindow(window::Id, String); - -impl PartialEq for SelectableWindow { - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 - } -} - -impl Eq for SelectableWindow {} - -impl std::fmt::Display for SelectableWindow { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - self.1.fmt(f) - } -} - -#[derive(Debug)] -struct Pane { - id: usize, - pub scrollable_id: scrollable::Id, - pub axis: pane_grid::Axis, - pub is_pinned: bool, - pub is_moving: bool, - pub snapped: bool, -} - -impl Pane { - fn new(id: usize, axis: pane_grid::Axis) -> Self { - Self { - id, - scrollable_id: scrollable::Id::unique(), - axis, - is_pinned: false, - is_moving: false, - snapped: false, - } - } -} - -fn view_content<'a>( - pane: pane_grid::Pane, - scrollable_id: scrollable::Id, - count: usize, - total_panes: usize, - is_pinned: bool, - size: Size, -) -> Element<'a, WindowMessage> { - let button = |label, message| { - button( - text(label) - .width(Length::Fill) - .horizontal_alignment(alignment::Horizontal::Center) - .size(16), - ) - .width(Length::Fill) - .padding(8) - .on_press(message) - }; - - let mut controls = column![ - button( - "Split horizontally", - WindowMessage::Split(pane_grid::Axis::Horizontal, pane), - ), - button( - "Split vertically", - WindowMessage::Split(pane_grid::Axis::Vertical, pane), - ), - button("Snap", WindowMessage::SnapToggle,) - ] - .spacing(5) - .max_width(150); - - if total_panes > 1 && !is_pinned { - controls = controls.push( - button("Close", WindowMessage::Close(pane)) - .style(theme::Button::Destructive), - ); - } - - let content = column![ - text(format!("{}x{}", size.width, size.height)).size(24), - controls, - text(format!("{count}")).size(48), - ] - .width(Length::Fill) - .height(800) - .spacing(10) - .align_items(Alignment::Center); - - container( - scrollable(content) - .height(Length::Fill) - .vertical_scroll(Properties::new()) - .id(scrollable_id), - ) - .width(Length::Fill) - .height(Length::Fill) - .padding(5) - .center_y() - .into() -} - -fn view_controls<'a>( - pane: pane_grid::Pane, - total_panes: usize, - is_pinned: bool, - is_moving: bool, - window_title: &'a str, - window_id: window::Id, - windows: &HashMap, -) -> Element<'a, WindowMessage> { - let window_selector = { - let options: Vec<_> = windows - .iter() - .map(|(id, window)| SelectableWindow(*id, window.title.clone())) - .collect(); - pick_list( - options, - Some(SelectableWindow(window_id, window_title.to_string())), - move |window| WindowMessage::SelectedWindow(pane, window), - ) - }; - - let mut move_to = button(text("Move to").size(14)).padding(3); - - let mut pop_out = button(text("Pop Out").size(14)).padding(3); - - let mut close = button(text("Close").size(14)) - .style(theme::Button::Destructive) - .padding(3); - - if total_panes > 1 && !is_pinned { - close = close.on_press(WindowMessage::Close(pane)); - pop_out = pop_out.on_press(WindowMessage::PopOut(pane)); - } - - if windows.len() > 1 && total_panes > 1 && !is_pinned { - move_to = move_to.on_press(WindowMessage::ToggleMoving(pane)); - } - - let mut content = row![].spacing(10); - if is_moving { - content = content.push(pop_out).push(window_selector).push(close); - } else { - content = content.push(pop_out).push(move_to).push(close); - } - - content.into() -} - -mod style { - use iced::widget::container; - use iced::Theme; - - pub fn title_bar_active(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - text_color: Some(palette.background.strong.text), - background: Some(palette.background.strong.color.into()), - ..Default::default() - } - } - - pub fn title_bar_focused(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - text_color: Some(palette.primary.strong.text), - background: Some(palette.primary.strong.color.into()), - ..Default::default() - } - } - - pub fn pane_active(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - background: Some(palette.background.weak.color.into()), - border_width: 2.0, - border_color: palette.background.strong.color, - ..Default::default() - } - } - - pub fn pane_focused(theme: &Theme) -> container::Appearance { - let palette = theme.extended_palette(); - - container::Appearance { - background: Some(palette.background.weak.color.into()), - border_width: 2.0, - border_color: palette.primary.strong.color, - ..Default::default() - } - } -} diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index 83824535..7658384b 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, subscription, Alignment, Application, Command, ContentFit, Element, Event, Length, Rectangle, Renderer, Subscription, @@ -71,7 +71,10 @@ impl Application for Example { fn update(&mut self, message: Self::Message) -> Command { 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 4282ddcf..e28c4236 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -528,7 +528,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 = None; self.instants.iter_mut().enumerate().for_each( diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index 6ad7b4fb..04c8f618 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -164,7 +164,7 @@ impl Application for Todos { } } Message::ToggleFullscreen(mode) => { - window::change_mode(mode) + window::change_mode(window::Id::MAIN, mode) } _ => Command::none(), }; diff --git a/futures/src/subscription.rs b/futures/src/subscription.rs index 0642a924..c087fdab 100644 --- a/futures/src/subscription.rs +++ b/futures/src/subscription.rs @@ -251,7 +251,7 @@ where events.filter_map(move |(event, status)| { future::ready(match event { - Event::Window(window::Event::RedrawRequested(_)) => None, + Event::Window(_, window::Event::RedrawRequested(_)) => None, _ => f(event, status), }) }) diff --git a/glutin/src/application.rs b/glutin/src/application.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 7a9e6aee..15d26346 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -12,7 +12,6 @@ categories = ["gui"] [features] geometry = ["lyon_path"] -opengl = [] image = ["dep:image", "kamadak-exif"] web-colors = [] diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index f7b86045..32111008 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -24,6 +24,9 @@ pub trait Compositor: Sized { compatible_window: Option<&W>, ) -> Result<(Self, Self::Renderer), Error>; + /// Creates a [`Renderer`] for the [`Compositor`]. + fn renderer(&self) -> Self::Renderer; + /// Crates a new [`Surface`] for the given window. /// /// [`Surface`]: Self::Surface diff --git a/native/src/subscription.rs b/native/src/subscription.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/native/src/window.rs b/native/src/window.rs deleted file mode 100644 index e69de29b..00000000 diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 8b17a4b0..b5da31bf 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -46,6 +46,22 @@ impl crate::graphics::Compositor for Compositor { Err(error) } + fn renderer(&self) -> Self::Renderer { + match self { + Compositor::TinySkia(compositor) => { + Renderer::TinySkia(compositor.renderer()) + } + #[cfg(feature = "wgpu")] + Compositor::Wgpu(compositor) => { + Renderer::Wgpu(compositor.renderer()) + } + #[cfg(not(feature = "wgpu"))] + Self::Wgpu => { + panic!("`wgpu` feature was not enabled in `iced_renderer`") + } + } + } + fn create_surface( &mut self, window: &W, diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index a65f07f2..3d2976a7 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -9,6 +9,7 @@ repository = "https://github.com/iced-rs/iced" [features] debug = [] +multi-window = [] [dependencies] thiserror = "1" diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 4bbf9687..4c39f80f 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -53,6 +53,9 @@ pub mod system; pub mod user_interface; pub mod window; +#[cfg(feature = "multi-window")] +pub mod multi_window; + // We disable debug capabilities on release builds unless the `debug` feature // is explicitly enabled. #[cfg(feature = "debug")] diff --git a/runtime/src/multi_window.rs b/runtime/src/multi_window.rs new file mode 100644 index 00000000..cf778a20 --- /dev/null +++ b/runtime/src/multi_window.rs @@ -0,0 +1,6 @@ +//! A multi-window application. +pub mod program; +pub mod state; + +pub use program::Program; +pub use state::State; diff --git a/runtime/src/multi_window/program.rs b/runtime/src/multi_window/program.rs new file mode 100644 index 00000000..c3989d0d --- /dev/null +++ b/runtime/src/multi_window/program.rs @@ -0,0 +1,32 @@ +//! Build interactive programs using The Elm Architecture. +use crate::{window, Command}; + +use crate::core::text; +use crate::core::{Element, Renderer}; + +/// The core of a user interface for a multi-window application following The Elm Architecture. +pub trait Program: Sized { + /// The graphics backend to use to draw the [`Program`]. + type Renderer: Renderer + text::Renderer; + + /// The type of __messages__ your [`Program`] will produce. + type Message: std::fmt::Debug + Send; + + /// Handles a __message__ and updates the state of the [`Program`]. + /// + /// This is where you define your __update logic__. All the __messages__, + /// produced by either user interactions or commands, will be handled by + /// this method. + /// + /// Any [`Command`] returned will be executed immediately in the + /// background by shells. + fn update(&mut self, message: Self::Message) -> Command; + + /// Returns the widgets to display in the [`Program`] for the `window`. + /// + /// These widgets can produce __messages__ based on user interaction. + fn view( + &self, + window: window::Id, + ) -> Element<'_, Self::Message, Self::Renderer>; +} diff --git a/runtime/src/multi_window/state.rs b/runtime/src/multi_window/state.rs new file mode 100644 index 00000000..78c35e6c --- /dev/null +++ b/runtime/src/multi_window/state.rs @@ -0,0 +1,280 @@ +//! The internal state of a multi-window [`Program`]. +use crate::core::event::{self, Event}; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::widget::operation::{self, Operation}; +use crate::core::{Clipboard, Size}; +use crate::user_interface::{self, UserInterface}; +use crate::{Command, Debug, Program}; + +/// The execution state of a multi-window [`Program`]. It leverages caching, event +/// processing, and rendering primitive storage. +#[allow(missing_debug_implementations)] +pub struct State

+where + P: Program + 'static, +{ + program: P, + caches: Option>, + queued_events: Vec, + queued_messages: Vec, + mouse_interaction: mouse::Interaction, +} + +impl

State

+where + P: Program + 'static, +{ + /// Creates a new [`State`] with the provided [`Program`], initializing its + /// primitive with the given logical bounds and renderer. + pub fn new( + program: P, + bounds: Size, + renderer: &mut P::Renderer, + debug: &mut Debug, + ) -> Self { + let user_interface = build_user_interface( + &program, + user_interface::Cache::default(), + renderer, + bounds, + debug, + ); + + let caches = Some(vec![user_interface.into_cache()]); + + State { + program, + caches, + queued_events: Vec::new(), + queued_messages: Vec::new(), + mouse_interaction: mouse::Interaction::Idle, + } + } + + /// Returns a reference to the [`Program`] of the [`State`]. + pub fn program(&self) -> &P { + &self.program + } + + /// Queues an event in the [`State`] for processing during an [`update`]. + /// + /// [`update`]: Self::update + pub fn queue_event(&mut self, event: Event) { + self.queued_events.push(event); + } + + /// Queues a message in the [`State`] for processing during an [`update`]. + /// + /// [`update`]: Self::update + pub fn queue_message(&mut self, message: P::Message) { + self.queued_messages.push(message); + } + + /// Returns whether the event queue of the [`State`] is empty or not. + pub fn is_queue_empty(&self) -> bool { + self.queued_events.is_empty() && self.queued_messages.is_empty() + } + + /// Returns the current [`mouse::Interaction`] of the [`State`]. + pub fn mouse_interaction(&self) -> mouse::Interaction { + self.mouse_interaction + } + + /// Processes all the queued events and messages, rebuilding and redrawing + /// the widgets of the linked [`Program`] if necessary. + /// + /// Returns a list containing the instances of [`Event`] that were not + /// captured by any widget, and the [`Command`] obtained from [`Program`] + /// after updating it, only if an update was necessary. + pub fn update( + &mut self, + bounds: Size, + cursor: mouse::Cursor, + renderer: &mut P::Renderer, + theme: &::Theme, + style: &renderer::Style, + clipboard: &mut dyn Clipboard, + debug: &mut Debug, + ) -> (Vec, Option>) { + let mut user_interfaces = build_user_interfaces( + &self.program, + self.caches.take().unwrap(), + renderer, + bounds, + debug, + ); + + debug.event_processing_started(); + let mut messages = Vec::new(); + + let uncaptured_events = user_interfaces.iter_mut().fold( + vec![], + |mut uncaptured_events, ui| { + let (_, event_statuses) = ui.update( + &self.queued_events, + cursor, + renderer, + clipboard, + &mut messages, + ); + + uncaptured_events.extend( + self.queued_events + .iter() + .zip(event_statuses) + .filter_map(|(event, status)| { + matches!(status, event::Status::Ignored) + .then_some(event) + }) + .cloned(), + ); + uncaptured_events + }, + ); + + self.queued_events.clear(); + messages.append(&mut self.queued_messages); + debug.event_processing_finished(); + + let commands = if messages.is_empty() { + debug.draw_started(); + + for ui in &mut user_interfaces { + self.mouse_interaction = + ui.draw(renderer, theme, style, cursor); + } + + debug.draw_finished(); + + self.caches = Some( + user_interfaces + .drain(..) + .map(UserInterface::into_cache) + .collect(), + ); + + None + } else { + let temp_caches = user_interfaces + .drain(..) + .map(UserInterface::into_cache) + .collect(); + + drop(user_interfaces); + + let commands = Command::batch(messages.into_iter().map(|msg| { + debug.log_message(&msg); + + debug.update_started(); + let command = self.program.update(msg); + debug.update_finished(); + + command + })); + + let mut user_interfaces = build_user_interfaces( + &self.program, + temp_caches, + renderer, + bounds, + debug, + ); + + debug.draw_started(); + for ui in &mut user_interfaces { + self.mouse_interaction = + ui.draw(renderer, theme, style, cursor); + } + debug.draw_finished(); + + self.caches = Some( + user_interfaces + .drain(..) + .map(UserInterface::into_cache) + .collect(), + ); + + Some(commands) + }; + + (uncaptured_events, commands) + } + + /// Applies [`widget::Operation`]s to the [`State`] + pub fn operate( + &mut self, + renderer: &mut P::Renderer, + operations: impl Iterator>>, + bounds: Size, + debug: &mut Debug, + ) { + let mut user_interfaces = build_user_interfaces( + &self.program, + self.caches.take().unwrap(), + renderer, + bounds, + debug, + ); + + for operation in operations { + let mut current_operation = Some(operation); + + while let Some(mut operation) = current_operation.take() { + for ui in &mut user_interfaces { + ui.operate(renderer, operation.as_mut()); + } + + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + self.queued_messages.push(message) + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } + }; + } + } + + self.caches = Some( + user_interfaces + .drain(..) + .map(UserInterface::into_cache) + .collect(), + ); + } +} + +fn build_user_interfaces<'a, P: Program>( + program: &'a P, + mut caches: Vec, + renderer: &mut P::Renderer, + size: Size, + debug: &mut Debug, +) -> Vec> { + caches + .drain(..) + .map(|cache| { + build_user_interface(program, cache, renderer, size, debug) + }) + .collect() +} + +fn build_user_interface<'a, P: Program>( + program: &'a P, + cache: user_interface::Cache, + renderer: &mut P::Renderer, + size: Size, + debug: &mut Debug, +) -> UserInterface<'a, P::Message, P::Renderer> { + debug.view_started(); + let view = program.view(); + debug.view_finished(); + + debug.layout_started(); + let user_interface = UserInterface::build(view, size, cache, renderer); + debug.layout_finished(); + + user_interface +} diff --git a/runtime/src/window.rs b/runtime/src/window.rs index 5219fbfd..4737dcdd 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -3,101 +3,117 @@ mod action; pub mod screenshot; +pub use crate::core::window::Id; pub use action::Action; pub use screenshot::Screenshot; use crate::command::{self, Command}; use crate::core::time::Instant; -use crate::core::window::{Event, Icon, Level, Mode, UserAttention}; +use crate::core::window::{self, Event, Icon, Level, Mode, UserAttention}; use crate::core::Size; use crate::futures::subscription::{self, Subscription}; /// Subscribes to the frames of the window of the running application. /// /// The resulting [`Subscription`] will produce items at a rate equal to the -/// refresh rate of the window. Note that this rate may be variable, as it is +/// refresh rate of the first application window. Note that this rate may be variable, as it is /// normally managed by the graphics driver and/or the OS. /// /// In any case, this [`Subscription`] is useful to smoothly draw application-driven /// animations without missing any frames. pub fn frames() -> Subscription { subscription::raw_events(|event, _status| match event { - iced_core::Event::Window(Event::RedrawRequested(at)) => Some(at), + iced_core::Event::Window(_, Event::RedrawRequested(at)) => Some(at), _ => None, }) } -/// Closes the current window and exits the application. -pub fn close() -> Command { - Command::single(command::Action::Window(Action::Close)) +/// Spawns a new window with the given `id` and `settings`. +pub fn spawn( + id: window::Id, + settings: window::Settings, +) -> Command { + Command::single(command::Action::Window(id, Action::Spawn { settings })) +} + +/// Closes the window with `id`. +pub fn close(id: window::Id) -> Command { + Command::single(command::Action::Window(id, Action::Close)) } /// Begins dragging the window while the left mouse button is held. -pub fn drag() -> Command { - Command::single(command::Action::Window(Action::Drag)) +pub fn drag(id: window::Id) -> Command { + Command::single(command::Action::Window(id, Action::Drag)) } /// Resizes the window to the given logical dimensions. -pub fn resize(new_size: Size) -> Command { - Command::single(command::Action::Window(Action::Resize(new_size))) +pub fn resize( + id: window::Id, + new_size: Size, +) -> Command { + Command::single(command::Action::Window(id, Action::Resize(new_size))) } -/// Fetches the current window size in logical dimensions. +/// Fetches the window's size in logical dimensions. pub fn fetch_size( + id: window::Id, f: impl FnOnce(Size) -> Message + 'static, ) -> Command { - Command::single(command::Action::Window(Action::FetchSize(Box::new(f)))) + Command::single(command::Action::Window(id, Action::FetchSize(Box::new(f)))) } /// Maximizes the window. -pub fn maximize(maximized: bool) -> Command { - Command::single(command::Action::Window(Action::Maximize(maximized))) +pub fn maximize(id: window::Id, maximized: bool) -> Command { + Command::single(command::Action::Window(id, Action::Maximize(maximized))) } -/// Minimes the window. -pub fn minimize(minimized: bool) -> Command { - Command::single(command::Action::Window(Action::Minimize(minimized))) +/// Minimizes the window. +pub fn minimize(id: window::Id, minimized: bool) -> Command { + Command::single(command::Action::Window(id, Action::Minimize(minimized))) } -/// Moves a window to the given logical coordinates. -pub fn move_to(x: i32, y: i32) -> Command { - Command::single(command::Action::Window(Action::Move { x, y })) +/// Moves the window to the given logical coordinates. +pub fn move_to(id: window::Id, x: i32, y: i32) -> Command { + Command::single(command::Action::Window(id, Action::Move { x, y })) } /// Changes the [`Mode`] of the window. -pub fn change_mode(mode: Mode) -> Command { - Command::single(command::Action::Window(Action::ChangeMode(mode))) +pub fn change_mode(id: window::Id, mode: Mode) -> Command { + Command::single(command::Action::Window(id, Action::ChangeMode(mode))) } /// Fetches the current [`Mode`] of the window. pub fn fetch_mode( + id: window::Id, f: impl FnOnce(Mode) -> Message + 'static, ) -> Command { - Command::single(command::Action::Window(Action::FetchMode(Box::new(f)))) + Command::single(command::Action::Window(id, Action::FetchMode(Box::new(f)))) } /// Toggles the window to maximized or back. -pub fn toggle_maximize() -> Command { - Command::single(command::Action::Window(Action::ToggleMaximize)) +pub fn toggle_maximize(id: window::Id) -> Command { + Command::single(command::Action::Window(id, Action::ToggleMaximize)) } /// Toggles the window decorations. -pub fn toggle_decorations() -> Command { - Command::single(command::Action::Window(Action::ToggleDecorations)) +pub fn toggle_decorations(id: window::Id) -> Command { + Command::single(command::Action::Window(id, Action::ToggleDecorations)) } -/// Request user attention to the window, this has no effect if the application +/// Request user attention to the window. This has no effect if the application /// is already focused. How requesting for user attention manifests is platform dependent, /// see [`UserAttention`] for details. /// /// Providing `None` will unset the request for user attention. Unsetting the request for /// user attention might not be done automatically by the WM when the window receives input. pub fn request_user_attention( + id: window::Id, user_attention: Option, ) -> Command { - Command::single(command::Action::Window(Action::RequestUserAttention( - user_attention, - ))) + Command::single(command::Action::Window( + id, + Action::RequestUserAttention(user_attention), + )) } /// Brings the window to the front and sets input focus. Has no effect if the window is @@ -106,30 +122,36 @@ pub fn request_user_attention( /// This [`Command`] steals input focus from other applications. Do not use this method unless /// you are certain that's what the user wants. Focus stealing can cause an extremely disruptive /// user experience. -pub fn gain_focus() -> Command { - Command::single(command::Action::Window(Action::GainFocus)) +pub fn gain_focus(id: window::Id) -> Command { + Command::single(command::Action::Window(id, Action::GainFocus)) } /// Changes the window [`Level`]. -pub fn change_level(level: Level) -> Command { - Command::single(command::Action::Window(Action::ChangeLevel(level))) +pub fn change_level(id: window::Id, level: Level) -> Command { + Command::single(command::Action::Window(id, Action::ChangeLevel(level))) } -/// Fetches an identifier unique to the window. +/// Fetches an identifier unique to the window, provided by the underlying windowing system. This is +/// not to be confused with [`window::Id`]. pub fn fetch_id( + id: window::Id, f: impl FnOnce(u64) -> Message + 'static, ) -> Command { - Command::single(command::Action::Window(Action::FetchId(Box::new(f)))) + Command::single(command::Action::Window(id, Action::FetchId(Box::new(f)))) } /// Changes the [`Icon`] of the window. -pub fn change_icon(icon: Icon) -> Command { - Command::single(command::Action::Window(Action::ChangeIcon(icon))) +pub fn change_icon(id: window::Id, icon: Icon) -> Command { + Command::single(command::Action::Window(id, Action::ChangeIcon(icon))) } /// Captures a [`Screenshot`] from the window. pub fn screenshot( + id: window::Id, f: impl FnOnce(Screenshot) -> Message + Send + 'static, ) -> Command { - Command::single(command::Action::Window(Action::Screenshot(Box::new(f)))) + Command::single(command::Action::Window( + id, + Action::Screenshot(Box::new(f)), + )) } diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index cebec4ae..d631cee1 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::core::window::{Icon, Level, Mode, UserAttention, Settings}; +use crate::core::window::{Icon, Level, Mode, Settings, UserAttention}; use crate::core::Size; use crate::futures::MaybeSend; use crate::window::Screenshot; @@ -15,7 +15,7 @@ pub enum Action { /// There’s no guarantee that this will work unless the left mouse /// button was pressed immediately before this function is called. Drag, - /// Spawns a new window with the provided [`window::Settings`]. + /// Spawns a new window. Spawn { /// The settings of the [`Window`]. settings: Settings, diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 9974128c..0486159e 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -1,30 +1,37 @@ use crate::window; use crate::{Command, Element, Executor, Settings, Subscription}; -pub use iced_native::application::{Appearance, StyleSheet}; +pub use crate::style::application::{Appearance, StyleSheet}; /// An interactive cross-platform multi-window application. /// /// This trait is the main entrypoint of Iced. Once implemented, you can run /// your GUI application by simply calling [`run`](#method.run). /// +/// - On native platforms, it will run in its own windows. +/// - On the web, it will take control of the `` and the `<body>` of the +/// document and display only the contents of the `window::Id::MAIN` window. +/// /// An [`Application`] can execute asynchronous actions by returning a -/// [`Command`] in some of its methods. For example, to spawn a new window, you -/// can use the `iced_winit::window::spawn()` [`Command`]. +/// [`Command`] in some of its methods. If you do not intend to perform any +/// background work in your program, the [`Sandbox`] trait offers a simplified +/// interface. /// /// When using an [`Application`] with the `debug` feature enabled, a debug view /// can be toggled by pressing `F12`. /// +/// # Examples +/// See the `examples/multi-window` example to see this multi-window `Application` trait in action. +/// /// ## A simple "Hello, world!" /// /// If you just want to get started, here is a simple [`Application`] that /// says "Hello, world!": /// /// ```no_run -/// use iced::executor; -/// use iced::multi_window::Application; -/// use iced::window; +/// use iced::{executor, window}; /// use iced::{Command, Element, Settings, Theme}; +/// use iced::multi_window::{self, Application}; /// /// pub fn main() -> iced::Result { /// Hello::run(Settings::default()) @@ -32,17 +39,17 @@ pub use iced_native::application::{Appearance, StyleSheet}; /// /// struct Hello; /// -/// impl Application for Hello { +/// impl multi_window::Application for Hello { /// type Executor = executor::Default; +/// type Flags = (); /// type Message = (); /// type Theme = Theme; -/// type Flags = (); /// /// fn new(_flags: ()) -> (Hello, Command<Self::Message>) { /// (Hello, Command::none()) /// } /// -/// fn title(&self, window: window::Id) -> String { +/// fn title(&self, _window: window::Id) -> String { /// String::from("A cool application") /// } /// @@ -50,13 +57,9 @@ pub use iced_native::application::{Appearance, StyleSheet}; /// Command::none() /// } /// -/// fn view(&self, window: window::Id) -> Element<Self::Message> { +/// fn view(&self, _window: window::Id) -> Element<Self::Message> { /// "Hello, world!".into() /// } -/// -/// fn close_requested(&self, window: window::Id) -> Self::Message { -/// () -/// } /// } /// ``` pub trait Application: Sized { @@ -89,10 +92,10 @@ pub trait Application: Sized { /// [`run`]: Self::run fn new(flags: Self::Flags) -> (Self, Command<Self::Message>); - /// Returns the current title of the [`Application`]. + /// Returns the current title of the `window` of the [`Application`]. /// /// This title can be dynamic! The runtime will automatically update the - /// title of your application when necessary. + /// title of your window when necessary. fn title(&self, window: window::Id) -> String; /// Handles a __message__ and updates the state of the [`Application`]. @@ -104,7 +107,15 @@ pub trait Application: Sized { /// Any [`Command`] returned will be executed immediately in the background. fn update(&mut self, message: Self::Message) -> Command<Self::Message>; - /// Returns the current [`Theme`] of the [`Application`]. + /// Returns the widgets to display in the `window` of the [`Application`]. + /// + /// These widgets can produce __messages__ based on user interaction. + fn view( + &self, + window: window::Id, + ) -> Element<'_, Self::Message, crate::Renderer<Self::Theme>>; + + /// Returns the current [`Theme`] of the `window` of the [`Application`]. /// /// [`Theme`]: Self::Theme #[allow(unused_variables)] @@ -112,9 +123,8 @@ pub trait Application: Sized { Self::Theme::default() } - /// Returns the current [`Style`] of the [`Theme`]. + /// Returns the current `Style` of the [`Theme`]. /// - /// [`Style`]: <Self::Theme as StyleSheet>::Style /// [`Theme`]: Self::Theme fn style(&self) -> <Self::Theme as StyleSheet>::Style { <Self::Theme as StyleSheet>::Style::default() @@ -132,14 +142,6 @@ pub trait Application: Sized { Subscription::none() } - /// Returns the widgets to display in the [`Application`]. - /// - /// These widgets can produce __messages__ based on user interaction. - fn view( - &self, - window: window::Id, - ) -> Element<'_, Self::Message, crate::Renderer<Self::Theme>>; - /// Returns the scale factor of the `window` of the [`Application`]. /// /// It can be used to dynamically control the size of the UI at runtime @@ -154,18 +156,7 @@ pub trait Application: Sized { 1.0 } - /// Returns whether the [`Application`] should be terminated. - /// - /// By default, it returns `false`. - fn should_exit(&self) -> bool { - false - } - - /// Returns the `Self::Message` that should be processed when a `window` is requested to - /// be closed. - fn close_requested(&self, window: window::Id) -> Self::Message; - - /// Runs the [`Application`]. + /// Runs the multi-window [`Application`]. /// /// On native platforms, this method will take control of the current thread /// until the [`Application`] exits. @@ -182,30 +173,28 @@ pub trait Application: Sized { let renderer_settings = crate::renderer::Settings { default_font: settings.default_font, default_text_size: settings.default_text_size, - text_multithreading: settings.text_multithreading, antialiasing: if settings.antialiasing { - Some(crate::renderer::settings::Antialiasing::MSAAx4) + Some(crate::graphics::Antialiasing::MSAAx4) } else { None }, - ..crate::renderer::Settings::from_env() + ..crate::renderer::Settings::default() }; - Ok(crate::runtime::multi_window::run::< + Ok(crate::shell::multi_window::run::< Instance<Self>, Self::Executor, - crate::renderer::window::Compositor<Self::Theme>, + crate::renderer::Compositor<Self::Theme>, >(settings.into(), renderer_settings)?) } } struct Instance<A: Application>(A); -impl<A> crate::runtime::multi_window::Application for Instance<A> +impl<A> crate::runtime::multi_window::Program for Instance<A> where A: Application, { - type Flags = A::Flags; type Renderer = crate::Renderer<A::Theme>; type Message = A::Message; @@ -219,6 +208,13 @@ where ) -> Element<'_, Self::Message, Self::Renderer> { self.0.view(window) } +} + +impl<A> crate::shell::multi_window::Application for Instance<A> +where + A: Application, +{ + type Flags = A::Flags; fn new(flags: Self::Flags) -> (Self, Command<A::Message>) { let (app, command) = A::new(flags); @@ -245,12 +241,4 @@ where fn scale_factor(&self, window: window::Id) -> f64 { self.0.scale_factor(window) } - - fn should_exit(&self) -> bool { - self.0.should_exit() - } - - fn close_requested(&self, window: window::Id) -> Self::Message { - self.0.close_requested(window) - } } diff --git a/src/settings.rs b/src/settings.rs index 0dd46584..4ce2d135 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -91,7 +91,7 @@ impl<Flags> From<Settings<Flags>> for iced_winit::Settings<Flags> { fn from(settings: Settings<Flags>) -> iced_winit::Settings<Flags> { iced_winit::Settings { id: settings.id, - window: settings.window.into(), + window: settings.window, flags: settings.flags, exit_on_close_request: settings.exit_on_close_request, } diff --git a/src/window.rs b/src/window.rs index e4601575..9f96da52 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,12 +1,8 @@ //! Configure the window of your application in native platforms. -mod position; -mod settings; pub mod icon; pub use icon::Icon; -pub use position::Position; -pub use settings::{PlatformSpecific, Settings}; pub use crate::core::window::*; pub use crate::runtime::window::*; diff --git a/winit/src/icon.rs b/src/window/icon.rs similarity index 100% rename from winit/src/icon.rs rename to src/window/icon.rs diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 775cf9e5..1aaba2c9 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -8,6 +8,7 @@ use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; use std::marker::PhantomData; pub struct Compositor<Theme> { + settings: Settings, _theme: PhantomData<Theme>, } @@ -33,6 +34,10 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { Ok((compositor, Renderer::new(backend))) } + fn renderer(&self) -> Self::Renderer { + Renderer::new(Backend::new(self.settings)) + } + fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( &mut self, window: &W, @@ -116,6 +121,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { pub fn new<Theme>(settings: Settings) -> (Compositor<Theme>, Backend) { ( Compositor { + settings, _theme: PhantomData, }, Backend::new(settings), diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index cd5b20cc..814269f3 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -219,6 +219,10 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { Ok((compositor, Renderer::new(backend))) } + fn renderer(&self) -> Self::Renderer { + Renderer::new(self.create_backend()) + } + fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( &mut self, window: &W, diff --git a/winit/Cargo.toml b/winit/Cargo.toml index a4c0a402..30cec0b8 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -12,8 +12,6 @@ categories = ["gui"] [features] default = ["x11", "wayland", "wayland-dlopen", "wayland-csd-adwaita"] -trace = ["tracing", "tracing-core", "tracing-subscriber"] -chrome-trace = ["trace", "tracing-chrome"] debug = ["iced_runtime/debug"] system = ["sysinfo"] application = [] @@ -21,7 +19,7 @@ x11 = ["winit/x11"] wayland = ["winit/wayland"] wayland-dlopen = ["winit/wayland-dlopen"] wayland-csd-adwaita = ["winit/wayland-csd-adwaita"] -multi-window = [] +multi-window = ["iced_runtime/multi-window"] [dependencies] window_clipboard = "0.3" @@ -47,24 +45,6 @@ path = "../graphics" version = "0.8" path = "../style" -[dependencies.tracing] -version = "0.1.37" -optional = true -features = ["std"] - -[dependencies.tracing-core] -version = "0.1.30" -optional = true - -[dependencies.tracing-subscriber] -version = "0.3.16" -optional = true -features = ["registry"] - -[dependencies.tracing-chrome] -version = "0.7.0" -optional = true - [target.'cfg(target_os = "windows")'.dependencies.winapi] version = "0.3.6" diff --git a/winit/src/application.rs b/winit/src/application.rs index ab7b2495..5c45bbda 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -18,6 +18,7 @@ use crate::runtime::clipboard; use crate::runtime::program::Program; use crate::runtime::user_interface::{self, UserInterface}; use crate::runtime::{Command, Debug}; +use crate::settings; use crate::style::application::{Appearance, StyleSheet}; use crate::{Clipboard, Error, Proxy, Settings}; @@ -25,11 +26,6 @@ use futures::channel::mpsc; use std::mem::ManuallyDrop; -#[cfg(feature = "trace")] -pub use crate::Profiler; -#[cfg(feature = "trace")] -use tracing::{info_span, instrument::Instrument}; - /// An interactive, native cross-platform application. /// /// This trait is the main entrypoint of Iced. Once implemented, you can run @@ -117,15 +113,9 @@ where use futures::Future; use winit::event_loop::EventLoopBuilder; - #[cfg(feature = "trace")] - let _guard = Profiler::init(); - let mut debug = Debug::new(); debug.startup_started(); - #[cfg(feature = "trace")] - let _ = info_span!("Application", "RUN").entered(); - let event_loop = EventLoopBuilder::with_user_event().build(); let proxy = event_loop.create_proxy(); @@ -146,14 +136,13 @@ where let target = settings.window.platform_specific.target.clone(); let should_be_visible = settings.window.visible; - let builder = settings - .window - .into_builder( - &application.title(), - event_loop.primary_monitor(), - settings.id, - ) - .with_visible(false); + let builder = settings::window_builder( + settings.window, + &application.title(), + event_loop.primary_monitor(), + settings.id, + ) + .with_visible(false); log::debug!("Window builder: {:#?}", builder); @@ -196,28 +185,20 @@ where let (mut event_sender, event_receiver) = mpsc::unbounded(); let (control_sender, mut control_receiver) = mpsc::unbounded(); - let mut instance = Box::pin({ - let run_instance = run_instance::<A, E, C>( - application, - compositor, - renderer, - runtime, - proxy, - debug, - event_receiver, - control_sender, - init_command, - window, - should_be_visible, - settings.exit_on_close_request, - ); - - #[cfg(feature = "trace")] - let run_instance = - run_instance.instrument(info_span!("Application", "LOOP")); - - run_instance - }); + let mut instance = Box::pin(run_instance::<A, E, C>( + application, + compositor, + renderer, + runtime, + proxy, + debug, + event_receiver, + control_sender, + init_command, + window, + should_be_visible, + settings.exit_on_close_request, + )); let mut context = task::Context::from_waker(task::noop_waker_ref()); @@ -480,9 +461,6 @@ async fn run_instance<A, E, C>( messages.push(message); } event::Event::RedrawRequested(_) => { - #[cfg(feature = "trace")] - let _ = info_span!("Application", "FRAME").entered(); - let physical_size = state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { @@ -622,24 +600,12 @@ pub fn build_user_interface<'a, A: Application>( where <A::Renderer as core::Renderer>::Theme: StyleSheet, { - #[cfg(feature = "trace")] - let view_span = info_span!("Application", "VIEW").entered(); - debug.view_started(); let view = application.view(); - - #[cfg(feature = "trace")] - let _ = view_span.exit(); debug.view_finished(); - #[cfg(feature = "trace")] - let layout_span = info_span!("Application", "LAYOUT").entered(); - debug.layout_started(); let user_interface = UserInterface::build(view, size, cache, renderer); - - #[cfg(feature = "trace")] - let _ = layout_span.exit(); debug.layout_finished(); user_interface @@ -666,16 +632,10 @@ pub fn update<A: Application, C, E: Executor>( <A::Renderer as core::Renderer>::Theme: StyleSheet, { for message in messages.drain(..) { - #[cfg(feature = "trace")] - let update_span = info_span!("Application", "UPDATE").entered(); - debug.log_message(&message); debug.update_started(); let command = runtime.enter(|| application.update(message)); - - #[cfg(feature = "trace")] - let _ = update_span.exit(); debug.update_finished(); run_command( @@ -750,7 +710,7 @@ pub fn run_command<A, C, E>( } window::Action::Spawn { .. } => { log::info!( - "Spawning a window is only available with `multi_window::Application`s." + "Spawning a window is only available with multi-window applications." ) } window::Action::Resize(size) => { diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index fe0fce19..0625e74b 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -7,7 +7,6 @@ use crate::core::mouse; use crate::core::touch; use crate::core::window; use crate::core::{Event, Point}; -use crate::Position; /// Converts a winit window event into an iced event. pub fn window_event( @@ -169,17 +168,17 @@ pub fn window_level(level: window::Level) -> winit::window::WindowLevel { pub fn position( monitor: Option<&winit::monitor::MonitorHandle>, (width, height): (u32, u32), - position: Position, + position: window::Position, ) -> Option<winit::dpi::Position> { match position { - Position::Default => None, - Position::Specific(x, y) => { + window::Position::Default => None, + window::Position::Specific(x, y) => { Some(winit::dpi::Position::Logical(winit::dpi::LogicalPosition { x: f64::from(x), y: f64::from(y), })) } - Position::Centered => { + window::Position::Centered => { if let Some(monitor) = monitor { let start = monitor.position(); diff --git a/winit/src/lib.rs b/winit/src/lib.rs index dc163430..31002f51 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -51,20 +51,14 @@ pub mod settings; pub mod system; mod error; -mod icon; mod proxy; -#[cfg(feature = "trace")] -mod profiler; #[cfg(feature = "application")] pub use application::Application; -#[cfg(feature = "trace")] -pub use profiler::Profiler; pub use clipboard::Clipboard; pub use error::Error; -pub use icon::Icon; pub use proxy::Proxy; pub use settings::Settings; +pub use crate::core::window::*; pub use iced_graphics::Viewport; -pub use iced_native::window::Position; diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 9b395c1d..e6f440bc 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -1,58 +1,57 @@ //! Create interactive, native cross-platform applications for WGPU. mod state; +mod windows; pub use state::State; -use crate::clipboard::{self, Clipboard}; -use crate::conversion; -use crate::mouse; -use crate::renderer; -use crate::settings; -use crate::widget::operation; -use crate::window; -use crate::{ - Command, Debug, Element, Error, Executor, Proxy, Renderer, Runtime, - Settings, Size, Subscription, -}; +use crate::core::widget::operation; +use crate::core::{self, mouse, renderer, window, Size}; +use crate::futures::futures::channel::mpsc; +use crate::futures::futures::{task, Future, FutureExt, StreamExt}; +use crate::futures::{Executor, Runtime, Subscription}; +use crate::graphics::{compositor, Compositor}; +use crate::multi_window::windows::Windows; +use crate::runtime::command::{self, Command}; +use crate::runtime::multi_window::Program; +use crate::runtime::user_interface::{self, UserInterface}; +use crate::runtime::Debug; +use crate::settings::window_builder; +use crate::style::application::StyleSheet; +use crate::{conversion, settings, Clipboard, Error, Proxy, Settings}; -use iced_futures::futures::channel::mpsc; -use iced_futures::futures::{self, FutureExt}; -use iced_graphics::compositor; -use iced_native::user_interface::{self, UserInterface}; - -pub use iced_native::application::{Appearance, StyleSheet}; - -use std::collections::HashMap; +use iced_runtime::user_interface::Cache; use std::mem::ManuallyDrop; use std::time::Instant; - -#[cfg(feature = "trace")] -pub use crate::Profiler; -#[cfg(feature = "trace")] -use tracing::{info_span, instrument::Instrument}; +use winit::monitor::MonitorHandle; /// This is a wrapper around the `Application::Message` associate type /// to allows the `shell` to create internal messages, while still having /// the current user-specified custom messages. #[derive(Debug)] pub enum Event<Message> { - /// An [`Application`] generated message + /// An internal event which contains an [`Application`] generated message. Application(Message), - /// A message which spawns a new window. + /// An internal event which spawns a new window. NewWindow { /// The [window::Id] of the newly spawned [`Window`]. id: window::Id, /// The [settings::Window] of the newly spawned [`Window`]. - settings: settings::Window, + settings: window::Settings, /// The title of the newly spawned [`Window`]. title: String, + /// The monitor on which to spawn the window. If `None`, will use monitor of the last window + /// spawned. + monitor: Option<MonitorHandle>, }, - /// Close a window. + /// An internal event for closing a window. CloseWindow(window::Id), - /// A message for when the window has finished being created. + /// An internal event for when the window has finished being created. WindowCreated(window::Id, winit::window::Window), } +#[allow(unsafe_code)] +unsafe impl<Message> std::marker::Send for Event<Message> {} + /// An interactive, native, cross-platform, multi-windowed application. /// /// This trait is the main entrypoint of multi-window Iced. Once implemented, you can run @@ -64,37 +63,13 @@ pub enum Event<Message> { /// /// When using an [`Application`] with the `debug` feature enabled, a debug view /// can be toggled by pressing `F12`. -pub trait Application: Sized +pub trait Application: Program where - <Self::Renderer as crate::Renderer>::Theme: StyleSheet, + <Self::Renderer as core::Renderer>::Theme: StyleSheet, { /// The data needed to initialize your [`Application`]. type Flags; - /// The graphics backend to use to draw the [`Program`]. - type Renderer: Renderer; - - /// The type of __messages__ your [`Program`] will produce. - type Message: std::fmt::Debug + Send; - - /// Handles a __message__ and updates the state of the [`Program`]. - /// - /// This is where you define your __update logic__. All the __messages__, - /// produced by either user interactions or commands, will be handled by - /// this method. - /// - /// Any [`Command`] returned will be executed immediately in the - /// background by shells. - fn update(&mut self, message: Self::Message) -> Command<Self::Message>; - - /// Returns the widgets to display for the `window` in the [`Program`]. - /// - /// These widgets can produce __messages__ based on user interaction. - fn view( - &self, - window: window::Id, - ) -> Element<'_, Self::Message, Self::Renderer>; - /// Initializes the [`Application`] with the flags provided to /// [`run`] as part of the [`Settings`]. /// @@ -105,19 +80,22 @@ where /// load state from a file, perform an initial HTTP request, etc. fn new(flags: Self::Flags) -> (Self, Command<Self::Message>); - /// Returns the current title of each window of the [`Application`]. + /// Returns the current title of the [`Application`]. /// /// This title can be dynamic! The runtime will automatically update the /// title of your application when necessary. fn title(&self, window: window::Id) -> String; - /// Returns the current [`Theme`] of the [`Application`]. - fn theme(&self, window: window::Id) -> <Self::Renderer as crate::Renderer>::Theme; + /// Returns the current `Theme` of the [`Application`]. + fn theme( + &self, + window: window::Id, + ) -> <Self::Renderer as core::Renderer>::Theme; - /// Returns the [`Style`] variation of the [`Theme`]. + /// Returns the `Style` variation of the `Theme`. fn style( &self, - ) -> <<Self::Renderer as crate::Renderer>::Theme as StyleSheet>::Style { + ) -> <<Self::Renderer as core::Renderer>::Theme as StyleSheet>::Style { Default::default() } @@ -147,17 +125,6 @@ where fn scale_factor(&self, window: window::Id) -> f64 { 1.0 } - - /// Returns whether the [`Application`] should be terminated. - /// - /// By default, it returns `false`. - fn should_exit(&self) -> bool { - false - } - - /// Returns the `Self::Message` that should be processed when a `window` is requested to - /// be closed. - fn close_requested(&self, window: window::Id) -> Self::Message; } /// Runs an [`Application`] with an executor, compositor, and the provided @@ -169,22 +136,14 @@ pub fn run<A, E, C>( where A: Application + 'static, E: Executor + 'static, - C: iced_graphics::window::Compositor<Renderer = A::Renderer> + 'static, - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer> + 'static, + <A::Renderer as core::Renderer>::Theme: StyleSheet, { - use futures::task; - use futures::Future; use winit::event_loop::EventLoopBuilder; - #[cfg(feature = "trace")] - let _guard = Profiler::init(); - let mut debug = Debug::new(); debug.startup_started(); - #[cfg(feature = "trace")] - let _ = info_span!("Application", "RUN").entered(); - let event_loop = EventLoopBuilder::with_user_event().build(); let proxy = event_loop.create_proxy(); @@ -201,68 +160,77 @@ where runtime.enter(|| A::new(flags)) }; - let builder = settings.window.into_builder( + let should_main_be_visible = settings.window.visible; + let builder = window_builder( + settings.window, &application.title(window::Id::MAIN), event_loop.primary_monitor(), settings.id, - ); + ) + .with_visible(false); log::info!("Window builder: {:#?}", builder); - let window = builder + let main_window = builder .build(&event_loop) .map_err(Error::WindowCreationFailed)?; - let windows: HashMap<window::Id, winit::window::Window> = - HashMap::from([(window::Id::MAIN, window)]); - - let window = windows.values().next().expect("No window found"); - #[cfg(target_arch = "wasm32")] { use winit::platform::web::WindowExtWebSys; - let canvas = window.canvas(); + let canvas = main_window.canvas(); let window = web_sys::window().unwrap(); let document = window.document().unwrap(); let body = document.body().unwrap(); - let _ = body - .append_child(&canvas) - .expect("Append canvas to HTML body"); + let target = target.and_then(|target| { + body.query_selector(&format!("#{}", target)) + .ok() + .unwrap_or(None) + }); + + match target { + Some(node) => { + let _ = node + .replace_with_with_node_1(&canvas) + .expect(&format!("Could not replace #{}", node.id())); + } + None => { + let _ = body + .append_child(&canvas) + .expect("Append canvas to HTML body"); + } + }; } - let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; + let (mut compositor, renderer) = + C::new(compositor_settings, Some(&main_window))?; + + let windows = + Windows::new(&application, &mut compositor, renderer, main_window); let (mut event_sender, event_receiver) = mpsc::unbounded(); let (control_sender, mut control_receiver) = mpsc::unbounded(); - let mut instance = Box::pin({ - let run_instance = run_instance::<A, E, C>( - application, - compositor, - renderer, - runtime, - proxy, - debug, - event_receiver, - control_sender, - init_command, - windows, - settings.exit_on_close_request, - ); - - #[cfg(feature = "trace")] - let run_instance = - run_instance.instrument(info_span!("Application", "LOOP")); - - run_instance - }); + let mut instance = Box::pin(run_instance::<A, E, C>( + application, + compositor, + runtime, + proxy, + debug, + event_receiver, + control_sender, + init_command, + windows, + should_main_be_visible, + settings.exit_on_close_request, + )); let mut context = task::Context::from_waker(task::noop_waker_ref()); - platform::run(event_loop, move |event, event_loop, control_flow| { + platform::run(event_loop, move |event, window_target, control_flow| { use winit::event_loop::ControlFlow; if let ControlFlow::ExitWithCode(_) = control_flow { @@ -285,11 +253,12 @@ where id, settings, title, + monitor, }) => { - let window = settings - .into_builder(&title, event_loop.primary_monitor(), None) - .build(event_loop) - .expect("Failed to build window"); + let window = + settings::window_builder(settings, &title, monitor, None) + .build(window_target) + .expect("Failed to build window"); Some(winit::event::Event::UserEvent(Event::WindowCreated( id, window, @@ -320,7 +289,6 @@ where async fn run_instance<A, E, C>( mut application: A, mut compositor: C, - mut renderer: A::Renderer, mut runtime: Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, mut proxy: winit::event_loop::EventLoopProxy<Event<A::Message>>, mut debug: Debug, @@ -329,74 +297,65 @@ async fn run_instance<A, E, C>( >, mut control_sender: mpsc::UnboundedSender<winit::event_loop::ControlFlow>, init_command: Command<A::Message>, - mut windows: HashMap<window::Id, winit::window::Window>, - _exit_on_close_request: bool, + mut windows: Windows<A, C>, + should_main_window_be_visible: bool, + exit_on_main_closed: bool, ) where A: Application + 'static, E: Executor + 'static, - C: iced_graphics::window::Compositor<Renderer = A::Renderer> + 'static, - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer> + 'static, + <A::Renderer as core::Renderer>::Theme: StyleSheet, { - use iced_futures::futures::stream::StreamExt; use winit::event; use winit::event_loop::ControlFlow; - let mut clipboard = - Clipboard::connect(windows.values().next().expect("No window found")); - let mut caches = HashMap::new(); - let mut window_ids: HashMap<_, _> = windows - .iter() - .map(|(&id, window)| (window.id(), id)) - .collect(); + let mut clipboard = Clipboard::connect(windows.main()); - let mut states = HashMap::new(); - let mut surfaces = HashMap::new(); - let mut interfaces = ManuallyDrop::new(HashMap::new()); + let mut ui_caches = vec![user_interface::Cache::default()]; + let mut user_interfaces = ManuallyDrop::new(build_user_interfaces( + &application, + &mut debug, + &mut windows, + vec![user_interface::Cache::default()], + )); - for (&id, window) in windows.keys().zip(windows.values()) { - let mut surface = compositor.create_surface(window); - let state = State::new(&application, id, window); - let physical_size = state.physical_size(); - - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); - - let user_interface = build_user_interface( - &application, - user_interface::Cache::default(), - &mut renderer, - state.logical_size(), - &mut debug, - id, - ); - - let _ = states.insert(id, state); - let _ = surfaces.insert(id, surface); - let _ = interfaces.insert(id, user_interface); - let _ = caches.insert(id, user_interface::Cache::default()); + if should_main_window_be_visible { + windows.main().set_visible(true); } run_command( &application, - &mut caches, - &states, - &mut renderer, + &mut compositor, init_command, &mut runtime, &mut clipboard, &mut proxy, &mut debug, - &windows, - || compositor.fetch_information(), + &mut windows, + &mut ui_caches, ); - runtime.track(application.subscription().map(Event::Application)); + runtime.track( + application + .subscription() + .map(Event::Application) + .into_recipes(), + ); let mut mouse_interaction = mouse::Interaction::default(); - let mut events = Vec::new(); + + let mut events = + if let Some((position, size)) = logical_bounds_of(windows.main()) { + vec![( + Some(window::Id::MAIN), + core::Event::Window( + window::Id::MAIN, + window::Event::Created { position, size }, + ), + )] + } else { + Vec::new() + }; let mut messages = Vec::new(); let mut redraw_pending = false; @@ -413,25 +372,20 @@ async fn run_instance<A, E, C>( ); } event::Event::MainEventsCleared => { - for id in states.keys().copied().collect::<Vec<_>>() { - // Partition events into only events for this window - let (filtered, remaining): (Vec<_>, Vec<_>) = - events.iter().cloned().partition( - |(window_id, _event): &( - Option<window::Id>, - iced_native::event::Event, - )| { - *window_id == Some(id) || *window_id == None - }, - ); + debug.event_processing_started(); + let mut uis_stale = false; - // Only retain events which have not been processed for next iteration - events.retain(|el| remaining.contains(el)); + for (i, id) in windows.ids.iter().enumerate() { + let mut window_events = vec![]; - let window_events: Vec<_> = filtered - .into_iter() - .map(|(_id, event)| event) - .collect(); + events.retain(|(window_id, event)| { + if *window_id == Some(*id) || window_id.is_none() { + window_events.push(event.clone()); + false + } else { + true + } + }); if !redraw_pending && window_events.is_empty() @@ -440,144 +394,124 @@ async fn run_instance<A, E, C>( continue; } - // Process winit events for window - debug.event_processing_started(); - let cursor_position = - states.get(&id).unwrap().cursor_position(); + let (ui_state, statuses) = user_interfaces[i].update( + &window_events, + windows.states[i].cursor(), + &mut windows.renderers[i], + &mut clipboard, + &mut messages, + ); - let (interface_state, statuses) = { - let user_interface = interfaces.get_mut(&id).unwrap(); - user_interface.update( - &window_events, - cursor_position, - &mut renderer, - &mut clipboard, - &mut messages, - ) - }; + if !uis_stale { + uis_stale = + matches!(ui_state, user_interface::State::Outdated); + } - for event in + for (event, status) in window_events.into_iter().zip(statuses.into_iter()) { - runtime.broadcast(event); + runtime.broadcast(event, status); } - debug.event_processing_finished(); + } - // Update application with app messages - // Unless we implement some kind of diffing, we must redraw all windows as we - // cannot know what changed. - if !messages.is_empty() - || matches!( - interface_state, - user_interface::State::Outdated, - ) + debug.event_processing_finished(); + + // TODO mw application update returns which window IDs to update + if !messages.is_empty() || uis_stale { + let mut cached_interfaces: Vec<Cache> = + ManuallyDrop::into_inner(user_interfaces) + .drain(..) + .map(UserInterface::into_cache) + .collect(); + + // Update application + update( + &mut application, + &mut compositor, + &mut runtime, + &mut clipboard, + &mut proxy, + &mut debug, + &mut messages, + &mut windows, + &mut cached_interfaces, + ); + + // we must synchronize all window states with application state after an + // application update since we don't know what changed + for (state, (id, window)) in windows + .states + .iter_mut() + .zip(windows.ids.iter().zip(windows.raw.iter())) { - let mut cached_interfaces: HashMap<_, _> = - ManuallyDrop::into_inner(interfaces) - .drain() - .map( - |(id, interface): ( - window::Id, - UserInterface<'_, _, _>, - )| { - (id, interface.into_cache()) - }, - ) - .collect(); - - // Update application - update( - &mut application, - &mut cached_interfaces, - &states, - &mut renderer, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &mut messages, - &windows, - || compositor.fetch_information(), - ); - - // synchronize window states with application states. - for (id, state) in states.iter_mut() { - state.synchronize( - &application, - *id, - windows - .get(id) - .expect("No window found with ID."), - ); - } - - interfaces = ManuallyDrop::new(build_user_interfaces( - &application, - &mut renderer, - &mut debug, - &states, - cached_interfaces, - )); - - if application.should_exit() { - break 'main; - } + state.synchronize(&application, *id, window); } + // rebuild UIs with the synchronized states + user_interfaces = ManuallyDrop::new(build_user_interfaces( + &application, + &mut debug, + &mut windows, + cached_interfaces, + )); + } + + debug.draw_started(); + + for (i, id) in windows.ids.iter().enumerate() { // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes + // request redraws on state changes // // Then, we can use the `interface_state` here to decide if a redraw // is needed right away, or simply wait until a specific time. - let redraw_event = iced_native::Event::Window( - id, + let redraw_event = core::Event::Window( + *id, window::Event::RedrawRequested(Instant::now()), ); - let (interface_state, _) = - interfaces.get_mut(&id).unwrap().update( - &[redraw_event.clone()], - cursor_position, - &mut renderer, - &mut clipboard, - &mut messages, - ); + let cursor = windows.states[i].cursor(); + + let (ui_state, _) = user_interfaces[i].update( + &[redraw_event.clone()], + cursor, + &mut windows.renderers[i], + &mut clipboard, + &mut messages, + ); - debug.draw_started(); let new_mouse_interaction = { - let state = states.get(&id).unwrap(); + let state = &windows.states[i]; - interfaces.get_mut(&id).unwrap().draw( - &mut renderer, + user_interfaces[i].draw( + &mut windows.renderers[i], state.theme(), &renderer::Style { text_color: state.text_color(), }, - state.cursor_position(), + cursor, ) }; - debug.draw_finished(); - - let window = windows.get(&id).unwrap(); if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); + windows.raw[i].set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); mouse_interaction = new_mouse_interaction; } - for window in windows.values() { - window.request_redraw(); - } + // TODO once widgets can request to be redrawn, we can avoid always requesting a + // redraw + windows.raw[i].request_redraw(); - runtime.broadcast(( + runtime.broadcast( redraw_event.clone(), - crate::event::Status::Ignored, - )); + core::event::Status::Ignored, + ); - let _ = control_sender.start_send(match interface_state { + let _ = control_sender.start_send(match ui_state { user_interface::State::Updated { redraw_request: Some(redraw_request), } => match redraw_request { @@ -590,17 +524,20 @@ async fn run_instance<A, E, C>( }, _ => ControlFlow::Wait, }); - - redraw_pending = false; } + + redraw_pending = false; + + debug.draw_finished(); } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), )) => { - use iced_native::event; + use crate::core::event; + events.push(( None, - iced_native::Event::PlatformSpecific( + event::Event::PlatformSpecific( event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), ), @@ -612,91 +549,48 @@ async fn run_instance<A, E, C>( messages.push(message); } Event::WindowCreated(id, window) => { - let mut surface = compositor.create_surface(&window); - let state = State::new(&application, id, &window); - let physical_size = state.physical_size(); + let bounds = logical_bounds_of(&window); - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); + let (inner_size, i) = + windows.add(&application, &mut compositor, id, window); - let user_interface = build_user_interface( + user_interfaces.push(build_user_interface( &application, user_interface::Cache::default(), - &mut renderer, - state.logical_size(), + &mut windows.renderers[i], + inner_size, &mut debug, id, - ); + )); + ui_caches.push(user_interface::Cache::default()); - let _ = states.insert(id, state); - let _ = surfaces.insert(id, surface); - let _ = interfaces.insert(id, user_interface); - let _ = window_ids.insert(window.id(), id); - let _ = windows.insert(id, window); - let _ = caches.insert(id, user_interface::Cache::default()); + if let Some(bounds) = bounds { + events.push(( + Some(id), + core::Event::Window( + id, + window::Event::Created { + position: bounds.0, + size: bounds.1, + }, + ), + )); + } } Event::CloseWindow(id) => { - if let Some(window) = windows.get(&id) { - if window_ids.remove(&window.id()).is_none() { - log::error!("Failed to remove window with id {:?} from window_ids.", window.id()); - } - } else { - log::error!( - "Could not find window with id {:?} in windows.", - id - ); - } - if states.remove(&id).is_none() { - log::error!( - "Failed to remove window {:?} from states.", - id - ); - } - if interfaces.remove(&id).is_none() { - log::error!( - "Failed to remove window {:?} from interfaces.", - id - ); - } - if windows.remove(&id).is_none() { - log::error!( - "Failed to remove window {:?} from windows.", - id - ); - } - if surfaces.remove(&id).is_none() { - log::error!( - "Failed to remove window {:?} from surfaces.", - id - ); - } + let i = windows.delete(id); + let _ = user_interfaces.remove(i); + let _ = ui_caches.remove(i); if windows.is_empty() { - log::info!( - "All windows are closed. Terminating program." - ); break 'main; - } else { - log::info!("Remaining windows: {:?}", windows.len()); } } Event::NewWindow { .. } => unreachable!(), }, event::Event::RedrawRequested(id) => { - #[cfg(feature = "trace")] - let _ = info_span!("Application", "FRAME").entered(); - - let state = window_ids - .get(&id) - .and_then(|id| states.get_mut(id)) - .unwrap(); - let surface = window_ids - .get(&id) - .and_then(|id| surfaces.get_mut(id)) - .unwrap(); + let i = windows.index_from_raw(id); + let state = &windows.states[i]; let physical_size = state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { @@ -704,60 +598,55 @@ async fn run_instance<A, E, C>( } debug.render_started(); + let current_viewport_version = state.viewport_version(); + let window_viewport_version = windows.viewport_versions[i]; - if state.viewport_changed() { - let mut user_interface = window_ids - .get(&id) - .and_then(|id| interfaces.remove(id)) - .unwrap(); - + if window_viewport_version != current_viewport_version { let logical_size = state.logical_size(); debug.layout_started(); - user_interface = - user_interface.relayout(logical_size, &mut renderer); + + let renderer = &mut windows.renderers[i]; + let ui = user_interfaces.remove(i); + + user_interfaces + .insert(i, ui.relayout(logical_size, renderer)); + debug.layout_finished(); debug.draw_started(); - let new_mouse_interaction = { - let state = &state; + let new_mouse_interaction = user_interfaces[i].draw( + renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor(), + ); - user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor_position(), - ) - }; - - let window = window_ids - .get(&id) - .and_then(|id| windows.get(id)) - .unwrap(); if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); + windows.raw[i].set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); mouse_interaction = new_mouse_interaction; } debug.draw_finished(); - let _ = interfaces - .insert(*window_ids.get(&id).unwrap(), user_interface); - compositor.configure_surface( - surface, + &mut windows.surfaces[i], physical_size.width, physical_size.height, ); + + windows.viewport_versions[i] = current_viewport_version; } match compositor.present( - &mut renderer, - surface, + &mut windows.renderers[i], + &mut windows.surfaces[i], state.viewport(), state.background_color(), &debug.overlay(), @@ -775,10 +664,12 @@ async fn run_instance<A, E, C>( } _ => { debug.render_finished(); - log::error!("Error {error:?} when presenting surface."); + log::error!( + "Error {error:?} when presenting surface." + ); - // Try rendering windows again next frame. - for window in windows.values() { + // Try rendering all windows again next frame. + for window in &windows.raw { window.request_redraw(); } } @@ -789,42 +680,58 @@ async fn run_instance<A, E, C>( event: window_event, window_id, } => { - if let (Some(window), Some(state)) = ( - window_ids.get(&window_id).and_then(|id| windows.get(id)), - window_ids - .get(&window_id) - .and_then(|id| states.get_mut(id)), - ) { - if crate::application::requests_exit(&window_event, state.modifiers()) { - if let Some(id) = window_ids.get(&window_id).cloned() { - let message = application.close_requested(id); - messages.push(message); - } + let window_deleted = windows + .pending_destroy + .iter() + .any(|(_, w_id)| window_id == *w_id); + + if matches!(window_event, winit::event::WindowEvent::Destroyed) + { + // This is the only special case, since in order trigger the Destroyed event the + // window reference from winit must be dropped, but we still want to inform the + // user that the window was destroyed so they can clean up any specific window + // code for this window + let id = windows.get_pending_destroy(window_id); + + events.push(( + None, + core::Event::Window(id, window::Event::Destroyed), + )); + } else if !window_deleted { + let i = windows.index_from_raw(window_id); + let id = windows.ids[i]; + let raw = &windows.raw[i]; + let state = &mut windows.states[i]; + + // first check if we need to just break the entire application + // e.g. a user does a force quit on MacOS, or if a user has set "exit on main closed" + // as an option in window settings and wants to close the main window + if requests_exit( + i, + exit_on_main_closed, + &window_event, + state.modifiers(), + ) { + break 'main; } - state.update(window, &window_event, &mut debug); + state.update(raw, &window_event, &mut debug); if let Some(event) = conversion::window_event( - *window_ids.get(&window_id).unwrap(), + id, &window_event, state.scale_factor(), state.modifiers(), ) { - events - .push((window_ids.get(&window_id).cloned(), event)); + events.push((Some(id), event)); } - } else { - log::error!( - "Could not find window or state for id: {window_id:?}" - ); } } _ => {} } } - // Manually drop the user interfaces - drop(ManuallyDrop::into_inner(interfaces)); + let _ = ManuallyDrop::into_inner(user_interfaces); } /// Builds a window's [`UserInterface`] for the [`Application`]. @@ -837,103 +744,79 @@ pub fn build_user_interface<'a, A: Application>( id: window::Id, ) -> UserInterface<'a, A::Message, A::Renderer> where - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + <A::Renderer as core::Renderer>::Theme: StyleSheet, { - #[cfg(feature = "trace")] - let view_span = info_span!("Application", "VIEW").entered(); - debug.view_started(); let view = application.view(id); - - #[cfg(feature = "trace")] - let _ = view_span.exit(); debug.view_finished(); - #[cfg(feature = "trace")] - let layout_span = info_span!("Application", "LAYOUT").entered(); debug.layout_started(); - let user_interface = UserInterface::build(view, size, cache, renderer); - - #[cfg(feature = "trace")] - let _ = layout_span.exit(); debug.layout_finished(); user_interface } -/// Updates an [`Application`] by feeding it messages, spawning any +/// Updates a multi-window [`Application`] by feeding it messages, spawning any /// resulting [`Command`], and tracking its [`Subscription`]. -pub fn update<A: Application, E: Executor>( +pub fn update<A: Application, C, E: Executor>( application: &mut A, - caches: &mut HashMap<window::Id, user_interface::Cache>, - states: &HashMap<window::Id, State<A>>, - renderer: &mut A::Renderer, + compositor: &mut C, runtime: &mut Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, clipboard: &mut Clipboard, proxy: &mut winit::event_loop::EventLoopProxy<Event<A::Message>>, debug: &mut Debug, messages: &mut Vec<A::Message>, - windows: &HashMap<window::Id, winit::window::Window>, - graphics_info: impl FnOnce() -> compositor::Information + Copy, + windows: &mut Windows<A, C>, + ui_caches: &mut Vec<user_interface::Cache>, ) where - A: Application + 'static, - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer> + 'static, + <A::Renderer as core::Renderer>::Theme: StyleSheet, { for message in messages.drain(..) { - #[cfg(feature = "trace")] - let update_span = info_span!("Application", "UPDATE").entered(); - debug.log_message(&message); - debug.update_started(); let command = runtime.enter(|| application.update(message)); - - #[cfg(feature = "trace")] - let _ = update_span.exit(); debug.update_finished(); run_command( application, - caches, - states, - renderer, + compositor, command, runtime, clipboard, proxy, debug, windows, - graphics_info, + ui_caches, ); } let subscription = application.subscription().map(Event::Application); - runtime.track(subscription); + runtime.track(subscription.into_recipes()); } /// Runs the actions of a [`Command`]. -pub fn run_command<A, E>( +pub fn run_command<A, C, E>( application: &A, - caches: &mut HashMap<window::Id, user_interface::Cache>, - states: &HashMap<window::Id, State<A>>, - renderer: &mut A::Renderer, + compositor: &mut C, command: Command<A::Message>, runtime: &mut Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, clipboard: &mut Clipboard, proxy: &mut winit::event_loop::EventLoopProxy<Event<A::Message>>, debug: &mut Debug, - windows: &HashMap<window::Id, winit::window::Window>, - _graphics_info: impl FnOnce() -> compositor::Information + Copy, + windows: &mut Windows<A, C>, + ui_caches: &mut Vec<user_interface::Cache>, ) where - A: Application + 'static, + A: Application, E: Executor, - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer> + 'static, + <A::Renderer as core::Renderer>::Theme: StyleSheet, { - use iced_native::command; - use iced_native::system; - use iced_native::window; + use crate::runtime::clipboard; + use crate::runtime::system; + use crate::runtime::window; for action in command.actions() { match action { @@ -954,11 +837,14 @@ pub fn run_command<A, E>( }, command::Action::Window(id, action) => match action { window::Action::Spawn { settings } => { + let monitor = windows.last_monitor(); + proxy .send_event(Event::NewWindow { id, - settings: settings.into(), + settings, title: application.title(id), + monitor, }) .expect("Send message to event loop"); } @@ -968,86 +854,117 @@ pub fn run_command<A, E>( .expect("Send message to event loop"); } window::Action::Drag => { - let window = windows.get(&id).expect("No window found"); - let _res = window.drag_window(); + let _ = windows.with_raw(id).drag_window(); } - window::Action::Resize { width, height } => { - let window = windows.get(&id).expect("No window found"); - window.set_inner_size(winit::dpi::LogicalSize { - width, - height, - }); + window::Action::Resize(size) => { + windows.with_raw(id).set_inner_size( + winit::dpi::LogicalSize { + width: size.width, + height: size.height, + }, + ); + } + window::Action::FetchSize(callback) => { + let window = windows.with_raw(id); + let size = window.inner_size(); + + proxy + .send_event(Event::Application(callback(Size::new( + size.width, + size.height, + )))) + .expect("Send message to event loop") + } + window::Action::Maximize(maximized) => { + windows.with_raw(id).set_maximized(maximized); + } + window::Action::Minimize(minimized) => { + windows.with_raw(id).set_minimized(minimized); } window::Action::Move { x, y } => { - let window = windows.get(&id).expect("No window found"); - window.set_outer_position(winit::dpi::LogicalPosition { - x, - y, - }); + windows.with_raw(id).set_outer_position( + winit::dpi::LogicalPosition { x, y }, + ); } window::Action::ChangeMode(mode) => { - let window = windows.get(&id).expect("No window found"); + let window = windows.with_raw(id); window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( window.current_monitor(), mode, )); } + window::Action::ChangeIcon(icon) => { + windows.with_raw(id).set_window_icon(conversion::icon(icon)) + } window::Action::FetchMode(tag) => { - let window = windows.get(&id).expect("No window found"); + let window = windows.with_raw(id); let mode = if window.is_visible().unwrap_or(true) { conversion::mode(window.fullscreen()) } else { - window::Mode::Hidden + core::window::Mode::Hidden }; proxy .send_event(Event::Application(tag(mode))) - .expect("Send message to event loop"); - } - window::Action::Maximize(value) => { - let window = windows.get(&id).expect("No window found!"); - window.set_maximized(value); - } - window::Action::Minimize(value) => { - let window = windows.get(&id).expect("No window found!"); - window.set_minimized(value); + .expect("Event loop doesn't exist."); } window::Action::ToggleMaximize => { - let window = windows.get(&id).expect("No window found!"); + let window = windows.with_raw(id); window.set_maximized(!window.is_maximized()); } window::Action::ToggleDecorations => { - let window = windows.get(&id).expect("No window found!"); + let window = windows.with_raw(id); window.set_decorations(!window.is_decorated()); } window::Action::RequestUserAttention(attention_type) => { - let window = windows.get(&id).expect("No window found!"); - window.request_user_attention( + windows.with_raw(id).request_user_attention( attention_type.map(conversion::user_attention), ); } window::Action::GainFocus => { - let window = windows.get(&id).expect("No window found!"); - window.focus_window(); + windows.with_raw(id).focus_window(); } - window::Action::ChangeAlwaysOnTop(on_top) => { - let window = windows.get(&id).expect("No window found!"); - window.set_always_on_top(on_top); + window::Action::ChangeLevel(level) => { + windows + .with_raw(id) + .set_window_level(conversion::window_level(level)); } - window::Action::FetchId(tag) => { - let window = windows.get(&id).expect("No window found!"); + window::Action::FetchId(tag) => proxy + .send_event(Event::Application(tag(windows + .with_raw(id) + .id() + .into()))) + .expect("Event loop doesn't exist."), + window::Action::Screenshot(tag) => { + let i = windows.index_from_id(id); + let state = &windows.states[i]; + let surface = &mut windows.surfaces[i]; + let renderer = &mut windows.renderers[i]; + + let bytes = compositor.screenshot( + renderer, + surface, + state.viewport(), + state.background_color(), + &debug.overlay(), + ); proxy - .send_event(Event::Application(tag(window.id().into()))) - .expect("Send message to event loop.") + .send_event(Event::Application(tag( + window::Screenshot::new( + bytes, + state.physical_size(), + ), + ))) + .expect("Event loop doesn't exist.") } }, command::Action::System(action) => match action { system::Action::QueryInformation(_tag) => { #[cfg(feature = "system")] { - let graphics_info = _graphics_info(); + let graphics_info = compositor.fetch_information(); let proxy = proxy.clone(); let _ = std::thread::spawn(move || { @@ -1058,33 +975,36 @@ pub fn run_command<A, E>( proxy .send_event(Event::Application(message)) - .expect("Send message to event loop") + .expect("Event loop doesn't exist.") }); } } }, command::Action::Widget(action) => { - let mut current_caches = std::mem::take(caches); - let mut current_operation = Some(action.into_operation()); + let mut current_operation = Some(action); - let mut user_interfaces = build_user_interfaces( + let mut uis = build_user_interfaces( application, - renderer, debug, - states, - current_caches, + windows, + std::mem::take(ui_caches), ); - while let Some(mut operation) = current_operation.take() { - for user_interface in user_interfaces.values_mut() { - user_interface.operate(renderer, operation.as_mut()); + 'operate: while let Some(mut operation) = + current_operation.take() + { + for (i, ui) in uis.iter_mut().enumerate() { + ui.operate(&windows.renderers[i], operation.as_mut()); match operation.finish() { operation::Outcome::None => {} operation::Outcome::Some(message) => { proxy .send_event(Event::Application(message)) - .expect("Send message to event loop"); + .expect("Event loop doesn't exist."); + + // operation completed, don't need to try to operate on rest of UIs + break 'operate; } operation::Outcome::Chain(next) => { current_operation = Some(next); @@ -1093,55 +1013,105 @@ pub fn run_command<A, E>( } } - let user_interfaces: HashMap<_, _> = user_interfaces - .drain() - .map(|(id, interface)| (id, interface.into_cache())) - .collect(); + *ui_caches = + uis.drain(..).map(UserInterface::into_cache).collect(); + } + command::Action::LoadFont { bytes, tagger } => { + use crate::core::text::Renderer; - current_caches = user_interfaces; - *caches = current_caches; + // TODO change this once we change each renderer to having a single backend reference.. :pain: + // TODO: Error handling (?) + for renderer in &mut windows.renderers { + renderer.load_font(bytes.clone()); + } + + proxy + .send_event(Event::Application(tagger(Ok(())))) + .expect("Send message to event loop"); } } } } -/// Build the user interfaces for every window. -pub fn build_user_interfaces<'a, A>( +/// Build the user interface for every window. +pub fn build_user_interfaces<'a, A: Application, C: Compositor>( application: &'a A, - renderer: &mut A::Renderer, debug: &mut Debug, - states: &HashMap<window::Id, State<A>>, - mut cached_user_interfaces: HashMap<window::Id, user_interface::Cache>, -) -> HashMap< - window::Id, - UserInterface< - 'a, - <A as Application>::Message, - <A as Application>::Renderer, - >, -> + windows: &mut Windows<A, C>, + mut cached_user_interfaces: Vec<user_interface::Cache>, +) -> Vec<UserInterface<'a, A::Message, A::Renderer>> where - A: Application + 'static, - <A::Renderer as crate::Renderer>::Theme: StyleSheet, + <A::Renderer as core::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer>, { - let mut interfaces = HashMap::new(); + cached_user_interfaces + .drain(..) + .zip( + windows + .ids + .iter() + .zip(windows.states.iter().zip(windows.renderers.iter_mut())), + ) + .fold(vec![], |mut uis, (cache, (id, (state, renderer)))| { + uis.push(build_user_interface( + application, + cache, + renderer, + state.logical_size(), + debug, + *id, + )); - for (id, cache) in cached_user_interfaces.drain() { - let state = &states.get(&id).unwrap(); + uis + }) +} - let user_interface = build_user_interface( - application, - cache, - renderer, - state.logical_size(), - debug, - id, - ); +/// Returns true if the provided event should cause an [`Application`] to +/// exit. +pub fn requests_exit( + window: usize, + exit_on_main_closed: bool, + event: &winit::event::WindowEvent<'_>, + _modifiers: winit::event::ModifiersState, +) -> bool { + use winit::event::WindowEvent; - let _ = interfaces.insert(id, user_interface); + //TODO alt f4..? + match event { + WindowEvent::CloseRequested => exit_on_main_closed && window == 0, + #[cfg(target_os = "macos")] + WindowEvent::KeyboardInput { + input: + winit::event::KeyboardInput { + virtual_keycode: Some(winit::event::VirtualKeyCode::Q), + state: winit::event::ElementState::Pressed, + .. + }, + .. + } if _modifiers.logo() => true, + _ => false, } +} - interfaces +fn logical_bounds_of( + window: &winit::window::Window, +) -> Option<((i32, i32), Size<u32>)> { + let scale = window.scale_factor(); + let pos = window + .inner_position() + .map(|pos| { + ((pos.x as f64 / scale) as i32, (pos.y as f64 / scale) as i32) + }) + .ok()?; + let size = { + let size = window.inner_size(); + Size::new( + (size.width as f64 / scale) as u32, + (size.height as f64 / scale) as u32, + ) + }; + + Some((pos, size)) } #[cfg(not(target_arch = "wasm32"))] diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 54a114ad..f2741c3c 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -1,33 +1,50 @@ -use crate::application::{self, StyleSheet as _}; use crate::conversion; +use crate::core; +use crate::core::{mouse, window}; +use crate::core::{Color, Size}; +use crate::graphics::Viewport; use crate::multi_window::Application; -use crate::window; -use crate::{Color, Debug, Point, Size, Viewport}; +use crate::style::application; +use std::fmt::{Debug, Formatter}; -use std::marker::PhantomData; +use iced_style::application::StyleSheet; use winit::event::{Touch, WindowEvent}; use winit::window::Window; /// The state of a multi-windowed [`Application`]. -#[allow(missing_debug_implementations)] pub struct State<A: Application> where - <A::Renderer as crate::Renderer>::Theme: application::StyleSheet, + <A::Renderer as core::Renderer>::Theme: application::StyleSheet, { title: String, scale_factor: f64, viewport: Viewport, - viewport_changed: bool, - cursor_position: winit::dpi::PhysicalPosition<f64>, + viewport_version: usize, + cursor_position: Option<winit::dpi::PhysicalPosition<f64>>, modifiers: winit::event::ModifiersState, - theme: <A::Renderer as crate::Renderer>::Theme, + theme: <A::Renderer as core::Renderer>::Theme, appearance: application::Appearance, - application: PhantomData<A>, +} + +impl<A: Application> Debug for State<A> +where + <A::Renderer as core::Renderer>::Theme: application::StyleSheet, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("multi_window::State") + .field("title", &self.title) + .field("scale_factor", &self.scale_factor) + .field("viewport", &self.viewport) + .field("viewport_version", &self.viewport_version) + .field("cursor_position", &self.cursor_position) + .field("appearance", &self.appearance) + .finish() + } } impl<A: Application> State<A> where - <A::Renderer as crate::Renderer>::Theme: application::StyleSheet, + <A::Renderer as core::Renderer>::Theme: application::StyleSheet, { /// Creates a new [`State`] for the provided [`Application`]'s `window`. pub fn new( @@ -53,13 +70,11 @@ where title, scale_factor, viewport, - viewport_changed: false, - // TODO: Encode cursor availability in the type-system - cursor_position: winit::dpi::PhysicalPosition::new(-1.0, -1.0), + viewport_version: 0, + cursor_position: None, modifiers: winit::event::ModifiersState::default(), theme, appearance, - application: PhantomData, } } @@ -68,9 +83,11 @@ where &self.viewport } - /// Returns whether or not the viewport changed. - pub fn viewport_changed(&self) -> bool { - self.viewport_changed + /// Returns the version of the [`Viewport`] of the [`State`]. + /// + /// The version is incremented every time the [`Viewport`] changes. + pub fn viewport_version(&self) -> usize { + self.viewport_version } /// Returns the physical [`Size`] of the [`Viewport`] of the [`State`]. @@ -89,11 +106,16 @@ where } /// Returns the current cursor position of the [`State`]. - pub fn cursor_position(&self) -> Point { - conversion::cursor_position( - self.cursor_position, - self.viewport.scale_factor(), - ) + pub fn cursor(&self) -> mouse::Cursor { + self.cursor_position + .map(|cursor_position| { + conversion::cursor_position( + cursor_position, + self.viewport.scale_factor(), + ) + }) + .map(mouse::Cursor::Available) + .unwrap_or(mouse::Cursor::Unavailable) } /// Returns the current keyboard modifiers of the [`State`]. @@ -102,7 +124,7 @@ where } /// Returns the current theme of the [`State`]. - pub fn theme(&self) -> &<A::Renderer as crate::Renderer>::Theme { + pub fn theme(&self) -> &<A::Renderer as core::Renderer>::Theme { &self.theme } @@ -121,7 +143,7 @@ where &mut self, window: &Window, event: &WindowEvent<'_>, - _debug: &mut Debug, + _debug: &mut crate::runtime::Debug, ) { match event { WindowEvent::Resized(new_size) => { @@ -132,7 +154,7 @@ where window.scale_factor() * self.scale_factor, ); - self.viewport_changed = true; + self.viewport_version = self.viewport_version.wrapping_add(1); } WindowEvent::ScaleFactorChanged { scale_factor: new_scale_factor, @@ -146,18 +168,16 @@ where new_scale_factor * self.scale_factor, ); - self.viewport_changed = true; + self.viewport_version = self.viewport_version.wrapping_add(1); } WindowEvent::CursorMoved { position, .. } | WindowEvent::Touch(Touch { location: position, .. }) => { - self.cursor_position = *position; + self.cursor_position = Some(*position); } WindowEvent::CursorLeft { .. } => { - // TODO: Encode cursor availability in the type-system - self.cursor_position = - winit::dpi::PhysicalPosition::new(-1.0, -1.0); + self.cursor_position = None; } WindowEvent::ModifiersChanged(new_modifiers) => { self.modifiers = *new_modifiers; @@ -197,16 +217,20 @@ where self.title = new_title; } - // Update scale factor + // Update scale factor and size let new_scale_factor = application.scale_factor(window_id); + let new_size = window.inner_size(); + let current_size = self.viewport.physical_size(); - if self.scale_factor != new_scale_factor { - let size = window.inner_size(); - + if self.scale_factor != new_scale_factor + || (current_size.width, current_size.height) + != (new_size.width, new_size.height) + { self.viewport = Viewport::with_physical_size( - Size::new(size.width, size.height), + Size::new(new_size.width, new_size.height), window.scale_factor() * new_scale_factor, ); + self.viewport_version = self.viewport_version.wrapping_add(1); self.scale_factor = new_scale_factor; } diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs new file mode 100644 index 00000000..7b63defa --- /dev/null +++ b/winit/src/multi_window/windows.rs @@ -0,0 +1,170 @@ +use crate::core::{window, Size}; +use crate::multi_window::{Application, State}; +use iced_graphics::Compositor; +use iced_style::application::StyleSheet; +use std::fmt::{Debug, Formatter}; +use winit::monitor::MonitorHandle; + +pub struct Windows<A: Application, C: Compositor> +where + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer>, +{ + pub ids: Vec<window::Id>, + pub raw: Vec<winit::window::Window>, + pub states: Vec<State<A>>, + pub viewport_versions: Vec<usize>, + pub surfaces: Vec<C::Surface>, + pub renderers: Vec<A::Renderer>, + pub pending_destroy: Vec<(window::Id, winit::window::WindowId)>, +} + +impl<A: Application, C: Compositor> Debug for Windows<A, C> +where + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer>, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Windows") + .field("ids", &self.ids) + .field( + "raw", + &self + .raw + .iter() + .map(|raw| raw.id()) + .collect::<Vec<winit::window::WindowId>>(), + ) + .field("states", &self.states) + .field("viewport_versions", &self.viewport_versions) + .finish() + } +} + +impl<A: Application, C: Compositor> Windows<A, C> +where + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer>, +{ + /// Creates a new [`Windows`] with a single `window::Id::MAIN` window. + pub fn new( + application: &A, + compositor: &mut C, + renderer: A::Renderer, + main: winit::window::Window, + ) -> Self { + let state = State::new(application, window::Id::MAIN, &main); + let viewport_version = state.viewport_version(); + let physical_size = state.physical_size(); + let surface = compositor.create_surface( + &main, + physical_size.width, + physical_size.height, + ); + + Self { + ids: vec![window::Id::MAIN], + raw: vec![main], + states: vec![state], + viewport_versions: vec![viewport_version], + surfaces: vec![surface], + renderers: vec![renderer], + pending_destroy: vec![], + } + } + + /// Adds a new window to [`Windows`]. Returns the size of the newly created window in logical + /// pixels & the index of the window within [`Windows`]. + pub fn add( + &mut self, + application: &A, + compositor: &mut C, + id: window::Id, + window: winit::window::Window, + ) -> (Size, usize) { + let state = State::new(application, id, &window); + let window_size = state.logical_size(); + let viewport_version = state.viewport_version(); + let physical_size = state.physical_size(); + let surface = compositor.create_surface( + &window, + physical_size.width, + physical_size.height, + ); + let renderer = compositor.renderer(); + + self.ids.push(id); + self.raw.push(window); + self.states.push(state); + self.viewport_versions.push(viewport_version); + self.surfaces.push(surface); + self.renderers.push(renderer); + + (window_size, self.ids.len() - 1) + } + + pub fn is_empty(&self) -> bool { + self.ids.is_empty() + } + + pub fn main(&self) -> &winit::window::Window { + &self.raw[0] + } + + pub fn index_from_raw(&self, id: winit::window::WindowId) -> usize { + self.raw + .iter() + .position(|window| window.id() == id) + .expect("No raw window in multi_window::Windows") + } + + pub fn index_from_id(&self, id: window::Id) -> usize { + self.ids + .iter() + .position(|window_id| *window_id == id) + .expect("No window in multi_window::Windows") + } + + pub fn last_monitor(&self) -> Option<MonitorHandle> { + self.raw.last().and_then(|w| w.current_monitor()) + } + + pub fn last(&self) -> usize { + self.ids.len() - 1 + } + + pub fn with_raw(&self, id: window::Id) -> &winit::window::Window { + let i = self.index_from_id(id); + &self.raw[i] + } + + /// Deletes the window with `id` from [`Windows`]. Returns the index that the window had. + pub fn delete(&mut self, id: window::Id) -> usize { + let i = self.index_from_id(id); + + let id = self.ids.remove(i); + let window = self.raw.remove(i); + let _ = self.states.remove(i); + let _ = self.viewport_versions.remove(i); + let _ = self.surfaces.remove(i); + + self.pending_destroy.push((id, window.id())); + + i + } + + /// Gets the winit `window` that is pending to be destroyed if it exists. + pub fn get_pending_destroy( + &mut self, + window: winit::window::WindowId, + ) -> window::Id { + let i = self + .pending_destroy + .iter() + .position(|(_, window_id)| window == *window_id) + .unwrap(); + + let (id, _) = self.pending_destroy.remove(i); + id + } +} diff --git a/winit/src/profiler.rs b/winit/src/profiler.rs deleted file mode 100644 index 7031507a..00000000 --- a/winit/src/profiler.rs +++ /dev/null @@ -1,101 +0,0 @@ -//! A simple profiler for Iced. -use std::ffi::OsStr; -use std::path::Path; -use std::time::Duration; -use tracing_subscriber::prelude::*; -use tracing_subscriber::Registry; -#[cfg(feature = "chrome-trace")] -use { - tracing_chrome::FlushGuard, - tracing_subscriber::fmt::{format::DefaultFields, FormattedFields}, -}; - -/// Profiler state. This will likely need to be updated or reworked when adding new tracing backends. -#[allow(missing_debug_implementations)] -pub struct Profiler { - #[cfg(feature = "chrome-trace")] - /// [`FlushGuard`] must not be dropped until the application scope is dropped for accurate tracing. - _guard: FlushGuard, -} - -impl Profiler { - /// Initializes the [`Profiler`]. - pub fn init() -> Self { - // Registry stores the spans & generates unique span IDs - let subscriber = Registry::default(); - - let default_path = Path::new(env!("CARGO_MANIFEST_DIR")); - let curr_exe = std::env::current_exe() - .unwrap_or_else(|_| default_path.to_path_buf()); - let out_dir = curr_exe.parent().unwrap_or(default_path).join("traces"); - - #[cfg(feature = "chrome-trace")] - let (chrome_layer, guard) = { - let mut layer = tracing_chrome::ChromeLayerBuilder::new(); - - // Optional configurable env var: CHROME_TRACE_FILE=/path/to/trace_file/file.json, - // for uploading to chrome://tracing (old) or ui.perfetto.dev (new). - if let Ok(path) = std::env::var("CHROME_TRACE_FILE") { - layer = layer.file(path); - } else if std::fs::create_dir_all(&out_dir).is_ok() { - let time = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or(Duration::from_millis(0)) - .as_millis(); - - let curr_exe_name = curr_exe - .file_name() - .unwrap_or_else(|| OsStr::new("trace")) - .to_str() - .unwrap_or("trace"); - - let path = - out_dir.join(format!("{curr_exe_name}_trace_{time}.json")); - - layer = layer.file(path); - } else { - layer = layer.file(env!("CARGO_MANIFEST_DIR")) - } - - let (chrome_layer, guard) = layer - .name_fn(Box::new(|event_or_span| match event_or_span { - tracing_chrome::EventOrSpan::Event(event) => { - event.metadata().name().into() - } - tracing_chrome::EventOrSpan::Span(span) => { - if let Some(fields) = span - .extensions() - .get::<FormattedFields<DefaultFields>>() - { - format!( - "{}: {}", - span.metadata().name(), - fields.fields.as_str() - ) - } else { - span.metadata().name().into() - } - } - })) - .build(); - - (chrome_layer, guard) - }; - - let fmt_layer = tracing_subscriber::fmt::Layer::default(); - let subscriber = subscriber.with(fmt_layer); - - #[cfg(feature = "chrome-trace")] - let subscriber = subscriber.with(chrome_layer); - - // create dispatcher which will forward span events to the subscriber - // this can only be set once or will panic - tracing::subscriber::set_global_default(subscriber) - .expect("Tracer could not set the global default subscriber."); - - Profiler { - #[cfg(feature = "chrome-trace")] - _guard: guard, - } - } -} diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 40b3d487..2b846fbd 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -1,35 +1,10 @@ //! Configure your application. -#[cfg(target_os = "windows")] -#[path = "settings/windows.rs"] -mod platform; - -#[cfg(target_os = "macos")] -#[path = "settings/macos.rs"] -mod platform; - -#[cfg(target_arch = "wasm32")] -#[path = "settings/wasm.rs"] -mod platform; - -#[cfg(not(any( - target_os = "windows", - target_os = "macos", - target_arch = "wasm32" -)))] -#[path = "settings/other.rs"] -mod platform; - -pub use platform::PlatformSpecific; - use crate::conversion; -use crate::core::window::{Icon, Level}; -use crate::Position; +use crate::core::window; use winit::monitor::MonitorHandle; use winit::window::WindowBuilder; -use std::fmt; - /// The settings of an application. #[derive(Debug, Clone, Default)] pub struct Settings<Flags> { @@ -40,7 +15,7 @@ pub struct Settings<Flags> { pub id: Option<String>, /// The [`Window`] settings. - pub window: Window, + pub window: window::Settings, /// The data needed to initialize an [`Application`]. /// @@ -50,166 +25,93 @@ pub struct Settings<Flags> { /// Whether the [`Application`] should exit when the user requests the /// window to close (e.g. the user presses the close button). /// + /// With a [`multi_window::Application`] this will instead be used to determine whether the + /// application should exit when the "main"" window is closed, i.e. the first window created on + /// app launch. + /// /// [`Application`]: crate::Application pub exit_on_close_request: bool, } -/// The window settings of an application. -#[derive(Clone)] -pub struct Window { - /// The size of the window. - pub size: (u32, u32), +/// Converts the window settings into a `WindowBuilder` from `winit`. +pub fn window_builder( + settings: window::Settings, + title: &str, + monitor: Option<MonitorHandle>, + _id: Option<String>, +) -> WindowBuilder { + let mut window_builder = WindowBuilder::new(); - /// The position of the window. - pub position: Position, + let (width, height) = settings.size; - /// The minimum size of the window. - pub min_size: Option<(u32, u32)>, + window_builder = window_builder + .with_title(title) + .with_inner_size(winit::dpi::LogicalSize { width, height }) + .with_resizable(settings.resizable) + .with_decorations(settings.decorations) + .with_transparent(settings.transparent) + .with_window_icon(settings.icon.and_then(conversion::icon)) + .with_window_level(conversion::window_level(settings.level)) + .with_visible(settings.visible); - /// The maximum size of the window. - pub max_size: Option<(u32, u32)>, - - /// Whether the window should be visible or not. - pub visible: bool, - - /// Whether the window should be resizable or not. - pub resizable: bool, - - /// Whether the window should have a border, a title bar, etc. - pub decorations: bool, - - /// Whether the window should be transparent. - pub transparent: bool, - - /// The window [`Level`]. - pub level: Level, - - /// The window icon, which is also usually used in the taskbar - pub icon: Option<Icon>, - - /// Platform specific settings. - pub platform_specific: platform::PlatformSpecific, -} - -impl fmt::Debug for Window { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Window") - .field("size", &self.size) - .field("position", &self.position) - .field("min_size", &self.min_size) - .field("max_size", &self.max_size) - .field("visible", &self.visible) - .field("resizable", &self.resizable) - .field("decorations", &self.decorations) - .field("transparent", &self.transparent) - .field("level", &self.level) - .field("icon", &self.icon.is_some()) - .field("platform_specific", &self.platform_specific) - .finish() + if let Some(position) = + conversion::position(monitor.as_ref(), settings.size, settings.position) + { + window_builder = window_builder.with_position(position); } -} -impl Window { - /// Converts the window settings into a `WindowBuilder` from `winit`. - pub fn into_builder( - self, - title: &str, - primary_monitor: Option<MonitorHandle>, - _id: Option<String>, - ) -> WindowBuilder { - let mut window_builder = WindowBuilder::new(); + if let Some((width, height)) = settings.min_size { + window_builder = window_builder + .with_min_inner_size(winit::dpi::LogicalSize { width, height }); + } - let (width, height) = self.size; + if let Some((width, height)) = settings.max_size { + window_builder = window_builder + .with_max_inner_size(winit::dpi::LogicalSize { width, height }); + } + + #[cfg(any( + target_os = "linux", + target_os = "dragonfly", + target_os = "freebsd", + target_os = "netbsd", + target_os = "openbsd" + ))] + { + // `with_name` is available on both `WindowBuilderExtWayland` and `WindowBuilderExtX11` and they do + // exactly the same thing. We arbitrarily choose `WindowBuilderExtWayland` here. + use ::winit::platform::wayland::WindowBuilderExtWayland; + + if let Some(id) = _id { + window_builder = window_builder.with_name(id.clone(), id); + } + } + + #[cfg(target_os = "windows")] + { + use winit::platform::windows::WindowBuilderExtWindows; + #[allow(unsafe_code)] + unsafe { + window_builder = window_builder + .with_parent_window(settings.platform_specific.parent); + } + window_builder = window_builder + .with_drag_and_drop(settings.platform_specific.drag_and_drop); + } + + #[cfg(target_os = "macos")] + { + use winit::platform::macos::WindowBuilderExtMacOS; window_builder = window_builder - .with_title(title) - .with_inner_size(winit::dpi::LogicalSize { width, height }) - .with_resizable(self.resizable) - .with_decorations(self.decorations) - .with_transparent(self.transparent) - .with_window_icon(self.icon.and_then(conversion::icon)) - .with_window_level(conversion::window_level(self.level)) - .with_visible(self.visible); - - if let Some(position) = conversion::position( - primary_monitor.as_ref(), - self.size, - self.position, - ) { - window_builder = window_builder.with_position(position); - } - - if let Some((width, height)) = self.min_size { - window_builder = window_builder - .with_min_inner_size(winit::dpi::LogicalSize { width, height }); - } - - if let Some((width, height)) = self.max_size { - window_builder = window_builder - .with_max_inner_size(winit::dpi::LogicalSize { width, height }); - } - - #[cfg(any( - target_os = "linux", - target_os = "dragonfly", - target_os = "freebsd", - target_os = "netbsd", - target_os = "openbsd" - ))] - { - // `with_name` is available on both `WindowBuilderExtWayland` and `WindowBuilderExtX11` and they do - // exactly the same thing. We arbitrarily choose `WindowBuilderExtWayland` here. - use ::winit::platform::wayland::WindowBuilderExtWayland; - - if let Some(id) = _id { - window_builder = window_builder.with_name(id.clone(), id); - } - } - - #[cfg(target_os = "windows")] - { - use winit::platform::windows::WindowBuilderExtWindows; - #[allow(unsafe_code)] - unsafe { - window_builder = window_builder - .with_parent_window(self.platform_specific.parent); - } - window_builder = window_builder - .with_drag_and_drop(self.platform_specific.drag_and_drop); - } - - #[cfg(target_os = "macos")] - { - use winit::platform::macos::WindowBuilderExtMacOS; - - window_builder = window_builder - .with_title_hidden(self.platform_specific.title_hidden) - .with_titlebar_transparent( - self.platform_specific.titlebar_transparent, - ) - .with_fullsize_content_view( - self.platform_specific.fullsize_content_view, - ); - } - - window_builder + .with_title_hidden(settings.platform_specific.title_hidden) + .with_titlebar_transparent( + settings.platform_specific.titlebar_transparent, + ) + .with_fullsize_content_view( + settings.platform_specific.fullsize_content_view, + ); } -} -impl Default for Window { - fn default() -> Window { - Window { - size: (1024, 768), - position: Position::default(), - min_size: None, - max_size: None, - visible: true, - resizable: true, - decorations: true, - transparent: false, - level: Level::default(), - icon: None, - platform_specific: Default::default(), - } - } + window_builder } diff --git a/winit/src/window.rs b/winit/src/window.rs deleted file mode 100644 index e69de29b..00000000 From 83c7870c569a2976923ee6243a19813094d44673 Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Mon, 24 Jul 2023 14:32:59 -0700 Subject: [PATCH 051/286] Moved `exit_on_close_request` to window settings. This now controls whether each INDIVIDUAL window should close on CloseRequested events. --- core/src/window/event.rs | 3 - core/src/window/settings.rs | 11 +++ examples/multi_window/src/main.rs | 6 +- src/settings.rs | 11 --- winit/src/application.rs | 4 +- winit/src/multi_window.rs | 142 ++++++++++++++++++------------ winit/src/multi_window/windows.rs | 26 ++++++ winit/src/settings.rs | 12 +-- 8 files changed, 130 insertions(+), 85 deletions(-) diff --git a/core/src/window/event.rs b/core/src/window/event.rs index 3efce05e..f7759435 100644 --- a/core/src/window/event.rs +++ b/core/src/window/event.rs @@ -28,9 +28,6 @@ pub enum Event { RedrawRequested(Instant), /// The user has requested for the window to close. - /// - /// Usually, you will want to terminate the execution whenever this event - /// occurs. CloseRequested, /// A window was destroyed by the runtime. diff --git a/core/src/window/settings.rs b/core/src/window/settings.rs index 20811e83..eba27914 100644 --- a/core/src/window/settings.rs +++ b/core/src/window/settings.rs @@ -57,6 +57,16 @@ pub struct Settings { /// Platform specific settings. pub platform_specific: PlatformSpecific, + + /// Whether the window will close when the user requests it, e.g. when a user presses the + /// close button. + /// + /// This can be useful if you want to have some behavior that executes before the window is + /// actually destroyed. If you disable this, you must manually close the window with the + /// `window::close` command. + /// + /// By default this is enabled. + pub exit_on_close_request: bool, } impl Default for Settings { @@ -73,6 +83,7 @@ impl Default for Settings { level: Level::default(), icon: None, platform_specific: Default::default(), + exit_on_close_request: true, } } } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 58604702..51ec3595 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -8,10 +8,7 @@ use iced::{ use std::collections::HashMap; fn main() -> iced::Result { - Example::run(Settings { - exit_on_close_request: false, - ..Default::default() - }) + Example::run(Settings::default()) } #[derive(Default)] @@ -111,6 +108,7 @@ impl multi_window::Application for Example { id, window::Settings { position: self.next_window_pos, + exit_on_close_request: count % 2 == 0, ..Default::default() }, ); diff --git a/src/settings.rs b/src/settings.rs index 4ce2d135..e2a43581 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -41,14 +41,6 @@ pub struct Settings<Flags> { /// /// [`Canvas`]: crate::widget::Canvas pub antialiasing: bool, - - /// Whether the [`Application`] should exit when the user requests the - /// window to close (e.g. the user presses the close button). - /// - /// By default, it is enabled. - /// - /// [`Application`]: crate::Application - pub exit_on_close_request: bool, } impl<Flags> Settings<Flags> { @@ -65,7 +57,6 @@ impl<Flags> Settings<Flags> { default_font: default_settings.default_font, default_text_size: default_settings.default_text_size, antialiasing: default_settings.antialiasing, - exit_on_close_request: default_settings.exit_on_close_request, } } } @@ -82,7 +73,6 @@ where default_font: Default::default(), default_text_size: 16.0, antialiasing: false, - exit_on_close_request: true, } } } @@ -93,7 +83,6 @@ impl<Flags> From<Settings<Flags>> for iced_winit::Settings<Flags> { id: settings.id, window: settings.window, flags: settings.flags, - exit_on_close_request: settings.exit_on_close_request, } } } diff --git a/winit/src/application.rs b/winit/src/application.rs index 5c45bbda..cffcb884 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -136,6 +136,8 @@ where let target = settings.window.platform_specific.target.clone(); let should_be_visible = settings.window.visible; + let exit_on_close_request = settings.window.exit_on_close_request; + let builder = settings::window_builder( settings.window, &application.title(), @@ -197,7 +199,7 @@ where init_command, window, should_be_visible, - settings.exit_on_close_request, + exit_on_close_request, )); let mut context = task::Context::from_waker(task::noop_waker_ref()); diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index e6f440bc..b67c0a48 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -46,7 +46,14 @@ pub enum Event<Message> { /// An internal event for closing a window. CloseWindow(window::Id), /// An internal event for when the window has finished being created. - WindowCreated(window::Id, winit::window::Window), + WindowCreated { + /// The internal ID of the window. + id: window::Id, + /// The raw window. + window: winit::window::Window, + /// Whether or not the window should close when a user requests it does. + exit_on_close_request: bool, + }, } #[allow(unsafe_code)] @@ -161,6 +168,8 @@ where }; let should_main_be_visible = settings.window.visible; + let exit_on_close_request = settings.window.exit_on_close_request; + let builder = window_builder( settings.window, &application.title(window::Id::MAIN), @@ -208,8 +217,13 @@ where let (mut compositor, renderer) = C::new(compositor_settings, Some(&main_window))?; - let windows = - Windows::new(&application, &mut compositor, renderer, main_window); + let windows = Windows::new( + &application, + &mut compositor, + renderer, + main_window, + exit_on_close_request, + ); let (mut event_sender, event_receiver) = mpsc::unbounded(); let (control_sender, mut control_receiver) = mpsc::unbounded(); @@ -225,7 +239,6 @@ where init_command, windows, should_main_be_visible, - settings.exit_on_close_request, )); let mut context = task::Context::from_waker(task::noop_waker_ref()); @@ -255,14 +268,18 @@ where title, monitor, }) => { + let exit_on_close_request = settings.exit_on_close_request; + let window = settings::window_builder(settings, &title, monitor, None) .build(window_target) .expect("Failed to build window"); - Some(winit::event::Event::UserEvent(Event::WindowCreated( - id, window, - ))) + Some(winit::event::Event::UserEvent(Event::WindowCreated { + id, + window, + exit_on_close_request, + })) } _ => event.to_static(), }; @@ -299,7 +316,6 @@ async fn run_instance<A, E, C>( init_command: Command<A::Message>, mut windows: Windows<A, C>, should_main_window_be_visible: bool, - exit_on_main_closed: bool, ) where A: Application + 'static, E: Executor + 'static, @@ -548,11 +564,20 @@ async fn run_instance<A, E, C>( Event::Application(message) => { messages.push(message); } - Event::WindowCreated(id, window) => { + Event::WindowCreated { + id, + window, + exit_on_close_request, + } => { let bounds = logical_bounds_of(&window); - let (inner_size, i) = - windows.add(&application, &mut compositor, id, window); + let (inner_size, i) = windows.add( + &application, + &mut compositor, + id, + window, + exit_on_close_request, + ); user_interfaces.push(build_user_interface( &application, @@ -680,50 +705,61 @@ async fn run_instance<A, E, C>( event: window_event, window_id, } => { - let window_deleted = windows - .pending_destroy - .iter() - .any(|(_, w_id)| window_id == *w_id); + let window_index = + windows.raw.iter().position(|w| w.id() == window_id); - if matches!(window_event, winit::event::WindowEvent::Destroyed) - { - // This is the only special case, since in order trigger the Destroyed event the - // window reference from winit must be dropped, but we still want to inform the - // user that the window was destroyed so they can clean up any specific window - // code for this window - let id = windows.get_pending_destroy(window_id); + match window_index { + Some(i) => { + let id = windows.ids[i]; + let raw = &windows.raw[i]; + let exit_on_close_request = + windows.exit_on_close_requested[i]; - events.push(( - None, - core::Event::Window(id, window::Event::Destroyed), - )); - } else if !window_deleted { - let i = windows.index_from_raw(window_id); - let id = windows.ids[i]; - let raw = &windows.raw[i]; - let state = &mut windows.states[i]; + if matches!( + window_event, + winit::event::WindowEvent::CloseRequested + ) && exit_on_close_request + { + let i = windows.delete(id); + let _ = user_interfaces.remove(i); + let _ = ui_caches.remove(i); - // first check if we need to just break the entire application - // e.g. a user does a force quit on MacOS, or if a user has set "exit on main closed" - // as an option in window settings and wants to close the main window - if requests_exit( - i, - exit_on_main_closed, - &window_event, - state.modifiers(), - ) { - break 'main; + if windows.is_empty() { + break 'main; + } + } else { + let state = &mut windows.states[i]; + state.update(raw, &window_event, &mut debug); + + if let Some(event) = conversion::window_event( + id, + &window_event, + state.scale_factor(), + state.modifiers(), + ) { + events.push((Some(id), event)); + } + } } + None => { + // This is the only special case, since in order to trigger the Destroyed event the + // window reference from winit must be dropped, but we still want to inform the + // user that the window was destroyed so they can clean up any specific window + // code for this window + if matches!( + window_event, + winit::event::WindowEvent::Destroyed + ) { + let id = windows.get_pending_destroy(window_id); - state.update(raw, &window_event, &mut debug); - - if let Some(event) = conversion::window_event( - id, - &window_event, - state.scale_factor(), - state.modifiers(), - ) { - events.push((Some(id), event)); + events.push(( + None, + core::Event::Window( + id, + window::Event::Destroyed, + ), + )); + } } } } @@ -1068,17 +1104,13 @@ where /// Returns true if the provided event should cause an [`Application`] to /// exit. -pub fn requests_exit( - window: usize, - exit_on_main_closed: bool, +pub fn user_force_quit( event: &winit::event::WindowEvent<'_>, _modifiers: winit::event::ModifiersState, ) -> bool { use winit::event::WindowEvent; - //TODO alt f4..? match event { - WindowEvent::CloseRequested => exit_on_main_closed && window == 0, #[cfg(target_os = "macos")] WindowEvent::KeyboardInput { input: diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs index 7b63defa..1f606b31 100644 --- a/winit/src/multi_window/windows.rs +++ b/winit/src/multi_window/windows.rs @@ -14,6 +14,7 @@ where pub raw: Vec<winit::window::Window>, pub states: Vec<State<A>>, pub viewport_versions: Vec<usize>, + pub exit_on_close_requested: Vec<bool>, pub surfaces: Vec<C::Surface>, pub renderers: Vec<A::Renderer>, pub pending_destroy: Vec<(window::Id, winit::window::WindowId)>, @@ -52,6 +53,7 @@ where compositor: &mut C, renderer: A::Renderer, main: winit::window::Window, + exit_on_close_requested: bool, ) -> Self { let state = State::new(application, window::Id::MAIN, &main); let viewport_version = state.viewport_version(); @@ -67,6 +69,7 @@ where raw: vec![main], states: vec![state], viewport_versions: vec![viewport_version], + exit_on_close_requested: vec![exit_on_close_requested], surfaces: vec![surface], renderers: vec![renderer], pending_destroy: vec![], @@ -81,6 +84,7 @@ where compositor: &mut C, id: window::Id, window: winit::window::Window, + exit_on_close_requested: bool, ) -> (Size, usize) { let state = State::new(application, id, &window); let window_size = state.logical_size(); @@ -96,6 +100,7 @@ where self.ids.push(id); self.raw.push(window); self.states.push(state); + self.exit_on_close_requested.push(exit_on_close_requested); self.viewport_versions.push(viewport_version); self.surfaces.push(surface); self.renderers.push(renderer); @@ -145,6 +150,7 @@ where let id = self.ids.remove(i); let window = self.raw.remove(i); let _ = self.states.remove(i); + let _ = self.exit_on_close_requested.remove(i); let _ = self.viewport_versions.remove(i); let _ = self.surfaces.remove(i); @@ -167,4 +173,24 @@ where let (id, _) = self.pending_destroy.remove(i); id } + + /// Returns the windows that need to be requested to closed, and also the windows that can be + /// closed immediately. + pub fn partition_close_requests(&self) -> (Vec<window::Id>, Vec<window::Id>) { + self.exit_on_close_requested.iter().enumerate().fold( + (vec![], vec![]), + |(mut close_immediately, mut needs_request_closed), + (i, close)| { + let id = self.ids[i]; + + if *close { + close_immediately.push(id); + } else { + needs_request_closed.push(id); + } + + (close_immediately, needs_request_closed) + }, + ) + } } diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 2b846fbd..c0b3b047 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -1,6 +1,6 @@ //! Configure your application. -use crate::conversion; use crate::core::window; +use crate::conversion; use winit::monitor::MonitorHandle; use winit::window::WindowBuilder; @@ -21,16 +21,6 @@ pub struct Settings<Flags> { /// /// [`Application`]: crate::Application pub flags: Flags, - - /// Whether the [`Application`] should exit when the user requests the - /// window to close (e.g. the user presses the close button). - /// - /// With a [`multi_window::Application`] this will instead be used to determine whether the - /// application should exit when the "main"" window is closed, i.e. the first window created on - /// app launch. - /// - /// [`Application`]: crate::Application - pub exit_on_close_request: bool, } /// Converts the window settings into a `WindowBuilder` from `winit`. From 346af3f8b0baa418fd37b878bc2930ff0bd57cc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 11 Sep 2023 02:47:24 +0200 Subject: [PATCH 052/286] Make `FontSystem` global and simplify `Paragraph` API --- core/src/renderer/null.rs | 34 +------- core/src/text.rs | 90 ++++++-------------- core/src/widget/text.rs | 23 +++--- graphics/Cargo.toml | 12 +-- graphics/src/backend.rs | 4 - graphics/src/renderer.rs | 35 -------- graphics/src/text.rs | 47 +++++------ graphics/src/text/paragraph.rs | 145 ++++++++++++++++----------------- renderer/src/lib.rs | 16 ---- tiny_skia/src/backend.rs | 5 -- tiny_skia/src/text.rs | 21 ++--- wgpu/src/backend.rs | 5 -- wgpu/src/text.rs | 17 ++-- widget/src/pick_list.rs | 22 ++--- widget/src/text_input.rs | 17 ++-- 15 files changed, 165 insertions(+), 328 deletions(-) diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 55d58a59..0ffd3649 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -58,16 +58,6 @@ impl text::Renderer for Null { fn load_font(&mut self, _font: Cow<'static, [u8]>) {} - fn create_paragraph(&self, _text: Text<'_, Self::Font>) -> Self::Paragraph { - } - - fn resize_paragraph( - &self, - _paragraph: &mut Self::Paragraph, - _new_bounds: Size, - ) { - } - fn fill_paragraph( &mut self, _paragraph: &Self::Paragraph, @@ -88,24 +78,12 @@ impl text::Renderer for Null { impl text::Paragraph for () { type Font = Font; - fn content(&self) -> &str { - "" - } + fn with_text(_text: Text<'_, Self::Font>) -> Self {} - fn text_size(&self) -> Pixels { - Pixels(16.0) - } + fn resize(&mut self, _new_bounds: Size) {} - fn font(&self) -> Self::Font { - Font::default() - } - - fn line_height(&self) -> text::LineHeight { - text::LineHeight::default() - } - - fn shaping(&self) -> text::Shaping { - text::Shaping::default() + fn compare(&self, _text: Text<'_, Self::Font>) -> text::Difference { + text::Difference::None } fn horizontal_alignment(&self) -> alignment::Horizontal { @@ -120,10 +98,6 @@ impl text::Paragraph for () { None } - fn bounds(&self) -> Size { - Size::ZERO - } - fn min_bounds(&self) -> Size { Size::ZERO } diff --git a/core/src/text.rs b/core/src/text.rs index 0e3617b1..ff85696e 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -156,33 +156,6 @@ pub trait Renderer: crate::Renderer { /// Loads a [`Self::Font`] from its bytes. fn load_font(&mut self, font: Cow<'static, [u8]>); - /// Creates a new [`Paragraph`] laid out with the given [`Text`]. - fn create_paragraph(&self, text: Text<'_, Self::Font>) -> Self::Paragraph; - - /// Lays out the given [`Paragraph`] with some new boundaries. - fn resize_paragraph( - &self, - paragraph: &mut Self::Paragraph, - new_bounds: Size, - ); - - /// Updates a [`Paragraph`] to match the given [`Text`], if needed. - fn update_paragraph( - &self, - paragraph: &mut Self::Paragraph, - text: Text<'_, Self::Font>, - ) { - match compare(paragraph, text) { - Difference::None => {} - Difference::Bounds => { - self.resize_paragraph(paragraph, text.bounds); - } - Difference::Shape => { - *paragraph = self.create_paragraph(text); - } - } - } - /// Draws the given [`Paragraph`] at the given position and with the given /// [`Color`]. fn fill_paragraph( @@ -201,25 +174,21 @@ pub trait Renderer: crate::Renderer { color: Color, ); } + /// A text paragraph. -pub trait Paragraph: Default { +pub trait Paragraph: Sized + Default { /// The font of this [`Paragraph`]. - type Font; + type Font: Copy + PartialEq; - /// Returns the content of the [`Paragraph`]. - fn content(&self) -> &str; + /// Creates a new [`Paragraph`] laid out with the given [`Text`]. + fn with_text(text: Text<'_, Self::Font>) -> Self; - /// Returns the text size of the [`Paragraph`]. - fn text_size(&self) -> Pixels; + /// Lays out the [`Paragraph`] with some new boundaries. + fn resize(&mut self, new_bounds: Size); - /// Returns the [`LineHeight`] of the [`Paragraph`]. - fn line_height(&self) -> LineHeight; - - /// Returns the [`Self::Font`] of the [`Paragraph`]. - fn font(&self) -> Self::Font; - - /// Returns the [`Shaping`] strategy of the [`Paragraph`]. - fn shaping(&self) -> Shaping; + /// Compares the [`Paragraph`] with some desired [`Text`] and returns the + /// [`Difference`]. + fn compare(&self, text: Text<'_, Self::Font>) -> Difference; /// Returns the horizontal alignment of the [`Paragraph`]. fn horizontal_alignment(&self) -> alignment::Horizontal; @@ -227,9 +196,6 @@ pub trait Paragraph: Default { /// Returns the vertical alignment of the [`Paragraph`]. fn vertical_alignment(&self) -> alignment::Vertical; - /// Returns the boundaries of the [`Paragraph`]. - fn bounds(&self) -> Size; - /// Returns the minimum boundaries that can fit the contents of the /// [`Paragraph`]. fn min_bounds(&self) -> Size; @@ -241,6 +207,19 @@ pub trait Paragraph: Default { /// Returns the distance to the given grapheme index in the [`Paragraph`]. fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>; + /// Updates the [`Paragraph`] to match the given [`Text`], if needed. + fn update(&mut self, text: Text<'_, Self::Font>) { + match self.compare(text) { + Difference::None => {} + Difference::Bounds => { + self.resize(text.bounds); + } + Difference::Shape => { + *self = Self::with_text(text); + } + } + } + /// Returns the minimum width that can fit the contents of the [`Paragraph`]. fn min_width(&self) -> f32 { self.min_bounds().width @@ -276,26 +255,3 @@ pub enum Difference { /// the text is necessary. Shape, } - -/// Compares a [`Paragraph`] with some desired [`Text`] and returns the -/// [`Difference`]. -pub fn compare<Font: PartialEq>( - paragraph: &impl Paragraph<Font = Font>, - text: Text<'_, Font>, -) -> Difference { - if paragraph.content() != text.content - || paragraph.text_size() != text.size - || paragraph.line_height().to_absolute(text.size) - != text.line_height.to_absolute(text.size) - || paragraph.font() != text.font - || paragraph.shaping() != text.shaping - || paragraph.horizontal_alignment() != text.horizontal_alignment - || paragraph.vertical_alignment() != text.vertical_alignment - { - Difference::Shape - } else if paragraph.bounds() != text.bounds { - Difference::Bounds - } else { - Difference::None - } -} diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 53ed463e..c7c9f539 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -212,19 +212,16 @@ where let State(ref mut paragraph) = state; - renderer.update_paragraph( - paragraph, - text::Text { - content, - bounds, - size, - line_height, - font, - shaping, - horizontal_alignment, - vertical_alignment, - }, - ); + paragraph.update(text::Text { + content, + bounds, + size, + line_height, + font, + shaping, + horizontal_alignment, + vertical_alignment, + }); let size = limits.resolve(paragraph.min_bounds()); diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index ff698649..26bd1435 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -25,16 +25,15 @@ iced_core.workspace = true bitflags.workspace = true bytemuck.workspace = true +cosmic-text.workspace = true glam.workspace = true half.workspace = true log.workspace = true +once_cell.workspace = true raw-window-handle.workspace = true -thiserror.workspace = true -cosmic-text.workspace = true rustc-hash.workspace = true - -lyon_path.workspace = true -lyon_path.optional = true +thiserror.workspace = true +twox-hash.workspace = true image.workspace = true image.optional = true @@ -42,7 +41,8 @@ image.optional = true kamadak-exif.workspace = true kamadak-exif.optional = true -twox-hash.workspace = true +lyon_path.workspace = true +lyon_path.optional = true [target.'cfg(not(target_arch = "wasm32"))'.dependencies] twox-hash.workspace = true diff --git a/graphics/src/backend.rs b/graphics/src/backend.rs index c2ac82ba..10eb337f 100644 --- a/graphics/src/backend.rs +++ b/graphics/src/backend.rs @@ -2,7 +2,6 @@ use crate::core::image; use crate::core::svg; use crate::core::Size; -use crate::text; use std::borrow::Cow; @@ -18,9 +17,6 @@ pub trait Backend { pub trait Text { /// Loads a font from its bytes. fn load_font(&mut self, font: Cow<'static, [u8]>); - - /// Returns the [`cosmic_text::FontSystem`] of the [`Backend`]. - fn font_system(&self) -> &text::FontSystem; } /// A graphics backend that supports image rendering. diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index d4df29a5..c5033d36 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -158,41 +158,6 @@ where self.backend.load_font(bytes); } - fn create_paragraph(&self, text: Text<'_, Self::Font>) -> text::Paragraph { - text::Paragraph::with_text(text, self.backend.font_system()) - } - - fn update_paragraph( - &self, - paragraph: &mut Self::Paragraph, - text: Text<'_, Self::Font>, - ) { - let font_system = self.backend.font_system(); - - if paragraph.version() != font_system.version() { - // The font system has changed, paragraph fonts may be outdated - *paragraph = self.create_paragraph(text); - } else { - match core::text::compare(paragraph, text) { - core::text::Difference::None => {} - core::text::Difference::Bounds => { - self.resize_paragraph(paragraph, text.bounds); - } - core::text::Difference::Shape => { - *paragraph = self.create_paragraph(text); - } - } - } - } - - fn resize_paragraph( - &self, - paragraph: &mut Self::Paragraph, - new_bounds: Size, - ) { - paragraph.resize(new_bounds, self.backend.font_system()); - } - fn fill_paragraph( &mut self, paragraph: &Self::Paragraph, diff --git a/graphics/src/text.rs b/graphics/src/text.rs index bc06aa3c..f5ccaf52 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -10,40 +10,39 @@ use crate::core::font::{self, Font}; use crate::core::text::Shaping; use crate::core::Size; +use once_cell::sync::OnceCell; use std::borrow::Cow; -use std::sync::{self, Arc, RwLock}; +use std::sync::{Arc, RwLock}; -#[allow(missing_debug_implementations)] -pub struct FontSystem { - raw: RwLock<cosmic_text::FontSystem>, - version: Version, -} +pub fn font_system() -> &'static RwLock<FontSystem> { + static FONT_SYSTEM: OnceCell<RwLock<FontSystem>> = OnceCell::new(); -impl FontSystem { - pub fn new() -> Self { - FontSystem { - raw: RwLock::new(cosmic_text::FontSystem::new_with_fonts( + FONT_SYSTEM.get_or_init(|| { + RwLock::new(FontSystem { + raw: cosmic_text::FontSystem::new_with_fonts( [cosmic_text::fontdb::Source::Binary(Arc::new( include_bytes!("../fonts/Iced-Icons.ttf").as_slice(), ))] .into_iter(), - )), + ), version: Version::default(), - } - } + }) + }) +} - pub fn get_mut(&mut self) -> &mut cosmic_text::FontSystem { - self.raw.get_mut().expect("Lock font system") - } +#[allow(missing_debug_implementations)] +pub struct FontSystem { + raw: cosmic_text::FontSystem, + version: Version, +} - pub fn write( - &self, - ) -> (sync::RwLockWriteGuard<'_, cosmic_text::FontSystem>, Version) { - (self.raw.write().expect("Write font system"), self.version) +impl FontSystem { + pub fn raw(&mut self) -> &mut cosmic_text::FontSystem { + &mut self.raw } pub fn load_font(&mut self, bytes: Cow<'static, [u8]>) { - let _ = self.get_mut().db_mut().load_font_source( + let _ = self.raw.db_mut().load_font_source( cosmic_text::fontdb::Source::Binary(Arc::new(bytes.into_owned())), ); @@ -58,12 +57,6 @@ impl FontSystem { #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct Version(u32); -impl Default for FontSystem { - fn default() -> Self { - Self::new() - } -} - pub fn measure(buffer: &cosmic_text::Buffer) -> Size { let (width, total_lines) = buffer .layout_runs() diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index e4350cff..d0396e8e 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -2,7 +2,7 @@ use crate::core; use crate::core::alignment; use crate::core::text::{Hit, LineHeight, Shaping, Text}; use crate::core::{Font, Pixels, Point, Size}; -use crate::text::{self, FontSystem}; +use crate::text; use std::fmt; use std::sync::{self, Arc}; @@ -27,13 +27,39 @@ impl Paragraph { Self::default() } - pub fn with_text(text: Text<'_, Font>, font_system: &FontSystem) -> Self { + pub fn buffer(&self) -> &cosmic_text::Buffer { + &self.internal().buffer + } + + pub fn downgrade(&self) -> Weak { + let paragraph = self.internal(); + + Weak { + raw: Arc::downgrade(paragraph), + min_bounds: paragraph.min_bounds, + horizontal_alignment: paragraph.horizontal_alignment, + vertical_alignment: paragraph.vertical_alignment, + } + } + + fn internal(&self) -> &Arc<Internal> { + self.0 + .as_ref() + .expect("paragraph should always be initialized") + } +} + +impl core::text::Paragraph for Paragraph { + type Font = Font; + + fn with_text(text: Text<'_, Font>) -> Self { log::trace!("Allocating paragraph: {}", text.content); - let (mut font_system, version) = font_system.write(); + let mut font_system = + text::font_system().write().expect("Write font system"); let mut buffer = cosmic_text::Buffer::new( - &mut font_system, + font_system.raw(), cosmic_text::Metrics::new( text.size.into(), text.line_height.to_absolute(text.size).into(), @@ -41,13 +67,13 @@ impl Paragraph { ); buffer.set_size( - &mut font_system, + font_system.raw(), text.bounds.width, text.bounds.height, ); buffer.set_text( - &mut font_system, + font_system.raw(), text.content, text::to_attributes(text.font), text::to_shaping(text.shaping), @@ -64,30 +90,11 @@ impl Paragraph { shaping: text.shaping, bounds: text.bounds, min_bounds, - version, + version: font_system.version(), }))) } - pub fn buffer(&self) -> &cosmic_text::Buffer { - &self.internal().buffer - } - - pub fn version(&self) -> text::Version { - self.internal().version - } - - pub fn downgrade(&self) -> Weak { - let paragraph = self.internal(); - - Weak { - raw: Arc::downgrade(paragraph), - min_bounds: paragraph.min_bounds, - horizontal_alignment: paragraph.horizontal_alignment, - vertical_alignment: paragraph.vertical_alignment, - } - } - - pub fn resize(&mut self, new_bounds: Size, font_system: &FontSystem) { + fn resize(&mut self, new_bounds: Size) { let paragraph = self .0 .take() @@ -95,10 +102,11 @@ impl Paragraph { match Arc::try_unwrap(paragraph) { Ok(mut internal) => { - let (mut font_system, _) = font_system.write(); + let mut font_system = + text::font_system().write().expect("Write font system"); internal.buffer.set_size( - &mut font_system, + font_system.raw(), new_bounds.width, new_bounds.height, ); @@ -113,55 +121,42 @@ impl Paragraph { // If there is a strong reference somewhere, we recompute the // buffer from scratch - *self = Self::with_text( - Text { - content: &internal.content, - bounds: internal.bounds, - size: Pixels(metrics.font_size), - line_height: LineHeight::Absolute(Pixels( - metrics.line_height, - )), - font: internal.font, - horizontal_alignment: internal.horizontal_alignment, - vertical_alignment: internal.vertical_alignment, - shaping: internal.shaping, - }, - font_system, - ); + *self = Self::with_text(Text { + content: &internal.content, + bounds: internal.bounds, + size: Pixels(metrics.font_size), + line_height: LineHeight::Absolute(Pixels( + metrics.line_height, + )), + font: internal.font, + horizontal_alignment: internal.horizontal_alignment, + vertical_alignment: internal.vertical_alignment, + shaping: internal.shaping, + }); } } } - fn internal(&self) -> &Arc<Internal> { - self.0 - .as_ref() - .expect("paragraph should always be initialized") - } -} + fn compare(&self, text: Text<'_, Font>) -> core::text::Difference { + let font_system = text::font_system().read().expect("Read font system"); + let paragraph = self.internal(); + let metrics = paragraph.buffer.metrics(); -impl core::text::Paragraph for Paragraph { - type Font = Font; - - fn content(&self) -> &str { - &self.internal().content - } - - fn text_size(&self) -> Pixels { - Pixels(self.internal().buffer.metrics().font_size) - } - - fn line_height(&self) -> LineHeight { - LineHeight::Absolute(Pixels( - self.internal().buffer.metrics().line_height, - )) - } - - fn font(&self) -> Font { - self.internal().font - } - - fn shaping(&self) -> Shaping { - self.internal().shaping + if paragraph.version != font_system.version + || paragraph.content != text.content + || metrics.font_size != text.size.0 + || metrics.line_height != text.line_height.to_absolute(text.size).0 + || paragraph.font != text.font + || paragraph.shaping != text.shaping + || paragraph.horizontal_alignment != text.horizontal_alignment + || paragraph.vertical_alignment != text.vertical_alignment + { + core::text::Difference::Shape + } else if paragraph.bounds != text.bounds { + core::text::Difference::Bounds + } else { + core::text::Difference::None + } } fn horizontal_alignment(&self) -> alignment::Horizontal { @@ -172,10 +167,6 @@ impl core::text::Paragraph for Paragraph { self.internal().vertical_alignment } - fn bounds(&self) -> Size { - self.internal().bounds - } - fn min_bounds(&self) -> Size { self.internal().min_bounds } diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 8bdf231d..73e56890 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -173,22 +173,6 @@ impl<T> text::Renderer for Renderer<T> { delegate!(self, renderer, renderer.default_size()) } - fn create_paragraph(&self, text: Text<'_, Self::Font>) -> Self::Paragraph { - delegate!(self, renderer, renderer.create_paragraph(text)) - } - - fn resize_paragraph( - &self, - paragraph: &mut Self::Paragraph, - new_bounds: Size, - ) { - delegate!( - self, - renderer, - renderer.resize_paragraph(paragraph, new_bounds) - ); - } - fn load_font(&mut self, bytes: Cow<'static, [u8]>) { delegate!(self, renderer, renderer.load_font(bytes)); } diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index c721d96e..72184c8a 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -1,6 +1,5 @@ use crate::core::{Background, Color, Gradient, Rectangle, Vector}; use crate::graphics::backend; -use crate::graphics::text; use crate::graphics::{Damage, Viewport}; use crate::primitive::{self, Primitive}; @@ -805,10 +804,6 @@ impl iced_graphics::Backend for Backend { } impl backend::Text for Backend { - fn font_system(&self) -> &text::FontSystem { - self.text_pipeline.font_system() - } - fn load_font(&mut self, font: Cow<'static, [u8]>) { self.text_pipeline.load_font(font); } diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index cb3ef54c..4f6e3941 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -2,8 +2,8 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; use crate::core::{Color, Font, Pixels, Point, Rectangle}; use crate::graphics::text::cache::{self, Cache}; +use crate::graphics::text::font_system; use crate::graphics::text::paragraph; -use crate::graphics::text::FontSystem; use rustc_hash::{FxHashMap, FxHashSet}; use std::borrow::Cow; @@ -12,7 +12,6 @@ use std::collections::hash_map; #[allow(missing_debug_implementations)] pub struct Pipeline { - font_system: FontSystem, glyph_cache: GlyphCache, cache: RefCell<Cache>, } @@ -20,18 +19,16 @@ pub struct Pipeline { impl Pipeline { pub fn new() -> Self { Pipeline { - font_system: FontSystem::new(), glyph_cache: GlyphCache::new(), cache: RefCell::new(Cache::new()), } } - pub fn font_system(&self) -> &FontSystem { - &self.font_system - } - pub fn load_font(&mut self, bytes: Cow<'static, [u8]>) { - self.font_system.load_font(bytes); + font_system() + .write() + .expect("Write font system") + .load_font(bytes); self.cache = RefCell::new(Cache::new()); } @@ -51,8 +48,10 @@ impl Pipeline { return; }; + let mut font_system = font_system().write().expect("Write font system"); + draw( - self.font_system.get_mut(), + font_system.raw(), &mut self.glyph_cache, paragraph.buffer(), Rectangle::new(position, paragraph.min_bounds()), @@ -82,7 +81,9 @@ impl Pipeline { ) { let line_height = f32::from(line_height.to_absolute(size)); - let font_system = self.font_system.get_mut(); + let mut font_system = font_system().write().expect("Write font system"); + let font_system = font_system.raw(); + let key = cache::Key { bounds: bounds.size(), content, diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 65c63f19..3d1755e1 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -1,5 +1,4 @@ use crate::core::{Color, Size}; -use crate::graphics; use crate::graphics::backend; use crate::graphics::color; use crate::graphics::{Transformation, Viewport}; @@ -310,10 +309,6 @@ impl crate::graphics::Backend for Backend { } impl backend::Text for Backend { - fn font_system(&self) -> &graphics::text::FontSystem { - self.text_pipeline.font_system() - } - fn load_font(&mut self, font: Cow<'static, [u8]>) { self.text_pipeline.load_font(font); } diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index bd4f3e06..5c9f4d7e 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -2,7 +2,7 @@ use crate::core::alignment; use crate::core::{Rectangle, Size}; use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; -use crate::graphics::text::{FontSystem, Paragraph}; +use crate::graphics::text::{font_system, Paragraph}; use crate::layer::Text; use std::borrow::Cow; @@ -10,7 +10,6 @@ use std::cell::RefCell; #[allow(missing_debug_implementations)] pub struct Pipeline { - font_system: FontSystem, renderers: Vec<glyphon::TextRenderer>, atlas: glyphon::TextAtlas, prepare_layer: usize, @@ -24,7 +23,6 @@ impl Pipeline { format: wgpu::TextureFormat, ) -> Self { Pipeline { - font_system: FontSystem::new(), renderers: Vec::new(), atlas: glyphon::TextAtlas::with_color_mode( device, @@ -41,12 +39,11 @@ impl Pipeline { } } - pub fn font_system(&self) -> &FontSystem { - &self.font_system - } - pub fn load_font(&mut self, bytes: Cow<'static, [u8]>) { - self.font_system.load_font(bytes); + font_system() + .write() + .expect("Write font system") + .load_font(bytes); self.cache = RefCell::new(Cache::new()); } @@ -69,7 +66,9 @@ impl Pipeline { )); } - let font_system = self.font_system.get_mut(); + let mut font_system = font_system().write().expect("Write font system"); + let font_system = font_system.raw(); + let renderer = &mut self.renderers[self.prepare_layer]; let cache = self.cache.get_mut(); diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 056a5e65..4b89d6ff 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -415,23 +415,17 @@ where for (option, paragraph) in options.iter().zip(state.options.iter_mut()) { let label = option.to_string(); - renderer.update_paragraph( - paragraph, - Text { - content: &label, - ..option_text - }, - ); + paragraph.update(Text { + content: &label, + ..option_text + }); } if let Some(placeholder) = placeholder { - renderer.update_paragraph( - &mut state.placeholder, - Text { - content: placeholder, - ..option_text - }, - ); + state.placeholder.update(Text { + content: placeholder, + ..option_text + }); } let max_width = match width { diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 7d5ae806..f9a2d419 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -523,18 +523,15 @@ where shaping: text::Shaping::Advanced, }; - renderer.update_paragraph(&mut state.placeholder, placeholder_text); + state.placeholder.update(placeholder_text); let secure_value = is_secure.then(|| value.secure()); let value = secure_value.as_ref().unwrap_or(value); - renderer.update_paragraph( - &mut state.value, - Text { - content: &value.to_string(), - ..placeholder_text - }, - ); + state.value.update(Text { + content: &value.to_string(), + ..placeholder_text + }); if let Some(icon) = icon { let icon_text = Text { @@ -548,7 +545,7 @@ where shaping: text::Shaping::Advanced, }; - renderer.update_paragraph(&mut state.icon, icon_text); + state.icon.update(icon_text); let icon_width = state.icon.min_width(); @@ -1461,7 +1458,7 @@ fn replace_paragraph<Renderer>( let mut children_layout = layout.children(); let text_bounds = children_layout.next().unwrap().bounds(); - state.value = renderer.create_paragraph(Text { + state.value = Renderer::Paragraph::with_text(Text { font, line_height, content: &value.to_string(), From 6448429103c9c82b90040ac5a5a097bdded23f82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 12 Sep 2023 14:51:00 +0200 Subject: [PATCH 053/286] Draft `Editor` API and `TextEditor` widget --- core/src/layout/limits.rs | 2 +- core/src/lib.rs | 2 +- core/src/renderer/null.rs | 38 +++ core/src/text.rs | 123 ++++------ core/src/text/editor.rs | 68 ++++++ core/src/text/paragraph.rs | 59 +++++ examples/editor/Cargo.toml | 10 + examples/editor/src/main.rs | 49 ++++ graphics/src/damage.rs | 7 + graphics/src/primitive.rs | 10 + graphics/src/renderer.rs | 14 ++ graphics/src/text.rs | 2 + graphics/src/text/editor.rs | 327 ++++++++++++++++++++++++++ renderer/src/lib.rs | 19 +- style/src/lib.rs | 1 + style/src/text_editor.rs | 47 ++++ style/src/theme.rs | 113 +++++++++ tiny_skia/src/backend.rs | 25 ++ tiny_skia/src/text.rs | 32 +++ wgpu/src/layer.rs | 15 +- wgpu/src/layer/text.rs | 8 +- wgpu/src/text.rs | 28 ++- widget/src/helpers.rs | 15 ++ widget/src/lib.rs | 5 +- widget/src/text_editor.rs | 457 ++++++++++++++++++++++++++++++++++++ 25 files changed, 1384 insertions(+), 92 deletions(-) create mode 100644 core/src/text/editor.rs create mode 100644 core/src/text/paragraph.rs create mode 100644 examples/editor/Cargo.toml create mode 100644 examples/editor/src/main.rs create mode 100644 graphics/src/text/editor.rs create mode 100644 style/src/text_editor.rs create mode 100644 widget/src/text_editor.rs diff --git a/core/src/layout/limits.rs b/core/src/layout/limits.rs index 5d3c1556..39a3d98b 100644 --- a/core/src/layout/limits.rs +++ b/core/src/layout/limits.rs @@ -2,7 +2,7 @@ use crate::{Length, Padding, Size}; /// A set of size constraints for layouting. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct Limits { min: Size, max: Size, diff --git a/core/src/lib.rs b/core/src/lib.rs index 1bfba7bd..13a9f06b 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -12,7 +12,7 @@ #![forbid(unsafe_code, rust_2018_idioms)] #![deny( missing_debug_implementations, - missing_docs, + // missing_docs, unused_results, clippy::extra_unused_lifetimes, clippy::from_over_into, diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 0ffd3649..adf75969 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -43,6 +43,7 @@ impl Renderer for Null { impl text::Renderer for Null { type Font = Font; type Paragraph = (); + type Editor = (); const ICON_FONT: Font = Font::DEFAULT; const CHECKMARK_ICON: char = '0'; @@ -66,6 +67,14 @@ impl text::Renderer for Null { ) { } + fn fill_editor( + &mut self, + _editor: &Self::Editor, + _position: Point, + _color: Color, + ) { + } + fn fill_text( &mut self, _paragraph: Text<'_, Self::Font>, @@ -106,3 +115,32 @@ impl text::Paragraph for () { None } } + +impl text::Editor for () { + type Font = Font; + + fn with_text(_text: &str) -> Self {} + + fn cursor(&self) -> text::editor::Cursor { + text::editor::Cursor::Caret(Point::ORIGIN) + } + + fn perform(&mut self, _action: text::editor::Action) {} + + fn bounds(&self) -> Size { + Size::ZERO + } + + fn min_bounds(&self) -> Size { + Size::ZERO + } + + fn update( + &mut self, + _new_bounds: Size, + _new_font: Self::Font, + _new_size: Pixels, + _new_line_height: text::LineHeight, + ) { + } +} diff --git a/core/src/text.rs b/core/src/text.rs index ff85696e..5aacbcc5 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -1,4 +1,11 @@ //! Draw and interact with text. +mod paragraph; + +pub mod editor; + +pub use editor::Editor; +pub use paragraph::Paragraph; + use crate::alignment; use crate::{Color, Pixels, Point, Size}; @@ -126,6 +133,31 @@ impl Hit { } } +/// The difference detected in some text. +/// +/// You will obtain a [`Difference`] when you [`compare`] a [`Paragraph`] with some +/// [`Text`]. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Difference { + /// No difference. + /// + /// The text can be reused as it is! + None, + + /// A bounds difference. + /// + /// This normally means a relayout is necessary, but the shape of the text can + /// be reused. + Bounds, + + /// A shape difference. + /// + /// The contents, alignment, sizes, fonts, or any other essential attributes + /// of the shape of the text have changed. A complete reshape and relayout of + /// the text is necessary. + Shape, +} + /// A renderer capable of measuring and drawing [`Text`]. pub trait Renderer: crate::Renderer { /// The font type used. @@ -134,6 +166,9 @@ pub trait Renderer: crate::Renderer { /// The [`Paragraph`] of this [`Renderer`]. type Paragraph: Paragraph<Font = Self::Font> + 'static; + /// The [`Editor`] of this [`Renderer`]. + type Editor: Editor<Font = Self::Font> + 'static; + /// The icon font of the backend. const ICON_FONT: Self::Font; @@ -165,6 +200,13 @@ pub trait Renderer: crate::Renderer { color: Color, ); + fn fill_editor( + &mut self, + editor: &Self::Editor, + position: Point, + color: Color, + ); + /// Draws the given [`Text`] at the given position and with the given /// [`Color`]. fn fill_text( @@ -174,84 +216,3 @@ pub trait Renderer: crate::Renderer { color: Color, ); } - -/// A text paragraph. -pub trait Paragraph: Sized + Default { - /// The font of this [`Paragraph`]. - type Font: Copy + PartialEq; - - /// Creates a new [`Paragraph`] laid out with the given [`Text`]. - fn with_text(text: Text<'_, Self::Font>) -> Self; - - /// Lays out the [`Paragraph`] with some new boundaries. - fn resize(&mut self, new_bounds: Size); - - /// Compares the [`Paragraph`] with some desired [`Text`] and returns the - /// [`Difference`]. - fn compare(&self, text: Text<'_, Self::Font>) -> Difference; - - /// Returns the horizontal alignment of the [`Paragraph`]. - fn horizontal_alignment(&self) -> alignment::Horizontal; - - /// Returns the vertical alignment of the [`Paragraph`]. - fn vertical_alignment(&self) -> alignment::Vertical; - - /// Returns the minimum boundaries that can fit the contents of the - /// [`Paragraph`]. - fn min_bounds(&self) -> Size; - - /// Tests whether the provided point is within the boundaries of the - /// [`Paragraph`], returning information about the nearest character. - fn hit_test(&self, point: Point) -> Option<Hit>; - - /// Returns the distance to the given grapheme index in the [`Paragraph`]. - fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>; - - /// Updates the [`Paragraph`] to match the given [`Text`], if needed. - fn update(&mut self, text: Text<'_, Self::Font>) { - match self.compare(text) { - Difference::None => {} - Difference::Bounds => { - self.resize(text.bounds); - } - Difference::Shape => { - *self = Self::with_text(text); - } - } - } - - /// Returns the minimum width that can fit the contents of the [`Paragraph`]. - fn min_width(&self) -> f32 { - self.min_bounds().width - } - - /// Returns the minimum height that can fit the contents of the [`Paragraph`]. - fn min_height(&self) -> f32 { - self.min_bounds().height - } -} - -/// The difference detected in some text. -/// -/// You will obtain a [`Difference`] when you [`compare`] a [`Paragraph`] with some -/// [`Text`]. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum Difference { - /// No difference. - /// - /// The text can be reused as it is! - None, - - /// A bounds difference. - /// - /// This normally means a relayout is necessary, but the shape of the text can - /// be reused. - Bounds, - - /// A shape difference. - /// - /// The contents, alignment, sizes, fonts, or any other essential attributes - /// of the shape of the text have changed. A complete reshape and relayout of - /// the text is necessary. - Shape, -} diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs new file mode 100644 index 00000000..a4fd0ec1 --- /dev/null +++ b/core/src/text/editor.rs @@ -0,0 +1,68 @@ +use crate::text::LineHeight; +use crate::{Pixels, Point, Rectangle, Size}; + +pub trait Editor: Sized + Default { + type Font: Copy + PartialEq + Default; + + /// Creates a new [`Editor`] laid out with the given text. + fn with_text(text: &str) -> Self; + + fn cursor(&self) -> Cursor; + + fn perform(&mut self, action: Action); + + /// Returns the current boundaries of the [`Editor`]. + fn bounds(&self) -> Size; + + /// Returns the minimum boundaries that can fit the contents of the + /// [`Editor`]. + fn min_bounds(&self) -> Size; + + /// Updates the [`Editor`] with some new attributes. + fn update( + &mut self, + new_bounds: Size, + new_font: Self::Font, + new_size: Pixels, + new_line_height: LineHeight, + ); + + /// Returns the minimum width that can fit the contents of the [`Editor`]. + fn min_width(&self) -> f32 { + self.min_bounds().width + } + + /// Returns the minimum height that can fit the contents of the [`Editor`]. + fn min_height(&self) -> f32 { + self.min_bounds().height + } +} + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Action { + MoveLeft, + MoveRight, + MoveUp, + MoveDown, + MoveLeftWord, + MoveRightWord, + MoveHome, + MoveEnd, + SelectWord, + SelectLine, + Insert(char), + Backspace, + Delete, + Click(Point), + Drag(Point), +} + +/// The cursor of an [`Editor`]. +#[derive(Debug, Clone)] +pub enum Cursor { + /// Cursor without a selection + Caret(Point), + + /// Cursor selecting a range of text + Selection(Vec<Rectangle>), +} diff --git a/core/src/text/paragraph.rs b/core/src/text/paragraph.rs new file mode 100644 index 00000000..de1fb74d --- /dev/null +++ b/core/src/text/paragraph.rs @@ -0,0 +1,59 @@ +use crate::alignment; +use crate::text::{Difference, Hit, Text}; +use crate::{Point, Size}; + +/// A text paragraph. +pub trait Paragraph: Sized + Default { + /// The font of this [`Paragraph`]. + type Font: Copy + PartialEq; + + /// Creates a new [`Paragraph`] laid out with the given [`Text`]. + fn with_text(text: Text<'_, Self::Font>) -> Self; + + /// Lays out the [`Paragraph`] with some new boundaries. + fn resize(&mut self, new_bounds: Size); + + /// Compares the [`Paragraph`] with some desired [`Text`] and returns the + /// [`Difference`]. + fn compare(&self, text: Text<'_, Self::Font>) -> Difference; + + /// Returns the horizontal alignment of the [`Paragraph`]. + fn horizontal_alignment(&self) -> alignment::Horizontal; + + /// Returns the vertical alignment of the [`Paragraph`]. + fn vertical_alignment(&self) -> alignment::Vertical; + + /// Returns the minimum boundaries that can fit the contents of the + /// [`Paragraph`]. + fn min_bounds(&self) -> Size; + + /// Tests whether the provided point is within the boundaries of the + /// [`Paragraph`], returning information about the nearest character. + fn hit_test(&self, point: Point) -> Option<Hit>; + + /// Returns the distance to the given grapheme index in the [`Paragraph`]. + fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>; + + /// Updates the [`Paragraph`] to match the given [`Text`], if needed. + fn update(&mut self, text: Text<'_, Self::Font>) { + match self.compare(text) { + Difference::None => {} + Difference::Bounds => { + self.resize(text.bounds); + } + Difference::Shape => { + *self = Self::with_text(text); + } + } + } + + /// Returns the minimum width that can fit the contents of the [`Paragraph`]. + fn min_width(&self) -> f32 { + self.min_bounds().width + } + + /// Returns the minimum height that can fit the contents of the [`Paragraph`]. + fn min_height(&self) -> f32 { + self.min_bounds().height + } +} diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml new file mode 100644 index 00000000..528cf23c --- /dev/null +++ b/examples/editor/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "editor" +version = "0.1.0" +authors = ["Héctor Ramón Jiménez <hector@hecrj.dev>"] +edition = "2021" +publish = false + +[dependencies] +iced.workspace = true +iced.features = ["debug"] \ No newline at end of file diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs new file mode 100644 index 00000000..50989ac5 --- /dev/null +++ b/examples/editor/src/main.rs @@ -0,0 +1,49 @@ +use iced::widget::{container, text_editor}; +use iced::{Element, Font, Sandbox, Settings}; + +pub fn main() -> iced::Result { + Editor::run(Settings::default()) +} + +struct Editor { + content: text_editor::Content, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + Edit(text_editor::Action), +} + +impl Sandbox for Editor { + type Message = Message; + + fn new() -> Self { + Self { + content: text_editor::Content::with(include_str!( + "../../../README.md" + )), + } + } + + fn title(&self) -> String { + String::from("Editor - Iced") + } + + fn update(&mut self, message: Message) { + match message { + Message::Edit(action) => { + self.content.edit(action); + } + } + } + + fn view(&self) -> Element<Message> { + container( + text_editor(&self.content) + .on_edit(Message::Edit) + .font(Font::with_name("Hasklug Nerd Font Mono")), + ) + .padding(20) + .into() + } +} diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index 3276c2d4..595cc274 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -66,6 +66,13 @@ impl<T: Damage> Damage for Primitive<T> { bounds.expand(1.5) } + Self::Editor { + editor, position, .. + } => { + let bounds = Rectangle::new(*position, editor.bounds); + + bounds.expand(1.5) + } Self::Quad { bounds, .. } | Self::Image { bounds, .. } | Self::Svg { bounds, .. } => bounds.expand(1.0), diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 8a97e6e7..ce0b734b 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -4,6 +4,7 @@ use crate::core::image; use crate::core::svg; use crate::core::text; use crate::core::{Background, Color, Font, Pixels, Point, Rectangle, Vector}; +use crate::text::editor; use crate::text::paragraph; use std::sync::Arc; @@ -41,6 +42,15 @@ pub enum Primitive<T> { /// The color of the paragraph. color: Color, }, + /// An editor primitive + Editor { + /// The [`editor::Weak`] reference. + editor: editor::Weak, + /// The position of the paragraph. + position: Point, + /// The color of the paragraph. + color: Color, + }, /// A quad primitive Quad { /// The bounds of the quad diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index c5033d36..9b699183 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -141,6 +141,7 @@ where { type Font = Font; type Paragraph = text::Paragraph; + type Editor = text::Editor; const ICON_FONT: Font = Font::with_name("Iced-Icons"); const CHECKMARK_ICON: char = '\u{f00c}'; @@ -171,6 +172,19 @@ where }); } + fn fill_editor( + &mut self, + editor: &Self::Editor, + position: Point, + color: Color, + ) { + self.primitives.push(Primitive::Editor { + editor: editor.downgrade(), + position, + color, + }); + } + fn fill_text( &mut self, text: Text<'_, Self::Font>, diff --git a/graphics/src/text.rs b/graphics/src/text.rs index f5ccaf52..280e4f01 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -1,7 +1,9 @@ pub mod cache; +pub mod editor; pub mod paragraph; pub use cache::Cache; +pub use editor::Editor; pub use paragraph::Paragraph; pub use cosmic_text; diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs new file mode 100644 index 00000000..53f63fea --- /dev/null +++ b/graphics/src/text/editor.rs @@ -0,0 +1,327 @@ +use crate::core::text::editor::{self, Action, Cursor}; +use crate::core::text::LineHeight; +use crate::core::{Font, Pixels, Point, Size}; +use crate::text; + +use cosmic_text::Edit; + +use std::fmt; +use std::sync::{self, Arc}; + +#[derive(Debug, PartialEq)] +pub struct Editor(Option<Arc<Internal>>); + +struct Internal { + editor: cosmic_text::Editor, + font: Font, + bounds: Size, + min_bounds: Size, + version: text::Version, +} + +impl Editor { + pub fn new() -> Self { + Self::default() + } + + pub fn buffer(&self) -> &cosmic_text::Buffer { + &self.internal().editor.buffer() + } + + pub fn downgrade(&self) -> Weak { + let editor = self.internal(); + + Weak { + raw: Arc::downgrade(editor), + bounds: editor.bounds, + } + } + + fn internal(&self) -> &Arc<Internal> { + self.0 + .as_ref() + .expect("editor should always be initialized") + } +} + +impl editor::Editor for Editor { + type Font = Font; + + fn with_text(text: &str) -> Self { + let mut buffer = cosmic_text::Buffer::new_empty(cosmic_text::Metrics { + font_size: 1.0, + line_height: 1.0, + }); + + buffer.set_text( + text::font_system() + .write() + .expect("Write font system") + .raw(), + text, + cosmic_text::Attrs::new(), + cosmic_text::Shaping::Advanced, + ); + + Editor(Some(Arc::new(Internal { + editor: cosmic_text::Editor::new(buffer), + ..Default::default() + }))) + } + + fn cursor(&self) -> editor::Cursor { + let internal = self.internal(); + + match internal.editor.select_opt() { + Some(selection) => { + // TODO + Cursor::Selection(vec![]) + } + None => { + let cursor = internal.editor.cursor(); + let buffer = internal.editor.buffer(); + + let lines_before_cursor: usize = buffer + .lines + .iter() + .take(cursor.line) + .map(|line| { + line.layout_opt() + .as_ref() + .expect("Line layout should be cached") + .len() + }) + .sum(); + + let line = buffer + .lines + .get(cursor.line) + .expect("Cursor line should be present"); + + let layout = line + .layout_opt() + .as_ref() + .expect("Line layout should be cached"); + + let mut lines = layout.iter().enumerate(); + + let (subline, offset) = lines + .find_map(|(i, line)| { + let start = line + .glyphs + .first() + .map(|glyph| glyph.start) + .unwrap_or(0); + let end = line + .glyphs + .last() + .map(|glyph| glyph.end) + .unwrap_or(0); + + let is_cursor_after_start = start <= cursor.index; + + let is_cursor_before_end = match cursor.affinity { + cosmic_text::Affinity::Before => { + cursor.index <= end + } + cosmic_text::Affinity::After => cursor.index < end, + }; + + if is_cursor_after_start && is_cursor_before_end { + let offset = line + .glyphs + .iter() + .take_while(|glyph| cursor.index > glyph.start) + .map(|glyph| glyph.w) + .sum(); + + Some((i, offset)) + } else { + None + } + }) + .unwrap_or((0, 0.0)); + + let line_height = buffer.metrics().line_height; + + let scroll_offset = buffer.scroll() as f32 * line_height; + + Cursor::Caret(Point::new( + offset, + (lines_before_cursor + subline) as f32 * line_height + - scroll_offset, + )) + } + } + } + + fn perform(&mut self, action: Action) { + let mut font_system = + text::font_system().write().expect("Write font system"); + + let editor = + self.0.take().expect("Editor should always be initialized"); + + // TODO: Handle multiple strong references somehow + let mut internal = Arc::try_unwrap(editor) + .expect("Editor cannot have multiple strong references"); + + let editor = &mut internal.editor; + + let mut act = |action| editor.action(font_system.raw(), action); + + match action { + Action::MoveLeft => act(cosmic_text::Action::Left), + Action::MoveRight => act(cosmic_text::Action::Right), + Action::MoveUp => act(cosmic_text::Action::Up), + Action::MoveDown => act(cosmic_text::Action::Down), + Action::Insert(c) => act(cosmic_text::Action::Insert(c)), + Action::Backspace => act(cosmic_text::Action::Backspace), + Action::Delete => act(cosmic_text::Action::Delete), + Action::Click(position) => act(cosmic_text::Action::Click { + x: position.x as i32, + y: position.y as i32, + }), + Action::Drag(position) => act(cosmic_text::Action::Drag { + x: position.x as i32, + y: position.y as i32, + }), + _ => todo!(), + } + + editor.shape_as_needed(font_system.raw()); + + self.0 = Some(Arc::new(internal)); + } + + fn bounds(&self) -> Size { + self.internal().bounds + } + + fn min_bounds(&self) -> Size { + self.internal().min_bounds + } + + fn update( + &mut self, + new_bounds: Size, + new_font: Font, + new_size: Pixels, + new_line_height: LineHeight, + ) { + let editor = + self.0.take().expect("editor should always be initialized"); + + let mut internal = Arc::try_unwrap(editor) + .expect("Editor cannot have multiple strong references"); + + let mut font_system = + text::font_system().write().expect("Write font system"); + + let mut changed = false; + + if new_font != internal.font { + for line in internal.editor.buffer_mut().lines.iter_mut() { + let _ = line.set_attrs_list(cosmic_text::AttrsList::new( + text::to_attributes(new_font), + )); + } + + changed = true; + } + + let metrics = internal.editor.buffer().metrics(); + let new_line_height = new_line_height.to_absolute(new_size); + + if new_size.0 != metrics.font_size + || new_line_height.0 != metrics.line_height + { + internal.editor.buffer_mut().set_metrics( + font_system.raw(), + cosmic_text::Metrics::new(new_size.0, new_line_height.0), + ); + + changed = true; + } + + if new_bounds != internal.bounds { + internal.editor.buffer_mut().set_size( + font_system.raw(), + new_bounds.width, + new_bounds.height, + ); + + internal.bounds = new_bounds; + changed = true; + } + + if changed { + internal.min_bounds = text::measure(&internal.editor.buffer()); + } + + self.0 = Some(Arc::new(internal)); + } +} + +impl Default for Editor { + fn default() -> Self { + Self(Some(Arc::new(Internal::default()))) + } +} + +impl PartialEq for Internal { + fn eq(&self, other: &Self) -> bool { + self.font == other.font + && self.bounds == other.bounds + && self.min_bounds == other.min_bounds + && self.editor.buffer().metrics() == other.editor.buffer().metrics() + } +} + +impl Default for Internal { + fn default() -> Self { + Self { + editor: cosmic_text::Editor::new(cosmic_text::Buffer::new_empty( + cosmic_text::Metrics { + font_size: 1.0, + line_height: 1.0, + }, + )), + font: Font::default(), + bounds: Size::ZERO, + min_bounds: Size::ZERO, + version: text::Version::default(), + } + } +} + +impl fmt::Debug for Internal { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Internal") + .field("font", &self.font) + .field("bounds", &self.bounds) + .field("min_bounds", &self.min_bounds) + .finish() + } +} + +#[derive(Debug, Clone)] +pub struct Weak { + raw: sync::Weak<Internal>, + pub bounds: Size, +} + +impl Weak { + pub fn upgrade(&self) -> Option<Editor> { + self.raw.upgrade().map(Some).map(Editor) + } +} + +impl PartialEq for Weak { + fn eq(&self, other: &Self) -> bool { + match (self.raw.upgrade(), other.raw.upgrade()) { + (Some(p1), Some(p2)) => p1 == p2, + _ => false, + } + } +} diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 73e56890..6f044af6 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -32,6 +32,7 @@ use crate::core::text::{self, Text}; use crate::core::{ Background, Color, Font, Pixels, Point, Rectangle, Size, Vector, }; +use crate::graphics::text::Editor; use crate::graphics::text::Paragraph; use crate::graphics::Mesh; @@ -159,6 +160,7 @@ impl<T> core::Renderer for Renderer<T> { impl<T> text::Renderer for Renderer<T> { type Font = Font; type Paragraph = Paragraph; + type Editor = Editor; const ICON_FONT: Font = iced_tiny_skia::Renderer::<T>::ICON_FONT; const CHECKMARK_ICON: char = iced_tiny_skia::Renderer::<T>::CHECKMARK_ICON; @@ -179,14 +181,27 @@ impl<T> text::Renderer for Renderer<T> { fn fill_paragraph( &mut self, - text: &Self::Paragraph, + paragraph: &Self::Paragraph, position: Point, color: Color, ) { delegate!( self, renderer, - renderer.fill_paragraph(text, position, color) + renderer.fill_paragraph(paragraph, position, color) + ); + } + + fn fill_editor( + &mut self, + editor: &Self::Editor, + position: Point, + color: Color, + ) { + delegate!( + self, + renderer, + renderer.fill_editor(editor, position, color) ); } diff --git a/style/src/lib.rs b/style/src/lib.rs index 0c555ed8..7a97ac77 100644 --- a/style/src/lib.rs +++ b/style/src/lib.rs @@ -35,6 +35,7 @@ pub mod rule; pub mod scrollable; pub mod slider; pub mod svg; +pub mod text_editor; pub mod text_input; pub mod theme; pub mod toggler; diff --git a/style/src/text_editor.rs b/style/src/text_editor.rs new file mode 100644 index 00000000..45c9bad8 --- /dev/null +++ b/style/src/text_editor.rs @@ -0,0 +1,47 @@ +//! Change the appearance of a text editor. +use iced_core::{Background, BorderRadius, Color}; + +/// The appearance of a text input. +#[derive(Debug, Clone, Copy)] +pub struct Appearance { + /// The [`Background`] of the text input. + pub background: Background, + /// The border radius of the text input. + pub border_radius: BorderRadius, + /// The border width of the text input. + pub border_width: f32, + /// The border [`Color`] of the text input. + pub border_color: Color, +} + +/// A set of rules that dictate the style of a text input. +pub trait StyleSheet { + /// The supported style of the [`StyleSheet`]. + type Style: Default; + + /// Produces the style of an active text input. + fn active(&self, style: &Self::Style) -> Appearance; + + /// Produces the style of a focused text input. + fn focused(&self, style: &Self::Style) -> Appearance; + + /// Produces the [`Color`] of the placeholder of a text input. + fn placeholder_color(&self, style: &Self::Style) -> Color; + + /// Produces the [`Color`] of the value of a text input. + fn value_color(&self, style: &Self::Style) -> Color; + + /// Produces the [`Color`] of the value of a disabled text input. + fn disabled_color(&self, style: &Self::Style) -> Color; + + /// Produces the [`Color`] of the selection of a text input. + fn selection_color(&self, style: &Self::Style) -> Color; + + /// Produces the style of an hovered text input. + fn hovered(&self, style: &Self::Style) -> Appearance { + self.focused(style) + } + + /// Produces the style of a disabled text input. + fn disabled(&self, style: &Self::Style) -> Appearance; +} diff --git a/style/src/theme.rs b/style/src/theme.rs index 893d7202..a1501c01 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -17,6 +17,7 @@ use crate::rule; use crate::scrollable; use crate::slider; use crate::svg; +use crate::text_editor; use crate::text_input; use crate::toggler; @@ -1174,3 +1175,115 @@ impl text_input::StyleSheet for Theme { self.placeholder_color(style) } } + +/// The style of a text input. +#[derive(Default)] +pub enum TextEditor { + /// The default style. + #[default] + Default, + /// A custom style. + Custom(Box<dyn text_editor::StyleSheet<Style = Theme>>), +} + +impl text_editor::StyleSheet for Theme { + type Style = TextEditor; + + fn active(&self, style: &Self::Style) -> text_editor::Appearance { + if let TextEditor::Custom(custom) = style { + return custom.active(self); + } + + let palette = self.extended_palette(); + + text_editor::Appearance { + background: palette.background.base.color.into(), + border_radius: 2.0.into(), + border_width: 1.0, + border_color: palette.background.strong.color, + } + } + + fn hovered(&self, style: &Self::Style) -> text_editor::Appearance { + if let TextEditor::Custom(custom) = style { + return custom.hovered(self); + } + + let palette = self.extended_palette(); + + text_editor::Appearance { + background: palette.background.base.color.into(), + border_radius: 2.0.into(), + border_width: 1.0, + border_color: palette.background.base.text, + } + } + + fn focused(&self, style: &Self::Style) -> text_editor::Appearance { + if let TextEditor::Custom(custom) = style { + return custom.focused(self); + } + + let palette = self.extended_palette(); + + text_editor::Appearance { + background: palette.background.base.color.into(), + border_radius: 2.0.into(), + border_width: 1.0, + border_color: palette.primary.strong.color, + } + } + + fn placeholder_color(&self, style: &Self::Style) -> Color { + if let TextEditor::Custom(custom) = style { + return custom.placeholder_color(self); + } + + let palette = self.extended_palette(); + + palette.background.strong.color + } + + fn value_color(&self, style: &Self::Style) -> Color { + if let TextEditor::Custom(custom) = style { + return custom.value_color(self); + } + + let palette = self.extended_palette(); + + palette.background.base.text + } + + fn selection_color(&self, style: &Self::Style) -> Color { + if let TextEditor::Custom(custom) = style { + return custom.selection_color(self); + } + + let palette = self.extended_palette(); + + palette.primary.weak.color + } + + fn disabled(&self, style: &Self::Style) -> text_editor::Appearance { + if let TextEditor::Custom(custom) = style { + return custom.disabled(self); + } + + let palette = self.extended_palette(); + + text_editor::Appearance { + background: palette.background.weak.color.into(), + border_radius: 2.0.into(), + border_width: 1.0, + border_color: palette.background.strong.color, + } + } + + fn disabled_color(&self, style: &Self::Style) -> Color { + if let TextEditor::Custom(custom) = style { + return custom.disabled_color(self); + } + + self.placeholder_color(style) + } +} diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index 72184c8a..5f66dff2 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -383,6 +383,31 @@ impl Backend { clip_mask, ); } + Primitive::Editor { + editor, + position, + color, + } => { + let physical_bounds = + (Rectangle::new(*position, editor.bounds) + translation) + * scale_factor; + + if !clip_bounds.intersects(&physical_bounds) { + return; + } + + let clip_mask = (!physical_bounds.is_within(&clip_bounds)) + .then_some(clip_mask as &_); + + self.text_pipeline.draw_editor( + editor, + *position + translation, + *color, + scale_factor, + pixels, + clip_mask, + ); + } Primitive::Text { content, bounds, diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index 4f6e3941..d055c749 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -2,6 +2,7 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; use crate::core::{Color, Font, Pixels, Point, Rectangle}; use crate::graphics::text::cache::{self, Cache}; +use crate::graphics::text::editor; use crate::graphics::text::font_system; use crate::graphics::text::paragraph; @@ -64,6 +65,37 @@ impl Pipeline { ); } + pub fn draw_editor( + &mut self, + editor: &editor::Weak, + position: Point, + color: Color, + scale_factor: f32, + pixels: &mut tiny_skia::PixmapMut<'_>, + clip_mask: Option<&tiny_skia::Mask>, + ) { + use crate::core::text::Editor as _; + + let Some(editor) = editor.upgrade() else { + return; + }; + + let mut font_system = font_system().write().expect("Write font system"); + + draw( + font_system.raw(), + &mut self.glyph_cache, + editor.buffer(), + Rectangle::new(position, editor.min_bounds()), + color, + alignment::Horizontal::Left, + alignment::Vertical::Top, + scale_factor, + pixels, + clip_mask, + ); + } + pub fn draw_cached( &mut self, content: &str, diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 7a5a0f7c..10b3332d 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -120,12 +120,25 @@ impl<'a> Layer<'a> { } => { let layer = &mut layers[current_layer]; - layer.text.push(Text::Managed { + layer.text.push(Text::Paragraph { paragraph: paragraph.clone(), position: *position + translation, color: *color, }); } + Primitive::Editor { + editor, + position, + color, + } => { + let layer = &mut layers[current_layer]; + + layer.text.push(Text::Editor { + editor: editor.clone(), + position: *position + translation, + color: *color, + }); + } Primitive::Text { content, bounds, diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index b61615d6..d46b39da 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -1,16 +1,22 @@ use crate::core::alignment; use crate::core::text; use crate::core::{Color, Font, Pixels, Point, Rectangle}; +use crate::graphics::text::editor; use crate::graphics::text::paragraph; /// A paragraph of text. #[derive(Debug, Clone)] pub enum Text<'a> { - Managed { + Paragraph { paragraph: paragraph::Weak, position: Point, color: Color, }, + Editor { + editor: editor::Weak, + position: Point, + color: Color, + }, Cached(Cached<'a>), } diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 5c9f4d7e..397c38dd 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -2,7 +2,7 @@ use crate::core::alignment; use crate::core::{Rectangle, Size}; use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; -use crate::graphics::text::{font_system, Paragraph}; +use crate::graphics::text::{font_system, Editor, Paragraph}; use crate::layer::Text; use std::borrow::Cow; @@ -74,15 +74,19 @@ impl Pipeline { enum Allocation { Paragraph(Paragraph), + Editor(Editor), Cache(cache::KeyHash), } let allocations: Vec<_> = sections .iter() .map(|section| match section { - Text::Managed { paragraph, .. } => { + Text::Paragraph { paragraph, .. } => { paragraph.upgrade().map(Allocation::Paragraph) } + Text::Editor { editor, .. } => { + editor.upgrade().map(Allocation::Editor) + } Text::Cached(text) => { let (key, _) = cache.allocate( font_system, @@ -117,7 +121,7 @@ impl Pipeline { vertical_alignment, color, ) = match section { - Text::Managed { + Text::Paragraph { position, color, .. } => { use crate::core::text::Paragraph as _; @@ -135,6 +139,24 @@ impl Pipeline { *color, ) } + Text::Editor { + position, color, .. + } => { + use crate::core::text::Editor as _; + + let Some(Allocation::Editor(editor)) = allocation + else { + return None; + }; + + ( + editor.buffer(), + Rectangle::new(*position, editor.min_bounds()), + alignment::Horizontal::Left, + alignment::Vertical::Top, + *color, + ) + } Text::Cached(text) => { let Some(Allocation::Cache(key)) = allocation else { return None; diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 3c9c2b29..61541eac 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -16,6 +16,7 @@ use crate::runtime::Command; use crate::scrollable::{self, Scrollable}; use crate::slider::{self, Slider}; use crate::text::{self, Text}; +use crate::text_editor::{self, TextEditor}; use crate::text_input::{self, TextInput}; use crate::toggler::{self, Toggler}; use crate::tooltip::{self, Tooltip}; @@ -206,6 +207,20 @@ where TextInput::new(placeholder, value) } +/// Creates a new [`TextEditor`]. +/// +/// [`TextEditor`]: crate::TextEditor +pub fn text_editor<'a, Message, Renderer>( + content: &'a text_editor::Content<Renderer>, +) -> TextEditor<'a, Message, Renderer> +where + Message: Clone, + Renderer: core::text::Renderer, + Renderer::Theme: text_editor::StyleSheet, +{ + TextEditor::new(content) +} + /// Creates a new [`Slider`]. /// /// [`Slider`]: crate::Slider diff --git a/widget/src/lib.rs b/widget/src/lib.rs index 7e204171..f8e5e865 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -4,8 +4,8 @@ )] #![forbid(unsafe_code, rust_2018_idioms)] #![deny( - missing_debug_implementations, - missing_docs, + // missing_debug_implementations, + // missing_docs, unused_results, clippy::extra_unused_lifetimes, clippy::from_over_into, @@ -41,6 +41,7 @@ pub mod scrollable; pub mod slider; pub mod space; pub mod text; +pub mod text_editor; pub mod text_input; pub mod toggler; pub mod tooltip; diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs new file mode 100644 index 00000000..d09f2c3e --- /dev/null +++ b/widget/src/text_editor.rs @@ -0,0 +1,457 @@ +use crate::core::event::{self, Event}; +use crate::core::keyboard; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::text::editor::{Cursor, Editor as _}; +use crate::core::text::{self, LineHeight}; +use crate::core::widget::{self, Widget}; +use crate::core::{ + Clipboard, Color, Element, Length, Padding, Pixels, Point, Rectangle, + Shell, Vector, +}; + +use std::cell::RefCell; + +pub use crate::style::text_editor::{Appearance, StyleSheet}; +pub use text::editor::Action; + +pub struct TextEditor<'a, Message, Renderer = crate::Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ + content: &'a Content<Renderer>, + font: Option<Renderer::Font>, + text_size: Option<Pixels>, + line_height: LineHeight, + width: Length, + height: Length, + padding: Padding, + style: <Renderer::Theme as StyleSheet>::Style, + on_edit: Option<Box<dyn Fn(Action) -> Message + 'a>>, +} + +impl<'a, Message, Renderer> TextEditor<'a, Message, Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ + pub fn new(content: &'a Content<Renderer>) -> Self { + Self { + content, + font: None, + text_size: None, + line_height: LineHeight::default(), + width: Length::Fill, + height: Length::Fill, + padding: Padding::new(5.0), + style: Default::default(), + on_edit: None, + } + } + + pub fn on_edit(mut self, on_edit: impl Fn(Action) -> Message + 'a) -> Self { + self.on_edit = Some(Box::new(on_edit)); + self + } + + pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { + self.font = Some(font.into()); + self + } + + pub fn padding(mut self, padding: impl Into<Padding>) -> Self { + self.padding = padding.into(); + self + } +} + +pub struct Content<R = crate::Renderer>(RefCell<Internal<R>>) +where + R: text::Renderer; + +struct Internal<R> +where + R: text::Renderer, +{ + editor: R::Editor, + is_dirty: bool, +} + +impl<R> Content<R> +where + R: text::Renderer, +{ + pub fn new() -> Self { + Self::with("") + } + + pub fn with(text: &str) -> Self { + Self(RefCell::new(Internal { + editor: R::Editor::with_text(text), + is_dirty: true, + })) + } + + pub fn edit(&mut self, action: Action) { + let internal = self.0.get_mut(); + + internal.editor.perform(action); + internal.is_dirty = true; + } +} + +impl<Renderer> Default for Content<Renderer> +where + Renderer: text::Renderer, +{ + fn default() -> Self { + Self::new() + } +} + +struct State { + is_focused: bool, + is_dragging: bool, + last_click: Option<mouse::Click>, +} + +impl<'a, Message, Renderer> Widget<Message, Renderer> + for TextEditor<'a, Message, Renderer> +where + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ + fn tag(&self) -> widget::tree::Tag { + widget::tree::Tag::of::<State>() + } + + fn state(&self) -> widget::tree::State { + widget::tree::State::new(State { + is_focused: false, + is_dragging: false, + last_click: None, + }) + } + + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + self.height + } + + fn layout( + &self, + _tree: &mut widget::Tree, + renderer: &Renderer, + limits: &layout::Limits, + ) -> iced_renderer::core::layout::Node { + let mut internal = self.content.0.borrow_mut(); + + internal.editor.update( + limits.pad(self.padding).max(), + self.font.unwrap_or_else(|| renderer.default_font()), + self.text_size.unwrap_or_else(|| renderer.default_size()), + self.line_height, + ); + + layout::Node::new(limits.max()) + } + + fn on_event( + &mut self, + tree: &mut widget::Tree, + event: Event, + layout: Layout<'_>, + cursor: mouse::Cursor, + _renderer: &Renderer, + clipboard: &mut dyn Clipboard, + shell: &mut Shell<'_, Message>, + _viewport: &Rectangle, + ) -> event::Status { + let Some(on_edit) = self.on_edit.as_ref() else { + return event::Status::Ignored; + }; + + let state = tree.state.downcast_mut::<State>(); + + let Some(update) = Update::from_event( + event, + state, + layout.bounds(), + self.padding, + cursor, + ) else { + return event::Status::Ignored; + }; + + match update { + Update::Focus { click, action } => { + state.is_focused = true; + state.last_click = Some(click); + shell.publish(on_edit(action)); + } + Update::Unfocus => { + state.is_focused = false; + state.is_dragging = false; + } + Update::Click { click, action } => { + state.last_click = Some(click); + state.is_dragging = true; + shell.publish(on_edit(action)); + } + Update::StopDragging => { + state.is_dragging = false; + } + Update::Edit(action) => { + shell.publish(on_edit(action)); + } + Update::Copy => {} + Update::Paste => if let Some(_contents) = clipboard.read() {}, + } + + event::Status::Captured + } + + fn draw( + &self, + tree: &widget::Tree, + renderer: &mut Renderer, + theme: &<Renderer as renderer::Renderer>::Theme, + style: &renderer::Style, + layout: Layout<'_>, + cursor: mouse::Cursor, + _viewport: &Rectangle, + ) { + let bounds = layout.bounds(); + + let internal = self.content.0.borrow(); + let state = tree.state.downcast_ref::<State>(); + + let is_disabled = self.on_edit.is_none(); + let is_mouse_over = cursor.is_over(bounds); + + let appearance = if is_disabled { + theme.disabled(&self.style) + } else if state.is_focused { + theme.focused(&self.style) + } else if is_mouse_over { + theme.hovered(&self.style) + } else { + theme.active(&self.style) + }; + + renderer.fill_quad( + renderer::Quad { + bounds, + border_radius: appearance.border_radius, + border_width: appearance.border_width, + border_color: appearance.border_color, + }, + appearance.background, + ); + + renderer.fill_editor( + &internal.editor, + bounds.position() + + Vector::new(self.padding.left, self.padding.top), + style.text_color, + ); + + if state.is_focused { + match internal.editor.cursor() { + Cursor::Caret(position) => { + renderer.fill_quad( + renderer::Quad { + bounds: Rectangle { + x: position.x + bounds.x + self.padding.left, + y: position.y + bounds.y + self.padding.top, + width: 1.0, + height: self + .line_height + .to_absolute(self.text_size.unwrap_or_else( + || renderer.default_size(), + )) + .into(), + }, + border_radius: 0.0.into(), + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, + theme.value_color(&self.style), + ); + } + Cursor::Selection(ranges) => { + for range in ranges { + renderer.fill_quad( + renderer::Quad { + bounds: range + Vector::new(bounds.x, bounds.y), + border_radius: 0.0.into(), + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, + theme.selection_color(&self.style), + ); + } + } + } + } + } + + fn mouse_interaction( + &self, + _state: &widget::Tree, + layout: Layout<'_>, + cursor: mouse::Cursor, + _viewport: &Rectangle, + _renderer: &Renderer, + ) -> mouse::Interaction { + let is_disabled = self.on_edit.is_none(); + + if cursor.is_over(layout.bounds()) { + if is_disabled { + mouse::Interaction::NotAllowed + } else { + mouse::Interaction::Text + } + } else { + mouse::Interaction::default() + } + } +} + +impl<'a, Message, Renderer> From<TextEditor<'a, Message, Renderer>> + for Element<'a, Message, Renderer> +where + Message: 'a, + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ + fn from(text_editor: TextEditor<'a, Message, Renderer>) -> Self { + Self::new(text_editor) + } +} + +enum Update { + Focus { click: mouse::Click, action: Action }, + Unfocus, + Click { click: mouse::Click, action: Action }, + StopDragging, + Edit(Action), + Copy, + Paste, +} + +impl Update { + fn from_event( + event: Event, + state: &State, + bounds: Rectangle, + padding: Padding, + cursor: mouse::Cursor, + ) -> Option<Self> { + match event { + Event::Mouse(event) => match event { + mouse::Event::ButtonPressed(mouse::Button::Left) => { + if let Some(cursor_position) = cursor.position_in(bounds) { + let cursor_position = cursor_position + - Vector::new(padding.top, padding.left); + + if state.is_focused { + let click = mouse::Click::new( + cursor_position, + state.last_click, + ); + + let action = match click.kind() { + mouse::click::Kind::Single => { + Action::Click(cursor_position) + } + mouse::click::Kind::Double => { + Action::SelectWord + } + mouse::click::Kind::Triple => { + Action::SelectLine + } + }; + + Some(Update::Click { click, action }) + } else { + Some(Update::Focus { + click: mouse::Click::new(cursor_position, None), + action: Action::Click(cursor_position), + }) + } + } else if state.is_focused { + Some(Update::Unfocus) + } else { + None + } + } + mouse::Event::ButtonReleased(mouse::Button::Left) => { + Some(Update::StopDragging) + } + mouse::Event::CursorMoved { .. } if state.is_dragging => { + let cursor_position = cursor.position_in(bounds)? + - Vector::new(padding.top, padding.left); + + Some(Self::Edit(Action::Drag(cursor_position))) + } + _ => None, + }, + Event::Keyboard(event) => match event { + keyboard::Event::KeyPressed { + key_code, + modifiers, + } if state.is_focused => match key_code { + keyboard::KeyCode::Left => { + if platform::is_jump_modifier_pressed(modifiers) { + Some(Self::Edit(Action::MoveLeftWord)) + } else { + Some(Self::Edit(Action::MoveLeft)) + } + } + keyboard::KeyCode::Right => { + if platform::is_jump_modifier_pressed(modifiers) { + Some(Self::Edit(Action::MoveRightWord)) + } else { + Some(Self::Edit(Action::MoveRight)) + } + } + keyboard::KeyCode::Up => Some(Self::Edit(Action::MoveUp)), + keyboard::KeyCode::Down => { + Some(Self::Edit(Action::MoveDown)) + } + keyboard::KeyCode::Backspace => { + Some(Self::Edit(Action::Backspace)) + } + keyboard::KeyCode::Delete => { + Some(Self::Edit(Action::Delete)) + } + keyboard::KeyCode::Escape => Some(Self::Unfocus), + _ => None, + }, + keyboard::Event::CharacterReceived(c) if state.is_focused => { + Some(Self::Edit(Action::Insert(c))) + } + _ => None, + }, + _ => None, + } + } +} + +mod platform { + use crate::core::keyboard; + + pub fn is_jump_modifier_pressed(modifiers: keyboard::Modifiers) -> bool { + if cfg!(target_os = "macos") { + modifiers.alt() + } else { + modifiers.control() + } + } +} From 1455911b636f19810e12eeb12a6eed11c5244cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 12 Sep 2023 15:03:23 +0200 Subject: [PATCH 054/286] Add `Enter` variant to `Action` in `text::Editor` --- core/src/text/editor.rs | 1 + graphics/src/text/editor.rs | 1 + widget/src/text_editor.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index a4fd0ec1..09d4efde 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -51,6 +51,7 @@ pub enum Action { SelectWord, SelectLine, Insert(char), + Enter, Backspace, Delete, Click(Point), diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 53f63fea..b4d6819f 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -176,6 +176,7 @@ impl editor::Editor for Editor { Action::MoveUp => act(cosmic_text::Action::Up), Action::MoveDown => act(cosmic_text::Action::Down), Action::Insert(c) => act(cosmic_text::Action::Insert(c)), + Action::Enter => act(cosmic_text::Action::Enter), Action::Backspace => act(cosmic_text::Action::Backspace), Action::Delete => act(cosmic_text::Action::Delete), Action::Click(position) => act(cosmic_text::Action::Click { diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index d09f2c3e..fcbd3dad 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -425,6 +425,7 @@ impl Update { keyboard::KeyCode::Down => { Some(Self::Edit(Action::MoveDown)) } + keyboard::KeyCode::Enter => Some(Self::Edit(Action::Enter)), keyboard::KeyCode::Backspace => { Some(Self::Edit(Action::Backspace)) } From abab1448576fbfa4717b65cdf1455debf44f2df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 12 Sep 2023 18:20:02 +0200 Subject: [PATCH 055/286] Return `Cursor::Caret` if selection matches cursor position in `Editor::cursor` --- graphics/src/text/editor.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index b4d6819f..7b0ddec1 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -72,15 +72,18 @@ impl editor::Editor for Editor { fn cursor(&self) -> editor::Cursor { let internal = self.internal(); + let cursor = internal.editor.cursor(); + let buffer = internal.editor.buffer(); + match internal.editor.select_opt() { - Some(selection) => { + Some(selection) + if cursor.line != selection.line + || cursor.index != selection.index => + { // TODO Cursor::Selection(vec![]) } - None => { - let cursor = internal.editor.cursor(); - let buffer = internal.editor.buffer(); - + _ => { let lines_before_cursor: usize = buffer .lines .iter() From 4389ab9865d13e17ce3c66223d7c149437be692b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 12 Sep 2023 18:27:30 +0200 Subject: [PATCH 056/286] Fix cursor offset with `Affinity::After` at the end of lines in `Editor::cursor` --- graphics/src/text/editor.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 7b0ddec1..b39e9831 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -143,7 +143,10 @@ impl editor::Editor for Editor { None } }) - .unwrap_or((0, 0.0)); + .unwrap_or(( + 0, + layout.last().map(|line| line.w).unwrap_or(0.0), + )); let line_height = buffer.metrics().line_height; From a28ed825c1f48c61a655c5583eb207999e98f400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 12 Sep 2023 20:57:46 +0200 Subject: [PATCH 057/286] Fix subline positioning in `Editor::cursor` --- graphics/src/text/editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index b39e9831..52a5d942 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -144,7 +144,7 @@ impl editor::Editor for Editor { } }) .unwrap_or(( - 0, + layout.len().saturating_sub(1), layout.last().map(|line| line.w).unwrap_or(0.0), )); From 40eb648f1e1e2ceb2782eddacbbc966f44de6961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 15:00:33 +0200 Subject: [PATCH 058/286] Implement `Cursor::Selection` calculation in `Editor::cursor` --- graphics/src/text/editor.rs | 118 +++++++++++++++++++++++++++++++++++- widget/src/text_editor.rs | 6 +- 2 files changed, 120 insertions(+), 4 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 52a5d942..3544bde6 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,6 +1,6 @@ use crate::core::text::editor::{self, Action, Cursor}; use crate::core::text::LineHeight; -use crate::core::{Font, Pixels, Point, Size}; +use crate::core::{Font, Pixels, Point, Rectangle, Size, Vector}; use crate::text; use cosmic_text::Edit; @@ -80,8 +80,70 @@ impl editor::Editor for Editor { if cursor.line != selection.line || cursor.index != selection.index => { - // TODO - Cursor::Selection(vec![]) + let line_height = buffer.metrics().line_height; + let scroll_offset = buffer.scroll() as f32 * line_height; + + let (start, end) = if cursor < selection { + (cursor, selection) + } else { + (selection, cursor) + }; + + let visual_lines_before_start: usize = buffer + .lines + .iter() + .take(start.line) + .map(|line| { + line.layout_opt() + .as_ref() + .expect("Line layout should be cached") + .len() + }) + .sum(); + + let selected_lines = end.line - start.line + 1; + + let regions = buffer + .lines + .iter() + .skip(start.line) + .take(selected_lines) + .enumerate() + .flat_map(|(i, line)| { + highlight_line( + line, + if i == 0 { start.index } else { 0 }, + if i == selected_lines - 1 { + end.index + } else { + line.text().len() + }, + ) + }) + .enumerate() + .filter_map(|(visual_line, (x, width))| { + if width > 0.0 { + Some(Rectangle { + x, + width, + y: visual_line as f32 * line_height, + height: line_height, + }) + } else { + None + } + }) + .map(|region| { + region + + Vector::new( + 0.0, + visual_lines_before_start as f32 * line_height + + scroll_offset, + ) + }) + .collect(); + + Cursor::Selection(regions) } _ => { let lines_before_cursor: usize = buffer @@ -332,3 +394,53 @@ impl PartialEq for Weak { } } } + +fn highlight_line<'a>( + line: &'a cosmic_text::BufferLine, + from: usize, + to: usize, +) -> impl Iterator<Item = (f32, f32)> + 'a { + let layout = line + .layout_opt() + .as_ref() + .expect("Line layout should be cached"); + + layout.iter().map(move |visual_line| { + let start = visual_line + .glyphs + .first() + .map(|glyph| glyph.start) + .unwrap_or(0); + let end = visual_line + .glyphs + .last() + .map(|glyph| glyph.end) + .unwrap_or(0); + + let range = start.max(from)..end.min(to); + + if range.is_empty() { + (0.0, 0.0) + } else if range.start == start && range.end == end { + (0.0, visual_line.w) + } else { + let first_glyph = visual_line + .glyphs + .iter() + .position(|glyph| range.start <= glyph.start) + .unwrap_or(0); + + let mut glyphs = visual_line.glyphs.iter(); + + let x = + glyphs.by_ref().take(first_glyph).map(|glyph| glyph.w).sum(); + + let width: f32 = glyphs + .take_while(|glyph| range.end > glyph.start) + .map(|glyph| glyph.w) + .sum(); + + (x, width) + } + }) +} diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index fcbd3dad..12e66f68 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -288,7 +288,11 @@ where for range in ranges { renderer.fill_quad( renderer::Quad { - bounds: range + Vector::new(bounds.x, bounds.y), + bounds: range + + Vector::new( + bounds.x + self.padding.left, + bounds.y + self.padding.top, + ), border_radius: 0.0.into(), border_width: 0.0, border_color: Color::TRANSPARENT, From d502c9f16fc78bf6b5253152751480c5b5e5999c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 15:16:47 +0200 Subject: [PATCH 059/286] Unify `Focus` and `Click` updates in `widget::text_editor` --- widget/src/text_editor.rs | 44 +++++++++++++-------------------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 12e66f68..a8069069 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -189,16 +189,12 @@ where }; match update { - Update::Focus { click, action } => { - state.is_focused = true; - state.last_click = Some(click); - shell.publish(on_edit(action)); - } Update::Unfocus => { state.is_focused = false; state.is_dragging = false; } Update::Click { click, action } => { + state.is_focused = true; state.last_click = Some(click); state.is_dragging = true; shell.publish(on_edit(action)); @@ -340,9 +336,8 @@ where } enum Update { - Focus { click: mouse::Click, action: Action }, - Unfocus, Click { click: mouse::Click, action: Action }, + Unfocus, StopDragging, Edit(Action), Copy, @@ -364,31 +359,20 @@ impl Update { let cursor_position = cursor_position - Vector::new(padding.top, padding.left); - if state.is_focused { - let click = mouse::Click::new( - cursor_position, - state.last_click, - ); + let click = mouse::Click::new( + cursor_position, + state.last_click, + ); - let action = match click.kind() { - mouse::click::Kind::Single => { - Action::Click(cursor_position) - } - mouse::click::Kind::Double => { - Action::SelectWord - } - mouse::click::Kind::Triple => { - Action::SelectLine - } - }; + let action = match click.kind() { + mouse::click::Kind::Single => { + Action::Click(cursor_position) + } + mouse::click::Kind::Double => Action::SelectWord, + mouse::click::Kind::Triple => Action::SelectLine, + }; - Some(Update::Click { click, action }) - } else { - Some(Update::Focus { - click: mouse::Click::new(cursor_position, None), - action: Action::Click(cursor_position), - }) - } + Some(Update::Click { click, action }) } else if state.is_focused { Some(Update::Unfocus) } else { From 52b36a9574f45138363a4bfc6394c6da03baa433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 15:17:04 +0200 Subject: [PATCH 060/286] Use `Theme::Dark` in `editor` example --- examples/editor/src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 50989ac5..2a70b34c 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,5 +1,5 @@ use iced::widget::{container, text_editor}; -use iced::{Element, Font, Sandbox, Settings}; +use iced::{Element, Font, Sandbox, Settings, Theme}; pub fn main() -> iced::Result { Editor::run(Settings::default()) @@ -46,4 +46,8 @@ impl Sandbox for Editor { .padding(20) .into() } + + fn theme(&self) -> Theme { + Theme::Dark + } } From f4c51a96d50953d5fb6e9eb62194f226e2cbfd3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 16:11:43 +0200 Subject: [PATCH 061/286] Introduce `Motion` concept in `core::text::editor` --- core/src/text/editor.rs | 38 ++++++++++--- graphics/src/text/editor.rs | 106 ++++++++++++++++++++++++++++-------- widget/src/text_editor.rs | 79 +++++++++++++++------------ 3 files changed, 157 insertions(+), 66 deletions(-) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 09d4efde..f87e18f3 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -40,14 +40,8 @@ pub trait Editor: Sized + Default { #[derive(Debug, Clone, Copy, PartialEq)] pub enum Action { - MoveLeft, - MoveRight, - MoveUp, - MoveDown, - MoveLeftWord, - MoveRightWord, - MoveHome, - MoveEnd, + Move(Motion), + Select(Motion), SelectWord, SelectLine, Insert(char), @@ -58,6 +52,34 @@ pub enum Action { Drag(Point), } +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Motion { + Left, + Right, + Up, + Down, + WordLeft, + WordRight, + Home, + End, + PageUp, + PageDown, + DocumentStart, + DocumentEnd, +} + +impl Motion { + pub fn widen(self) -> Self { + match self { + Self::Left => Self::WordLeft, + Self::Right => Self::WordRight, + Self::Home => Self::DocumentStart, + Self::End => Self::DocumentEnd, + _ => self, + } + } +} + /// The cursor of an [`Editor`]. #[derive(Debug, Clone)] pub enum Cursor { diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 3544bde6..747f3a80 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,4 +1,4 @@ -use crate::core::text::editor::{self, Action, Cursor}; +use crate::core::text::editor::{self, Action, Cursor, Motion}; use crate::core::text::LineHeight; use crate::core::{Font, Pixels, Point, Rectangle, Size, Vector}; use crate::text; @@ -76,10 +76,7 @@ impl editor::Editor for Editor { let buffer = internal.editor.buffer(); match internal.editor.select_opt() { - Some(selection) - if cursor.line != selection.line - || cursor.index != selection.index => - { + Some(selection) => { let line_height = buffer.metrics().line_height; let scroll_offset = buffer.scroll() as f32 * line_height; @@ -236,26 +233,87 @@ impl editor::Editor for Editor { let editor = &mut internal.editor; - let mut act = |action| editor.action(font_system.raw(), action); - match action { - Action::MoveLeft => act(cosmic_text::Action::Left), - Action::MoveRight => act(cosmic_text::Action::Right), - Action::MoveUp => act(cosmic_text::Action::Up), - Action::MoveDown => act(cosmic_text::Action::Down), - Action::Insert(c) => act(cosmic_text::Action::Insert(c)), - Action::Enter => act(cosmic_text::Action::Enter), - Action::Backspace => act(cosmic_text::Action::Backspace), - Action::Delete => act(cosmic_text::Action::Delete), - Action::Click(position) => act(cosmic_text::Action::Click { - x: position.x as i32, - y: position.y as i32, - }), - Action::Drag(position) => act(cosmic_text::Action::Drag { - x: position.x as i32, - y: position.y as i32, - }), - _ => todo!(), + // Motion events + Action::Move(motion) => { + if let Some(_selection) = editor.select_opt() { + editor.set_select_opt(None); + } else { + editor.action( + font_system.raw(), + match motion { + Motion::Left => cosmic_text::Action::Left, + Motion::Right => cosmic_text::Action::Right, + Motion::Up => cosmic_text::Action::Up, + Motion::Down => cosmic_text::Action::Down, + Motion::WordLeft => cosmic_text::Action::LeftWord, + Motion::WordRight => cosmic_text::Action::RightWord, + Motion::Home => cosmic_text::Action::Home, + Motion::End => cosmic_text::Action::End, + Motion::PageUp => cosmic_text::Action::PageUp, + Motion::PageDown => cosmic_text::Action::PageDown, + Motion::DocumentStart => { + cosmic_text::Action::BufferStart + } + Motion::DocumentEnd => { + cosmic_text::Action::BufferEnd + } + }, + ); + } + } + + // Selection events + Action::Select(_motion) => todo!(), + Action::SelectWord => todo!(), + Action::SelectLine => todo!(), + + // Editing events + Action::Insert(c) => { + editor + .action(font_system.raw(), cosmic_text::Action::Insert(c)); + } + Action::Enter => { + editor.action(font_system.raw(), cosmic_text::Action::Enter); + } + Action::Backspace => { + editor + .action(font_system.raw(), cosmic_text::Action::Backspace); + } + Action::Delete => { + editor.action(font_system.raw(), cosmic_text::Action::Delete); + } + + // Mouse events + Action::Click(position) => { + editor.action( + font_system.raw(), + cosmic_text::Action::Click { + x: position.x as i32, + y: position.y as i32, + }, + ); + } + Action::Drag(position) => { + editor.action( + font_system.raw(), + cosmic_text::Action::Drag { + x: position.x as i32, + y: position.y as i32, + }, + ); + + // Deselect if selection matches cursor position + if let Some(selection) = editor.select_opt() { + let cursor = editor.cursor(); + + if cursor.line == selection.line + && cursor.index == selection.index + { + editor.set_select_opt(None); + } + } + } } editor.shape_as_needed(font_system.raw()); diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index a8069069..38c243bd 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -14,7 +14,7 @@ use crate::core::{ use std::cell::RefCell; pub use crate::style::text_editor::{Appearance, StyleSheet}; -pub use text::editor::Action; +pub use text::editor::{Action, Motion}; pub struct TextEditor<'a, Message, Renderer = crate::Renderer> where @@ -189,16 +189,16 @@ where }; match update { + Update::Click { click, action } => { + state.is_focused = true; + state.is_dragging = true; + state.last_click = Some(click); + shell.publish(on_edit(action)); + } Update::Unfocus => { state.is_focused = false; state.is_dragging = false; } - Update::Click { click, action } => { - state.is_focused = true; - state.last_click = Some(click); - state.is_dragging = true; - shell.publish(on_edit(action)); - } Update::StopDragging => { state.is_dragging = false; } @@ -352,6 +352,9 @@ impl Update { padding: Padding, cursor: mouse::Cursor, ) -> Option<Self> { + let edit = |action| Some(Update::Edit(action)); + let move_ = |motion| Some(Update::Edit(Action::Move(motion))); + match event { Event::Mouse(event) => match event { mouse::Event::ButtonPressed(mouse::Button::Left) => { @@ -386,7 +389,7 @@ impl Update { let cursor_position = cursor.position_in(bounds)? - Vector::new(padding.top, padding.left); - Some(Self::Edit(Action::Drag(cursor_position))) + edit(Action::Drag(cursor_position)) } _ => None, }, @@ -394,37 +397,31 @@ impl Update { keyboard::Event::KeyPressed { key_code, modifiers, - } if state.is_focused => match key_code { - keyboard::KeyCode::Left => { - if platform::is_jump_modifier_pressed(modifiers) { - Some(Self::Edit(Action::MoveLeftWord)) + } if state.is_focused => { + if let Some(motion) = motion(key_code) { + let motion = if modifiers.control() { + motion.widen() } else { - Some(Self::Edit(Action::MoveLeft)) - } - } - keyboard::KeyCode::Right => { - if platform::is_jump_modifier_pressed(modifiers) { - Some(Self::Edit(Action::MoveRightWord)) + motion + }; + + return edit(if modifiers.shift() { + Action::Select(motion) } else { - Some(Self::Edit(Action::MoveRight)) - } + Action::Move(motion) + }); } - keyboard::KeyCode::Up => Some(Self::Edit(Action::MoveUp)), - keyboard::KeyCode::Down => { - Some(Self::Edit(Action::MoveDown)) + + match key_code { + keyboard::KeyCode::Enter => edit(Action::Enter), + keyboard::KeyCode::Backspace => edit(Action::Backspace), + keyboard::KeyCode::Delete => edit(Action::Delete), + keyboard::KeyCode::Escape => Some(Self::Unfocus), + _ => None, } - keyboard::KeyCode::Enter => Some(Self::Edit(Action::Enter)), - keyboard::KeyCode::Backspace => { - Some(Self::Edit(Action::Backspace)) - } - keyboard::KeyCode::Delete => { - Some(Self::Edit(Action::Delete)) - } - keyboard::KeyCode::Escape => Some(Self::Unfocus), - _ => None, - }, + } keyboard::Event::CharacterReceived(c) if state.is_focused => { - Some(Self::Edit(Action::Insert(c))) + edit(Action::Insert(c)) } _ => None, }, @@ -433,6 +430,20 @@ impl Update { } } +fn motion(key_code: keyboard::KeyCode) -> Option<Motion> { + match key_code { + keyboard::KeyCode::Left => Some(Motion::Left), + keyboard::KeyCode::Right => Some(Motion::Right), + keyboard::KeyCode::Up => Some(Motion::Up), + keyboard::KeyCode::Down => Some(Motion::Down), + keyboard::KeyCode::Home => Some(Motion::Home), + keyboard::KeyCode::End => Some(Motion::End), + keyboard::KeyCode::PageUp => Some(Motion::PageUp), + keyboard::KeyCode::PageDown => Some(Motion::PageDown), + _ => None, + } +} + mod platform { use crate::core::keyboard; From f14ef7a6069cf45ae11261d7d20df6a5d7870dde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 16:31:56 +0200 Subject: [PATCH 062/286] Fix `clippy` lints --- graphics/src/text/editor.rs | 27 ++++++++++++++++++--------- widget/src/helpers.rs | 6 +++--- widget/src/text_editor.rs | 30 ++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 747f3a80..d31ea390 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -25,7 +25,7 @@ impl Editor { } pub fn buffer(&self) -> &cosmic_text::Buffer { - &self.internal().editor.buffer() + self.internal().editor.buffer() } pub fn downgrade(&self) -> Weak { @@ -53,11 +53,11 @@ impl editor::Editor for Editor { line_height: 1.0, }); + let mut font_system = + text::font_system().write().expect("Write font system"); + buffer.set_text( - text::font_system() - .write() - .expect("Write font system") - .raw(), + font_system.raw(), text, cosmic_text::Attrs::new(), cosmic_text::Shaping::Advanced, @@ -65,6 +65,7 @@ impl editor::Editor for Editor { Editor(Some(Arc::new(Internal { editor: cosmic_text::Editor::new(buffer), + version: font_system.version(), ..Default::default() }))) } @@ -347,6 +348,14 @@ impl editor::Editor for Editor { let mut changed = false; + if font_system.version() != internal.version { + for line in internal.editor.buffer_mut().lines.iter_mut() { + line.reset(); + } + + changed = true; + } + if new_font != internal.font { for line in internal.editor.buffer_mut().lines.iter_mut() { let _ = line.set_attrs_list(cosmic_text::AttrsList::new( @@ -383,7 +392,7 @@ impl editor::Editor for Editor { } if changed { - internal.min_bounds = text::measure(&internal.editor.buffer()); + internal.min_bounds = text::measure(internal.editor.buffer()); } self.0 = Some(Arc::new(internal)); @@ -453,11 +462,11 @@ impl PartialEq for Weak { } } -fn highlight_line<'a>( - line: &'a cosmic_text::BufferLine, +fn highlight_line( + line: &cosmic_text::BufferLine, from: usize, to: usize, -) -> impl Iterator<Item = (f32, f32)> + 'a { +) -> impl Iterator<Item = (f32, f32)> + '_ { let layout = line .layout_opt() .as_ref() diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 61541eac..e3f31513 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -210,9 +210,9 @@ where /// Creates a new [`TextEditor`]. /// /// [`TextEditor`]: crate::TextEditor -pub fn text_editor<'a, Message, Renderer>( - content: &'a text_editor::Content<Renderer>, -) -> TextEditor<'a, Message, Renderer> +pub fn text_editor<Message, Renderer>( + content: &text_editor::Content<Renderer>, +) -> TextEditor<'_, Message, Renderer> where Message: Clone, Renderer: core::text::Renderer, diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 38c243bd..48de6409 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -7,8 +7,8 @@ use crate::core::text::editor::{Cursor, Editor as _}; use crate::core::text::{self, LineHeight}; use crate::core::widget::{self, Widget}; use crate::core::{ - Clipboard, Color, Element, Length, Padding, Pixels, Point, Rectangle, - Shell, Vector, + Clipboard, Color, Element, Length, Padding, Pixels, Rectangle, Shell, + Vector, }; use std::cell::RefCell; @@ -205,8 +205,12 @@ where Update::Edit(action) => { shell.publish(on_edit(action)); } - Update::Copy => {} - Update::Paste => if let Some(_contents) = clipboard.read() {}, + Update::Copy => todo!(), + Update::Paste => { + if let Some(_contents) = clipboard.read() { + todo!() + } + } } event::Status::Captured @@ -353,7 +357,6 @@ impl Update { cursor: mouse::Cursor, ) -> Option<Self> { let edit = |action| Some(Update::Edit(action)); - let move_ = |motion| Some(Update::Edit(Action::Move(motion))); match event { Event::Mouse(event) => match event { @@ -399,11 +402,12 @@ impl Update { modifiers, } if state.is_focused => { if let Some(motion) = motion(key_code) { - let motion = if modifiers.control() { - motion.widen() - } else { - motion - }; + let motion = + if platform::is_jump_modifier_pressed(modifiers) { + motion.widen() + } else { + motion + }; return edit(if modifiers.shift() { Action::Select(motion) @@ -417,6 +421,12 @@ impl Update { keyboard::KeyCode::Backspace => edit(Action::Backspace), keyboard::KeyCode::Delete => edit(Action::Delete), keyboard::KeyCode::Escape => Some(Self::Unfocus), + keyboard::KeyCode::C => Some(Self::Copy), + keyboard::KeyCode::V + if modifiers.command() && !modifiers.alt() => + { + Some(Self::Paste) + } _ => None, } } From c829b4b04e1274f157ea7bb3adf832c4c53ce3e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 13 Sep 2023 17:55:33 +0200 Subject: [PATCH 063/286] Fix unused import in `iced_renderer` --- renderer/src/lib.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 6f044af6..81f60886 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -29,9 +29,7 @@ pub use geometry::Geometry; use crate::core::renderer; use crate::core::text::{self, Text}; -use crate::core::{ - Background, Color, Font, Pixels, Point, Rectangle, Size, Vector, -}; +use crate::core::{Background, Color, Font, Pixels, Point, Rectangle, Vector}; use crate::graphics::text::Editor; use crate::graphics::text::Paragraph; use crate::graphics::Mesh; @@ -219,7 +217,10 @@ impl<T> text::Renderer for Renderer<T> { impl<T> crate::core::image::Renderer for Renderer<T> { type Handle = crate::core::image::Handle; - fn dimensions(&self, handle: &crate::core::image::Handle) -> Size<u32> { + fn dimensions( + &self, + handle: &crate::core::image::Handle, + ) -> core::Size<u32> { delegate!(self, renderer, renderer.dimensions(handle)) } @@ -230,7 +231,7 @@ impl<T> crate::core::image::Renderer for Renderer<T> { #[cfg(feature = "svg")] impl<T> crate::core::svg::Renderer for Renderer<T> { - fn dimensions(&self, handle: &crate::core::svg::Handle) -> Size<u32> { + fn dimensions(&self, handle: &crate::core::svg::Handle) -> core::Size<u32> { delegate!(self, renderer, renderer.dimensions(handle)) } From ab020383b9fd7f2cc15d145dd1a3c0870dc71d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 00:41:15 +0200 Subject: [PATCH 064/286] Fix scrolling offset for `Cursor::Selection` --- graphics/src/text/editor.rs | 74 ++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index d31ea390..c0f8d9d5 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,6 +1,6 @@ use crate::core::text::editor::{self, Action, Cursor, Motion}; use crate::core::text::LineHeight; -use crate::core::{Font, Pixels, Point, Rectangle, Size, Vector}; +use crate::core::{Font, Pixels, Point, Rectangle, Size}; use crate::text; use cosmic_text::Edit; @@ -78,29 +78,18 @@ impl editor::Editor for Editor { match internal.editor.select_opt() { Some(selection) => { - let line_height = buffer.metrics().line_height; - let scroll_offset = buffer.scroll() as f32 * line_height; - let (start, end) = if cursor < selection { (cursor, selection) } else { (selection, cursor) }; - let visual_lines_before_start: usize = buffer - .lines - .iter() - .take(start.line) - .map(|line| { - line.layout_opt() - .as_ref() - .expect("Line layout should be cached") - .len() - }) - .sum(); - + let line_height = buffer.metrics().line_height; let selected_lines = end.line - start.line + 1; + let visual_lines_offset = + visual_lines_offset(start.line, buffer); + let regions = buffer .lines .iter() @@ -124,37 +113,24 @@ impl editor::Editor for Editor { Some(Rectangle { x, width, - y: visual_line as f32 * line_height, + y: (visual_line as i32 + visual_lines_offset) + as f32 + * line_height, height: line_height, }) } else { None } }) - .map(|region| { - region - + Vector::new( - 0.0, - visual_lines_before_start as f32 * line_height - + scroll_offset, - ) - }) .collect(); Cursor::Selection(regions) } _ => { - let lines_before_cursor: usize = buffer - .lines - .iter() - .take(cursor.line) - .map(|line| { - line.layout_opt() - .as_ref() - .expect("Line layout should be cached") - .len() - }) - .sum(); + let line_height = buffer.metrics().line_height; + + let visual_lines_offset = + visual_lines_offset(cursor.line, buffer); let line = buffer .lines @@ -168,7 +144,7 @@ impl editor::Editor for Editor { let mut lines = layout.iter().enumerate(); - let (subline, offset) = lines + let (visual_line, offset) = lines .find_map(|(i, line)| { let start = line .glyphs @@ -208,14 +184,10 @@ impl editor::Editor for Editor { layout.last().map(|line| line.w).unwrap_or(0.0), )); - let line_height = buffer.metrics().line_height; - - let scroll_offset = buffer.scroll() as f32 * line_height; - Cursor::Caret(Point::new( offset, - (lines_before_cursor + subline) as f32 * line_height - - scroll_offset, + (visual_lines_offset + visual_line as i32) as f32 + * line_height, )) } } @@ -511,3 +483,19 @@ fn highlight_line( } }) } + +fn visual_lines_offset(line: usize, buffer: &cosmic_text::Buffer) -> i32 { + let visual_lines_before_start: usize = buffer + .lines + .iter() + .take(line) + .map(|line| { + line.layout_opt() + .as_ref() + .expect("Line layout should be cached") + .len() + }) + .sum(); + + visual_lines_before_start as i32 - buffer.scroll() +} From e6c2db8a9312e3fe37f30f049d1fa497892f1a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 00:47:04 +0200 Subject: [PATCH 065/286] Fix `Cursor::Caret` position on lines that wrap on whitespace --- graphics/src/text/editor.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index c0f8d9d5..83d41c85 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -157,7 +157,7 @@ impl editor::Editor for Editor { .map(|glyph| glyph.end) .unwrap_or(0); - let is_cursor_after_start = start <= cursor.index; + let is_cursor_before_start = start > cursor.index; let is_cursor_before_end = match cursor.affinity { cosmic_text::Affinity::Before => { @@ -166,7 +166,17 @@ impl editor::Editor for Editor { cosmic_text::Affinity::After => cursor.index < end, }; - if is_cursor_after_start && is_cursor_before_end { + if is_cursor_before_start { + // Sometimes, the glyph we are looking for is right + // between lines. This can happen when a line wraps + // on a space. + // In that case, we can assume the cursor is at the + // end of the previous line. + // i is guaranteed to be > 0 because `start` is always + // 0 for the first line, so there is no way for the + // cursor to be before it. + Some((i - 1, layout[i - 1].w)) + } else if is_cursor_before_end { let offset = line .glyphs .iter() From b24b94d82778733ddae1b824d0d7690afcec3056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 14:18:49 +0200 Subject: [PATCH 066/286] Handle motions when a selection is present in `text::Editor` --- core/src/text/editor.rs | 23 ++++++++++++ graphics/src/text/editor.rs | 70 +++++++++++++++++++++++++------------ 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index f87e18f3..3adfc61a 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -78,6 +78,29 @@ impl Motion { _ => self, } } + + pub fn direction(&self) -> Direction { + match self { + Self::Left + | Self::Up + | Self::WordLeft + | Self::Home + | Self::PageUp + | Self::DocumentStart => Direction::Left, + Self::Right + | Self::Down + | Self::WordRight + | Self::End + | Self::PageDown + | Self::DocumentEnd => Direction::Right, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Direction { + Left, + Right, } /// The cursor of an [`Editor`]. diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 83d41c85..d88bcd1d 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,4 +1,4 @@ -use crate::core::text::editor::{self, Action, Cursor, Motion}; +use crate::core::text::editor::{self, Action, Cursor, Direction, Motion}; use crate::core::text::LineHeight; use crate::core::{Font, Pixels, Point, Rectangle, Size}; use crate::text; @@ -219,30 +219,37 @@ impl editor::Editor for Editor { match action { // Motion events Action::Move(motion) => { - if let Some(_selection) = editor.select_opt() { + if let Some(selection) = editor.select_opt() { + let cursor = editor.cursor(); + + let (left, right) = if cursor < selection { + (cursor, selection) + } else { + (selection, cursor) + }; + editor.set_select_opt(None); + + match motion { + // These motions are performed as-is even when a selection + // is present + Motion::Home + | Motion::End + | Motion::DocumentStart + | Motion::DocumentEnd => { + editor.action( + font_system.raw(), + motion_to_action(motion), + ); + } + // Other motions simply move the cursor to one end of the selection + _ => editor.set_cursor(match motion.direction() { + Direction::Left => left, + Direction::Right => right, + }), + } } else { - editor.action( - font_system.raw(), - match motion { - Motion::Left => cosmic_text::Action::Left, - Motion::Right => cosmic_text::Action::Right, - Motion::Up => cosmic_text::Action::Up, - Motion::Down => cosmic_text::Action::Down, - Motion::WordLeft => cosmic_text::Action::LeftWord, - Motion::WordRight => cosmic_text::Action::RightWord, - Motion::Home => cosmic_text::Action::Home, - Motion::End => cosmic_text::Action::End, - Motion::PageUp => cosmic_text::Action::PageUp, - Motion::PageDown => cosmic_text::Action::PageDown, - Motion::DocumentStart => { - cosmic_text::Action::BufferStart - } - Motion::DocumentEnd => { - cosmic_text::Action::BufferEnd - } - }, - ); + editor.action(font_system.raw(), motion_to_action(motion)); } } @@ -509,3 +516,20 @@ fn visual_lines_offset(line: usize, buffer: &cosmic_text::Buffer) -> i32 { visual_lines_before_start as i32 - buffer.scroll() } + +fn motion_to_action(motion: Motion) -> cosmic_text::Action { + match motion { + Motion::Left => cosmic_text::Action::Left, + Motion::Right => cosmic_text::Action::Right, + Motion::Up => cosmic_text::Action::Up, + Motion::Down => cosmic_text::Action::Down, + Motion::WordLeft => cosmic_text::Action::LeftWord, + Motion::WordRight => cosmic_text::Action::RightWord, + Motion::Home => cosmic_text::Action::Home, + Motion::End => cosmic_text::Action::End, + Motion::PageUp => cosmic_text::Action::PageUp, + Motion::PageDown => cosmic_text::Action::PageDown, + Motion::DocumentStart => cosmic_text::Action::BufferStart, + Motion::DocumentEnd => cosmic_text::Action::BufferEnd, + } +} From edd591847599a3e47601646ce075cb5b71ea751b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 14:25:46 +0200 Subject: [PATCH 067/286] Implement motion selection in `text::Editor` --- graphics/src/text/editor.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index d88bcd1d..c6b2abd5 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -254,7 +254,26 @@ impl editor::Editor for Editor { } // Selection events - Action::Select(_motion) => todo!(), + Action::Select(motion) => { + let cursor = editor.cursor(); + + if editor.select_opt().is_none() { + editor.set_select_opt(Some(cursor)); + } + + editor.action(font_system.raw(), motion_to_action(motion)); + + // Deselect if selection matches cursor position + if let Some(selection) = editor.select_opt() { + let cursor = editor.cursor(); + + if cursor.line == selection.line + && cursor.index == selection.index + { + editor.set_select_opt(None); + } + } + } Action::SelectWord => todo!(), Action::SelectLine => todo!(), From f7d66899f1ae087a87be5d084ec1ee9a03dd4ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 15:20:23 +0200 Subject: [PATCH 068/286] Implement `Action::SelectWord` in `text::Editor` --- graphics/Cargo.toml | 1 + graphics/src/text/editor.rs | 61 ++++++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 26bd1435..3165810b 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -34,6 +34,7 @@ raw-window-handle.workspace = true rustc-hash.workspace = true thiserror.workspace = true twox-hash.workspace = true +unicode-segmentation.workspace = true image.workspace = true image.optional = true diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index c6b2abd5..3fd2c4fe 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -274,7 +274,66 @@ impl editor::Editor for Editor { } } } - Action::SelectWord => todo!(), + Action::SelectWord => { + use unicode_segmentation::UnicodeSegmentation; + + let cursor = editor.cursor(); + + if let Some(line) = editor.buffer().lines.get(cursor.line) { + let (start, end) = + UnicodeSegmentation::unicode_word_indices(line.text()) + // Split words with dots + .flat_map(|(i, word)| { + word.split('.').scan(i, |current, word| { + let start = *current; + *current += word.len() + 1; + + Some((start, word)) + }) + }) + // Turn words into ranges + .map(|(i, word)| (i, i + word.len())) + // Find the word at cursor + .find(|&(start, end)| { + start <= cursor.index && cursor.index < end + }) + // Cursor is not in a word. Let's select its punctuation cluster. + .unwrap_or_else(|| { + let start = line.text()[..cursor.index] + .char_indices() + .rev() + .take_while(|(_, c)| { + c.is_ascii_punctuation() + }) + .map(|(i, _)| i) + .last() + .unwrap_or(cursor.index); + + let end = line.text()[cursor.index..] + .char_indices() + .skip_while(|(_, c)| { + c.is_ascii_punctuation() + }) + .map(|(i, _)| i + cursor.index) + .next() + .unwrap_or(cursor.index); + + (start, end) + }); + + if start != end { + editor.set_cursor(cosmic_text::Cursor { + index: start, + ..cursor + }); + + editor.set_select_opt(Some(cosmic_text::Cursor { + index: end, + ..cursor + })); + } + } + } Action::SelectLine => todo!(), // Editing events From 8cad1d682a306071f1f03bff4e70196adc946491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 15:23:20 +0200 Subject: [PATCH 069/286] Implement `Action::SelectLine` in `text::Editor` --- graphics/src/text/editor.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 3fd2c4fe..8eec94c9 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -334,7 +334,24 @@ impl editor::Editor for Editor { } } } - Action::SelectLine => todo!(), + Action::SelectLine => { + let cursor = editor.cursor(); + + if let Some(line_length) = editor + .buffer() + .lines + .get(cursor.line) + .map(|line| line.text().len()) + { + editor + .set_cursor(cosmic_text::Cursor { index: 0, ..cursor }); + + editor.set_select_opt(Some(cosmic_text::Cursor { + index: line_length, + ..cursor + })); + } + } // Editing events Action::Insert(c) => { From c7d02e24e6f8265c205a68bd97b2643d40ae30ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 18:57:09 +0200 Subject: [PATCH 070/286] Remove `Editor::min_bounds` and use `bounds` instead --- core/src/renderer/null.rs | 4 ---- core/src/text/editor.rs | 14 -------------- graphics/src/text/editor.rs | 4 ---- tiny_skia/src/text.rs | 2 +- wgpu/src/text.rs | 2 +- 5 files changed, 2 insertions(+), 24 deletions(-) diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index adf75969..e714e492 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -131,10 +131,6 @@ impl text::Editor for () { Size::ZERO } - fn min_bounds(&self) -> Size { - Size::ZERO - } - fn update( &mut self, _new_bounds: Size, diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 3adfc61a..56cda3ef 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -14,10 +14,6 @@ pub trait Editor: Sized + Default { /// Returns the current boundaries of the [`Editor`]. fn bounds(&self) -> Size; - /// Returns the minimum boundaries that can fit the contents of the - /// [`Editor`]. - fn min_bounds(&self) -> Size; - /// Updates the [`Editor`] with some new attributes. fn update( &mut self, @@ -26,16 +22,6 @@ pub trait Editor: Sized + Default { new_size: Pixels, new_line_height: LineHeight, ); - - /// Returns the minimum width that can fit the contents of the [`Editor`]. - fn min_width(&self) -> f32 { - self.min_bounds().width - } - - /// Returns the minimum height that can fit the contents of the [`Editor`]. - fn min_height(&self) -> f32 { - self.min_bounds().height - } } #[derive(Debug, Clone, Copy, PartialEq)] diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 8eec94c9..6d9e9bb6 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -410,10 +410,6 @@ impl editor::Editor for Editor { self.internal().bounds } - fn min_bounds(&self) -> Size { - self.internal().min_bounds - } - fn update( &mut self, new_bounds: Size, diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index d055c749..96cfbf32 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -86,7 +86,7 @@ impl Pipeline { font_system.raw(), &mut self.glyph_cache, editor.buffer(), - Rectangle::new(position, editor.min_bounds()), + Rectangle::new(position, editor.bounds()), color, alignment::Horizontal::Left, alignment::Vertical::Top, diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 397c38dd..581df0cb 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -151,7 +151,7 @@ impl Pipeline { ( editor.buffer(), - Rectangle::new(*position, editor.min_bounds()), + Rectangle::new(*position, editor.bounds()), alignment::Horizontal::Left, alignment::Vertical::Top, *color, From 3afac11784b9cedc7e6208e3bf1d0365e1f5e902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 18:58:52 +0200 Subject: [PATCH 071/286] Remove `min_bounds` field in `graphics::text::Editor` --- graphics/src/text/editor.rs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 6d9e9bb6..07a2d72a 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -15,7 +15,6 @@ struct Internal { editor: cosmic_text::Editor, font: Font, bounds: Size, - min_bounds: Size, version: text::Version, } @@ -426,14 +425,10 @@ impl editor::Editor for Editor { let mut font_system = text::font_system().write().expect("Write font system"); - let mut changed = false; - if font_system.version() != internal.version { for line in internal.editor.buffer_mut().lines.iter_mut() { line.reset(); } - - changed = true; } if new_font != internal.font { @@ -442,8 +437,6 @@ impl editor::Editor for Editor { text::to_attributes(new_font), )); } - - changed = true; } let metrics = internal.editor.buffer().metrics(); @@ -456,8 +449,6 @@ impl editor::Editor for Editor { font_system.raw(), cosmic_text::Metrics::new(new_size.0, new_line_height.0), ); - - changed = true; } if new_bounds != internal.bounds { @@ -468,11 +459,6 @@ impl editor::Editor for Editor { ); internal.bounds = new_bounds; - changed = true; - } - - if changed { - internal.min_bounds = text::measure(internal.editor.buffer()); } self.0 = Some(Arc::new(internal)); @@ -489,7 +475,6 @@ impl PartialEq for Internal { fn eq(&self, other: &Self) -> bool { self.font == other.font && self.bounds == other.bounds - && self.min_bounds == other.min_bounds && self.editor.buffer().metrics() == other.editor.buffer().metrics() } } @@ -505,7 +490,6 @@ impl Default for Internal { )), font: Font::default(), bounds: Size::ZERO, - min_bounds: Size::ZERO, version: text::Version::default(), } } @@ -516,7 +500,6 @@ impl fmt::Debug for Internal { f.debug_struct("Internal") .field("font", &self.font) .field("bounds", &self.bounds) - .field("min_bounds", &self.min_bounds) .finish() } } From 8e6e37e0cee79a2f293abedd18a6a7249575bb63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 19:05:50 +0200 Subject: [PATCH 072/286] Fix broken intra-doc links --- core/src/text.rs | 2 ++ widget/src/lib.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/src/text.rs b/core/src/text.rs index 5aacbcc5..90581fea 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -137,6 +137,8 @@ impl Hit { /// /// You will obtain a [`Difference`] when you [`compare`] a [`Paragraph`] with some /// [`Text`]. +/// +/// [`compare`]: Paragraph::compare #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Difference { /// No difference. diff --git a/widget/src/lib.rs b/widget/src/lib.rs index f8e5e865..4c318d75 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -93,6 +93,8 @@ pub use space::Space; #[doc(no_inline)] pub use text::Text; #[doc(no_inline)] +pub use text_editor::TextEditor; +#[doc(no_inline)] pub use text_input::TextInput; #[doc(no_inline)] pub use toggler::Toggler; From f7fc13d98c52a9260b1ab55394a0c3d2693318ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 14 Sep 2023 22:55:54 +0200 Subject: [PATCH 073/286] Fix `Copy` action being triggered without any modifiers --- widget/src/text_editor.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 48de6409..114d35ef 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -421,7 +421,9 @@ impl Update { keyboard::KeyCode::Backspace => edit(Action::Backspace), keyboard::KeyCode::Delete => edit(Action::Delete), keyboard::KeyCode::Escape => Some(Self::Unfocus), - keyboard::KeyCode::C => Some(Self::Copy), + keyboard::KeyCode::C if modifiers.command() => { + Some(Self::Copy) + } keyboard::KeyCode::V if modifiers.command() && !modifiers.alt() => { From c6d0443627c22dcf1576303e5a426aa3622f1b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 16 Sep 2023 15:27:25 +0200 Subject: [PATCH 074/286] Implement methods to query the contents of a `TextEditor` --- core/src/renderer/null.rs | 12 ++++++++++ core/src/text/editor.rs | 6 +++++ graphics/src/text/editor.rs | 41 +++++++++++++++++++++++++++++++ widget/src/text_editor.rs | 48 +++++++++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index e714e492..01a52c7a 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -125,6 +125,18 @@ impl text::Editor for () { text::editor::Cursor::Caret(Point::ORIGIN) } + fn selection(&self) -> Option<String> { + None + } + + fn line(&self, _index: usize) -> Option<&str> { + None + } + + fn line_count(&self) -> usize { + 0 + } + fn perform(&mut self, _action: text::editor::Action) {} fn bounds(&self) -> Size { diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 56cda3ef..5532fac5 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -9,6 +9,12 @@ pub trait Editor: Sized + Default { fn cursor(&self) -> Cursor; + fn selection(&self) -> Option<String>; + + fn line(&self, index: usize) -> Option<&str>; + + fn line_count(&self) -> usize; + fn perform(&mut self, action: Action); /// Returns the current boundaries of the [`Editor`]. diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 07a2d72a..1e375a25 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -69,6 +69,47 @@ impl editor::Editor for Editor { }))) } + fn line(&self, index: usize) -> Option<&str> { + self.buffer() + .lines + .get(index) + .map(cosmic_text::BufferLine::text) + } + + fn line_count(&self) -> usize { + self.buffer().lines.len() + } + + fn selection(&self) -> Option<String> { + let internal = self.internal(); + + let cursor = internal.editor.cursor(); + let selection = internal.editor.select_opt()?; + + let (start, end) = if cursor < selection { + (cursor, selection) + } else { + (selection, cursor) + }; + + Some( + internal.editor.buffer().lines[start.line..=end.line] + .iter() + .enumerate() + .map(|(i, line)| { + if i == 0 { + &line.text()[start.index..] + } else if i == end.line - start.line { + &line.text()[..end.index] + } else { + line.text() + } + }) + .collect::<Vec<_>>() + .join("\n"), + ) + } + fn cursor(&self) -> editor::Cursor { let internal = self.internal(); diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 114d35ef..ec7a6d1d 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -100,6 +100,54 @@ where internal.editor.perform(action); internal.is_dirty = true; } + + pub fn line_count(&self) -> usize { + self.0.borrow().editor.line_count() + } + + pub fn line( + &self, + index: usize, + ) -> Option<impl std::ops::Deref<Target = str> + '_> { + std::cell::Ref::filter_map(self.0.borrow(), |internal| { + internal.editor.line(index) + }) + .ok() + } + + pub fn lines( + &self, + ) -> impl Iterator<Item = impl std::ops::Deref<Target = str> + '_> { + struct Lines<'a, Renderer: text::Renderer> { + internal: std::cell::Ref<'a, Internal<Renderer>>, + current: usize, + } + + impl<'a, Renderer: text::Renderer> Iterator for Lines<'a, Renderer> { + type Item = std::cell::Ref<'a, str>; + + fn next(&mut self) -> Option<Self::Item> { + let line = std::cell::Ref::filter_map( + std::cell::Ref::clone(&self.internal), + |internal| internal.editor.line(self.current), + ) + .ok()?; + + self.current += 1; + + Some(line) + } + } + + Lines { + internal: self.0.borrow(), + current: 0, + } + } + + pub fn selection(&self) -> Option<String> { + self.0.borrow().editor.selection() + } } impl<Renderer> Default for Content<Renderer> From d051f21597bb333ac10183aaa3214a292e9aa365 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 16 Sep 2023 15:40:16 +0200 Subject: [PATCH 075/286] Implement `Copy` and `Paste` actions for `text::Editor` --- core/src/text/editor.rs | 5 ++++- examples/editor/src/main.rs | 2 +- graphics/src/text/editor.rs | 11 +++++++++++ widget/src/text_editor.rs | 11 ++++++++--- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 5532fac5..003557c1 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -1,6 +1,8 @@ use crate::text::LineHeight; use crate::{Pixels, Point, Rectangle, Size}; +use std::sync::Arc; + pub trait Editor: Sized + Default { type Font: Copy + PartialEq + Default; @@ -30,13 +32,14 @@ pub trait Editor: Sized + Default { ); } -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub enum Action { Move(Motion), Select(Motion), SelectWord, SelectLine, Insert(char), + Paste(Arc<String>), Enter, Backspace, Delete, diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 2a70b34c..11819c69 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -9,7 +9,7 @@ struct Editor { content: text_editor::Content, } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] enum Message { Edit(text_editor::Action), } diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 1e375a25..1890cb82 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -398,6 +398,17 @@ impl editor::Editor for Editor { editor .action(font_system.raw(), cosmic_text::Action::Insert(c)); } + Action::Paste(text) => { + editor.insert_string(&text, None); + + // TODO: Fix cosmic-text + // Cursor should be marked as moved after `insert_string`. + let cursor = editor.cursor(); + + editor + .buffer_mut() + .shape_until_cursor(font_system.raw(), cursor); + } Action::Enter => { editor.action(font_system.raw(), cosmic_text::Action::Enter); } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index ec7a6d1d..0bb6b7d3 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -12,6 +12,7 @@ use crate::core::{ }; use std::cell::RefCell; +use std::sync::Arc; pub use crate::style::text_editor::{Appearance, StyleSheet}; pub use text::editor::{Action, Motion}; @@ -253,10 +254,14 @@ where Update::Edit(action) => { shell.publish(on_edit(action)); } - Update::Copy => todo!(), + Update::Copy => { + if let Some(selection) = self.content.selection() { + clipboard.write(selection); + } + } Update::Paste => { - if let Some(_contents) = clipboard.read() { - todo!() + if let Some(contents) = clipboard.read() { + shell.publish(on_edit(Action::Paste(Arc::new(contents)))); } } } From c9dbccba468da683af2513535c40374da804aa60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 16 Sep 2023 16:27:02 +0200 Subject: [PATCH 076/286] Use fork of `cosmic-text` with some minor fixes --- Cargo.toml | 4 ++++ graphics/src/text/editor.rs | 36 +----------------------------------- 2 files changed, 5 insertions(+), 35 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index af74a3cf..f8dd5f14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -151,3 +151,7 @@ wgpu = "0.17" winapi = "0.3" window_clipboard = "0.3" winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8d9923870de1d4ab1994146e", default-features = false } + +[patch.crates-io.cosmic-text] +git = "https://github.com/hecrj/cosmic-text.git" +rev = "cb83458e7d0b84ef37c5beb72dda5046d7d343a6" diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 1890cb82..a828a3bc 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -81,33 +81,7 @@ impl editor::Editor for Editor { } fn selection(&self) -> Option<String> { - let internal = self.internal(); - - let cursor = internal.editor.cursor(); - let selection = internal.editor.select_opt()?; - - let (start, end) = if cursor < selection { - (cursor, selection) - } else { - (selection, cursor) - }; - - Some( - internal.editor.buffer().lines[start.line..=end.line] - .iter() - .enumerate() - .map(|(i, line)| { - if i == 0 { - &line.text()[start.index..] - } else if i == end.line - start.line { - &line.text()[..end.index] - } else { - line.text() - } - }) - .collect::<Vec<_>>() - .join("\n"), - ) + self.internal().editor.copy_selection() } fn cursor(&self) -> editor::Cursor { @@ -400,14 +374,6 @@ impl editor::Editor for Editor { } Action::Paste(text) => { editor.insert_string(&text, None); - - // TODO: Fix cosmic-text - // Cursor should be marked as moved after `insert_string`. - let cursor = editor.cursor(); - - editor - .buffer_mut() - .shape_until_cursor(font_system.raw(), cursor); } Action::Enter => { editor.action(font_system.raw(), cosmic_text::Action::Enter); From 45c5cfe5774ac99a6e1b1d1014418f68b21b41cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 16 Sep 2023 19:05:31 +0200 Subject: [PATCH 077/286] Avoid drag on double or triple click for now in `TextEditor` --- core/src/mouse/click.rs | 4 +++ widget/src/text_editor.rs | 52 +++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/core/src/mouse/click.rs b/core/src/mouse/click.rs index 4a7d796c..e8e5fb56 100644 --- a/core/src/mouse/click.rs +++ b/core/src/mouse/click.rs @@ -61,6 +61,10 @@ impl Click { self.kind } + pub fn position(&self) -> Point { + self.position + } + fn is_consecutive(&self, new_position: Point, time: Instant) -> bool { let duration = if time > self.time { Some(time - self.time) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 0bb6b7d3..68e3c656 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -162,8 +162,8 @@ where struct State { is_focused: bool, - is_dragging: bool, last_click: Option<mouse::Click>, + drag_click: Option<mouse::click::Kind>, } impl<'a, Message, Renderer> Widget<Message, Renderer> @@ -179,8 +179,8 @@ where fn state(&self) -> widget::tree::State { widget::tree::State::new(State { is_focused: false, - is_dragging: false, last_click: None, + drag_click: None, }) } @@ -238,18 +238,27 @@ where }; match update { - Update::Click { click, action } => { + Update::Click(click) => { + let action = match click.kind() { + mouse::click::Kind::Single => { + Action::Click(click.position()) + } + mouse::click::Kind::Double => Action::SelectWord, + mouse::click::Kind::Triple => Action::SelectLine, + }; + state.is_focused = true; - state.is_dragging = true; state.last_click = Some(click); + state.drag_click = Some(click.kind()); + shell.publish(on_edit(action)); } Update::Unfocus => { state.is_focused = false; - state.is_dragging = false; + state.drag_click = None; } - Update::StopDragging => { - state.is_dragging = false; + Update::Release => { + state.drag_click = None; } Update::Edit(action) => { shell.publish(on_edit(action)); @@ -393,9 +402,9 @@ where } enum Update { - Click { click: mouse::Click, action: Action }, + Click(mouse::Click), Unfocus, - StopDragging, + Release, Edit(Action), Copy, Paste, @@ -423,15 +432,7 @@ impl Update { state.last_click, ); - let action = match click.kind() { - mouse::click::Kind::Single => { - Action::Click(cursor_position) - } - mouse::click::Kind::Double => Action::SelectWord, - mouse::click::Kind::Triple => Action::SelectLine, - }; - - Some(Update::Click { click, action }) + Some(Update::Click(click)) } else if state.is_focused { Some(Update::Unfocus) } else { @@ -439,14 +440,17 @@ impl Update { } } mouse::Event::ButtonReleased(mouse::Button::Left) => { - Some(Update::StopDragging) + Some(Update::Release) } - mouse::Event::CursorMoved { .. } if state.is_dragging => { - let cursor_position = cursor.position_in(bounds)? - - Vector::new(padding.top, padding.left); + mouse::Event::CursorMoved { .. } => match state.drag_click { + Some(mouse::click::Kind::Single) => { + let cursor_position = cursor.position_in(bounds)? + - Vector::new(padding.top, padding.left); - edit(Action::Drag(cursor_position)) - } + edit(Action::Drag(cursor_position)) + } + _ => None, + }, _ => None, }, Event::Keyboard(event) => match event { From 723111bb0df486bffaedcaed0722b1793d65bfe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 16 Sep 2023 19:09:31 +0200 Subject: [PATCH 078/286] Remove unnecessary `into_iter` call in `graphics::text` --- graphics/src/text.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/graphics/src/text.rs b/graphics/src/text.rs index 280e4f01..b4aeb2be 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -21,12 +21,11 @@ pub fn font_system() -> &'static RwLock<FontSystem> { FONT_SYSTEM.get_or_init(|| { RwLock::new(FontSystem { - raw: cosmic_text::FontSystem::new_with_fonts( - [cosmic_text::fontdb::Source::Binary(Arc::new( + raw: cosmic_text::FontSystem::new_with_fonts([ + cosmic_text::fontdb::Source::Binary(Arc::new( include_bytes!("../fonts/Iced-Icons.ttf").as_slice(), - ))] - .into_iter(), - ), + )), + ]), version: Version::default(), }) }) From 76dc82e8e8b5201ec10f8d00d851c1decf998583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 15:29:14 +0200 Subject: [PATCH 079/286] Draft `Highlighter` API --- core/src/renderer/null.rs | 11 ++++++ core/src/text.rs | 2 ++ core/src/text/editor.rs | 9 +++++ core/src/text/highlighter.rs | 56 ++++++++++++++++++++++++++++++ graphics/src/text.rs | 8 ++++- graphics/src/text/editor.rs | 67 ++++++++++++++++++++++++++++++++++++ style/src/lib.rs | 2 +- style/src/text_editor.rs | 16 ++++++++- widget/src/helpers.rs | 2 +- widget/src/text_editor.rs | 64 ++++++++++++++++++++++++++-------- 10 files changed, 218 insertions(+), 19 deletions(-) create mode 100644 core/src/text/highlighter.rs diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 01a52c7a..21597c8e 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -149,6 +149,17 @@ impl text::Editor for () { _new_font: Self::Font, _new_size: Pixels, _new_line_height: text::LineHeight, + _new_highlighter: &mut impl text::Highlighter, + ) { + } + + fn highlight<H: text::Highlighter>( + &mut self, + _font: Self::Font, + _highlighter: &mut H, + _format_highlight: impl Fn( + &H::Highlight, + ) -> text::highlighter::Format<Self::Font>, ) { } } diff --git a/core/src/text.rs b/core/src/text.rs index 90581fea..9b9c753c 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -2,8 +2,10 @@ mod paragraph; pub mod editor; +pub mod highlighter; pub use editor::Editor; +pub use highlighter::Highlighter; pub use paragraph::Paragraph; use crate::alignment; diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 003557c1..0f439c8d 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -1,3 +1,4 @@ +use crate::text::highlighter::{self, Highlighter}; use crate::text::LineHeight; use crate::{Pixels, Point, Rectangle, Size}; @@ -29,6 +30,14 @@ pub trait Editor: Sized + Default { new_font: Self::Font, new_size: Pixels, new_line_height: LineHeight, + new_highlighter: &mut impl Highlighter, + ); + + fn highlight<H: Highlighter>( + &mut self, + font: Self::Font, + highlighter: &mut H, + format_highlight: impl Fn(&H::Highlight) -> highlighter::Format<Self::Font>, ); } diff --git a/core/src/text/highlighter.rs b/core/src/text/highlighter.rs new file mode 100644 index 00000000..1f9ac840 --- /dev/null +++ b/core/src/text/highlighter.rs @@ -0,0 +1,56 @@ +use crate::Color; + +use std::hash::Hash; +use std::ops::Range; + +pub trait Highlighter: Clone + 'static { + type Settings: Hash; + type Highlight; + + type Iterator<'a>: Iterator<Item = (Range<usize>, Self::Highlight)> + where + Self: 'a; + + fn new(settings: &Self::Settings) -> Self; + + fn change_line(&mut self, line: usize); + + fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_>; + + fn current_line(&self) -> usize; +} + +#[derive(Debug, Clone, Copy)] +pub struct Style { + pub color: Color, +} + +#[derive(Debug, Clone, Copy)] +pub struct PlainText; + +impl Highlighter for PlainText { + type Settings = (); + type Highlight = (); + + type Iterator<'a> = std::iter::Empty<(Range<usize>, Self::Highlight)>; + + fn new(_settings: &Self::Settings) -> Self { + Self + } + + fn change_line(&mut self, _line: usize) {} + + fn highlight_line(&mut self, _line: &str) -> Self::Iterator<'_> { + std::iter::empty() + } + + fn current_line(&self) -> usize { + usize::MAX + } +} + +#[derive(Debug, Clone, Copy)] +pub struct Format<Font> { + pub color: Option<Color>, + pub font: Option<Font>, +} diff --git a/graphics/src/text.rs b/graphics/src/text.rs index b4aeb2be..5fcfc699 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -10,7 +10,7 @@ pub use cosmic_text; use crate::core::font::{self, Font}; use crate::core::text::Shaping; -use crate::core::Size; +use crate::core::{Color, Size}; use once_cell::sync::OnceCell; use std::borrow::Cow; @@ -129,3 +129,9 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping { Shaping::Advanced => cosmic_text::Shaping::Advanced, } } + +pub fn to_color(color: Color) -> cosmic_text::Color { + let [r, g, b, a] = color.into_rgba8(); + + cosmic_text::Color::rgba(r, g, b, a) +} diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index a828a3bc..901b4295 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,4 +1,5 @@ use crate::core::text::editor::{self, Action, Cursor, Direction, Motion}; +use crate::core::text::highlighter::{self, Highlighter}; use crate::core::text::LineHeight; use crate::core::{Font, Pixels, Point, Rectangle, Size}; use crate::text; @@ -15,6 +16,7 @@ struct Internal { editor: cosmic_text::Editor, font: Font, bounds: Size, + topmost_line_changed: Option<usize>, version: text::Version, } @@ -433,6 +435,7 @@ impl editor::Editor for Editor { new_font: Font, new_size: Pixels, new_line_height: LineHeight, + new_highlighter: &mut impl Highlighter, ) { let editor = self.0.take().expect("editor should always be initialized"); @@ -479,6 +482,69 @@ impl editor::Editor for Editor { internal.bounds = new_bounds; } + if let Some(topmost_line_changed) = internal.topmost_line_changed.take() + { + new_highlighter.change_line(topmost_line_changed); + } + + self.0 = Some(Arc::new(internal)); + } + + fn highlight<H: Highlighter>( + &mut self, + font: Self::Font, + highlighter: &mut H, + format_highlight: impl Fn(&H::Highlight) -> highlighter::Format<Self::Font>, + ) { + let internal = self.internal(); + + let scroll = internal.editor.buffer().scroll(); + let visible_lines = internal.editor.buffer().visible_lines(); + let last_visible_line = (scroll + visible_lines - 1) as usize; + + let current_line = highlighter.current_line(); + + if current_line > last_visible_line { + return; + } + + let editor = + self.0.take().expect("editor should always be initialized"); + + let mut internal = Arc::try_unwrap(editor) + .expect("Editor cannot have multiple strong references"); + + let mut font_system = + text::font_system().write().expect("Write font system"); + + let attributes = text::to_attributes(font); + + for line in &mut internal.editor.buffer_mut().lines + [current_line..=last_visible_line] + { + let mut list = cosmic_text::AttrsList::new(attributes); + + for (range, highlight) in highlighter.highlight_line(line.text()) { + let format = format_highlight(&highlight); + + list.add_span( + range, + cosmic_text::Attrs { + color_opt: format.color.map(text::to_color), + ..if let Some(font) = format.font { + text::to_attributes(font) + } else { + attributes + } + }, + ); + } + + let _ = line.set_attrs_list(list); + } + + internal.editor.shape_as_needed(font_system.raw()); + self.0 = Some(Arc::new(internal)); } } @@ -508,6 +574,7 @@ impl Default for Internal { )), font: Font::default(), bounds: Size::ZERO, + topmost_line_changed: None, version: text::Version::default(), } } diff --git a/style/src/lib.rs b/style/src/lib.rs index 7a97ac77..c9879f24 100644 --- a/style/src/lib.rs +++ b/style/src/lib.rs @@ -15,7 +15,7 @@ clippy::needless_borrow, clippy::new_without_default, clippy::useless_conversion, - missing_docs, + // missing_docs, unused_results, rustdoc::broken_intra_doc_links )] diff --git a/style/src/text_editor.rs b/style/src/text_editor.rs index 45c9bad8..f1c31287 100644 --- a/style/src/text_editor.rs +++ b/style/src/text_editor.rs @@ -1,5 +1,6 @@ //! Change the appearance of a text editor. -use iced_core::{Background, BorderRadius, Color}; +use crate::core::text::highlighter; +use crate::core::{self, Background, BorderRadius, Color}; /// The appearance of a text input. #[derive(Debug, Clone, Copy)] @@ -45,3 +46,16 @@ pub trait StyleSheet { /// Produces the style of a disabled text input. fn disabled(&self, style: &Self::Style) -> Appearance; } + +pub trait Highlight<Font = core::Font, Theme = crate::Theme> { + fn format(&self, theme: &Theme) -> highlighter::Format<Font>; +} + +impl<Font, Theme> Highlight<Font, Theme> for () { + fn format(&self, _theme: &Theme) -> highlighter::Format<Font> { + highlighter::Format { + color: None, + font: None, + } + } +} diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index e3f31513..e0b58722 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -212,7 +212,7 @@ where /// [`TextEditor`]: crate::TextEditor pub fn text_editor<Message, Renderer>( content: &text_editor::Content<Renderer>, -) -> TextEditor<'_, Message, Renderer> +) -> TextEditor<'_, core::text::highlighter::PlainText, Message, Renderer> where Message: Clone, Renderer: core::text::Renderer, diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 68e3c656..b17e1156 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -4,6 +4,7 @@ use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::renderer; use crate::core::text::editor::{Cursor, Editor as _}; +use crate::core::text::highlighter::{self, Highlighter}; use crate::core::text::{self, LineHeight}; use crate::core::widget::{self, Widget}; use crate::core::{ @@ -12,13 +13,15 @@ use crate::core::{ }; use std::cell::RefCell; +use std::ops::DerefMut; use std::sync::Arc; -pub use crate::style::text_editor::{Appearance, StyleSheet}; +pub use crate::style::text_editor::{Appearance, Highlight, StyleSheet}; pub use text::editor::{Action, Motion}; -pub struct TextEditor<'a, Message, Renderer = crate::Renderer> +pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer> where + Highlighter: text::Highlighter, Renderer: text::Renderer, Renderer::Theme: StyleSheet, { @@ -31,9 +34,11 @@ where padding: Padding, style: <Renderer::Theme as StyleSheet>::Style, on_edit: Option<Box<dyn Fn(Action) -> Message + 'a>>, + highlighter_settings: Highlighter::Settings, } -impl<'a, Message, Renderer> TextEditor<'a, Message, Renderer> +impl<'a, Message, Renderer> + TextEditor<'a, highlighter::PlainText, Message, Renderer> where Renderer: text::Renderer, Renderer::Theme: StyleSheet, @@ -49,9 +54,19 @@ where padding: Padding::new(5.0), style: Default::default(), on_edit: None, + highlighter_settings: (), } } +} +impl<'a, Highlighter, Message, Renderer> + TextEditor<'a, Highlighter, Message, Renderer> +where + Highlighter: text::Highlighter, + Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, + Renderer: text::Renderer, + Renderer::Theme: StyleSheet, +{ pub fn on_edit(mut self, on_edit: impl Fn(Action) -> Message + 'a) -> Self { self.on_edit = Some(Box::new(on_edit)); self @@ -160,20 +175,23 @@ where } } -struct State { +struct State<Highlighter> { is_focused: bool, last_click: Option<mouse::Click>, drag_click: Option<mouse::click::Kind>, + highlighter: RefCell<Highlighter>, } -impl<'a, Message, Renderer> Widget<Message, Renderer> - for TextEditor<'a, Message, Renderer> +impl<'a, Highlighter, Message, Renderer> Widget<Message, Renderer> + for TextEditor<'a, Highlighter, Message, Renderer> where + Highlighter: text::Highlighter, + Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, Renderer: text::Renderer, Renderer::Theme: StyleSheet, { fn tag(&self) -> widget::tree::Tag { - widget::tree::Tag::of::<State>() + widget::tree::Tag::of::<State<Highlighter>>() } fn state(&self) -> widget::tree::State { @@ -181,6 +199,9 @@ where is_focused: false, last_click: None, drag_click: None, + highlighter: RefCell::new(Highlighter::new( + &self.highlighter_settings, + )), }) } @@ -194,17 +215,19 @@ where fn layout( &self, - _tree: &mut widget::Tree, + tree: &mut widget::Tree, renderer: &Renderer, limits: &layout::Limits, ) -> iced_renderer::core::layout::Node { let mut internal = self.content.0.borrow_mut(); + let state = tree.state.downcast_mut::<State<Highlighter>>(); internal.editor.update( limits.pad(self.padding).max(), self.font.unwrap_or_else(|| renderer.default_font()), self.text_size.unwrap_or_else(|| renderer.default_size()), self.line_height, + state.highlighter.borrow_mut().deref_mut(), ); layout::Node::new(limits.max()) @@ -225,7 +248,7 @@ where return event::Status::Ignored; }; - let state = tree.state.downcast_mut::<State>(); + let state = tree.state.downcast_mut::<State<Highlighter>>(); let Some(update) = Update::from_event( event, @@ -290,8 +313,14 @@ where ) { let bounds = layout.bounds(); - let internal = self.content.0.borrow(); - let state = tree.state.downcast_ref::<State>(); + let mut internal = self.content.0.borrow_mut(); + let state = tree.state.downcast_ref::<State<Highlighter>>(); + + internal.editor.highlight( + self.font.unwrap_or_else(|| renderer.default_font()), + state.highlighter.borrow_mut().deref_mut(), + |highlight| highlight.format(theme), + ); let is_disabled = self.on_edit.is_none(); let is_mouse_over = cursor.is_over(bounds); @@ -389,14 +418,19 @@ where } } -impl<'a, Message, Renderer> From<TextEditor<'a, Message, Renderer>> +impl<'a, Highlighter, Message, Renderer> + From<TextEditor<'a, Highlighter, Message, Renderer>> for Element<'a, Message, Renderer> where + Highlighter: text::Highlighter, + Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, Message: 'a, Renderer: text::Renderer, Renderer::Theme: StyleSheet, { - fn from(text_editor: TextEditor<'a, Message, Renderer>) -> Self { + fn from( + text_editor: TextEditor<'a, Highlighter, Message, Renderer>, + ) -> Self { Self::new(text_editor) } } @@ -411,9 +445,9 @@ enum Update { } impl Update { - fn from_event( + fn from_event<H: Highlighter>( event: Event, - state: &State, + state: &State<H>, bounds: Rectangle, padding: Padding, cursor: mouse::Cursor, From d3011992a76e83e12f74402c2ade616cdc7f1497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 19:03:58 +0200 Subject: [PATCH 080/286] Implement basic syntax highlighting with `syntect` in `editor` example --- core/src/text/highlighter.rs | 2 +- examples/editor/Cargo.toml | 4 +- examples/editor/src/main.rs | 168 ++++++++++++++++++++++++++++++++++- graphics/src/text/editor.rs | 25 +++++- widget/src/text_editor.rs | 18 ++++ 5 files changed, 211 insertions(+), 6 deletions(-) diff --git a/core/src/text/highlighter.rs b/core/src/text/highlighter.rs index 1f9ac840..a929826f 100644 --- a/core/src/text/highlighter.rs +++ b/core/src/text/highlighter.rs @@ -3,7 +3,7 @@ use crate::Color; use std::hash::Hash; use std::ops::Range; -pub trait Highlighter: Clone + 'static { +pub trait Highlighter: 'static { type Settings: Hash; type Highlight; diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml index 528cf23c..930ee592 100644 --- a/examples/editor/Cargo.toml +++ b/examples/editor/Cargo.toml @@ -7,4 +7,6 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["debug"] \ No newline at end of file +iced.features = ["advanced", "debug"] + +syntect = "5.1" \ No newline at end of file diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 11819c69..a72feebc 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,6 +1,8 @@ use iced::widget::{container, text_editor}; use iced::{Element, Font, Sandbox, Settings, Theme}; +use highlighter::Highlighter; + pub fn main() -> iced::Result { Editor::run(Settings::default()) } @@ -41,7 +43,10 @@ impl Sandbox for Editor { container( text_editor(&self.content) .on_edit(Message::Edit) - .font(Font::with_name("Hasklug Nerd Font Mono")), + .font(Font::with_name("Hasklug Nerd Font Mono")) + .highlight::<Highlighter>(highlighter::Settings { + token: String::from("md"), + }), ) .padding(20) .into() @@ -51,3 +56,164 @@ impl Sandbox for Editor { Theme::Dark } } + +mod highlighter { + use iced::advanced::text::highlighter; + use iced::widget::text_editor; + use iced::{Color, Font, Theme}; + + use std::ops::Range; + use syntect::highlighting; + use syntect::parsing; + + #[derive(Debug, Clone, Hash)] + pub struct Settings { + pub token: String, + } + + pub struct Highlight(highlighting::StyleModifier); + + impl text_editor::Highlight for Highlight { + fn format(&self, _theme: &Theme) -> highlighter::Format<Font> { + highlighter::Format { + color: self.0.foreground.map(|color| { + Color::from_rgba8( + color.r, + color.g, + color.b, + color.a as f32 / 255.0, + ) + }), + font: None, + } + } + } + + pub struct Highlighter { + syntaxes: parsing::SyntaxSet, + parser: parsing::ParseState, + stack: parsing::ScopeStack, + theme: highlighting::Theme, + token: String, + current_line: usize, + } + + impl highlighter::Highlighter for Highlighter { + type Settings = Settings; + type Highlight = Highlight; + + type Iterator<'a> = + Box<dyn Iterator<Item = (Range<usize>, Self::Highlight)> + 'a>; + + fn new(settings: &Self::Settings) -> Self { + let syntaxes = parsing::SyntaxSet::load_defaults_nonewlines(); + + let syntax = syntaxes + .find_syntax_by_token(&settings.token) + .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); + + let parser = parsing::ParseState::new(&syntax); + let stack = parsing::ScopeStack::new(); + + let theme = highlighting::ThemeSet::load_defaults() + .themes + .remove("base16-mocha.dark") + .unwrap(); + + Highlighter { + syntaxes, + parser, + stack, + theme, + token: settings.token.clone(), + current_line: 0, + } + } + + fn change_line(&mut self, _line: usize) { + // TODO: Caching + let syntax = self + .syntaxes + .find_syntax_by_token(&self.token) + .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()); + + self.parser = parsing::ParseState::new(&syntax); + self.stack = parsing::ScopeStack::new(); + self.current_line = 0; + } + + fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_> { + self.current_line += 1; + + let ops = self + .parser + .parse_line(line, &self.syntaxes) + .unwrap_or_default(); + + Box::new( + ScopeRangeIterator { + ops, + line_length: line.len(), + index: 0, + last_str_index: 0, + } + .filter_map(move |(range, scope)| { + let highlighter = + highlighting::Highlighter::new(&self.theme); + let _ = self.stack.apply(&scope); + + if range.is_empty() { + None + } else { + Some(( + range, + Highlight( + highlighter + .style_mod_for_stack(&self.stack.scopes), + ), + )) + } + }), + ) + } + + fn current_line(&self) -> usize { + self.current_line + } + } + + pub struct ScopeRangeIterator { + ops: Vec<(usize, parsing::ScopeStackOp)>, + line_length: usize, + index: usize, + last_str_index: usize, + } + + impl Iterator for ScopeRangeIterator { + type Item = (std::ops::Range<usize>, parsing::ScopeStackOp); + + fn next(&mut self) -> Option<Self::Item> { + if self.index > self.ops.len() { + return None; + } + + let next_str_i = if self.index == self.ops.len() { + self.line_length + } else { + self.ops[self.index].0 + }; + + let range = self.last_str_index..next_str_i; + self.last_str_index = next_str_i; + + let op = if self.index == 0 { + parsing::ScopeStackOp::Noop + } else { + self.ops[self.index - 1].1.clone() + }; + + self.index += 1; + Some((range, op)) + } + } +} diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 901b4295..58fcc3dc 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -447,17 +447,26 @@ impl editor::Editor for Editor { text::font_system().write().expect("Write font system"); if font_system.version() != internal.version { + log::trace!("Updating `FontSystem` of `Editor`..."); + for line in internal.editor.buffer_mut().lines.iter_mut() { line.reset(); } } if new_font != internal.font { + log::trace!("Updating font of `Editor`..."); + for line in internal.editor.buffer_mut().lines.iter_mut() { let _ = line.set_attrs_list(cosmic_text::AttrsList::new( text::to_attributes(new_font), )); } + + internal.font = new_font; + internal.topmost_line_changed = Some(0); + + internal.editor.shape_as_needed(font_system.raw()); } let metrics = internal.editor.buffer().metrics(); @@ -466,6 +475,8 @@ impl editor::Editor for Editor { if new_size.0 != metrics.font_size || new_line_height.0 != metrics.line_height { + log::trace!("Updating `Metrics` of `Editor`..."); + internal.editor.buffer_mut().set_metrics( font_system.raw(), cosmic_text::Metrics::new(new_size.0, new_line_height.0), @@ -473,6 +484,8 @@ impl editor::Editor for Editor { } if new_bounds != internal.bounds { + log::trace!("Updating size of `Editor`..."); + internal.editor.buffer_mut().set_size( font_system.raw(), new_bounds.width, @@ -484,6 +497,10 @@ impl editor::Editor for Editor { if let Some(topmost_line_changed) = internal.topmost_line_changed.take() { + log::trace!( + "Notifying highlighter of line change: {topmost_line_changed}" + ); + new_highlighter.change_line(topmost_line_changed); } @@ -497,10 +514,12 @@ impl editor::Editor for Editor { format_highlight: impl Fn(&H::Highlight) -> highlighter::Format<Self::Font>, ) { let internal = self.internal(); + let buffer = internal.editor.buffer(); - let scroll = internal.editor.buffer().scroll(); - let visible_lines = internal.editor.buffer().visible_lines(); - let last_visible_line = (scroll + visible_lines - 1) as usize; + let scroll = buffer.scroll(); + let visible_lines = buffer.visible_lines(); + let last_visible_line = + ((scroll + visible_lines) as usize).min(buffer.lines.len()) - 1; let current_line = highlighter.current_line(); diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index b17e1156..03adbb59 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -81,6 +81,24 @@ where self.padding = padding.into(); self } + + pub fn highlight<H: text::Highlighter>( + self, + settings: H::Settings, + ) -> TextEditor<'a, H, Message, Renderer> { + TextEditor { + content: self.content, + font: self.font, + text_size: self.text_size, + line_height: self.line_height, + width: self.width, + height: self.height, + padding: self.padding, + style: self.style, + on_edit: self.on_edit, + highlighter_settings: settings, + } + } } pub struct Content<R = crate::Renderer>(RefCell<Internal<R>>) From 23d00445ff1225b3e5ca99cb27966143cda8a2ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 19:06:20 +0200 Subject: [PATCH 081/286] Use `saturating_sub` for `last_visible_line` in `text::Editor` --- graphics/src/text/editor.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 58fcc3dc..fbae287e 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -518,8 +518,9 @@ impl editor::Editor for Editor { let scroll = buffer.scroll(); let visible_lines = buffer.visible_lines(); - let last_visible_line = - ((scroll + visible_lines) as usize).min(buffer.lines.len()) - 1; + let last_visible_line = ((scroll + visible_lines) as usize) + .min(buffer.lines.len()) + .saturating_sub(1); let current_line = highlighter.current_line(); From 2897986f2ded7318894a52572bec3d62754ebfaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 19:27:51 +0200 Subject: [PATCH 082/286] Notify `Highlighter` of topmost line change --- core/src/text/editor.rs | 9 ++++-- graphics/src/text/editor.rs | 58 +++++++++++++++++++++++++------------ widget/src/text_editor.rs | 25 +++++++++------- 3 files changed, 61 insertions(+), 31 deletions(-) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 0f439c8d..2144715f 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -47,13 +47,18 @@ pub enum Action { Select(Motion), SelectWord, SelectLine, + Edit(Edit), + Click(Point), + Drag(Point), +} + +#[derive(Debug, Clone, PartialEq)] +pub enum Edit { Insert(char), Paste(Arc<String>), Enter, Backspace, Delete, - Click(Point), - Drag(Point), } #[derive(Debug, Clone, Copy, PartialEq)] diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index fbae287e..47c210bd 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,10 +1,12 @@ -use crate::core::text::editor::{self, Action, Cursor, Direction, Motion}; +use crate::core::text::editor::{ + self, Action, Cursor, Direction, Edit, Motion, +}; use crate::core::text::highlighter::{self, Highlighter}; use crate::core::text::LineHeight; use crate::core::{Font, Pixels, Point, Rectangle, Size}; use crate::text; -use cosmic_text::Edit; +use cosmic_text::Edit as _; use std::fmt; use std::sync::{self, Arc}; @@ -370,22 +372,42 @@ impl editor::Editor for Editor { } // Editing events - Action::Insert(c) => { - editor - .action(font_system.raw(), cosmic_text::Action::Insert(c)); - } - Action::Paste(text) => { - editor.insert_string(&text, None); - } - Action::Enter => { - editor.action(font_system.raw(), cosmic_text::Action::Enter); - } - Action::Backspace => { - editor - .action(font_system.raw(), cosmic_text::Action::Backspace); - } - Action::Delete => { - editor.action(font_system.raw(), cosmic_text::Action::Delete); + Action::Edit(edit) => { + match edit { + Edit::Insert(c) => { + editor.action( + font_system.raw(), + cosmic_text::Action::Insert(c), + ); + } + Edit::Paste(text) => { + editor.insert_string(&text, None); + } + Edit::Enter => { + editor.action( + font_system.raw(), + cosmic_text::Action::Enter, + ); + } + Edit::Backspace => { + editor.action( + font_system.raw(), + cosmic_text::Action::Backspace, + ); + } + Edit::Delete => { + editor.action( + font_system.raw(), + cosmic_text::Action::Delete, + ); + } + } + + let cursor = editor.cursor(); + let selection = editor.select_opt().unwrap_or(cursor); + + internal.topmost_line_changed = + Some(cursor.min(selection).line); } // Mouse events diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 03adbb59..c30e185f 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -17,7 +17,7 @@ use std::ops::DerefMut; use std::sync::Arc; pub use crate::style::text_editor::{Appearance, Highlight, StyleSheet}; -pub use text::editor::{Action, Motion}; +pub use text::editor::{Action, Edit, Motion}; pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer> where @@ -301,7 +301,7 @@ where Update::Release => { state.drag_click = None; } - Update::Edit(action) => { + Update::Action(action) => { shell.publish(on_edit(action)); } Update::Copy => { @@ -311,7 +311,9 @@ where } Update::Paste => { if let Some(contents) = clipboard.read() { - shell.publish(on_edit(Action::Paste(Arc::new(contents)))); + shell.publish(on_edit(Action::Edit(Edit::Paste( + Arc::new(contents), + )))); } } } @@ -457,7 +459,7 @@ enum Update { Click(mouse::Click), Unfocus, Release, - Edit(Action), + Action(Action), Copy, Paste, } @@ -470,7 +472,8 @@ impl Update { padding: Padding, cursor: mouse::Cursor, ) -> Option<Self> { - let edit = |action| Some(Update::Edit(action)); + let action = |action| Some(Update::Action(action)); + let edit = |edit| action(Action::Edit(edit)); match event { Event::Mouse(event) => match event { @@ -499,7 +502,7 @@ impl Update { let cursor_position = cursor.position_in(bounds)? - Vector::new(padding.top, padding.left); - edit(Action::Drag(cursor_position)) + action(Action::Drag(cursor_position)) } _ => None, }, @@ -518,7 +521,7 @@ impl Update { motion }; - return edit(if modifiers.shift() { + return action(if modifiers.shift() { Action::Select(motion) } else { Action::Move(motion) @@ -526,9 +529,9 @@ impl Update { } match key_code { - keyboard::KeyCode::Enter => edit(Action::Enter), - keyboard::KeyCode::Backspace => edit(Action::Backspace), - keyboard::KeyCode::Delete => edit(Action::Delete), + keyboard::KeyCode::Enter => edit(Edit::Enter), + keyboard::KeyCode::Backspace => edit(Edit::Backspace), + keyboard::KeyCode::Delete => edit(Edit::Delete), keyboard::KeyCode::Escape => Some(Self::Unfocus), keyboard::KeyCode::C if modifiers.command() => { Some(Self::Copy) @@ -542,7 +545,7 @@ impl Update { } } keyboard::Event::CharacterReceived(c) if state.is_focused => { - edit(Action::Insert(c)) + edit(Edit::Insert(c)) } _ => None, }, From 790c0dabcf0a50a2466e47daeb4f1e149b2ede5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 21:45:13 +0200 Subject: [PATCH 083/286] Implement syntax highlighting cache in `editor` example --- Cargo.toml | 4 +++ examples/editor/src/main.rs | 67 +++++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f8dd5f14..70f84460 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -155,3 +155,7 @@ winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8 [patch.crates-io.cosmic-text] git = "https://github.com/hecrj/cosmic-text.git" rev = "cb83458e7d0b84ef37c5beb72dda5046d7d343a6" + +[patch.crates-io.rangemap] +git = "https://github.com/hecrj/rangemap.git" +branch = "fix/partial-eq" diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index a72feebc..1235d38b 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -64,7 +64,7 @@ mod highlighter { use std::ops::Range; use syntect::highlighting; - use syntect::parsing; + use syntect::parsing::{self, SyntaxReference}; #[derive(Debug, Clone, Hash)] pub struct Settings { @@ -91,13 +91,14 @@ mod highlighter { pub struct Highlighter { syntaxes: parsing::SyntaxSet, - parser: parsing::ParseState, - stack: parsing::ScopeStack, + syntax: SyntaxReference, + caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, theme: highlighting::Theme, - token: String, current_line: usize, } + const LINES_PER_SNAPSHOT: usize = 50; + impl highlighter::Highlighter for Highlighter { type Settings = Settings; type Highlight = Highlight; @@ -121,34 +122,53 @@ mod highlighter { .unwrap(); Highlighter { + syntax: syntax.clone(), syntaxes, - parser, - stack, + caches: vec![(parser, stack)], theme, - token: settings.token.clone(), current_line: 0, } } - fn change_line(&mut self, _line: usize) { - // TODO: Caching - let syntax = self - .syntaxes - .find_syntax_by_token(&self.token) - .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()); + fn change_line(&mut self, line: usize) { + let snapshot = line / LINES_PER_SNAPSHOT; - self.parser = parsing::ParseState::new(&syntax); - self.stack = parsing::ScopeStack::new(); - self.current_line = 0; + if snapshot <= self.caches.len() { + self.caches.truncate(snapshot); + self.current_line = snapshot * LINES_PER_SNAPSHOT; + } else { + self.caches.truncate(1); + self.current_line = 0; + } + + let (parser, stack) = + self.caches.last().cloned().unwrap_or_else(|| { + ( + parsing::ParseState::new(&self.syntax), + parsing::ScopeStack::new(), + ) + }); + + self.caches.push((parser, stack)); } fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_> { + if self.current_line / LINES_PER_SNAPSHOT >= self.caches.len() { + let (parser, stack) = + self.caches.last().expect("Caches must not be empty"); + + self.caches.push((parser.clone(), stack.clone())); + } + self.current_line += 1; - let ops = self - .parser - .parse_line(line, &self.syntaxes) - .unwrap_or_default(); + let (parser, stack) = + self.caches.last_mut().expect("Caches must not be empty"); + + let ops = + parser.parse_line(line, &self.syntaxes).unwrap_or_default(); + + let highlighter = highlighting::Highlighter::new(&self.theme); Box::new( ScopeRangeIterator { @@ -158,9 +178,7 @@ mod highlighter { last_str_index: 0, } .filter_map(move |(range, scope)| { - let highlighter = - highlighting::Highlighter::new(&self.theme); - let _ = self.stack.apply(&scope); + let _ = stack.apply(&scope); if range.is_empty() { None @@ -168,8 +186,7 @@ mod highlighter { Some(( range, Highlight( - highlighter - .style_mod_for_stack(&self.stack.scopes), + highlighter.style_mod_for_stack(&stack.scopes), ), )) } From 86d396cf8bede8155bdd4a7d3f115a0108c67297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 23:15:38 +0200 Subject: [PATCH 084/286] Avoid adding unnecessary spans when syntax highlighting --- Cargo.toml | 2 +- graphics/src/text/editor.rs | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 70f84460..ac59085d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,7 +154,7 @@ winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8 [patch.crates-io.cosmic-text] git = "https://github.com/hecrj/cosmic-text.git" -rev = "cb83458e7d0b84ef37c5beb72dda5046d7d343a6" +branch = "editor-fixes" [patch.crates-io.rangemap] git = "https://github.com/hecrj/rangemap.git" diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 47c210bd..95061c3c 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -569,17 +569,19 @@ impl editor::Editor for Editor { for (range, highlight) in highlighter.highlight_line(line.text()) { let format = format_highlight(&highlight); - list.add_span( - range, - cosmic_text::Attrs { - color_opt: format.color.map(text::to_color), - ..if let Some(font) = format.font { - text::to_attributes(font) - } else { - attributes - } - }, - ); + if format.color.is_some() || format.font.is_some() { + list.add_span( + range, + cosmic_text::Attrs { + color_opt: format.color.map(text::to_color), + ..if let Some(font) = format.font { + text::to_attributes(font) + } else { + attributes + } + }, + ); + } } let _ = line.set_attrs_list(list); From 8f8528a4ccee049aba779fe86cda786a52afac30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 17 Sep 2023 23:20:15 +0200 Subject: [PATCH 085/286] Fix unnecessary dereference in `editor` example --- examples/editor/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 1235d38b..74649676 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -113,7 +113,7 @@ mod highlighter { .find_syntax_by_token(&settings.token) .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); - let parser = parsing::ParseState::new(&syntax); + let parser = parsing::ParseState::new(syntax); let stack = parsing::ScopeStack::new(); let theme = highlighting::ThemeSet::load_defaults() From d1440ceca6340d045e556eb05354c254881732f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 13:39:47 +0200 Subject: [PATCH 086/286] Find correct `last_visible_line` in `Editor::highlight` --- graphics/src/text/editor.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 95061c3c..18c9b572 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -538,11 +538,27 @@ impl editor::Editor for Editor { let internal = self.internal(); let buffer = internal.editor.buffer(); - let scroll = buffer.scroll(); - let visible_lines = buffer.visible_lines(); - let last_visible_line = ((scroll + visible_lines) as usize) - .min(buffer.lines.len()) - .saturating_sub(1); + let mut window = buffer.scroll() + buffer.visible_lines(); + + let last_visible_line = buffer + .lines + .iter() + .enumerate() + .find_map(|(i, line)| { + let visible_lines = line + .layout_opt() + .as_ref() + .expect("Line layout should be cached") + .len() as i32; + + if window > visible_lines { + window -= visible_lines; + None + } else { + Some(i) + } + }) + .unwrap_or(buffer.lines.len()); let current_line = highlighter.current_line(); From a01b123cec1b57a9100d56f567fcfbf91967b12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 13:57:47 +0200 Subject: [PATCH 087/286] Shape as needed only in `update` during `layout` --- graphics/src/text/editor.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 18c9b572..59096e74 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -442,8 +442,6 @@ impl editor::Editor for Editor { } } - editor.shape_as_needed(font_system.raw()); - self.0 = Some(Arc::new(internal)); } @@ -487,8 +485,6 @@ impl editor::Editor for Editor { internal.font = new_font; internal.topmost_line_changed = Some(0); - - internal.editor.shape_as_needed(font_system.raw()); } let metrics = internal.editor.buffer().metrics(); @@ -526,6 +522,8 @@ impl editor::Editor for Editor { new_highlighter.change_line(topmost_line_changed); } + internal.editor.shape_as_needed(font_system.raw()); + self.0 = Some(Arc::new(internal)); } From b5466f41ca33452fb0d4e8470856c027d3b26e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 13:58:39 +0200 Subject: [PATCH 088/286] Fix inconsistent `expect` messages in `text::editor` --- graphics/src/text/editor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 59096e74..de1b998b 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -43,7 +43,7 @@ impl Editor { fn internal(&self) -> &Arc<Internal> { self.0 .as_ref() - .expect("editor should always be initialized") + .expect("Editor should always be initialized") } } @@ -458,7 +458,7 @@ impl editor::Editor for Editor { new_highlighter: &mut impl Highlighter, ) { let editor = - self.0.take().expect("editor should always be initialized"); + self.0.take().expect("Editor should always be initialized"); let mut internal = Arc::try_unwrap(editor) .expect("Editor cannot have multiple strong references"); @@ -565,7 +565,7 @@ impl editor::Editor for Editor { } let editor = - self.0.take().expect("editor should always be initialized"); + self.0.take().expect("Editor should always be initialized"); let mut internal = Arc::try_unwrap(editor) .expect("Editor cannot have multiple strong references"); From 61ef8f3249218b301d434d04c483ba70562c1df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 13:58:55 +0200 Subject: [PATCH 089/286] Update `version` properly when `FontSystem` changes in `text::editor` --- graphics/src/text/editor.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index de1b998b..4673fce3 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -472,6 +472,9 @@ impl editor::Editor for Editor { for line in internal.editor.buffer_mut().lines.iter_mut() { line.reset(); } + + internal.version = font_system.version(); + internal.topmost_line_changed = Some(0); } if new_font != internal.font { From 8446fe6de52fa68077d23d39f728f79a29b52f00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 14:38:54 +0200 Subject: [PATCH 090/286] Implement theme selector in `editor` example --- core/src/text/highlighter.rs | 7 ++- examples/editor/src/main.rs | 103 ++++++++++++++++++++++++++++------- widget/src/text_editor.rs | 13 ++++- 3 files changed, 100 insertions(+), 23 deletions(-) diff --git a/core/src/text/highlighter.rs b/core/src/text/highlighter.rs index a929826f..b462d083 100644 --- a/core/src/text/highlighter.rs +++ b/core/src/text/highlighter.rs @@ -1,10 +1,9 @@ use crate::Color; -use std::hash::Hash; use std::ops::Range; pub trait Highlighter: 'static { - type Settings: Hash; + type Settings: PartialEq + Clone; type Highlight; type Iterator<'a>: Iterator<Item = (Range<usize>, Self::Highlight)> @@ -13,6 +12,8 @@ pub trait Highlighter: 'static { fn new(settings: &Self::Settings) -> Self; + fn update(&mut self, new_settings: &Self::Settings); + fn change_line(&mut self, line: usize); fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_>; @@ -38,6 +39,8 @@ impl Highlighter for PlainText { Self } + fn update(&mut self, _new_settings: &Self::Settings) {} + fn change_line(&mut self, _line: usize) {} fn highlight_line(&mut self, _line: &str) -> Self::Iterator<'_> { diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 74649676..fa35ba0f 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,5 +1,5 @@ -use iced::widget::{container, text_editor}; -use iced::{Element, Font, Sandbox, Settings, Theme}; +use iced::widget::{column, horizontal_space, pick_list, row, text_editor}; +use iced::{Element, Font, Length, Sandbox, Settings, Theme}; use highlighter::Highlighter; @@ -9,11 +9,13 @@ pub fn main() -> iced::Result { struct Editor { content: text_editor::Content, + theme: highlighter::Theme, } #[derive(Debug, Clone)] enum Message { Edit(text_editor::Action), + ThemeSelected(highlighter::Theme), } impl Sandbox for Editor { @@ -21,9 +23,8 @@ impl Sandbox for Editor { fn new() -> Self { Self { - content: text_editor::Content::with(include_str!( - "../../../README.md" - )), + content: text_editor::Content::with(include_str!("main.rs")), + theme: highlighter::Theme::SolarizedDark, } } @@ -36,18 +37,33 @@ impl Sandbox for Editor { Message::Edit(action) => { self.content.edit(action); } + Message::ThemeSelected(theme) => { + self.theme = theme; + } } } fn view(&self) -> Element<Message> { - container( + column![ + row![ + horizontal_space(Length::Fill), + pick_list( + highlighter::Theme::ALL, + Some(self.theme), + Message::ThemeSelected + ) + .padding([5, 10]) + ] + .spacing(10), text_editor(&self.content) .on_edit(Message::Edit) .font(Font::with_name("Hasklug Nerd Font Mono")) .highlight::<Highlighter>(highlighter::Settings { - token: String::from("md"), + theme: self.theme, + extension: String::from("rs"), }), - ) + ] + .spacing(10) .padding(20) .into() } @@ -60,21 +76,52 @@ impl Sandbox for Editor { mod highlighter { use iced::advanced::text::highlighter; use iced::widget::text_editor; - use iced::{Color, Font, Theme}; + use iced::{Color, Font}; use std::ops::Range; use syntect::highlighting; use syntect::parsing::{self, SyntaxReference}; - #[derive(Debug, Clone, Hash)] + #[derive(Debug, Clone, PartialEq)] pub struct Settings { - pub token: String, + pub theme: Theme, + pub extension: String, + } + + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + pub enum Theme { + SolarizedDark, + InspiredGitHub, + Base16Mocha, + } + + impl Theme { + pub const ALL: &[Self] = + &[Self::SolarizedDark, Self::InspiredGitHub, Self::Base16Mocha]; + + fn key(&self) -> &'static str { + match self { + Theme::InspiredGitHub => "InspiredGitHub", + Theme::Base16Mocha => "base16-mocha.dark", + Theme::SolarizedDark => "Solarized (dark)", + } + } + } + + impl std::fmt::Display for Theme { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Theme::InspiredGitHub => write!(f, "Inspired GitHub"), + Theme::Base16Mocha => write!(f, "Mocha"), + Theme::SolarizedDark => write!(f, "Solarized Dark"), + } + } } pub struct Highlight(highlighting::StyleModifier); impl text_editor::Highlight for Highlight { - fn format(&self, _theme: &Theme) -> highlighter::Format<Font> { + fn format(&self, _theme: &iced::Theme) -> highlighter::Format<Font> { highlighter::Format { color: self.0.foreground.map(|color| { Color::from_rgba8( @@ -92,8 +139,8 @@ mod highlighter { pub struct Highlighter { syntaxes: parsing::SyntaxSet, syntax: SyntaxReference, - caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, theme: highlighting::Theme, + caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, current_line: usize, } @@ -110,26 +157,42 @@ mod highlighter { let syntaxes = parsing::SyntaxSet::load_defaults_nonewlines(); let syntax = syntaxes - .find_syntax_by_token(&settings.token) + .find_syntax_by_token(&settings.extension) .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); + let theme = highlighting::ThemeSet::load_defaults() + .themes + .remove(settings.theme.key()) + .unwrap(); + let parser = parsing::ParseState::new(syntax); let stack = parsing::ScopeStack::new(); - let theme = highlighting::ThemeSet::load_defaults() - .themes - .remove("base16-mocha.dark") - .unwrap(); - Highlighter { syntax: syntax.clone(), syntaxes, - caches: vec![(parser, stack)], theme, + caches: vec![(parser, stack)], current_line: 0, } } + fn update(&mut self, new_settings: &Self::Settings) { + self.syntax = self + .syntaxes + .find_syntax_by_token(&new_settings.extension) + .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()) + .clone(); + + self.theme = highlighting::ThemeSet::load_defaults() + .themes + .remove(new_settings.theme.key()) + .unwrap(); + + // Restart the highlighter + self.change_line(0); + } + fn change_line(&mut self, line: usize) { let snapshot = line / LINES_PER_SNAPSHOT; diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index c30e185f..0cde2c98 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -193,11 +193,12 @@ where } } -struct State<Highlighter> { +struct State<Highlighter: text::Highlighter> { is_focused: bool, last_click: Option<mouse::Click>, drag_click: Option<mouse::click::Kind>, highlighter: RefCell<Highlighter>, + highlighter_settings: Highlighter::Settings, } impl<'a, Highlighter, Message, Renderer> Widget<Message, Renderer> @@ -220,6 +221,7 @@ where highlighter: RefCell::new(Highlighter::new( &self.highlighter_settings, )), + highlighter_settings: self.highlighter_settings.clone(), }) } @@ -240,6 +242,15 @@ where let mut internal = self.content.0.borrow_mut(); let state = tree.state.downcast_mut::<State<Highlighter>>(); + if state.highlighter_settings != self.highlighter_settings { + state + .highlighter + .borrow_mut() + .update(&self.highlighter_settings); + + state.highlighter_settings = self.highlighter_settings.clone(); + } + internal.editor.update( limits.pad(self.padding).max(), self.font.unwrap_or_else(|| renderer.default_font()), From e7326f0af6f16cf2ff04fbac93bf296a044923f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 19:07:41 +0200 Subject: [PATCH 091/286] Flesh out the `editor` example a bit more --- core/src/renderer/null.rs | 4 + core/src/text/editor.rs | 8 + examples/editor/Cargo.toml | 8 +- examples/editor/fonts/icons.ttf | Bin 0 -> 6352 bytes examples/editor/src/main.rs | 285 +++++++++++++++++++++++++++++--- graphics/src/text/editor.rs | 8 +- src/settings.rs | 8 + widget/src/text_editor.rs | 4 + winit/src/application.rs | 9 +- winit/src/settings.rs | 4 + 10 files changed, 311 insertions(+), 27 deletions(-) create mode 100644 examples/editor/fonts/icons.ttf diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 21597c8e..da0f32de 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -125,6 +125,10 @@ impl text::Editor for () { text::editor::Cursor::Caret(Point::ORIGIN) } + fn cursor_position(&self) -> (usize, usize) { + (0, 0) + } + fn selection(&self) -> Option<String> { None } diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 2144715f..13bafc3d 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -12,6 +12,8 @@ pub trait Editor: Sized + Default { fn cursor(&self) -> Cursor; + fn cursor_position(&self) -> (usize, usize); + fn selection(&self) -> Option<String>; fn line(&self, index: usize) -> Option<&str>; @@ -52,6 +54,12 @@ pub enum Action { Drag(Point), } +impl Action { + pub fn is_edit(&self) -> bool { + matches!(self, Self::Edit(_)) + } +} + #[derive(Debug, Clone, PartialEq)] pub enum Edit { Insert(char), diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml index 930ee592..eeb34aa1 100644 --- a/examples/editor/Cargo.toml +++ b/examples/editor/Cargo.toml @@ -7,6 +7,10 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["advanced", "debug"] +iced.features = ["advanced", "tokio", "debug"] -syntect = "5.1" \ No newline at end of file +tokio.workspace = true +tokio.features = ["fs"] + +syntect = "5.1" +rfd = "0.12" diff --git a/examples/editor/fonts/icons.ttf b/examples/editor/fonts/icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..393c6922e52f0fce49800b294962763daee5a0f3 GIT binary patch literal 6352 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 Mle_MshbAZg3pft6(f|Me literal 0 HcmV?d00001 diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index fa35ba0f..09c4b9b5 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,70 +1,218 @@ -use iced::widget::{column, horizontal_space, pick_list, row, text_editor}; -use iced::{Element, Font, Length, Sandbox, Settings, Theme}; +use iced::executor; +use iced::theme::{self, Theme}; +use iced::widget::{ + button, column, container, horizontal_space, pick_list, row, text, + text_editor, tooltip, +}; +use iced::{Application, Command, Element, Font, Length, Settings}; use highlighter::Highlighter; +use std::ffi; +use std::io; +use std::path::{Path, PathBuf}; +use std::sync::Arc; + pub fn main() -> iced::Result { - Editor::run(Settings::default()) + Editor::run(Settings { + fonts: vec![include_bytes!("../fonts/icons.ttf").as_slice().into()], + default_font: Font { + monospaced: true, + ..Font::with_name("Hasklug Nerd Font Mono") + }, + ..Settings::default() + }) } struct Editor { + file: Option<PathBuf>, content: text_editor::Content, theme: highlighter::Theme, + is_loading: bool, + is_dirty: bool, } #[derive(Debug, Clone)] enum Message { Edit(text_editor::Action), ThemeSelected(highlighter::Theme), + NewFile, + OpenFile, + FileOpened(Result<(PathBuf, Arc<String>), Error>), + SaveFile, + FileSaved(Result<PathBuf, Error>), } -impl Sandbox for Editor { +impl Application for Editor { type Message = Message; + type Theme = Theme; + type Executor = executor::Default; + type Flags = (); - fn new() -> Self { - Self { - content: text_editor::Content::with(include_str!("main.rs")), - theme: highlighter::Theme::SolarizedDark, - } + fn new(_flags: Self::Flags) -> (Self, Command<Message>) { + ( + Self { + file: None, + content: text_editor::Content::new(), + theme: highlighter::Theme::SolarizedDark, + is_loading: true, + is_dirty: false, + }, + Command::perform(load_file(default_file()), Message::FileOpened), + ) } fn title(&self) -> String { String::from("Editor - Iced") } - fn update(&mut self, message: Message) { + fn update(&mut self, message: Message) -> Command<Message> { match message { Message::Edit(action) => { + self.is_dirty = self.is_dirty || action.is_edit(); + self.content.edit(action); + + Command::none() } Message::ThemeSelected(theme) => { self.theme = theme; + + Command::none() + } + Message::NewFile => { + if !self.is_loading { + self.file = None; + self.content = text_editor::Content::new(); + } + + Command::none() + } + Message::OpenFile => { + if self.is_loading { + Command::none() + } else { + self.is_loading = true; + + Command::perform(open_file(), Message::FileOpened) + } + } + Message::FileOpened(result) => { + self.is_loading = false; + self.is_dirty = false; + + if let Ok((path, contents)) = result { + self.file = Some(path); + self.content = text_editor::Content::with(&contents); + } + + Command::none() + } + Message::SaveFile => { + if self.is_loading { + Command::none() + } else { + self.is_loading = true; + + let mut contents = self.content.lines().enumerate().fold( + String::new(), + |mut contents, (i, line)| { + if i > 0 { + contents.push_str("\n"); + } + + contents.push_str(&line); + + contents + }, + ); + + if !contents.ends_with("\n") { + contents.push_str("\n"); + } + + Command::perform( + save_file(self.file.clone(), contents), + Message::FileSaved, + ) + } + } + Message::FileSaved(result) => { + self.is_loading = false; + + if let Ok(path) = result { + self.file = Some(path); + self.is_dirty = false; + } + + Command::none() } } } fn view(&self) -> Element<Message> { + let controls = row![ + action(new_icon(), "New file", Some(Message::NewFile)), + action( + open_icon(), + "Open file", + (!self.is_loading).then_some(Message::OpenFile) + ), + action( + save_icon(), + "Save file", + self.is_dirty.then_some(Message::SaveFile) + ), + horizontal_space(Length::Fill), + pick_list( + highlighter::Theme::ALL, + Some(self.theme), + Message::ThemeSelected + ) + .text_size(14) + .padding([5, 10]) + ] + .spacing(10); + + let status = row![ + text(if let Some(path) = &self.file { + let path = path.display().to_string(); + + if path.len() > 60 { + format!("...{}", &path[path.len() - 40..]) + } else { + path + } + } else { + String::from("New file") + }), + horizontal_space(Length::Fill), + text({ + let (line, column) = self.content.cursor_position(); + + format!("{}:{}", line + 1, column + 1) + }) + ] + .spacing(10); + column![ - row![ - horizontal_space(Length::Fill), - pick_list( - highlighter::Theme::ALL, - Some(self.theme), - Message::ThemeSelected - ) - .padding([5, 10]) - ] - .spacing(10), + controls, text_editor(&self.content) .on_edit(Message::Edit) - .font(Font::with_name("Hasklug Nerd Font Mono")) .highlight::<Highlighter>(highlighter::Settings { theme: self.theme, - extension: String::from("rs"), + extension: self + .file + .as_deref() + .and_then(Path::extension) + .and_then(ffi::OsStr::to_str) + .map(str::to_string) + .unwrap_or(String::from("rs")), }), + status, ] .spacing(10) - .padding(20) + .padding(10) .into() } @@ -73,6 +221,97 @@ impl Sandbox for Editor { } } +#[derive(Debug, Clone)] +pub enum Error { + DialogClosed, + IoError(io::ErrorKind), +} + +fn default_file() -> PathBuf { + PathBuf::from(format!("{}/src/main.rs", env!("CARGO_MANIFEST_DIR"))) +} + +async fn open_file() -> Result<(PathBuf, Arc<String>), Error> { + let picked_file = rfd::AsyncFileDialog::new() + .set_title("Open a text file...") + .pick_file() + .await + .ok_or(Error::DialogClosed)?; + + load_file(picked_file.path().to_owned()).await +} + +async fn load_file(path: PathBuf) -> Result<(PathBuf, Arc<String>), Error> { + let contents = tokio::fs::read_to_string(&path) + .await + .map(Arc::new) + .map_err(|error| Error::IoError(error.kind()))?; + + Ok((path, contents)) +} + +async fn save_file( + path: Option<PathBuf>, + contents: String, +) -> Result<PathBuf, Error> { + let path = if let Some(path) = path { + path + } else { + rfd::AsyncFileDialog::new() + .save_file() + .await + .as_ref() + .map(rfd::FileHandle::path) + .map(Path::to_owned) + .ok_or(Error::DialogClosed)? + }; + + let _ = tokio::fs::write(&path, contents) + .await + .map_err(|error| Error::IoError(error.kind()))?; + + Ok(path) +} + +fn action<'a, Message: Clone + 'a>( + content: impl Into<Element<'a, Message>>, + label: &'a str, + on_press: Option<Message>, +) -> Element<'a, Message> { + let action = + button(container(content).width(Length::Fill).center_x()).width(40); + + if let Some(on_press) = on_press { + tooltip( + action.on_press(on_press), + label, + tooltip::Position::FollowCursor, + ) + .style(theme::Container::Box) + .into() + } else { + action.style(theme::Button::Secondary).into() + } +} + +fn new_icon<'a, Message>() -> Element<'a, Message> { + icon('\u{0e800}') +} + +fn save_icon<'a, Message>() -> Element<'a, Message> { + icon('\u{0e801}') +} + +fn open_icon<'a, Message>() -> Element<'a, Message> { + icon('\u{0f115}') +} + +fn icon<'a, Message>(codepoint: char) -> Element<'a, Message> { + const ICON_FONT: Font = Font::with_name("editor-icons"); + + text(codepoint).font(ICON_FONT).into() +} + mod highlighter { use iced::advanced::text::highlighter; use iced::widget::text_editor; diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index 4673fce3..dfb91f34 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -221,6 +221,12 @@ impl editor::Editor for Editor { } } + fn cursor_position(&self) -> (usize, usize) { + let cursor = self.internal().editor.cursor(); + + (cursor.line, cursor.index) + } + fn perform(&mut self, action: Action) { let mut font_system = text::font_system().write().expect("Write font system"); @@ -559,7 +565,7 @@ impl editor::Editor for Editor { Some(i) } }) - .unwrap_or(buffer.lines.len()); + .unwrap_or(buffer.lines.len().saturating_sub(1)); let current_line = highlighter.current_line(); diff --git a/src/settings.rs b/src/settings.rs index d9778d7e..6b9ce095 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -2,6 +2,8 @@ use crate::window; use crate::{Font, Pixels}; +use std::borrow::Cow; + /// The settings of an application. #[derive(Debug, Clone)] pub struct Settings<Flags> { @@ -21,6 +23,9 @@ pub struct Settings<Flags> { /// [`Application`]: crate::Application pub flags: Flags, + /// The fonts to load on boot. + pub fonts: Vec<Cow<'static, [u8]>>, + /// The default [`Font`] to be used. /// /// By default, it uses [`Family::SansSerif`](crate::font::Family::SansSerif). @@ -62,6 +67,7 @@ impl<Flags> Settings<Flags> { flags, id: default_settings.id, window: default_settings.window, + fonts: default_settings.fonts, default_font: default_settings.default_font, default_text_size: default_settings.default_text_size, antialiasing: default_settings.antialiasing, @@ -79,6 +85,7 @@ where id: None, window: Default::default(), flags: Default::default(), + fonts: Default::default(), default_font: Default::default(), default_text_size: Pixels(16.0), antialiasing: false, @@ -93,6 +100,7 @@ impl<Flags> From<Settings<Flags>> for iced_winit::Settings<Flags> { id: settings.id, window: settings.window.into(), flags: settings.flags, + fonts: settings.fonts, exit_on_close_request: settings.exit_on_close_request, } } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 0cde2c98..970ec031 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -182,6 +182,10 @@ where pub fn selection(&self) -> Option<String> { self.0.borrow().editor.selection() } + + pub fn cursor_position(&self) -> (usize, usize) { + self.0.borrow().editor.cursor_position() + } } impl<Renderer> Default for Content<Renderer> diff --git a/winit/src/application.rs b/winit/src/application.rs index d1689452..e80e9783 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -193,7 +193,14 @@ where }; } - let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; + let (compositor, mut renderer) = + C::new(compositor_settings, Some(&window))?; + + for font in settings.fonts { + use crate::core::text::Renderer; + + renderer.load_font(font); + } let (mut event_sender, event_receiver) = mpsc::unbounded(); let (control_sender, mut control_receiver) = mpsc::unbounded(); diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 8d3e1b47..b4a1dd61 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -33,6 +33,7 @@ use crate::Position; use winit::monitor::MonitorHandle; use winit::window::WindowBuilder; +use std::borrow::Cow; use std::fmt; /// The settings of an application. @@ -52,6 +53,9 @@ pub struct Settings<Flags> { /// [`Application`]: crate::Application pub flags: Flags, + /// The fonts to load on boot. + pub fonts: Vec<Cow<'static, [u8]>>, + /// Whether the [`Application`] should exit when the user requests the /// window to close (e.g. the user presses the close button). /// From 161a971d065b3254a2f11cb374d2c94c2d67646b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 19:08:57 +0200 Subject: [PATCH 092/286] Fix `clippy` lints --- examples/editor/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 09c4b9b5..785dfb3b 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -118,7 +118,7 @@ impl Application for Editor { String::new(), |mut contents, (i, line)| { if i > 0 { - contents.push_str("\n"); + contents.push('\n'); } contents.push_str(&line); @@ -127,8 +127,8 @@ impl Application for Editor { }, ); - if !contents.ends_with("\n") { - contents.push_str("\n"); + if !contents.ends_with('\n') { + contents.push('\n'); } Command::perform( @@ -266,7 +266,7 @@ async fn save_file( .ok_or(Error::DialogClosed)? }; - let _ = tokio::fs::write(&path, contents) + tokio::fs::write(&path, contents) .await .map_err(|error| Error::IoError(error.kind()))?; From 8eec0033dee816bfcc102fc4f511c8bfe08c14ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 19:24:09 +0200 Subject: [PATCH 093/286] Remove unnecessary `monospaced` flag in `Font` --- core/src/font.rs | 4 ---- examples/editor/src/main.rs | 5 +---- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/core/src/font.rs b/core/src/font.rs index 7f647847..2b68decf 100644 --- a/core/src/font.rs +++ b/core/src/font.rs @@ -12,8 +12,6 @@ pub struct Font { pub stretch: Stretch, /// The [`Style`] of the [`Font`]. pub style: Style, - /// Whether if the [`Font`] is monospaced or not. - pub monospaced: bool, } impl Font { @@ -23,13 +21,11 @@ impl Font { weight: Weight::Normal, stretch: Stretch::Normal, style: Style::Normal, - monospaced: false, }; /// A monospaced font with normal [`Weight`]. pub const MONOSPACE: Font = Font { family: Family::Monospace, - monospaced: true, ..Self::DEFAULT }; diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 785dfb3b..5018b3cb 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -16,10 +16,7 @@ use std::sync::Arc; pub fn main() -> iced::Result { Editor::run(Settings { fonts: vec![include_bytes!("../fonts/icons.ttf").as_slice().into()], - default_font: Font { - monospaced: true, - ..Font::with_name("Hasklug Nerd Font Mono") - }, + default_font: Font::with_name("Hasklug Nerd Font Mono"), ..Settings::default() }) } From d1d0b3aaee84003278b9db3e86687e776f20b346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 20:14:38 +0200 Subject: [PATCH 094/286] Use `Font::MONOSPACE` in `editor` example --- Cargo.toml | 2 +- examples/editor/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ac59085d..e887afc0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,7 +154,7 @@ winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8 [patch.crates-io.cosmic-text] git = "https://github.com/hecrj/cosmic-text.git" -branch = "editor-fixes" +branch = "respect-fontconfig-aliases" [patch.crates-io.rangemap] git = "https://github.com/hecrj/rangemap.git" diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 5018b3cb..277eb3e9 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -16,7 +16,7 @@ use std::sync::Arc; pub fn main() -> iced::Result { Editor::run(Settings { fonts: vec![include_bytes!("../fonts/icons.ttf").as_slice().into()], - default_font: Font::with_name("Hasklug Nerd Font Mono"), + default_font: Font::MONOSPACE, ..Settings::default() }) } From 36e867de693d4e9fc64da3d9d7745a5b1398d8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 18 Sep 2023 20:59:39 +0200 Subject: [PATCH 095/286] Fix `lint` and `test` GitHub CI workflows --- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6fd98374..af34bb13 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,7 +2,7 @@ name: Lint on: [push, pull_request] jobs: all: - runs-on: ubuntu-latest + runs-on: macOS-latest steps: - uses: hecrj/setup-rust-action@v1 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ac8d27f9..215b616b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: run: | export DEBIAN_FRONTED=noninteractive sudo apt-get -qq update - sudo apt-get install -y libxkbcommon-dev + sudo apt-get install -y libxkbcommon-dev libgtk-3-dev - name: Run tests run: | cargo test --verbose --workspace From 4e757a26d0c1c58001f31cf0592131cd5ad886ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 01:18:06 +0200 Subject: [PATCH 096/286] Implement `Scroll` action in `text::editor` --- core/src/text/editor.rs | 1 + graphics/src/text/editor.rs | 6 ++++++ widget/src/text_editor.rs | 12 ++++++++++++ 3 files changed, 19 insertions(+) diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index 13bafc3d..e9d66ce9 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -52,6 +52,7 @@ pub enum Action { Edit(Edit), Click(Point), Drag(Point), + Scroll { lines: i32 }, } impl Action { diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index dfb91f34..a05312dc 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -446,6 +446,12 @@ impl editor::Editor for Editor { } } } + Action::Scroll { lines } => { + editor.action( + font_system.raw(), + cosmic_text::Action::Scroll { lines }, + ); + } } self.0 = Some(Arc::new(internal)); diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 970ec031..ad12a076 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -521,6 +521,18 @@ impl Update { } _ => None, }, + mouse::Event::WheelScrolled { delta } => { + action(Action::Scroll { + lines: match delta { + mouse::ScrollDelta::Lines { y, .. } => { + -y as i32 * 4 + } + mouse::ScrollDelta::Pixels { y, .. } => { + -y.signum() as i32 + } + }, + }) + } _ => None, }, Event::Keyboard(event) => match event { From 06dc12bfbf75958c6534306b3d1b57ae47bdb37a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 19:35:28 +0200 Subject: [PATCH 097/286] Simplify `editor` example --- examples/editor/src/main.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 277eb3e9..6def2082 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -4,7 +4,7 @@ use iced::widget::{ button, column, container, horizontal_space, pick_list, row, text, text_editor, tooltip, }; -use iced::{Application, Command, Element, Font, Length, Settings}; +use iced::{Alignment, Application, Command, Element, Font, Length, Settings}; use highlighter::Highlighter; @@ -169,7 +169,8 @@ impl Application for Editor { .text_size(14) .padding([5, 10]) ] - .spacing(10); + .spacing(10) + .align_items(Alignment::Center); let status = row![ text(if let Some(path) = &self.file { @@ -275,8 +276,7 @@ fn action<'a, Message: Clone + 'a>( label: &'a str, on_press: Option<Message>, ) -> Element<'a, Message> { - let action = - button(container(content).width(Length::Fill).center_x()).width(40); + let action = button(container(content).width(30).center_x()); if let Some(on_press) = on_press { tooltip( @@ -316,7 +316,7 @@ mod highlighter { use std::ops::Range; use syntect::highlighting; - use syntect::parsing::{self, SyntaxReference}; + use syntect::parsing; #[derive(Debug, Clone, PartialEq)] pub struct Settings { @@ -374,7 +374,7 @@ mod highlighter { pub struct Highlighter { syntaxes: parsing::SyntaxSet, - syntax: SyntaxReference, + syntax: parsing::SyntaxReference, theme: highlighting::Theme, caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, current_line: usize, From c0a141ab026f5686d6bd92c8807b174396cb9105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 19:39:23 +0200 Subject: [PATCH 098/286] Save file on `Cmd+S` in `editor` example --- examples/editor/src/main.rs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 6def2082..36d4287c 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,10 +1,14 @@ use iced::executor; +use iced::keyboard; use iced::theme::{self, Theme}; use iced::widget::{ button, column, container, horizontal_space, pick_list, row, text, text_editor, tooltip, }; -use iced::{Alignment, Application, Command, Element, Font, Length, Settings}; +use iced::{ + Alignment, Application, Command, Element, Font, Length, Settings, + Subscription, +}; use highlighter::Highlighter; @@ -147,6 +151,15 @@ impl Application for Editor { } } + fn subscription(&self) -> Subscription<Message> { + keyboard::on_key_press(|key_code, modifiers| match key_code { + keyboard::KeyCode::S if modifiers.command() => { + Some(Message::SaveFile) + } + _ => None, + }) + } + fn view(&self) -> Element<Message> { let controls = row![ action(new_icon(), "New file", Some(Message::NewFile)), From f806d001e6fb44b5a45029ca257261e6e0d4d4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 20:48:50 +0200 Subject: [PATCH 099/286] Introduce new `iced_highlighter` subcrate --- Cargo.toml | 10 +- core/src/text/highlighter.rs | 11 +- examples/editor/Cargo.toml | 2 +- examples/editor/src/main.rs | 251 ++--------------------------------- highlighter/Cargo.toml | 16 +++ highlighter/src/lib.rs | 225 +++++++++++++++++++++++++++++++ src/lib.rs | 3 + style/src/text_editor.rs | 16 +-- widget/src/text_editor.rs | 28 +++- 9 files changed, 302 insertions(+), 260 deletions(-) create mode 100644 highlighter/Cargo.toml create mode 100644 highlighter/src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index e887afc0..8899fa67 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,8 @@ system = ["iced_winit/system"] web-colors = ["iced_renderer/web-colors"] # Enables the WebGL backend, replacing WebGPU webgl = ["iced_renderer/webgl"] +# Enables the syntax `highlighter` module +highlighter = ["iced_highlighter"] # Enables the advanced module advanced = [] @@ -58,6 +60,9 @@ iced_widget.workspace = true iced_winit.features = ["application"] iced_winit.workspace = true +iced_highlighter.workspace = true +iced_highlighter.optional = true + thiserror.workspace = true image.workspace = true @@ -78,8 +83,9 @@ members = [ "core", "futures", "graphics", - "runtime", + "highlighter", "renderer", + "runtime", "style", "tiny_skia", "wgpu", @@ -103,6 +109,7 @@ iced = { version = "0.12", path = "." } iced_core = { version = "0.12", path = "core" } iced_futures = { version = "0.12", path = "futures" } iced_graphics = { version = "0.12", path = "graphics" } +iced_highlighter = { version = "0.12", path = "highlighter" } iced_renderer = { version = "0.12", path = "renderer" } iced_runtime = { version = "0.12", path = "runtime" } iced_style = { version = "0.12", path = "style" } @@ -137,6 +144,7 @@ resvg = "0.35" rustc-hash = "1.0" smol = "1.0" softbuffer = "0.2" +syntect = "5.1" sysinfo = "0.28" thiserror = "1.0" tiny-skia = "0.10" diff --git a/core/src/text/highlighter.rs b/core/src/text/highlighter.rs index b462d083..9a9cff89 100644 --- a/core/src/text/highlighter.rs +++ b/core/src/text/highlighter.rs @@ -52,8 +52,17 @@ impl Highlighter for PlainText { } } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct Format<Font> { pub color: Option<Color>, pub font: Option<Font>, } + +impl<Font> Default for Format<Font> { + fn default() -> Self { + Self { + color: None, + font: None, + } + } +} diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml index eeb34aa1..a77b1e9f 100644 --- a/examples/editor/Cargo.toml +++ b/examples/editor/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["advanced", "tokio", "debug"] +iced.features = ["highlighter", "tokio", "debug"] tokio.workspace = true tokio.features = ["fs"] diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 36d4287c..d513090f 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -1,4 +1,5 @@ use iced::executor; +use iced::highlighter::{self, Highlighter}; use iced::keyboard; use iced::theme::{self, Theme}; use iced::widget::{ @@ -10,8 +11,6 @@ use iced::{ Subscription, }; -use highlighter::Highlighter; - use std::ffi; use std::io; use std::path::{Path, PathBuf}; @@ -210,16 +209,19 @@ impl Application for Editor { controls, text_editor(&self.content) .on_edit(Message::Edit) - .highlight::<Highlighter>(highlighter::Settings { - theme: self.theme, - extension: self - .file - .as_deref() - .and_then(Path::extension) - .and_then(ffi::OsStr::to_str) - .map(str::to_string) - .unwrap_or(String::from("rs")), - }), + .highlight::<Highlighter>( + highlighter::Settings { + theme: self.theme, + extension: self + .file + .as_deref() + .and_then(Path::extension) + .and_then(ffi::OsStr::to_str) + .map(str::to_string) + .unwrap_or(String::from("rs")), + }, + |highlight, _theme| highlight.to_format() + ), status, ] .spacing(10) @@ -321,228 +323,3 @@ fn icon<'a, Message>(codepoint: char) -> Element<'a, Message> { text(codepoint).font(ICON_FONT).into() } - -mod highlighter { - use iced::advanced::text::highlighter; - use iced::widget::text_editor; - use iced::{Color, Font}; - - use std::ops::Range; - use syntect::highlighting; - use syntect::parsing; - - #[derive(Debug, Clone, PartialEq)] - pub struct Settings { - pub theme: Theme, - pub extension: String, - } - - #[derive(Debug, Clone, Copy, PartialEq, Eq)] - pub enum Theme { - SolarizedDark, - InspiredGitHub, - Base16Mocha, - } - - impl Theme { - pub const ALL: &[Self] = - &[Self::SolarizedDark, Self::InspiredGitHub, Self::Base16Mocha]; - - fn key(&self) -> &'static str { - match self { - Theme::InspiredGitHub => "InspiredGitHub", - Theme::Base16Mocha => "base16-mocha.dark", - Theme::SolarizedDark => "Solarized (dark)", - } - } - } - - impl std::fmt::Display for Theme { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Theme::InspiredGitHub => write!(f, "Inspired GitHub"), - Theme::Base16Mocha => write!(f, "Mocha"), - Theme::SolarizedDark => write!(f, "Solarized Dark"), - } - } - } - - pub struct Highlight(highlighting::StyleModifier); - - impl text_editor::Highlight for Highlight { - fn format(&self, _theme: &iced::Theme) -> highlighter::Format<Font> { - highlighter::Format { - color: self.0.foreground.map(|color| { - Color::from_rgba8( - color.r, - color.g, - color.b, - color.a as f32 / 255.0, - ) - }), - font: None, - } - } - } - - pub struct Highlighter { - syntaxes: parsing::SyntaxSet, - syntax: parsing::SyntaxReference, - theme: highlighting::Theme, - caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, - current_line: usize, - } - - const LINES_PER_SNAPSHOT: usize = 50; - - impl highlighter::Highlighter for Highlighter { - type Settings = Settings; - type Highlight = Highlight; - - type Iterator<'a> = - Box<dyn Iterator<Item = (Range<usize>, Self::Highlight)> + 'a>; - - fn new(settings: &Self::Settings) -> Self { - let syntaxes = parsing::SyntaxSet::load_defaults_nonewlines(); - - let syntax = syntaxes - .find_syntax_by_token(&settings.extension) - .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); - - let theme = highlighting::ThemeSet::load_defaults() - .themes - .remove(settings.theme.key()) - .unwrap(); - - let parser = parsing::ParseState::new(syntax); - let stack = parsing::ScopeStack::new(); - - Highlighter { - syntax: syntax.clone(), - syntaxes, - theme, - caches: vec![(parser, stack)], - current_line: 0, - } - } - - fn update(&mut self, new_settings: &Self::Settings) { - self.syntax = self - .syntaxes - .find_syntax_by_token(&new_settings.extension) - .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()) - .clone(); - - self.theme = highlighting::ThemeSet::load_defaults() - .themes - .remove(new_settings.theme.key()) - .unwrap(); - - // Restart the highlighter - self.change_line(0); - } - - fn change_line(&mut self, line: usize) { - let snapshot = line / LINES_PER_SNAPSHOT; - - if snapshot <= self.caches.len() { - self.caches.truncate(snapshot); - self.current_line = snapshot * LINES_PER_SNAPSHOT; - } else { - self.caches.truncate(1); - self.current_line = 0; - } - - let (parser, stack) = - self.caches.last().cloned().unwrap_or_else(|| { - ( - parsing::ParseState::new(&self.syntax), - parsing::ScopeStack::new(), - ) - }); - - self.caches.push((parser, stack)); - } - - fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_> { - if self.current_line / LINES_PER_SNAPSHOT >= self.caches.len() { - let (parser, stack) = - self.caches.last().expect("Caches must not be empty"); - - self.caches.push((parser.clone(), stack.clone())); - } - - self.current_line += 1; - - let (parser, stack) = - self.caches.last_mut().expect("Caches must not be empty"); - - let ops = - parser.parse_line(line, &self.syntaxes).unwrap_or_default(); - - let highlighter = highlighting::Highlighter::new(&self.theme); - - Box::new( - ScopeRangeIterator { - ops, - line_length: line.len(), - index: 0, - last_str_index: 0, - } - .filter_map(move |(range, scope)| { - let _ = stack.apply(&scope); - - if range.is_empty() { - None - } else { - Some(( - range, - Highlight( - highlighter.style_mod_for_stack(&stack.scopes), - ), - )) - } - }), - ) - } - - fn current_line(&self) -> usize { - self.current_line - } - } - - pub struct ScopeRangeIterator { - ops: Vec<(usize, parsing::ScopeStackOp)>, - line_length: usize, - index: usize, - last_str_index: usize, - } - - impl Iterator for ScopeRangeIterator { - type Item = (std::ops::Range<usize>, parsing::ScopeStackOp); - - fn next(&mut self) -> Option<Self::Item> { - if self.index > self.ops.len() { - return None; - } - - let next_str_i = if self.index == self.ops.len() { - self.line_length - } else { - self.ops[self.index].0 - }; - - let range = self.last_str_index..next_str_i; - self.last_str_index = next_str_i; - - let op = if self.index == 0 { - parsing::ScopeStackOp::Noop - } else { - self.ops[self.index - 1].1.clone() - }; - - self.index += 1; - Some((range, op)) - } - } -} diff --git a/highlighter/Cargo.toml b/highlighter/Cargo.toml new file mode 100644 index 00000000..311d2998 --- /dev/null +++ b/highlighter/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "iced_highlighter" +description = "A syntax higlighter for iced" +version.workspace = true +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true +homepage.workspace = true +categories.workspace = true +keywords.workspace = true + +[dependencies] +iced_core.workspace = true + +syntect.workspace = true diff --git a/highlighter/src/lib.rs b/highlighter/src/lib.rs new file mode 100644 index 00000000..79cfafcd --- /dev/null +++ b/highlighter/src/lib.rs @@ -0,0 +1,225 @@ +use iced_core as core; + +use crate::core::text::highlighter::{self, Format}; +use crate::core::{Color, Font}; + +use std::ops::Range; +use syntect::highlighting; +use syntect::parsing; + +pub struct Highlighter { + syntaxes: parsing::SyntaxSet, + syntax: parsing::SyntaxReference, + theme: highlighting::Theme, + caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, + current_line: usize, +} + +const LINES_PER_SNAPSHOT: usize = 50; + +impl highlighter::Highlighter for Highlighter { + type Settings = Settings; + type Highlight = Highlight; + + type Iterator<'a> = + Box<dyn Iterator<Item = (Range<usize>, Self::Highlight)> + 'a>; + + fn new(settings: &Self::Settings) -> Self { + let syntaxes = parsing::SyntaxSet::load_defaults_nonewlines(); + + let syntax = syntaxes + .find_syntax_by_token(&settings.extension) + .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); + + let theme = highlighting::ThemeSet::load_defaults() + .themes + .remove(settings.theme.key()) + .unwrap(); + + let parser = parsing::ParseState::new(syntax); + let stack = parsing::ScopeStack::new(); + + Highlighter { + syntax: syntax.clone(), + syntaxes, + theme, + caches: vec![(parser, stack)], + current_line: 0, + } + } + + fn update(&mut self, new_settings: &Self::Settings) { + self.syntax = self + .syntaxes + .find_syntax_by_token(&new_settings.extension) + .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()) + .clone(); + + self.theme = highlighting::ThemeSet::load_defaults() + .themes + .remove(new_settings.theme.key()) + .unwrap(); + + // Restart the highlighter + self.change_line(0); + } + + fn change_line(&mut self, line: usize) { + let snapshot = line / LINES_PER_SNAPSHOT; + + if snapshot <= self.caches.len() { + self.caches.truncate(snapshot); + self.current_line = snapshot * LINES_PER_SNAPSHOT; + } else { + self.caches.truncate(1); + self.current_line = 0; + } + + let (parser, stack) = + self.caches.last().cloned().unwrap_or_else(|| { + ( + parsing::ParseState::new(&self.syntax), + parsing::ScopeStack::new(), + ) + }); + + self.caches.push((parser, stack)); + } + + fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_> { + if self.current_line / LINES_PER_SNAPSHOT >= self.caches.len() { + let (parser, stack) = + self.caches.last().expect("Caches must not be empty"); + + self.caches.push((parser.clone(), stack.clone())); + } + + self.current_line += 1; + + let (parser, stack) = + self.caches.last_mut().expect("Caches must not be empty"); + + let ops = parser.parse_line(line, &self.syntaxes).unwrap_or_default(); + + let highlighter = highlighting::Highlighter::new(&self.theme); + + Box::new( + ScopeRangeIterator { + ops, + line_length: line.len(), + index: 0, + last_str_index: 0, + } + .filter_map(move |(range, scope)| { + let _ = stack.apply(&scope); + + if range.is_empty() { + None + } else { + Some(( + range, + Highlight( + highlighter.style_mod_for_stack(&stack.scopes), + ), + )) + } + }), + ) + } + + fn current_line(&self) -> usize { + self.current_line + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct Settings { + pub theme: Theme, + pub extension: String, +} + +pub struct Highlight(highlighting::StyleModifier); + +impl Highlight { + pub fn color(&self) -> Option<Color> { + self.0.foreground.map(|color| { + Color::from_rgba8(color.r, color.g, color.b, color.a as f32 / 255.0) + }) + } + + pub fn font(&self) -> Option<Font> { + None + } + + pub fn to_format(&self) -> Format<Font> { + Format { + color: self.color(), + font: self.font(), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Theme { + SolarizedDark, + InspiredGitHub, + Base16Mocha, +} + +impl Theme { + pub const ALL: &[Self] = + &[Self::SolarizedDark, Self::InspiredGitHub, Self::Base16Mocha]; + + fn key(&self) -> &'static str { + match self { + Theme::InspiredGitHub => "InspiredGitHub", + Theme::Base16Mocha => "base16-mocha.dark", + Theme::SolarizedDark => "Solarized (dark)", + } + } +} + +impl std::fmt::Display for Theme { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Theme::InspiredGitHub => write!(f, "Inspired GitHub"), + Theme::Base16Mocha => write!(f, "Mocha"), + Theme::SolarizedDark => write!(f, "Solarized Dark"), + } + } +} + +pub struct ScopeRangeIterator { + ops: Vec<(usize, parsing::ScopeStackOp)>, + line_length: usize, + index: usize, + last_str_index: usize, +} + +impl Iterator for ScopeRangeIterator { + type Item = (std::ops::Range<usize>, parsing::ScopeStackOp); + + fn next(&mut self) -> Option<Self::Item> { + if self.index > self.ops.len() { + return None; + } + + let next_str_i = if self.index == self.ops.len() { + self.line_length + } else { + self.ops[self.index].0 + }; + + let range = self.last_str_index..next_str_i; + self.last_str_index = next_str_i; + + let op = if self.index == 0 { + parsing::ScopeStackOp::Noop + } else { + self.ops[self.index - 1].1.clone() + }; + + self.index += 1; + Some((range, op)) + } +} diff --git a/src/lib.rs b/src/lib.rs index 3cbe716a..e435a041 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -174,6 +174,9 @@ use iced_winit::runtime; pub use iced_futures::futures; +#[cfg(feature = "highlighter")] +pub use iced_highlighter as highlighter; + mod error; mod sandbox; diff --git a/style/src/text_editor.rs b/style/src/text_editor.rs index f1c31287..f6bae7e6 100644 --- a/style/src/text_editor.rs +++ b/style/src/text_editor.rs @@ -1,6 +1,5 @@ //! Change the appearance of a text editor. -use crate::core::text::highlighter; -use crate::core::{self, Background, BorderRadius, Color}; +use crate::core::{Background, BorderRadius, Color}; /// The appearance of a text input. #[derive(Debug, Clone, Copy)] @@ -46,16 +45,3 @@ pub trait StyleSheet { /// Produces the style of a disabled text input. fn disabled(&self, style: &Self::Style) -> Appearance; } - -pub trait Highlight<Font = core::Font, Theme = crate::Theme> { - fn format(&self, theme: &Theme) -> highlighter::Format<Font>; -} - -impl<Font, Theme> Highlight<Font, Theme> for () { - fn format(&self, _theme: &Theme) -> highlighter::Format<Font> { - highlighter::Format { - color: None, - font: None, - } - } -} diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index ad12a076..c384b8a2 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -16,7 +16,7 @@ use std::cell::RefCell; use std::ops::DerefMut; use std::sync::Arc; -pub use crate::style::text_editor::{Appearance, Highlight, StyleSheet}; +pub use crate::style::text_editor::{Appearance, StyleSheet}; pub use text::editor::{Action, Edit, Motion}; pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer> @@ -35,6 +35,10 @@ where style: <Renderer::Theme as StyleSheet>::Style, on_edit: Option<Box<dyn Fn(Action) -> Message + 'a>>, highlighter_settings: Highlighter::Settings, + highlighter_format: fn( + &Highlighter::Highlight, + &Renderer::Theme, + ) -> highlighter::Format<Renderer::Font>, } impl<'a, Message, Renderer> @@ -55,6 +59,9 @@ where style: Default::default(), on_edit: None, highlighter_settings: (), + highlighter_format: |_highlight, _theme| { + highlighter::Format::default() + }, } } } @@ -63,7 +70,6 @@ impl<'a, Highlighter, Message, Renderer> TextEditor<'a, Highlighter, Message, Renderer> where Highlighter: text::Highlighter, - Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, Renderer: text::Renderer, Renderer::Theme: StyleSheet, { @@ -85,6 +91,10 @@ where pub fn highlight<H: text::Highlighter>( self, settings: H::Settings, + to_format: fn( + &H::Highlight, + &Renderer::Theme, + ) -> highlighter::Format<Renderer::Font>, ) -> TextEditor<'a, H, Message, Renderer> { TextEditor { content: self.content, @@ -97,6 +107,7 @@ where style: self.style, on_edit: self.on_edit, highlighter_settings: settings, + highlighter_format: to_format, } } } @@ -203,13 +214,13 @@ struct State<Highlighter: text::Highlighter> { drag_click: Option<mouse::click::Kind>, highlighter: RefCell<Highlighter>, highlighter_settings: Highlighter::Settings, + highlighter_format_address: usize, } impl<'a, Highlighter, Message, Renderer> Widget<Message, Renderer> for TextEditor<'a, Highlighter, Message, Renderer> where Highlighter: text::Highlighter, - Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, Renderer: text::Renderer, Renderer::Theme: StyleSheet, { @@ -226,6 +237,7 @@ where &self.highlighter_settings, )), highlighter_settings: self.highlighter_settings.clone(), + highlighter_format_address: self.highlighter_format as usize, }) } @@ -246,6 +258,13 @@ where let mut internal = self.content.0.borrow_mut(); let state = tree.state.downcast_mut::<State<Highlighter>>(); + if state.highlighter_format_address != self.highlighter_format as usize + { + state.highlighter.borrow_mut().change_line(0); + + state.highlighter_format_address = self.highlighter_format as usize; + } + if state.highlighter_settings != self.highlighter_settings { state .highlighter @@ -354,7 +373,7 @@ where internal.editor.highlight( self.font.unwrap_or_else(|| renderer.default_font()), state.highlighter.borrow_mut().deref_mut(), - |highlight| highlight.format(theme), + |highlight| (self.highlighter_format)(highlight, theme), ); let is_disabled = self.on_edit.is_none(); @@ -458,7 +477,6 @@ impl<'a, Highlighter, Message, Renderer> for Element<'a, Message, Renderer> where Highlighter: text::Highlighter, - Highlighter::Highlight: Highlight<Renderer::Font, Renderer::Theme>, Message: 'a, Renderer: text::Renderer, Renderer::Theme: StyleSheet, From 77db1699028cf50fb92b9282ffd1f73507fce974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 20:55:39 +0200 Subject: [PATCH 100/286] Fix typo in `higlighter` (why is it so hard to spell?) --- highlighter/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/highlighter/Cargo.toml b/highlighter/Cargo.toml index 311d2998..488546c0 100644 --- a/highlighter/Cargo.toml +++ b/highlighter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "iced_highlighter" -description = "A syntax higlighter for iced" +description = "A syntax highlighter for iced" version.workspace = true authors.workspace = true edition.workspace = true From 01667446549d10fab18f3ca0306f278b0fe22b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 20:56:50 +0200 Subject: [PATCH 101/286] Add `iced_highlighter` to `document` workflow --- .github/workflows/document.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/document.yml b/.github/workflows/document.yml index 230c5cb0..62e28ca3 100644 --- a/.github/workflows/document.yml +++ b/.github/workflows/document.yml @@ -15,6 +15,7 @@ jobs: RUSTDOCFLAGS="--cfg docsrs" \ cargo doc --no-deps --all-features \ -p iced_core \ + -p iced_highlighter \ -p iced_style \ -p iced_futures \ -p iced_runtime \ From d9fbecf0d80234d63e7e5711f28fc35ee75fa503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 20:58:15 +0200 Subject: [PATCH 102/286] Remove `syntect` dependency from `editor` example --- examples/editor/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml index a77b1e9f..a3f6ea3b 100644 --- a/examples/editor/Cargo.toml +++ b/examples/editor/Cargo.toml @@ -12,5 +12,4 @@ iced.features = ["highlighter", "tokio", "debug"] tokio.workspace = true tokio.features = ["fs"] -syntect = "5.1" rfd = "0.12" From a9ee8f62fdd0f74976947c21199684829aa8a496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 21:57:09 +0200 Subject: [PATCH 103/286] Reuse syntaxes and themes lazily in `iced_highlighter` --- highlighter/Cargo.toml | 1 + highlighter/src/lib.rs | 51 +++++++++++++++++++++--------------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/highlighter/Cargo.toml b/highlighter/Cargo.toml index 488546c0..2d108d6f 100644 --- a/highlighter/Cargo.toml +++ b/highlighter/Cargo.toml @@ -13,4 +13,5 @@ keywords.workspace = true [dependencies] iced_core.workspace = true +once_cell.workspace = true syntect.workspace = true diff --git a/highlighter/src/lib.rs b/highlighter/src/lib.rs index 79cfafcd..b80d6499 100644 --- a/highlighter/src/lib.rs +++ b/highlighter/src/lib.rs @@ -3,20 +3,26 @@ use iced_core as core; use crate::core::text::highlighter::{self, Format}; use crate::core::{Color, Font}; +use once_cell::sync::Lazy; use std::ops::Range; use syntect::highlighting; use syntect::parsing; +static SYNTAXES: Lazy<parsing::SyntaxSet> = + Lazy::new(|| parsing::SyntaxSet::load_defaults_nonewlines()); + +static THEMES: Lazy<highlighting::ThemeSet> = + Lazy::new(|| highlighting::ThemeSet::load_defaults()); + +const LINES_PER_SNAPSHOT: usize = 50; + pub struct Highlighter { - syntaxes: parsing::SyntaxSet, - syntax: parsing::SyntaxReference, - theme: highlighting::Theme, + syntax: &'static parsing::SyntaxReference, + highlighter: highlighting::Highlighter<'static>, caches: Vec<(parsing::ParseState, parsing::ScopeStack)>, current_line: usize, } -const LINES_PER_SNAPSHOT: usize = 50; - impl highlighter::Highlighter for Highlighter { type Settings = Settings; type Highlight = Highlight; @@ -25,40 +31,33 @@ impl highlighter::Highlighter for Highlighter { Box<dyn Iterator<Item = (Range<usize>, Self::Highlight)> + 'a>; fn new(settings: &Self::Settings) -> Self { - let syntaxes = parsing::SyntaxSet::load_defaults_nonewlines(); - - let syntax = syntaxes + let syntax = SYNTAXES .find_syntax_by_token(&settings.extension) - .unwrap_or_else(|| syntaxes.find_syntax_plain_text()); + .unwrap_or_else(|| SYNTAXES.find_syntax_plain_text()); - let theme = highlighting::ThemeSet::load_defaults() - .themes - .remove(settings.theme.key()) - .unwrap(); + let highlighter = highlighting::Highlighter::new( + &THEMES.themes[settings.theme.key()], + ); let parser = parsing::ParseState::new(syntax); let stack = parsing::ScopeStack::new(); Highlighter { - syntax: syntax.clone(), - syntaxes, - theme, + syntax, + highlighter, caches: vec![(parser, stack)], current_line: 0, } } fn update(&mut self, new_settings: &Self::Settings) { - self.syntax = self - .syntaxes + self.syntax = SYNTAXES .find_syntax_by_token(&new_settings.extension) - .unwrap_or_else(|| self.syntaxes.find_syntax_plain_text()) - .clone(); + .unwrap_or_else(|| SYNTAXES.find_syntax_plain_text()); - self.theme = highlighting::ThemeSet::load_defaults() - .themes - .remove(new_settings.theme.key()) - .unwrap(); + self.highlighter = highlighting::Highlighter::new( + &THEMES.themes[new_settings.theme.key()], + ); // Restart the highlighter self.change_line(0); @@ -99,9 +98,9 @@ impl highlighter::Highlighter for Highlighter { let (parser, stack) = self.caches.last_mut().expect("Caches must not be empty"); - let ops = parser.parse_line(line, &self.syntaxes).unwrap_or_default(); + let ops = parser.parse_line(line, &SYNTAXES).unwrap_or_default(); - let highlighter = highlighting::Highlighter::new(&self.theme); + let highlighter = &self.highlighter; Box::new( ScopeRangeIterator { From 9af0a27e675b71164f32f8d82eb4cde9cdd459f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 22:28:28 +0200 Subject: [PATCH 104/286] Draw colored glyphs in `iced_tiny_skia` --- tiny_skia/src/text.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index 96cfbf32..d1b33293 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -188,7 +188,7 @@ fn draw( if let Some((buffer, placement)) = glyph_cache.allocate( physical_glyph.cache_key, - color, + glyph.color_opt.map(from_color).unwrap_or(color), font_system, &mut swash, ) { @@ -213,6 +213,12 @@ fn draw( } } +fn from_color(color: cosmic_text::Color) -> Color { + let [r, g, b, a] = color.as_rgba(); + + Color::from_rgba8(r, g, b, a as f32 / 255.0) +} + #[derive(Debug, Clone, Default)] struct GlyphCache { entries: FxHashMap< From be340a8cd822be1ea0fe4c1b1f3a62ca66d705b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Sep 2023 23:00:20 +0200 Subject: [PATCH 105/286] Fix gamma correction for colored glyphs in `iced_wgpu` --- core/src/color.rs | 20 ++++++++++++++++++++ graphics/src/text.rs | 10 ++++++++-- tiny_skia/src/text.rs | 14 +++++++++++++- wgpu/src/text.rs | 13 ++----------- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/core/src/color.rs b/core/src/color.rs index 1392f28b..cce8b340 100644 --- a/core/src/color.rs +++ b/core/src/color.rs @@ -89,6 +89,26 @@ impl Color { } } + /// Creates a [`Color`] from its linear RGBA components. + pub fn from_linear_rgba(r: f32, g: f32, b: f32, a: f32) -> Self { + // As described in: + // https://en.wikipedia.org/wiki/SRGB + fn gamma_component(u: f32) -> f32 { + if u < 0.0031308 { + 12.92 * u + } else { + 1.055 * u.powf(1.0 / 2.4) - 0.055 + } + } + + Self { + r: gamma_component(r), + g: gamma_component(g), + b: gamma_component(b), + a, + } + } + /// Converts the [`Color`] into its RGBA8 equivalent. #[must_use] pub fn into_rgba8(self) -> [u8; 4] { diff --git a/graphics/src/text.rs b/graphics/src/text.rs index 5fcfc699..c10eacad 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -8,6 +8,7 @@ pub use paragraph::Paragraph; pub use cosmic_text; +use crate::color; use crate::core::font::{self, Font}; use crate::core::text::Shaping; use crate::core::{Color, Size}; @@ -131,7 +132,12 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping { } pub fn to_color(color: Color) -> cosmic_text::Color { - let [r, g, b, a] = color.into_rgba8(); + let [r, g, b, a] = color::pack(color).components(); - cosmic_text::Color::rgba(r, g, b, a) + cosmic_text::Color::rgba( + (r * 255.0) as u8, + (g * 255.0) as u8, + (b * 255.0) as u8, + (a * 255.0) as u8, + ) } diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index d1b33293..70e95d01 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -1,6 +1,7 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; use crate::core::{Color, Font, Pixels, Point, Rectangle}; +use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; use crate::graphics::text::editor; use crate::graphics::text::font_system; @@ -216,7 +217,18 @@ fn draw( fn from_color(color: cosmic_text::Color) -> Color { let [r, g, b, a] = color.as_rgba(); - Color::from_rgba8(r, g, b, a as f32 / 255.0) + if color::GAMMA_CORRECTION { + // `cosmic_text::Color` is linear RGB in this case, so we + // need to convert back to sRGB + Color::from_linear_rgba( + r as f32 / 255.0, + g as f32 / 255.0, + b as f32 / 255.0, + a as f32 / 255.0, + ) + } else { + Color::from_rgba8(r, g, b, a as f32 / 255.0) + } } #[derive(Debug, Clone, Default)] diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 581df0cb..f746be63 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -2,7 +2,7 @@ use crate::core::alignment; use crate::core::{Rectangle, Size}; use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; -use crate::graphics::text::{font_system, Editor, Paragraph}; +use crate::graphics::text::{font_system, to_color, Editor, Paragraph}; use crate::layer::Text; use std::borrow::Cow; @@ -214,16 +214,7 @@ impl Pipeline { right: (clip_bounds.x + clip_bounds.width) as i32, bottom: (clip_bounds.y + clip_bounds.height) as i32, }, - default_color: { - let [r, g, b, a] = color::pack(color).components(); - - glyphon::Color::rgba( - (r * 255.0) as u8, - (g * 255.0) as u8, - (b * 255.0) as u8, - (a * 255.0) as u8, - ) - }, + default_color: to_color(color), }) }, ); From 93d6f748f69fc4ccf6c18f95c5f16b369c776da0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 20 Sep 2023 01:13:36 +0200 Subject: [PATCH 106/286] Fix `clippy` lints in `iced_highlighter` --- highlighter/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/highlighter/src/lib.rs b/highlighter/src/lib.rs index b80d6499..f5a4fae5 100644 --- a/highlighter/src/lib.rs +++ b/highlighter/src/lib.rs @@ -9,10 +9,10 @@ use syntect::highlighting; use syntect::parsing; static SYNTAXES: Lazy<parsing::SyntaxSet> = - Lazy::new(|| parsing::SyntaxSet::load_defaults_nonewlines()); + Lazy::new(parsing::SyntaxSet::load_defaults_nonewlines); static THEMES: Lazy<highlighting::ThemeSet> = - Lazy::new(|| highlighting::ThemeSet::load_defaults()); + Lazy::new(highlighting::ThemeSet::load_defaults); const LINES_PER_SNAPSHOT: usize = 50; @@ -77,7 +77,7 @@ impl highlighter::Highlighter for Highlighter { let (parser, stack) = self.caches.last().cloned().unwrap_or_else(|| { ( - parsing::ParseState::new(&self.syntax), + parsing::ParseState::new(self.syntax), parsing::ScopeStack::new(), ) }); From ff78e97ad7df4db3b2a97b94e99854f2f9e3021a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 20 Sep 2023 01:21:42 +0200 Subject: [PATCH 107/286] Introduce more themes to `iced_highlighter` --- examples/editor/src/main.rs | 6 +++++- highlighter/src/lib.rs | 35 ++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index d513090f..f49ca6e8 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -230,7 +230,11 @@ impl Application for Editor { } fn theme(&self) -> Theme { - Theme::Dark + if self.theme.is_dark() { + Theme::Dark + } else { + Theme::Light + } } } diff --git a/highlighter/src/lib.rs b/highlighter/src/lib.rs index f5a4fae5..db28b5b1 100644 --- a/highlighter/src/lib.rs +++ b/highlighter/src/lib.rs @@ -161,19 +161,38 @@ impl Highlight { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Theme { SolarizedDark, - InspiredGitHub, Base16Mocha, + Base16Ocean, + Base16Eighties, + InspiredGitHub, } impl Theme { - pub const ALL: &[Self] = - &[Self::SolarizedDark, Self::InspiredGitHub, Self::Base16Mocha]; + pub const ALL: &[Self] = &[ + Self::SolarizedDark, + Self::Base16Mocha, + Self::Base16Ocean, + Self::Base16Eighties, + Self::InspiredGitHub, + ]; + + pub fn is_dark(self) -> bool { + match self { + Self::SolarizedDark + | Self::Base16Mocha + | Self::Base16Ocean + | Self::Base16Eighties => true, + Self::InspiredGitHub => false, + } + } fn key(&self) -> &'static str { match self { - Theme::InspiredGitHub => "InspiredGitHub", - Theme::Base16Mocha => "base16-mocha.dark", Theme::SolarizedDark => "Solarized (dark)", + Theme::Base16Mocha => "base16-mocha.dark", + Theme::Base16Ocean => "base16-ocean.dark", + Theme::Base16Eighties => "base16-eighties.dark", + Theme::InspiredGitHub => "InspiredGitHub", } } } @@ -181,9 +200,11 @@ impl Theme { impl std::fmt::Display for Theme { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Theme::InspiredGitHub => write!(f, "Inspired GitHub"), - Theme::Base16Mocha => write!(f, "Mocha"), Theme::SolarizedDark => write!(f, "Solarized Dark"), + Theme::Base16Mocha => write!(f, "Mocha"), + Theme::Base16Ocean => write!(f, "Ocean"), + Theme::Base16Eighties => write!(f, "Eighties"), + Theme::InspiredGitHub => write!(f, "Inspired GitHub"), } } } From 29fb4eab878a7ba399cae6ab1ec18a71e369ee59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 20 Sep 2023 01:23:50 +0200 Subject: [PATCH 108/286] Scroll `TextEditor` only if `cursor.is_over(bounds)` --- widget/src/text_editor.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index c384b8a2..4191e02c 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -539,7 +539,9 @@ impl Update { } _ => None, }, - mouse::Event::WheelScrolled { delta } => { + mouse::Event::WheelScrolled { delta } + if cursor.is_over(bounds) => + { action(Action::Scroll { lines: match delta { mouse::ScrollDelta::Lines { y, .. } => { From 25d47c3238ce23854e2c78e2bd9ad2b1f4b326b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 21 Sep 2023 06:05:46 +0200 Subject: [PATCH 109/286] Remove `rangemap` patch in `Cargo.toml` --- Cargo.toml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8899fa67..77d4c647 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -163,7 +163,3 @@ winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8 [patch.crates-io.cosmic-text] git = "https://github.com/hecrj/cosmic-text.git" branch = "respect-fontconfig-aliases" - -[patch.crates-io.rangemap] -git = "https://github.com/hecrj/rangemap.git" -branch = "fix/partial-eq" From da5dd2526a2d9ee27e9405ed19c0f7a641160c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 21 Sep 2023 06:07:19 +0200 Subject: [PATCH 110/286] Round `ScrollDelta::Lines` in `TextEditor` --- widget/src/text_editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 4191e02c..ac927fbc 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -545,7 +545,7 @@ impl Update { action(Action::Scroll { lines: match delta { mouse::ScrollDelta::Lines { y, .. } => { - -y as i32 * 4 + -y.round() as i32 * 4 } mouse::ScrollDelta::Pixels { y, .. } => { -y.signum() as i32 From 7373dd856b8837c2d91067b45e43b8f0e767c917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 21 Sep 2023 06:13:08 +0200 Subject: [PATCH 111/286] Scroll at least one line on macOS in `TextEditor` --- widget/src/text_editor.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index ac927fbc..76f3cc18 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -545,7 +545,11 @@ impl Update { action(Action::Scroll { lines: match delta { mouse::ScrollDelta::Lines { y, .. } => { - -y.round() as i32 * 4 + if y > 0.0 { + -(y * 4.0).min(1.0) as i32 + } else { + 0 + } } mouse::ScrollDelta::Pixels { y, .. } => { -y.signum() as i32 From 68d49459ce0e8b28e56b71970cb26e66ac1b01b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 21 Sep 2023 06:17:47 +0200 Subject: [PATCH 112/286] Fix vertical scroll for `TextEditor` --- widget/src/text_editor.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 76f3cc18..e8187b9c 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -545,8 +545,9 @@ impl Update { action(Action::Scroll { lines: match delta { mouse::ScrollDelta::Lines { y, .. } => { - if y > 0.0 { - -(y * 4.0).min(1.0) as i32 + if y.abs() > 0.0 { + (y.signum() * -(y.abs() * 4.0).max(1.0)) + as i32 } else { 0 } From 70e49df4289b925d24f92ce5c91ef2b03dbc54e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 22 Sep 2023 05:50:31 +0200 Subject: [PATCH 113/286] Fix selection clipping out of bounds in `TextEditor` --- widget/src/text_editor.rs | 63 ++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index e8187b9c..c142c22d 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -406,38 +406,47 @@ where style.text_color, ); + let translation = Vector::new( + bounds.x + self.padding.left, + bounds.y + self.padding.top, + ); + if state.is_focused { match internal.editor.cursor() { Cursor::Caret(position) => { - renderer.fill_quad( - renderer::Quad { - bounds: Rectangle { - x: position.x + bounds.x + self.padding.left, - y: position.y + bounds.y + self.padding.top, - width: 1.0, - height: self - .line_height - .to_absolute(self.text_size.unwrap_or_else( - || renderer.default_size(), - )) - .into(), - }, - border_radius: 0.0.into(), - border_width: 0.0, - border_color: Color::TRANSPARENT, - }, - theme.value_color(&self.style), - ); - } - Cursor::Selection(ranges) => { - for range in ranges { + let position = position + translation; + + if bounds.contains(position) { renderer.fill_quad( renderer::Quad { - bounds: range - + Vector::new( - bounds.x + self.padding.left, - bounds.y + self.padding.top, - ), + bounds: Rectangle { + x: position.x, + y: position.y, + width: 1.0, + height: self + .line_height + .to_absolute( + self.text_size.unwrap_or_else( + || renderer.default_size(), + ), + ) + .into(), + }, + border_radius: 0.0.into(), + border_width: 0.0, + border_color: Color::TRANSPARENT, + }, + theme.value_color(&self.style), + ); + } + } + Cursor::Selection(ranges) => { + for range in ranges.into_iter().filter_map(|range| { + bounds.intersection(&(range + translation)) + }) { + renderer.fill_quad( + renderer::Quad { + bounds: range, border_radius: 0.0.into(), border_width: 0.0, border_color: Color::TRANSPARENT, From af21cf82492bf7ffa1241cebae182c5916fc07d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 22 Sep 2023 05:55:27 +0200 Subject: [PATCH 114/286] Remove `patch.crates-io` section for `cosmic-text` in `Cargo.toml` --- Cargo.toml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 77d4c647..888e2df8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -121,10 +121,10 @@ iced_winit = { version = "0.12", path = "winit" } async-std = "1.0" bitflags = "1.0" bytemuck = { version = "1.0", features = ["derive"] } -cosmic-text = "0.9" +cosmic-text = { git = "https://github.com/pop-os/cosmic-text.git", rev = "30398c2f0cb79267d440870bc47967579e31a2ae" } futures = "0.3" glam = "0.24" -glyphon = { git = "https://github.com/grovesNL/glyphon.git", rev = "20f0f8fa80e0d0df4c63634ce9176fa489546ca9" } +glyphon = { git = "https://github.com/hecrj/glyphon.git", rev = "0a8366be5ec6d48c3e10c996ba840936992d878f" } guillotiere = "0.6" half = "2.2" image = "0.24" @@ -159,7 +159,3 @@ wgpu = "0.17" winapi = "0.3" window_clipboard = "0.3" winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8d9923870de1d4ab1994146e", default-features = false } - -[patch.crates-io.cosmic-text] -git = "https://github.com/hecrj/cosmic-text.git" -branch = "respect-fontconfig-aliases" From 8cc19de254c37d3123d5ea1b6513f1f34d35c7c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 22 Sep 2023 06:00:51 +0200 Subject: [PATCH 115/286] Add `text` helper method for `text_editor::Content` --- examples/editor/src/main.rs | 19 +------------------ widget/src/text_editor.rs | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index f49ca6e8..a69e1f54 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -114,25 +114,8 @@ impl Application for Editor { } else { self.is_loading = true; - let mut contents = self.content.lines().enumerate().fold( - String::new(), - |mut contents, (i, line)| { - if i > 0 { - contents.push('\n'); - } - - contents.push_str(&line); - - contents - }, - ); - - if !contents.ends_with('\n') { - contents.push('\n'); - } - Command::perform( - save_file(self.file.clone(), contents), + save_file(self.file.clone(), self.content.text()), Message::FileSaved, ) } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index c142c22d..6d25967e 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -190,6 +190,27 @@ where } } + pub fn text(&self) -> String { + let mut text = self.lines().enumerate().fold( + String::new(), + |mut contents, (i, line)| { + if i > 0 { + contents.push('\n'); + } + + contents.push_str(&line); + + contents + }, + ); + + if !text.ends_with('\n') { + text.push('\n'); + } + + text + } + pub fn selection(&self) -> Option<String> { self.0.borrow().editor.selection() } From e0233ebc3ce4791d094c52eeef81cce78b9bc578 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott <idscott@system76.com> Date: Thu, 3 Aug 2023 10:19:28 -0700 Subject: [PATCH 116/286] Fix `Command<T>::perform` to return a `Command<T>` This seems like clearly the correct thing to do here. If the type bound on `Command` isn't specified, it makes no difference, since the generic is inferred in a way that works with either definition. But this is important if `Command<T>` is aliased with a concrete type. --- runtime/src/command.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/runtime/src/command.rs b/runtime/src/command.rs index cd4c51ff..b74097bd 100644 --- a/runtime/src/command.rs +++ b/runtime/src/command.rs @@ -40,9 +40,9 @@ impl<T> Command<T> { /// Creates a [`Command`] that performs the action of the given future. pub fn perform<A>( - future: impl Future<Output = T> + 'static + MaybeSend, - f: impl FnOnce(T) -> A + 'static + MaybeSend, - ) -> Command<A> { + future: impl Future<Output = A> + 'static + MaybeSend, + f: impl FnOnce(A) -> T + 'static + MaybeSend, + ) -> Command<T> { use iced_futures::futures::FutureExt; Command::single(Action::Future(Box::pin(future.map(f)))) From 54e6d2b5fa1fe29e2e3588b51f6cfff36563cefc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 18 Oct 2023 17:49:19 -0500 Subject: [PATCH 117/286] Fix lint in `screenshot` example --- examples/screenshot/src/main.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index ab0a2ae3..f781a401 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -298,10 +298,7 @@ fn numeric_input( ) -> Element<'_, Option<u32>> { text_input( placeholder, - &value - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(String::new), + &value.as_ref().map(ToString::to_string).unwrap_or_default(), ) .on_input(move |text| { if text.is_empty() { From f1b1344d59fa7354615f560bd25ed01ad0c9f865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 22 Oct 2023 15:08:08 +0200 Subject: [PATCH 118/286] Run `cargo update` before `cargo audit` in `audit` workflow --- .github/workflows/audit.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index e9f4b0c5..bfb617fb 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -12,6 +12,8 @@ jobs: - name: Install cargo-audit run: cargo install cargo-audit - uses: actions/checkout@master + - name: Resolve dependencies + run: cargo update - name: Audit vulnerabilities run: cargo audit From 86b877517feb15b2155c6cfef29246a3f281c8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 03:21:40 +0200 Subject: [PATCH 119/286] Update `wgpu` to `0.18` and `cosmic-text` to `0.10` --- Cargo.toml | 6 +++--- examples/integration/src/scene.rs | 4 +++- wgpu/src/backend.rs | 8 ++++++-- wgpu/src/color.rs | 4 +++- wgpu/src/triangle.rs | 7 ++++++- wgpu/src/triangle/msaa.rs | 4 +++- 6 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index af74a3cf..bb8b4752 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -114,10 +114,10 @@ iced_winit = { version = "0.12", path = "winit" } async-std = "1.0" bitflags = "1.0" bytemuck = { version = "1.0", features = ["derive"] } -cosmic-text = "0.9" +cosmic-text = "0.10" futures = "0.3" glam = "0.24" -glyphon = { git = "https://github.com/grovesNL/glyphon.git", rev = "20f0f8fa80e0d0df4c63634ce9176fa489546ca9" } +glyphon = { git = "https://github.com/hecrj/glyphon.git", rev = "2caa9fc5e5923c1d827d177c3619cab7e9885b85" } guillotiere = "0.6" half = "2.2" image = "0.24" @@ -147,7 +147,7 @@ unicode-segmentation = "1.0" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" web-sys = "0.3" -wgpu = "0.17" +wgpu = "0.18" winapi = "0.3" window_clipboard = "0.3" winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8d9923870de1d4ab1994146e", default-features = false } diff --git a/examples/integration/src/scene.rs b/examples/integration/src/scene.rs index 01808f40..e29558bf 100644 --- a/examples/integration/src/scene.rs +++ b/examples/integration/src/scene.rs @@ -36,10 +36,12 @@ impl Scene { a: a as f64, } }), - store: true, + store: wgpu::StoreOp::Store, }, })], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }) } diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 65c63f19..32b8a189 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -222,10 +222,12 @@ impl Backend { }), None => wgpu::LoadOp::Load, }, - store: true, + store: wgpu::StoreOp::Store, }, })], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }, )); @@ -271,11 +273,13 @@ impl Backend { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, }, )], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }, )); } diff --git a/wgpu/src/color.rs b/wgpu/src/color.rs index 20827e3c..4598b0a6 100644 --- a/wgpu/src/color.rs +++ b/wgpu/src/color.rs @@ -143,10 +143,12 @@ pub fn convert( resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, })], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }); pass.set_pipeline(&pipeline); diff --git a/wgpu/src/triangle.rs b/wgpu/src/triangle.rs index 644c9f84..69270a73 100644 --- a/wgpu/src/triangle.rs +++ b/wgpu/src/triangle.rs @@ -300,10 +300,15 @@ impl Pipeline { wgpu::RenderPassColorAttachment { view: attachment, resolve_target, - ops: wgpu::Operations { load, store: true }, + ops: wgpu::Operations { + load, + store: wgpu::StoreOp::Store, + }, }, )], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }); let layer = &mut self.layers[layer]; diff --git a/wgpu/src/triangle/msaa.rs b/wgpu/src/triangle/msaa.rs index 320b5b12..14abd20b 100644 --- a/wgpu/src/triangle/msaa.rs +++ b/wgpu/src/triangle/msaa.rs @@ -167,10 +167,12 @@ impl Blit { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, })], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }); render_pass.set_pipeline(&self.pipeline); From a00ebcde3d698bc6b59a7a258e91c3612a6faaaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 03:24:59 +0200 Subject: [PATCH 120/286] Remove unnecessary `into_iter` call in `iced_graphics` --- graphics/src/text.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/graphics/src/text.rs b/graphics/src/text.rs index bc06aa3c..a7d52645 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -22,12 +22,11 @@ pub struct FontSystem { impl FontSystem { pub fn new() -> Self { FontSystem { - raw: RwLock::new(cosmic_text::FontSystem::new_with_fonts( - [cosmic_text::fontdb::Source::Binary(Arc::new( + raw: RwLock::new(cosmic_text::FontSystem::new_with_fonts([ + cosmic_text::fontdb::Source::Binary(Arc::new( include_bytes!("../fonts/Iced-Icons.ttf").as_slice(), - ))] - .into_iter(), - )), + )), + ])), version: Version::default(), } } From 625cd745f38215b1cb8f629cdc6d2fa41c9a739a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 05:04:14 +0200 Subject: [PATCH 121/286] Write documentation for the new text APIs --- core/src/lib.rs | 2 +- core/src/mouse/click.rs | 1 + core/src/text.rs | 2 ++ core/src/text/editor.rs | 51 +++++++++++++++++++++++++++++++++- core/src/text/highlighter.rs | 30 ++++++++++++++++---- examples/editor/src/main.rs | 10 +++---- graphics/src/lib.rs | 2 +- graphics/src/text.rs | 13 +++++++++ graphics/src/text/cache.rs | 19 +++++++++++++ graphics/src/text/editor.rs | 12 ++++++++ graphics/src/text/paragraph.rs | 14 ++++++++++ style/src/lib.rs | 2 +- wgpu/src/layer/text.rs | 7 ++++- wgpu/src/lib.rs | 2 +- widget/src/lib.rs | 4 +-- widget/src/text_editor.rs | 36 +++++++++++++++++++++--- 16 files changed, 185 insertions(+), 22 deletions(-) diff --git a/core/src/lib.rs b/core/src/lib.rs index 9eb3da34..54ea5839 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -12,7 +12,7 @@ #![forbid(unsafe_code, rust_2018_idioms)] #![deny( missing_debug_implementations, - // missing_docs, + missing_docs, unused_results, rustdoc::broken_intra_doc_links )] diff --git a/core/src/mouse/click.rs b/core/src/mouse/click.rs index b427da6c..6f3844be 100644 --- a/core/src/mouse/click.rs +++ b/core/src/mouse/click.rs @@ -61,6 +61,7 @@ impl Click { self.kind } + /// Returns the position of the [`Click`]. pub fn position(&self) -> Point { self.position } diff --git a/core/src/text.rs b/core/src/text.rs index 9b9c753c..546d0b5c 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -204,6 +204,8 @@ pub trait Renderer: crate::Renderer { color: Color, ); + /// Draws the given [`Editor`] at the given position and with the given + /// [`Color`]. fn fill_editor( &mut self, editor: &Self::Editor, diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index e9d66ce9..ebb0eee2 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -1,25 +1,36 @@ +//! Edit text. use crate::text::highlighter::{self, Highlighter}; use crate::text::LineHeight; use crate::{Pixels, Point, Rectangle, Size}; use std::sync::Arc; +/// A component that can be used by widgets to edit multi-line text. pub trait Editor: Sized + Default { + /// The [`Font`] of the [`Editor`]. type Font: Copy + PartialEq + Default; /// Creates a new [`Editor`] laid out with the given text. fn with_text(text: &str) -> Self; + /// Returns the current [`Cursor`] of the [`Editor`]. fn cursor(&self) -> Cursor; + /// Returns the current cursor position of the [`Editor`]. + /// + /// Line and column, respectively. fn cursor_position(&self) -> (usize, usize); + /// Returns the current selected text of the [`Editor`]. fn selection(&self) -> Option<String>; + /// Returns the text of the given line in the [`Editor`], if it exists. fn line(&self, index: usize) -> Option<&str>; + /// Returns the amount of lines in the [`Editor`]. fn line_count(&self) -> usize; + /// Performs an [`Action`] on the [`Editor`]. fn perform(&mut self, action: Action); /// Returns the current boundaries of the [`Editor`]. @@ -35,6 +46,7 @@ pub trait Editor: Sized + Default { new_highlighter: &mut impl Highlighter, ); + /// Runs a text [`Highlighter`] in the [`Editor`]. fn highlight<H: Highlighter>( &mut self, font: Self::Font, @@ -43,50 +55,83 @@ pub trait Editor: Sized + Default { ); } +/// An interaction with an [`Editor`]. #[derive(Debug, Clone, PartialEq)] pub enum Action { + /// Apply a [`Motion`]. Move(Motion), + /// Select text with a given [`Motion`]. Select(Motion), + /// Select the word at the current cursor. SelectWord, + /// Select the line at the current cursor. SelectLine, + /// Perform an [`Edit`]. Edit(Edit), + /// Click the [`Editor`] at the given [`Point`]. Click(Point), + /// Drag the mouse on the [`Editor`] to the given [`Point`]. Drag(Point), - Scroll { lines: i32 }, + /// Scroll the [`Editor`] a certain amount of lines. + Scroll { + /// The amount of lines to scroll. + lines: i32, + }, } impl Action { + /// Returns whether the [`Action`] is an editing action. pub fn is_edit(&self) -> bool { matches!(self, Self::Edit(_)) } } +/// An action that edits text. #[derive(Debug, Clone, PartialEq)] pub enum Edit { + /// Insert the given character. Insert(char), + /// Paste the given text. Paste(Arc<String>), + /// Break the current line. Enter, + /// Delete the previous character. Backspace, + /// Delete the next character. Delete, } +/// A cursor movement. #[derive(Debug, Clone, Copy, PartialEq)] pub enum Motion { + /// Move left. Left, + /// Move right. Right, + /// Move up. Up, + /// Move down. Down, + /// Move to the left boundary of a word. WordLeft, + /// Move to the right boundary of a word. WordRight, + /// Move to the start of the line. Home, + /// Move to the end of the line. End, + /// Move to the start of the previous window. PageUp, + /// Move to the start of the next window. PageDown, + /// Move to the start of the text. DocumentStart, + /// Move to the end of the text. DocumentEnd, } impl Motion { + /// Widens the [`Motion`], if possible. pub fn widen(self) -> Self { match self { Self::Left => Self::WordLeft, @@ -97,6 +142,7 @@ impl Motion { } } + /// Returns the [`Direction`] of the [`Motion`]. pub fn direction(&self) -> Direction { match self { Self::Left @@ -115,9 +161,12 @@ impl Motion { } } +/// A direction in some text. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Direction { + /// <- Left, + /// -> Right, } diff --git a/core/src/text/highlighter.rs b/core/src/text/highlighter.rs index 9a9cff89..a0535228 100644 --- a/core/src/text/highlighter.rs +++ b/core/src/text/highlighter.rs @@ -1,31 +1,48 @@ +//! Highlight text. use crate::Color; use std::ops::Range; +/// A type capable of highlighting text. +/// +/// A [`Highlighter`] highlights lines in sequence. When a line changes, +/// it must be notified and the lines after the changed one must be fed +/// again to the [`Highlighter`]. pub trait Highlighter: 'static { + /// The settings to configure the [`Highlighter`]. type Settings: PartialEq + Clone; + + /// The output of the [`Highlighter`]. type Highlight; + /// The highlight iterator type. type Iterator<'a>: Iterator<Item = (Range<usize>, Self::Highlight)> where Self: 'a; + /// Creates a new [`Highlighter`] from its [`Self::Settings`]. fn new(settings: &Self::Settings) -> Self; + /// Updates the [`Highlighter`] with some new [`Self::Settings`]. fn update(&mut self, new_settings: &Self::Settings); + /// Notifies the [`Highlighter`] that the line at the given index has changed. fn change_line(&mut self, line: usize); + /// Highlights the given line. + /// + /// If a line changed prior to this, the first line provided here will be the + /// line that changed. fn highlight_line(&mut self, line: &str) -> Self::Iterator<'_>; + /// Returns the current line of the [`Highlighter`]. + /// + /// If `change_line` has been called, this will normally be the least index + /// that changed. fn current_line(&self) -> usize; } -#[derive(Debug, Clone, Copy)] -pub struct Style { - pub color: Color, -} - +/// A highlighter that highlights nothing. #[derive(Debug, Clone, Copy)] pub struct PlainText; @@ -52,9 +69,12 @@ impl Highlighter for PlainText { } } +/// The format of some text. #[derive(Debug, Clone, Copy, PartialEq)] pub struct Format<Font> { + /// The [`Color`] of the text. pub color: Option<Color>, + /// The `Font` of the text. pub font: Option<Font>, } diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index a69e1f54..03d1e283 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -34,7 +34,7 @@ struct Editor { #[derive(Debug, Clone)] enum Message { - Edit(text_editor::Action), + ActionPerformed(text_editor::Action), ThemeSelected(highlighter::Theme), NewFile, OpenFile, @@ -68,10 +68,10 @@ impl Application for Editor { fn update(&mut self, message: Message) -> Command<Message> { match message { - Message::Edit(action) => { + Message::ActionPerformed(action) => { self.is_dirty = self.is_dirty || action.is_edit(); - self.content.edit(action); + self.content.perform(action); Command::none() } @@ -103,7 +103,7 @@ impl Application for Editor { if let Ok((path, contents)) = result { self.file = Some(path); - self.content = text_editor::Content::with(&contents); + self.content = text_editor::Content::with_text(&contents); } Command::none() @@ -191,7 +191,7 @@ impl Application for Editor { column![ controls, text_editor(&self.content) - .on_edit(Message::Edit) + .on_action(Message::ActionPerformed) .highlight::<Highlighter>( highlighter::Settings { theme: self.theme, diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs index a0729058..7a213909 100644 --- a/graphics/src/lib.rs +++ b/graphics/src/lib.rs @@ -10,7 +10,7 @@ #![forbid(rust_2018_idioms)] #![deny( missing_debug_implementations, - //missing_docs, + missing_docs, unsafe_code, unused_results, rustdoc::broken_intra_doc_links diff --git a/graphics/src/text.rs b/graphics/src/text.rs index c10eacad..7261900e 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -1,3 +1,4 @@ +//! Draw text. pub mod cache; pub mod editor; pub mod paragraph; @@ -17,6 +18,7 @@ use once_cell::sync::OnceCell; use std::borrow::Cow; use std::sync::{Arc, RwLock}; +/// Returns the global [`FontSystem`]. pub fn font_system() -> &'static RwLock<FontSystem> { static FONT_SYSTEM: OnceCell<RwLock<FontSystem>> = OnceCell::new(); @@ -32,6 +34,7 @@ pub fn font_system() -> &'static RwLock<FontSystem> { }) } +/// A set of system fonts. #[allow(missing_debug_implementations)] pub struct FontSystem { raw: cosmic_text::FontSystem, @@ -39,10 +42,12 @@ pub struct FontSystem { } impl FontSystem { + /// Returns the raw [`cosmic_text::FontSystem`]. pub fn raw(&mut self) -> &mut cosmic_text::FontSystem { &mut self.raw } + /// Loads a font from its bytes. pub fn load_font(&mut self, bytes: Cow<'static, [u8]>) { let _ = self.raw.db_mut().load_font_source( cosmic_text::fontdb::Source::Binary(Arc::new(bytes.into_owned())), @@ -51,14 +56,19 @@ impl FontSystem { self.version = Version(self.version.0 + 1); } + /// Returns the current [`Version`] of the [`FontSystem`]. + /// + /// Loading a font will increase the version of a [`FontSystem`]. pub fn version(&self) -> Version { self.version } } +/// A version number. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct Version(u32); +/// Measures the dimensions of the given [`cosmic_text::Buffer`]. pub fn measure(buffer: &cosmic_text::Buffer) -> Size { let (width, total_lines) = buffer .layout_runs() @@ -69,6 +79,7 @@ pub fn measure(buffer: &cosmic_text::Buffer) -> Size { Size::new(width, total_lines as f32 * buffer.metrics().line_height) } +/// Returns the attributes of the given [`Font`]. pub fn to_attributes(font: Font) -> cosmic_text::Attrs<'static> { cosmic_text::Attrs::new() .family(to_family(font.family)) @@ -124,6 +135,7 @@ fn to_style(style: font::Style) -> cosmic_text::Style { } } +/// Converts some [`Shaping`] strategy to a [`cosmic_text::Shaping`] strategy. pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping { match shaping { Shaping::Basic => cosmic_text::Shaping::Basic, @@ -131,6 +143,7 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping { } } +/// Converts some [`Color`] to a [`cosmic_text::Color`]. pub fn to_color(color: Color) -> cosmic_text::Color { let [r, g, b, a] = color::pack(color).components(); diff --git a/graphics/src/text/cache.rs b/graphics/src/text/cache.rs index 577c4687..b3293dd4 100644 --- a/graphics/src/text/cache.rs +++ b/graphics/src/text/cache.rs @@ -1,3 +1,4 @@ +//! Cache text. use crate::core::{Font, Size}; use crate::text; @@ -5,6 +6,7 @@ use rustc_hash::{FxHashMap, FxHashSet}; use std::collections::hash_map; use std::hash::{BuildHasher, Hash, Hasher}; +/// A store of recently used sections of text. #[allow(missing_debug_implementations)] #[derive(Default)] pub struct Cache { @@ -21,14 +23,17 @@ type HashBuilder = twox_hash::RandomXxHashBuilder64; type HashBuilder = std::hash::BuildHasherDefault<twox_hash::XxHash64>; impl Cache { + /// Creates a new empty [`Cache`]. pub fn new() -> Self { Self::default() } + /// Gets the text [`Entry`] with the given [`KeyHash`]. pub fn get(&self, key: &KeyHash) -> Option<&Entry> { self.entries.get(key) } + /// Allocates a text [`Entry`] if it is not already present in the [`Cache`]. pub fn allocate( &mut self, font_system: &mut cosmic_text::FontSystem, @@ -88,6 +93,9 @@ impl Cache { (hash, self.entries.get_mut(&hash).unwrap()) } + /// Trims the [`Cache`]. + /// + /// This will clear the sections of text that have not been used since the last `trim`. pub fn trim(&mut self) { self.entries .retain(|key, _| self.recently_used.contains(key)); @@ -99,13 +107,20 @@ impl Cache { } } +/// A cache key representing a section of text. #[derive(Debug, Clone, Copy)] pub struct Key<'a> { + /// The content of the text. pub content: &'a str, + /// The size of the text. pub size: f32, + /// The line height of the text. pub line_height: f32, + /// The [`Font`] of the text. pub font: Font, + /// The bounds of the text. pub bounds: Size, + /// The shaping strategy of the text. pub shaping: text::Shaping, } @@ -123,10 +138,14 @@ impl Key<'_> { } } +/// The hash of a [`Key`]. pub type KeyHash = u64; +/// A cache entry. #[allow(missing_debug_implementations)] pub struct Entry { + /// The buffer of text, ready for drawing. pub buffer: cosmic_text::Buffer, + /// The minimum bounds of the text. pub min_bounds: Size, } diff --git a/graphics/src/text/editor.rs b/graphics/src/text/editor.rs index a05312dc..d5262ae8 100644 --- a/graphics/src/text/editor.rs +++ b/graphics/src/text/editor.rs @@ -1,3 +1,4 @@ +//! Draw and edit text. use crate::core::text::editor::{ self, Action, Cursor, Direction, Edit, Motion, }; @@ -11,6 +12,7 @@ use cosmic_text::Edit as _; use std::fmt; use std::sync::{self, Arc}; +/// A multi-line text editor. #[derive(Debug, PartialEq)] pub struct Editor(Option<Arc<Internal>>); @@ -23,14 +25,21 @@ struct Internal { } impl Editor { + /// Creates a new empty [`Editor`]. pub fn new() -> Self { Self::default() } + /// Returns the buffer of the [`Editor`]. pub fn buffer(&self) -> &cosmic_text::Buffer { self.internal().editor.buffer() } + /// Creates a [`Weak`] reference to the [`Editor`]. + /// + /// This is useful to avoid cloning the [`Editor`] when + /// referential guarantees are unnecessary. For instance, + /// when creating a rendering tree. pub fn downgrade(&self) -> Weak { let editor = self.internal(); @@ -662,13 +671,16 @@ impl fmt::Debug for Internal { } } +/// A weak reference to an [`Editor`]. #[derive(Debug, Clone)] pub struct Weak { raw: sync::Weak<Internal>, + /// The bounds of the [`Editor`]. pub bounds: Size, } impl Weak { + /// Tries to update the reference into an [`Editor`]. pub fn upgrade(&self) -> Option<Editor> { self.raw.upgrade().map(Some).map(Editor) } diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index d0396e8e..ccfe4a61 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -1,3 +1,4 @@ +//! Draw paragraphs. use crate::core; use crate::core::alignment; use crate::core::text::{Hit, LineHeight, Shaping, Text}; @@ -7,6 +8,7 @@ use crate::text; use std::fmt; use std::sync::{self, Arc}; +/// A bunch of text. #[derive(Clone, PartialEq)] pub struct Paragraph(Option<Arc<Internal>>); @@ -23,14 +25,21 @@ struct Internal { } impl Paragraph { + /// Creates a new empty [`Paragraph`]. pub fn new() -> Self { Self::default() } + /// Returns the buffer of the [`Paragraph`]. pub fn buffer(&self) -> &cosmic_text::Buffer { &self.internal().buffer } + /// Creates a [`Weak`] reference to the [`Paragraph`]. + /// + /// This is useful to avoid cloning the [`Editor`] when + /// referential guarantees are unnecessary. For instance, + /// when creating a rendering tree. pub fn downgrade(&self) -> Weak { let paragraph = self.internal(); @@ -269,15 +278,20 @@ impl Default for Internal { } } +/// A weak reference to a [`Paragraph`]. #[derive(Debug, Clone)] pub struct Weak { raw: sync::Weak<Internal>, + /// The minimum bounds of the [`Paragraph`]. pub min_bounds: Size, + /// The horizontal alignment of the [`Paragraph`]. pub horizontal_alignment: alignment::Horizontal, + /// The vertical alignment of the [`Paragraph`]. pub vertical_alignment: alignment::Vertical, } impl Weak { + /// Tries to update the reference into a [`Paragraph`]. pub fn upgrade(&self) -> Option<Paragraph> { self.raw.upgrade().map(Some).map(Paragraph) } diff --git a/style/src/lib.rs b/style/src/lib.rs index 35460f4b..e4097434 100644 --- a/style/src/lib.rs +++ b/style/src/lib.rs @@ -10,7 +10,7 @@ #![forbid(unsafe_code, rust_2018_idioms)] #![deny( unused_results, - // missing_docs, + missing_docs, unused_results, rustdoc::broken_intra_doc_links )] diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index d46b39da..66417cec 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -4,19 +4,24 @@ use crate::core::{Color, Font, Pixels, Point, Rectangle}; use crate::graphics::text::editor; use crate::graphics::text::paragraph; -/// A paragraph of text. +/// A text primitive. #[derive(Debug, Clone)] pub enum Text<'a> { + /// A paragraph. + #[allow(missing_docs)] Paragraph { paragraph: paragraph::Weak, position: Point, color: Color, }, + /// An editor. + #[allow(missing_docs)] Editor { editor: editor::Weak, position: Point, color: Color, }, + /// A cached text. Cached(Cached<'a>), } diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 6d26723e..424dfeb3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -23,7 +23,7 @@ #![forbid(rust_2018_idioms)] #![deny( missing_debug_implementations, - //missing_docs, + missing_docs, unsafe_code, unused_results, rustdoc::broken_intra_doc_links diff --git a/widget/src/lib.rs b/widget/src/lib.rs index 97e4ac58..e3335a98 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -4,8 +4,8 @@ )] #![forbid(unsafe_code, rust_2018_idioms)] #![deny( - // missing_debug_implementations, - // missing_docs, + //missing_debug_implementations, + missing_docs, unused_results, rustdoc::broken_intra_doc_links )] diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 6d25967e..da1905dc 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -1,3 +1,4 @@ +//! Display a multi-line text input for text editing. use crate::core::event::{self, Event}; use crate::core::keyboard; use crate::core::layout::{self, Layout}; @@ -19,6 +20,7 @@ use std::sync::Arc; pub use crate::style::text_editor::{Appearance, StyleSheet}; pub use text::editor::{Action, Edit, Motion}; +/// A multi-line text input. pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer> where Highlighter: text::Highlighter, @@ -47,6 +49,7 @@ where Renderer: text::Renderer, Renderer::Theme: StyleSheet, { + /// Creates new [`TextEditor`] with the given [`Content`]. pub fn new(content: &'a Content<Renderer>) -> Self { Self { content, @@ -73,21 +76,34 @@ where Renderer: text::Renderer, Renderer::Theme: StyleSheet, { - pub fn on_edit(mut self, on_edit: impl Fn(Action) -> Message + 'a) -> Self { + /// Sets the message that should be produced when some action is performed in + /// the [`TextEditor`]. + /// + /// If this method is not called, the [`TextEditor`] will be disabled. + pub fn on_action( + mut self, + on_edit: impl Fn(Action) -> Message + 'a, + ) -> Self { self.on_edit = Some(Box::new(on_edit)); self } + /// Sets the [`Font`] of the [`TextEditor`]. + /// + /// [`Font`]: text::Renderer::Font pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self { self.font = Some(font.into()); self } + /// Sets the [`Padding`] of the [`TextEditor`]. pub fn padding(mut self, padding: impl Into<Padding>) -> Self { self.padding = padding.into(); self } + /// Highlights the [`TextEditor`] with the given [`Highlighter`] and + /// a strategy to turn its highlights into some text format. pub fn highlight<H: text::Highlighter>( self, settings: H::Settings, @@ -112,6 +128,7 @@ where } } +/// The content of a [`TextEditor`]. pub struct Content<R = crate::Renderer>(RefCell<Internal<R>>) where R: text::Renderer; @@ -128,28 +145,33 @@ impl<R> Content<R> where R: text::Renderer, { + /// Creates an empty [`Content`]. pub fn new() -> Self { - Self::with("") + Self::with_text("") } - pub fn with(text: &str) -> Self { + /// Creates a [`Content`] with the given text. + pub fn with_text(text: &str) -> Self { Self(RefCell::new(Internal { editor: R::Editor::with_text(text), is_dirty: true, })) } - pub fn edit(&mut self, action: Action) { + /// Performs an [`Action`] on the [`Content`]. + pub fn perform(&mut self, action: Action) { let internal = self.0.get_mut(); internal.editor.perform(action); internal.is_dirty = true; } + /// Returns the amount of lines of the [`Content`]. pub fn line_count(&self) -> usize { self.0.borrow().editor.line_count() } + /// Returns the text of the line at the given index, if it exists. pub fn line( &self, index: usize, @@ -160,6 +182,7 @@ where .ok() } + /// Returns an iterator of the text of the lines in the [`Content`]. pub fn lines( &self, ) -> impl Iterator<Item = impl std::ops::Deref<Target = str> + '_> { @@ -190,6 +213,9 @@ where } } + /// Returns the text of the [`Content`]. + /// + /// Lines are joined with `'\n'`. pub fn text(&self) -> String { let mut text = self.lines().enumerate().fold( String::new(), @@ -211,10 +237,12 @@ where text } + /// Returns the selected text of the [`Content`]. pub fn selection(&self) -> Option<String> { self.0.borrow().editor.selection() } + /// Returns the current cursor position of the [`Content`]. pub fn cursor_position(&self) -> (usize, usize) { self.0.borrow().editor.cursor_position() } From e579d8553088c7d17784e7ff8f6e21360c2bd9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 05:08:06 +0200 Subject: [PATCH 122/286] Implement missing debug implementations in `iced_widget` --- widget/src/lib.rs | 2 +- widget/src/text_editor.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/widget/src/lib.rs b/widget/src/lib.rs index e3335a98..2f959370 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -4,7 +4,7 @@ )] #![forbid(unsafe_code, rust_2018_idioms)] #![deny( - //missing_debug_implementations, + missing_debug_implementations, missing_docs, unused_results, rustdoc::broken_intra_doc_links diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index da1905dc..ac24920f 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -14,6 +14,7 @@ use crate::core::{ }; use std::cell::RefCell; +use std::fmt; use std::ops::DerefMut; use std::sync::Arc; @@ -21,6 +22,7 @@ pub use crate::style::text_editor::{Appearance, StyleSheet}; pub use text::editor::{Action, Edit, Motion}; /// A multi-line text input. +#[allow(missing_debug_implementations)] pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer> where Highlighter: text::Highlighter, @@ -257,6 +259,21 @@ where } } +impl<Renderer> fmt::Debug for Content<Renderer> +where + Renderer: text::Renderer, + Renderer::Editor: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let internal = self.0.borrow(); + + f.debug_struct("Content") + .field("editor", &internal.editor) + .field("is_dirty", &internal.is_dirty) + .finish() + } +} + struct State<Highlighter: text::Highlighter> { is_focused: bool, last_click: Option<mouse::Click>, From 57f9024e89256ad3f99a3ab19bdc8524c1defa54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 05:19:35 +0200 Subject: [PATCH 123/286] Fix intra-doc broken links --- .cargo/config.toml | 2 -- core/src/text/editor.rs | 2 +- graphics/src/text/paragraph.rs | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 3e02dda8..85a46cda 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -17,8 +17,6 @@ clippy --workspace --no-deps -- \ -D clippy::useless_conversion """ -#![allow(clippy::inherent_to_string, clippy::type_complexity)] - nitpick = """ clippy --workspace --no-deps -- \ -D warnings \ diff --git a/core/src/text/editor.rs b/core/src/text/editor.rs index ebb0eee2..f3c6e342 100644 --- a/core/src/text/editor.rs +++ b/core/src/text/editor.rs @@ -7,7 +7,7 @@ use std::sync::Arc; /// A component that can be used by widgets to edit multi-line text. pub trait Editor: Sized + Default { - /// The [`Font`] of the [`Editor`]. + /// The font of the [`Editor`]. type Font: Copy + PartialEq + Default; /// Creates a new [`Editor`] laid out with the given text. diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index ccfe4a61..4a08a8f4 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -37,7 +37,7 @@ impl Paragraph { /// Creates a [`Weak`] reference to the [`Paragraph`]. /// - /// This is useful to avoid cloning the [`Editor`] when + /// This is useful to avoid cloning the [`Paragraph`] when /// referential guarantees are unnecessary. For instance, /// when creating a rendering tree. pub fn downgrade(&self) -> Weak { From 3ec5ad42251d4f35861f3bed621223e383742b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 06:00:28 +0200 Subject: [PATCH 124/286] Use upstream repository for `glyphon` dependency --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index bb8b4752..03df14c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,7 +117,7 @@ bytemuck = { version = "1.0", features = ["derive"] } cosmic-text = "0.10" futures = "0.3" glam = "0.24" -glyphon = { git = "https://github.com/hecrj/glyphon.git", rev = "2caa9fc5e5923c1d827d177c3619cab7e9885b85" } +glyphon = { git = "https://github.com/grovesNL/glyphon.git", rev = "2caa9fc5e5923c1d827d177c3619cab7e9885b85" } guillotiere = "0.6" half = "2.2" image = "0.24" From c07315b84eb59daeb9bbe7480f30dc0937ceca13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 27 Oct 2023 05:53:29 +0200 Subject: [PATCH 125/286] Disable maximize window button if `Settings::resizable` is `false` --- winit/src/settings.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/winit/src/settings.rs b/winit/src/settings.rs index 867dad0f..16c9fcdc 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -130,6 +130,12 @@ impl Window { .with_title(title) .with_inner_size(winit::dpi::LogicalSize { width, height }) .with_resizable(self.resizable) + .with_enabled_buttons(if self.resizable { + winit::window::WindowButtons::all() + } else { + winit::window::WindowButtons::CLOSE + | winit::window::WindowButtons::MINIMIZE + }) .with_decorations(self.decorations) .with_transparent(self.transparent) .with_window_icon(self.icon.and_then(conversion::icon)) From c8eca4e6bfae82013e6bb08e9d8bf66560b36564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Fri, 27 Oct 2023 16:37:58 +0200 Subject: [PATCH 126/286] Improve `TextEditor` scroll interaction with a touchpad --- widget/src/text_editor.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index ac24920f..1708a2e5 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -628,7 +628,7 @@ impl Update { } } mouse::ScrollDelta::Pixels { y, .. } => { - -y.signum() as i32 + (-y / 4.0) as i32 } }, }) From 98e088e731e6fbd5b5035033ae61bda823ced988 Mon Sep 17 00:00:00 2001 From: dtzxporter <dtzxporter@users.noreply.github.com> Date: Tue, 12 Sep 2023 18:15:00 -0400 Subject: [PATCH 127/286] Migrate twox-hash -> xxhash_rust. Switch to Xxh3 for better performance. xxhash-rust is more maintained, built against `::core`, so no workaround for wasm is necessary. Switch to Xxh3 for better performance, which shows when loading/hashing image buffers. --- Cargo.toml | 2 +- core/Cargo.toml | 2 +- core/src/hasher.rs | 5 +++-- graphics/Cargo.toml | 6 +----- graphics/src/text/cache.rs | 6 +----- tiny_skia/Cargo.toml | 6 +----- 6 files changed, 8 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1a286b9b..f625f1ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,7 +150,7 @@ thiserror = "1.0" tiny-skia = "0.10" tokio = "1.0" tracing = "0.1" -twox-hash = { version = "1.0", default-features = false } +xxhash-rust = { version = "0.8.7", default-features = false, features = ["xxh3"] } unicode-segmentation = "1.0" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" diff --git a/core/Cargo.toml b/core/Cargo.toml index 7acb7511..82946847 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -14,7 +14,7 @@ keywords.workspace = true bitflags.workspace = true log.workspace = true thiserror.workspace = true -twox-hash.workspace = true +xxhash-rust.workspace = true num-traits.workspace = true palette.workspace = true diff --git a/core/src/hasher.rs b/core/src/hasher.rs index 9d8f75b3..a13d78af 100644 --- a/core/src/hasher.rs +++ b/core/src/hasher.rs @@ -1,6 +1,7 @@ /// The hasher used to compare layouts. -#[derive(Debug, Default)] -pub struct Hasher(twox_hash::XxHash64); +#[allow(missing_debug_implementations)] // Doesn't really make sense to have debug on the hasher state anyways. +#[derive(Default)] +pub struct Hasher(xxhash_rust::xxh3::Xxh3); impl core::hash::Hasher for Hasher { fn write(&mut self, bytes: &[u8]) { diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 3165810b..a7aea352 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -33,8 +33,8 @@ once_cell.workspace = true raw-window-handle.workspace = true rustc-hash.workspace = true thiserror.workspace = true -twox-hash.workspace = true unicode-segmentation.workspace = true +xxhash-rust.workspace = true image.workspace = true image.optional = true @@ -44,7 +44,3 @@ kamadak-exif.optional = true lyon_path.workspace = true lyon_path.optional = true - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -twox-hash.workspace = true -twox-hash.features = ["std"] diff --git a/graphics/src/text/cache.rs b/graphics/src/text/cache.rs index b3293dd4..7fb33567 100644 --- a/graphics/src/text/cache.rs +++ b/graphics/src/text/cache.rs @@ -16,11 +16,7 @@ pub struct Cache { hasher: HashBuilder, } -#[cfg(not(target_arch = "wasm32"))] -type HashBuilder = twox_hash::RandomXxHashBuilder64; - -#[cfg(target_arch = "wasm32")] -type HashBuilder = std::hash::BuildHasherDefault<twox_hash::XxHash64>; +type HashBuilder = xxhash_rust::xxh3::Xxh3Builder; impl Cache { /// Creates a new empty [`Cache`]. diff --git a/tiny_skia/Cargo.toml b/tiny_skia/Cargo.toml index 15a6928a..df4c6143 100644 --- a/tiny_skia/Cargo.toml +++ b/tiny_skia/Cargo.toml @@ -26,11 +26,7 @@ raw-window-handle.workspace = true rustc-hash.workspace = true softbuffer.workspace = true tiny-skia.workspace = true -twox-hash.workspace = true +xxhash-rust.workspace = true resvg.workspace = true resvg.optional = true - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -twox-hash.workspace = true -twox-hash.features = ["std"] From 4b69c71d5b570ce716b9c202e9a47d5ae9ce3ae0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 03:43:03 +0100 Subject: [PATCH 128/286] Remove patch version from `xxhash-rust` dependency --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f625f1ad..4bcf7c7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,7 +150,7 @@ thiserror = "1.0" tiny-skia = "0.10" tokio = "1.0" tracing = "0.1" -xxhash-rust = { version = "0.8.7", default-features = false, features = ["xxh3"] } +xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] } unicode-segmentation = "1.0" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" From 107e842071f1300df5e0bfcb26ee0a99024e51d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 03:43:50 +0100 Subject: [PATCH 129/286] Remove unnecessary `default-features` attribute from `xxhash-rust` dependency --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4bcf7c7a..ac34a4ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -150,7 +150,7 @@ thiserror = "1.0" tiny-skia = "0.10" tokio = "1.0" tracing = "0.1" -xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] } +xxhash-rust = { version = "0.8", features = ["xxh3"] } unicode-segmentation = "1.0" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" From 2aaaf2cd0cb56f9efc946159a0232270f8d37eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 04:03:25 +0100 Subject: [PATCH 130/286] Call `convert_text` on `svg` node before rendering `tiny-skia` does not support text rendering, so we convert the text nodes to path nodes prior to that. --- Cargo.toml | 4 ++-- tiny_skia/src/vector.rs | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1a286b9b..18dd8d3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -140,14 +140,14 @@ ouroboros = "0.17" palette = "0.7" qrcode = { version = "0.12", default-features = false } raw-window-handle = "0.5" -resvg = "0.35" +resvg = "0.36" rustc-hash = "1.0" smol = "1.0" softbuffer = "0.2" syntect = "5.1" sysinfo = "0.28" thiserror = "1.0" -tiny-skia = "0.10" +tiny-skia = "0.11" tokio = "1.0" tracing = "0.1" twox-hash = { version = "1.0", default-features = false } diff --git a/tiny_skia/src/vector.rs b/tiny_skia/src/vector.rs index a1cd269d..9c2893a2 100644 --- a/tiny_skia/src/vector.rs +++ b/tiny_skia/src/vector.rs @@ -1,7 +1,8 @@ use crate::core::svg::{Data, Handle}; use crate::core::{Color, Rectangle, Size}; +use crate::graphics::text; -use resvg::usvg; +use resvg::usvg::{self, TreeTextToPath}; use rustc_hash::{FxHashMap, FxHashSet}; use std::cell::RefCell; @@ -77,7 +78,7 @@ impl Cache { let id = handle.id(); if let hash_map::Entry::Vacant(entry) = self.trees.entry(id) { - let svg = match handle.data() { + let mut svg = match handle.data() { Data::Path(path) => { fs::read_to_string(path).ok().and_then(|contents| { usvg::Tree::from_str( @@ -92,6 +93,15 @@ impl Cache { } }; + if let Some(svg) = &mut svg { + if svg.has_text_nodes() { + let mut font_system = + text::font_system().write().expect("Read font system"); + + svg.convert_text(font_system.raw().db_mut()); + } + } + let _ = entry.insert(svg); } From bb2f557d6a75850aed8e8689348f7a544b364bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 04:36:45 +0100 Subject: [PATCH 131/286] Fix `artifacts` job in `audit` workflow --- .github/workflows/audit.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index bfb617fb..5f5f7f65 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -24,5 +24,7 @@ jobs: - name: Install cargo-outdated run: cargo install cargo-outdated - uses: actions/checkout@master + - name: Delete `web-sys` dependency from `integration` example + run: sed '$d' examples/integration/Cargo.toml - name: Find outdated dependencies run: cargo outdated --workspace --exit-code 1 From ef015a5e72802c059784e74d611f351df75403c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 04:46:11 +0100 Subject: [PATCH 132/286] Run `sed` with `-i` option in `artifacts` job --- .github/workflows/audit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 5f5f7f65..80bbcacd 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -25,6 +25,6 @@ jobs: run: cargo install cargo-outdated - uses: actions/checkout@master - name: Delete `web-sys` dependency from `integration` example - run: sed '$d' examples/integration/Cargo.toml + run: sed -i '$d' examples/integration/Cargo.toml - name: Find outdated dependencies run: cargo outdated --workspace --exit-code 1 From 5759096a4c33935fcdf5f96606143e4f21159186 Mon Sep 17 00:00:00 2001 From: Remmirad <remmirad@posteo.net> Date: Wed, 31 May 2023 15:46:21 +0200 Subject: [PATCH 133/286] Implement texture filtering options --- core/src/image.rs | 32 +++++++++++++++++++ tiny_skia/src/raster.rs | 7 ++++- wgpu/src/image.rs | 69 +++++++++++++++++++++++++++-------------- widget/src/image.rs | 2 +- 4 files changed, 84 insertions(+), 26 deletions(-) diff --git a/core/src/image.rs b/core/src/image.rs index 85d9d475..9a6011a3 100644 --- a/core/src/image.rs +++ b/core/src/image.rs @@ -5,11 +5,31 @@ use std::hash::{Hash, Hasher as _}; use std::path::PathBuf; use std::sync::Arc; +/// Image filter method +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum FilterMethod { + /// Bilinear interpolation + #[default] + Linear, + /// Nearest Neighbor + Nearest, +} + +/// Texture filter settings +#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)] +pub struct TextureFilter { + /// Filter for scaling the image down. + pub min: FilterMethod, + /// Filter for scaling the image up. + pub mag: FilterMethod, +} + /// A handle of some image data. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Handle { id: u64, data: Data, + filter: TextureFilter, } impl Handle { @@ -56,6 +76,7 @@ impl Handle { Handle { id: hasher.finish(), data, + filter: TextureFilter::default(), } } @@ -68,6 +89,17 @@ impl Handle { pub fn data(&self) -> &Data { &self.data } + + /// Returns a reference to the [`TextureFilter`]. + pub fn filter(&self) -> &TextureFilter { + &self.filter + } + + /// Sets the texture filtering methods. + pub fn set_filter(mut self, filter: TextureFilter) -> Self { + self.filter = filter; + self + } } impl<T> From<T> for Handle diff --git a/tiny_skia/src/raster.rs b/tiny_skia/src/raster.rs index d13b1167..95f74ad1 100644 --- a/tiny_skia/src/raster.rs +++ b/tiny_skia/src/raster.rs @@ -39,12 +39,17 @@ impl Pipeline { let transform = transform.pre_scale(width_scale, height_scale); + let quality = match handle.filter().mag { + raster::FilterMethod::Linear => tiny_skia::FilterQuality::Bilinear, + raster::FilterMethod::Nearest => tiny_skia::FilterQuality::Nearest, + }; + pixels.draw_pixmap( (bounds.x / width_scale) as i32, (bounds.y / height_scale) as i32, image, &tiny_skia::PixmapPaint { - quality: tiny_skia::FilterQuality::Bilinear, + quality: quality, ..Default::default() }, transform, diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 553ba330..a0fe7e83 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -7,6 +7,7 @@ mod raster; mod vector; use atlas::Atlas; +use iced_graphics::core::image::{TextureFilter, FilterMethod}; use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; @@ -14,6 +15,7 @@ use crate::layer; use crate::Buffer; use std::cell::RefCell; +use std::collections::HashMap; use std::mem; use bytemuck::{Pod, Zeroable}; @@ -37,7 +39,7 @@ pub struct Pipeline { pipeline: wgpu::RenderPipeline, vertices: wgpu::Buffer, indices: wgpu::Buffer, - sampler: wgpu::Sampler, + sampler: HashMap<TextureFilter,wgpu::Sampler>, texture: wgpu::BindGroup, texture_version: usize, texture_atlas: Atlas, @@ -142,15 +144,32 @@ impl Pipeline { pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { use wgpu::util::DeviceExt; - let sampler = device.create_sampler(&wgpu::SamplerDescriptor { - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: wgpu::FilterMode::Linear, - min_filter: wgpu::FilterMode::Linear, - mipmap_filter: wgpu::FilterMode::Linear, - ..Default::default() - }); + let to_wgpu = |method: FilterMethod| { + match method { + FilterMethod::Linear => wgpu::FilterMode::Linear, + FilterMethod::Nearest => wgpu::FilterMode::Nearest, + } + }; + + let mut sampler = HashMap::new(); + + let filter = [FilterMethod::Linear, FilterMethod::Nearest]; + for min in 0..filter.len() { + for mag in 0..filter.len() { + let _ = sampler.insert(TextureFilter {min: filter[min], mag: filter[mag]}, + device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: to_wgpu(filter[mag]), + min_filter: to_wgpu(filter[min]), + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + } + )); + } + } + let constant_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -355,7 +374,7 @@ impl Pipeline { #[cfg(feature = "tracing")] let _ = info_span!("Wgpu::Image", "DRAW").entered(); - let instances: &mut Vec<Instance> = &mut Vec::new(); + let instances: &mut HashMap<TextureFilter,Vec<Instance>> = &mut HashMap::new(); #[cfg(feature = "image")] let mut raster_cache = self.raster_cache.borrow_mut(); @@ -377,7 +396,7 @@ impl Pipeline { [bounds.x, bounds.y], [bounds.width, bounds.height], atlas_entry, - instances, + instances.entry(handle.filter().clone()).or_insert(Vec::new()), ); } } @@ -405,7 +424,7 @@ impl Pipeline { [bounds.x, bounds.y], size, atlas_entry, - instances, + instances.entry(TextureFilter::default()).or_insert(Vec::new()), ); } } @@ -438,18 +457,20 @@ impl Pipeline { self.texture_version = texture_version; } - if self.layers.len() <= self.prepare_layer { - self.layers.push(Layer::new( - device, - &self.constant_layout, - &self.sampler, - )); + for (filter, instances) in instances.iter_mut() { + if self.layers.len() <= self.prepare_layer { + self.layers.push(Layer::new( + device, + &self.constant_layout, + &self.sampler.get(filter).expect("Sampler is registered"), + )); + } + + let layer = &mut self.layers[self.prepare_layer]; + layer.prepare(device, queue, &instances, transformation); + + self.prepare_layer += 1; } - - let layer = &mut self.layers[self.prepare_layer]; - layer.prepare(device, queue, instances, transformation); - - self.prepare_layer += 1; } pub fn render<'a>( diff --git a/widget/src/image.rs b/widget/src/image.rs index a0e89920..9f0b16b7 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -13,7 +13,7 @@ use crate::core::{ use std::hash::Hash; -pub use image::Handle; +pub use image::{Handle, TextureFilter, FilterMethod}; /// Creates a new [`Viewer`] with the given image `Handle`. pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> { From 4b32a488808e371313ce78e727c9d98ab2eb759e Mon Sep 17 00:00:00 2001 From: Remmirad <remmirad@posteo.net> Date: Fri, 4 Aug 2023 13:50:16 +0200 Subject: [PATCH 134/286] Fix clippy + fmt --- core/src/image.rs | 2 +- tiny_skia/src/raster.rs | 10 +++++++--- wgpu/src/image.rs | 42 +++++++++++++++++++++++------------------ widget/src/image.rs | 2 +- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/core/src/image.rs b/core/src/image.rs index 9a6011a3..69f19436 100644 --- a/core/src/image.rs +++ b/core/src/image.rs @@ -11,7 +11,7 @@ pub enum FilterMethod { /// Bilinear interpolation #[default] Linear, - /// Nearest Neighbor + /// Nearest Neighbor Nearest, } diff --git a/tiny_skia/src/raster.rs b/tiny_skia/src/raster.rs index 95f74ad1..3f35ee78 100644 --- a/tiny_skia/src/raster.rs +++ b/tiny_skia/src/raster.rs @@ -40,8 +40,12 @@ impl Pipeline { let transform = transform.pre_scale(width_scale, height_scale); let quality = match handle.filter().mag { - raster::FilterMethod::Linear => tiny_skia::FilterQuality::Bilinear, - raster::FilterMethod::Nearest => tiny_skia::FilterQuality::Nearest, + raster::FilterMethod::Linear => { + tiny_skia::FilterQuality::Bilinear + } + raster::FilterMethod::Nearest => { + tiny_skia::FilterQuality::Nearest + } }; pixels.draw_pixmap( @@ -49,7 +53,7 @@ impl Pipeline { (bounds.y / height_scale) as i32, image, &tiny_skia::PixmapPaint { - quality: quality, + quality, ..Default::default() }, transform, diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index a0fe7e83..a3168001 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -7,7 +7,7 @@ mod raster; mod vector; use atlas::Atlas; -use iced_graphics::core::image::{TextureFilter, FilterMethod}; +use iced_graphics::core::image::{FilterMethod, TextureFilter}; use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; @@ -39,7 +39,7 @@ pub struct Pipeline { pipeline: wgpu::RenderPipeline, vertices: wgpu::Buffer, indices: wgpu::Buffer, - sampler: HashMap<TextureFilter,wgpu::Sampler>, + sampler: HashMap<TextureFilter, wgpu::Sampler>, texture: wgpu::BindGroup, texture_version: usize, texture_atlas: Atlas, @@ -144,11 +144,9 @@ impl Pipeline { pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { use wgpu::util::DeviceExt; - let to_wgpu = |method: FilterMethod| { - match method { - FilterMethod::Linear => wgpu::FilterMode::Linear, - FilterMethod::Nearest => wgpu::FilterMode::Nearest, - } + let to_wgpu = |method: FilterMethod| match method { + FilterMethod::Linear => wgpu::FilterMode::Linear, + FilterMethod::Nearest => wgpu::FilterMode::Nearest, }; let mut sampler = HashMap::new(); @@ -156,7 +154,11 @@ impl Pipeline { let filter = [FilterMethod::Linear, FilterMethod::Nearest]; for min in 0..filter.len() { for mag in 0..filter.len() { - let _ = sampler.insert(TextureFilter {min: filter[min], mag: filter[mag]}, + let _ = sampler.insert( + TextureFilter { + min: filter[min], + mag: filter[mag], + }, device.create_sampler(&wgpu::SamplerDescriptor { address_mode_u: wgpu::AddressMode::ClampToEdge, address_mode_v: wgpu::AddressMode::ClampToEdge, @@ -165,12 +167,11 @@ impl Pipeline { min_filter: to_wgpu(filter[min]), mipmap_filter: wgpu::FilterMode::Linear, ..Default::default() - } - )); + }), + ); } } - let constant_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Some("iced_wgpu::image constants layout"), @@ -374,7 +375,8 @@ impl Pipeline { #[cfg(feature = "tracing")] let _ = info_span!("Wgpu::Image", "DRAW").entered(); - let instances: &mut HashMap<TextureFilter,Vec<Instance>> = &mut HashMap::new(); + let instances: &mut HashMap<TextureFilter, Vec<Instance>> = + &mut HashMap::new(); #[cfg(feature = "image")] let mut raster_cache = self.raster_cache.borrow_mut(); @@ -396,7 +398,9 @@ impl Pipeline { [bounds.x, bounds.y], [bounds.width, bounds.height], atlas_entry, - instances.entry(handle.filter().clone()).or_insert(Vec::new()), + instances + .entry(handle.filter().clone()) + .or_insert(Vec::new()), ); } } @@ -424,7 +428,9 @@ impl Pipeline { [bounds.x, bounds.y], size, atlas_entry, - instances.entry(TextureFilter::default()).or_insert(Vec::new()), + instances + .entry(TextureFilter::default()) + .or_insert(Vec::new()), ); } } @@ -462,13 +468,13 @@ impl Pipeline { self.layers.push(Layer::new( device, &self.constant_layout, - &self.sampler.get(filter).expect("Sampler is registered"), + self.sampler.get(filter).expect("Sampler is registered"), )); } - + let layer = &mut self.layers[self.prepare_layer]; - layer.prepare(device, queue, &instances, transformation); - + layer.prepare(device, queue, instances, transformation); + self.prepare_layer += 1; } } diff --git a/widget/src/image.rs b/widget/src/image.rs index 9f0b16b7..684f200c 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -13,7 +13,7 @@ use crate::core::{ use std::hash::Hash; -pub use image::{Handle, TextureFilter, FilterMethod}; +pub use image::{FilterMethod, Handle, TextureFilter}; /// Creates a new [`Viewer`] with the given image `Handle`. pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> { From e5d3e75d826e9fad8a0da5dd538aa542059dd034 Mon Sep 17 00:00:00 2001 From: Remmirad <remmirad@posteo.net> Date: Mon, 25 Sep 2023 21:54:50 +0200 Subject: [PATCH 135/286] fix design for wgpu backend --- wgpu/src/image.rs | 127 +++++++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index a3168001..0aa7f899 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -8,6 +8,7 @@ mod vector; use atlas::Atlas; use iced_graphics::core::image::{FilterMethod, TextureFilter}; +use wgpu::Sampler; use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; @@ -15,7 +16,6 @@ use crate::layer; use crate::Buffer; use std::cell::RefCell; -use std::collections::HashMap; use std::mem; use bytemuck::{Pod, Zeroable}; @@ -29,6 +29,8 @@ use crate::core::svg; #[cfg(feature = "tracing")] use tracing::info_span; +const SAMPLER_COUNT: usize = 4; + #[derive(Debug)] pub struct Pipeline { #[cfg(feature = "image")] @@ -39,14 +41,14 @@ pub struct Pipeline { pipeline: wgpu::RenderPipeline, vertices: wgpu::Buffer, indices: wgpu::Buffer, - sampler: HashMap<TextureFilter, wgpu::Sampler>, + sampler: [wgpu::Sampler; SAMPLER_COUNT], texture: wgpu::BindGroup, texture_version: usize, texture_atlas: Atlas, texture_layout: wgpu::BindGroupLayout, constant_layout: wgpu::BindGroupLayout, - layers: Vec<Layer>, + layers: Vec<[Option<Layer>; SAMPLER_COUNT]>, prepare_layer: usize, } @@ -149,28 +151,32 @@ impl Pipeline { FilterMethod::Nearest => wgpu::FilterMode::Nearest, }; - let mut sampler = HashMap::new(); + let mut sampler: [Option<Sampler>; SAMPLER_COUNT] = + [None, None, None, None]; let filter = [FilterMethod::Linear, FilterMethod::Nearest]; for min in 0..filter.len() { for mag in 0..filter.len() { - let _ = sampler.insert( - TextureFilter { - min: filter[min], - mag: filter[mag], - }, - device.create_sampler(&wgpu::SamplerDescriptor { - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: to_wgpu(filter[mag]), - min_filter: to_wgpu(filter[min]), - mipmap_filter: wgpu::FilterMode::Linear, - ..Default::default() - }), - ); + sampler[to_index(&TextureFilter { + min: filter[min], + mag: filter[mag], + })] = Some(device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: to_wgpu(filter[mag]), + min_filter: to_wgpu(filter[min]), + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + })); } } + let sampler = [ + sampler[0].take().unwrap(), + sampler[1].take().unwrap(), + sampler[2].take().unwrap(), + sampler[3].take().unwrap(), + ]; let constant_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -375,8 +381,8 @@ impl Pipeline { #[cfg(feature = "tracing")] let _ = info_span!("Wgpu::Image", "DRAW").entered(); - let instances: &mut HashMap<TextureFilter, Vec<Instance>> = - &mut HashMap::new(); + let mut instances: [Vec<Instance>; SAMPLER_COUNT] = + [Vec::new(), Vec::new(), Vec::new(), Vec::new()]; #[cfg(feature = "image")] let mut raster_cache = self.raster_cache.borrow_mut(); @@ -398,9 +404,7 @@ impl Pipeline { [bounds.x, bounds.y], [bounds.width, bounds.height], atlas_entry, - instances - .entry(handle.filter().clone()) - .or_insert(Vec::new()), + &mut instances[to_index(handle.filter())], ); } } @@ -428,9 +432,7 @@ impl Pipeline { [bounds.x, bounds.y], size, atlas_entry, - instances - .entry(TextureFilter::default()) - .or_insert(Vec::new()), + &mut instances[to_index(&TextureFilter::default())], ); } } @@ -463,20 +465,26 @@ impl Pipeline { self.texture_version = texture_version; } - for (filter, instances) in instances.iter_mut() { - if self.layers.len() <= self.prepare_layer { - self.layers.push(Layer::new( - device, - &self.constant_layout, - self.sampler.get(filter).expect("Sampler is registered"), - )); + if self.layers.len() <= self.prepare_layer { + self.layers.push([None, None, None, None]); + } + for (i, instances) in instances.iter_mut().enumerate() { + let layer = &mut self.layers[self.prepare_layer][i]; + if !instances.is_empty() { + if layer.is_none() { + *layer = Some(Layer::new( + device, + &self.constant_layout, + &self.sampler[i], + )) + } } - let layer = &mut self.layers[self.prepare_layer]; - layer.prepare(device, queue, instances, transformation); - - self.prepare_layer += 1; + if let Some(layer) = layer { + layer.prepare(device, queue, instances, transformation); + } } + self.prepare_layer += 1; } pub fn render<'a>( @@ -485,24 +493,29 @@ impl Pipeline { bounds: Rectangle<u32>, render_pass: &mut wgpu::RenderPass<'a>, ) { - if let Some(layer) = self.layers.get(layer) { - render_pass.set_pipeline(&self.pipeline); + if let Some(layer_group) = self.layers.get(layer) { + for (i, layer) in layer_group.iter().enumerate() { + if let Some(layer) = layer { + println!("Render {i}"); + render_pass.set_pipeline(&self.pipeline); - render_pass.set_scissor_rect( - bounds.x, - bounds.y, - bounds.width, - bounds.height, - ); + render_pass.set_scissor_rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height, + ); - render_pass.set_bind_group(1, &self.texture, &[]); - render_pass.set_index_buffer( - self.indices.slice(..), - wgpu::IndexFormat::Uint16, - ); - render_pass.set_vertex_buffer(0, self.vertices.slice(..)); + render_pass.set_bind_group(1, &self.texture, &[]); + render_pass.set_index_buffer( + self.indices.slice(..), + wgpu::IndexFormat::Uint16, + ); + render_pass.set_vertex_buffer(0, self.vertices.slice(..)); - layer.render(render_pass); + layer.render(render_pass); + } + } } } @@ -517,6 +530,14 @@ impl Pipeline { } } +fn to_index(filter: &TextureFilter) -> usize { + let to_index = |m| match m { + FilterMethod::Linear => 0, + FilterMethod::Nearest => 1, + }; + return (to_index(filter.mag) << 1) | (to_index(filter.min)); +} + #[repr(C)] #[derive(Clone, Copy, Zeroable, Pod)] pub struct Vertex { From 75c9afc608a4a9ff44d60a8fb6f4a5819f05bf79 Mon Sep 17 00:00:00 2001 From: Remmirad <remmirad@posteo.net> Date: Mon, 25 Sep 2023 22:03:22 +0200 Subject: [PATCH 136/286] Remove debug traces --- wgpu/src/image.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 0aa7f899..6768a714 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -494,9 +494,8 @@ impl Pipeline { render_pass: &mut wgpu::RenderPass<'a>, ) { if let Some(layer_group) = self.layers.get(layer) { - for (i, layer) in layer_group.iter().enumerate() { + for layer in layer_group.iter() { if let Some(layer) = layer { - println!("Render {i}"); render_pass.set_pipeline(&self.pipeline); render_pass.set_scissor_rect( From a5125d6fea824df1191777fe3eb53a2f748208b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 07:02:01 +0100 Subject: [PATCH 137/286] Refactor texture image filtering - Support only `Linear` or `Nearest` - Simplify `Layer` groups - Move `FilterMethod` to `Image` and `image::Viewer` --- core/src/image.rs | 49 +++----- examples/tour/src/main.rs | 44 +++++-- graphics/src/primitive.rs | 2 + graphics/src/renderer.rs | 13 ++- renderer/src/lib.rs | 9 +- tiny_skia/src/backend.rs | 16 ++- tiny_skia/src/raster.rs | 3 +- wgpu/src/image.rs | 230 +++++++++++++++++++++---------------- wgpu/src/layer.rs | 7 +- wgpu/src/layer/image.rs | 3 + widget/src/image.rs | 29 +++-- widget/src/image/viewer.rs | 5 +- 12 files changed, 250 insertions(+), 160 deletions(-) diff --git a/core/src/image.rs b/core/src/image.rs index 69f19436..e9675316 100644 --- a/core/src/image.rs +++ b/core/src/image.rs @@ -5,31 +5,11 @@ use std::hash::{Hash, Hasher as _}; use std::path::PathBuf; use std::sync::Arc; -/// Image filter method -#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum FilterMethod { - /// Bilinear interpolation - #[default] - Linear, - /// Nearest Neighbor - Nearest, -} - -/// Texture filter settings -#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)] -pub struct TextureFilter { - /// Filter for scaling the image down. - pub min: FilterMethod, - /// Filter for scaling the image up. - pub mag: FilterMethod, -} - /// A handle of some image data. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Handle { id: u64, data: Data, - filter: TextureFilter, } impl Handle { @@ -76,7 +56,6 @@ impl Handle { Handle { id: hasher.finish(), data, - filter: TextureFilter::default(), } } @@ -89,17 +68,6 @@ impl Handle { pub fn data(&self) -> &Data { &self.data } - - /// Returns a reference to the [`TextureFilter`]. - pub fn filter(&self) -> &TextureFilter { - &self.filter - } - - /// Sets the texture filtering methods. - pub fn set_filter(mut self, filter: TextureFilter) -> Self { - self.filter = filter; - self - } } impl<T> From<T> for Handle @@ -196,6 +164,16 @@ impl std::fmt::Debug for Data { } } +/// Image filtering strategy. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum FilterMethod { + /// Bilinear interpolation. + #[default] + Linear, + /// Nearest neighbor. + Nearest, +} + /// A [`Renderer`] that can render raster graphics. /// /// [renderer]: crate::renderer @@ -210,5 +188,10 @@ pub trait Renderer: crate::Renderer { /// Draws an image with the given [`Handle`] and inside the provided /// `bounds`. - fn draw(&mut self, handle: Self::Handle, bounds: Rectangle); + fn draw( + &mut self, + handle: Self::Handle, + filter_method: FilterMethod, + bounds: Rectangle, + ); } diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index d46e40d1..7003d8ae 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -1,4 +1,4 @@ -use iced::alignment; +use iced::alignment::{self, Alignment}; use iced::theme; use iced::widget::{ checkbox, column, container, horizontal_space, image, radio, row, @@ -126,7 +126,10 @@ impl Steps { Step::Toggler { can_continue: false, }, - Step::Image { width: 300 }, + Step::Image { + width: 300, + filter_method: image::FilterMethod::Linear, + }, Step::Scrollable, Step::TextInput { value: String::new(), @@ -195,6 +198,7 @@ enum Step { }, Image { width: u16, + filter_method: image::FilterMethod, }, Scrollable, TextInput { @@ -215,6 +219,7 @@ pub enum StepMessage { TextColorChanged(Color), LanguageSelected(Language), ImageWidthChanged(u16), + ImageUseNearestToggled(bool), InputChanged(String), ToggleSecureInput(bool), ToggleTextInputIcon(bool), @@ -265,6 +270,15 @@ impl<'a> Step { *width = new_width; } } + StepMessage::ImageUseNearestToggled(use_nearest) => { + if let Step::Image { filter_method, .. } = self { + *filter_method = if use_nearest { + image::FilterMethod::Nearest + } else { + image::FilterMethod::Linear + }; + } + } StepMessage::InputChanged(new_value) => { if let Step::TextInput { value, .. } = self { *value = new_value; @@ -330,7 +344,10 @@ impl<'a> Step { Step::Toggler { can_continue } => Self::toggler(*can_continue), Step::Slider { value } => Self::slider(*value), Step::Text { size, color } => Self::text(*size, *color), - Step::Image { width } => Self::image(*width), + Step::Image { + width, + filter_method, + } => Self::image(*width, *filter_method), Step::RowsAndColumns { layout, spacing } => { Self::rows_and_columns(*layout, *spacing) } @@ -525,16 +542,25 @@ impl<'a> Step { ) } - fn image(width: u16) -> Column<'a, StepMessage> { + fn image( + width: u16, + filter_method: image::FilterMethod, + ) -> Column<'a, StepMessage> { Self::container("Image") .push("An image that tries to keep its aspect ratio.") - .push(ferris(width)) + .push(ferris(width, filter_method)) .push(slider(100..=500, width, StepMessage::ImageWidthChanged)) .push( text(format!("Width: {width} px")) .width(Length::Fill) .horizontal_alignment(alignment::Horizontal::Center), ) + .push(checkbox( + "Use nearest interpolation", + filter_method == image::FilterMethod::Nearest, + StepMessage::ImageUseNearestToggled, + )) + .align_items(Alignment::Center) } fn scrollable() -> Column<'a, StepMessage> { @@ -555,7 +581,7 @@ impl<'a> Step { .horizontal_alignment(alignment::Horizontal::Center), ) .push(vertical_space(4096)) - .push(ferris(300)) + .push(ferris(300, image::FilterMethod::Linear)) .push( text("You made it!") .width(Length::Fill) @@ -646,7 +672,10 @@ impl<'a> Step { } } -fn ferris<'a>(width: u16) -> Container<'a, StepMessage> { +fn ferris<'a>( + width: u16, + filter_method: image::FilterMethod, +) -> Container<'a, StepMessage> { container( // This should go away once we unify resource loading on native // platforms @@ -655,6 +684,7 @@ fn ferris<'a>(width: u16) -> Container<'a, StepMessage> { } else { image(format!("{}/images/ferris.png", env!("CARGO_MANIFEST_DIR"))) } + .filter_method(filter_method) .width(width), ) .width(Length::Fill) diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index ce0b734b..4ed512c1 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -68,6 +68,8 @@ pub enum Primitive<T> { Image { /// The handle of the image handle: image::Handle, + /// The filter method of the image + filter_method: image::FilterMethod, /// The bounds of the image bounds: Rectangle, }, diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index 93fff3b7..d7613e36 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -215,8 +215,17 @@ where self.backend().dimensions(handle) } - fn draw(&mut self, handle: image::Handle, bounds: Rectangle) { - self.primitives.push(Primitive::Image { handle, bounds }); + fn draw( + &mut self, + handle: image::Handle, + filter_method: image::FilterMethod, + bounds: Rectangle, + ) { + self.primitives.push(Primitive::Image { + handle, + filter_method, + bounds, + }); } } diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index cc81c6e2..43f9794b 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -214,8 +214,13 @@ impl<T> crate::core::image::Renderer for Renderer<T> { delegate!(self, renderer, renderer.dimensions(handle)) } - fn draw(&mut self, handle: crate::core::image::Handle, bounds: Rectangle) { - delegate!(self, renderer, renderer.draw(handle, bounds)); + fn draw( + &mut self, + handle: crate::core::image::Handle, + filter_method: crate::core::image::FilterMethod, + bounds: Rectangle, + ) { + delegate!(self, renderer, renderer.draw(handle, filter_method, bounds)); } } diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index 3c6fe288..f2905b00 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -445,7 +445,11 @@ impl Backend { ); } #[cfg(feature = "image")] - Primitive::Image { handle, bounds } => { + Primitive::Image { + handle, + filter_method, + bounds, + } => { let physical_bounds = (*bounds + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { @@ -461,8 +465,14 @@ impl Backend { ) .post_scale(scale_factor, scale_factor); - self.raster_pipeline - .draw(handle, *bounds, pixels, transform, clip_mask); + self.raster_pipeline.draw( + handle, + *filter_method, + *bounds, + pixels, + transform, + clip_mask, + ); } #[cfg(not(feature = "image"))] Primitive::Image { .. } => { diff --git a/tiny_skia/src/raster.rs b/tiny_skia/src/raster.rs index 3f35ee78..5f17ae60 100644 --- a/tiny_skia/src/raster.rs +++ b/tiny_skia/src/raster.rs @@ -28,6 +28,7 @@ impl Pipeline { pub fn draw( &mut self, handle: &raster::Handle, + filter_method: raster::FilterMethod, bounds: Rectangle, pixels: &mut tiny_skia::PixmapMut<'_>, transform: tiny_skia::Transform, @@ -39,7 +40,7 @@ impl Pipeline { let transform = transform.pre_scale(width_scale, height_scale); - let quality = match handle.filter().mag { + let quality = match filter_method { raster::FilterMethod::Linear => { tiny_skia::FilterQuality::Bilinear } diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 6768a714..1a88c6ae 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -7,8 +7,6 @@ mod raster; mod vector; use atlas::Atlas; -use iced_graphics::core::image::{FilterMethod, TextureFilter}; -use wgpu::Sampler; use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; @@ -29,8 +27,6 @@ use crate::core::svg; #[cfg(feature = "tracing")] use tracing::info_span; -const SAMPLER_COUNT: usize = 4; - #[derive(Debug)] pub struct Pipeline { #[cfg(feature = "image")] @@ -41,30 +37,31 @@ pub struct Pipeline { pipeline: wgpu::RenderPipeline, vertices: wgpu::Buffer, indices: wgpu::Buffer, - sampler: [wgpu::Sampler; SAMPLER_COUNT], + nearest_sampler: wgpu::Sampler, + linear_sampler: wgpu::Sampler, texture: wgpu::BindGroup, texture_version: usize, texture_atlas: Atlas, texture_layout: wgpu::BindGroupLayout, constant_layout: wgpu::BindGroupLayout, - layers: Vec<[Option<Layer>; SAMPLER_COUNT]>, + layers: Vec<Layer>, prepare_layer: usize, } #[derive(Debug)] struct Layer { uniforms: wgpu::Buffer, - constants: wgpu::BindGroup, - instances: Buffer<Instance>, - instance_count: usize, + nearest: Data, + linear: Data, } impl Layer { fn new( device: &wgpu::Device, constant_layout: &wgpu::BindGroupLayout, - sampler: &wgpu::Sampler, + nearest_sampler: &wgpu::Sampler, + linear_sampler: &wgpu::Sampler, ) -> Self { let uniforms = device.create_buffer(&wgpu::BufferDescriptor { label: Some("iced_wgpu::image uniforms buffer"), @@ -73,6 +70,59 @@ impl Layer { mapped_at_creation: false, }); + let nearest = + Data::new(device, constant_layout, nearest_sampler, &uniforms); + + let linear = + Data::new(device, constant_layout, linear_sampler, &uniforms); + + Self { + uniforms, + nearest, + linear, + } + } + + fn prepare( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + nearest_instances: &[Instance], + linear_instances: &[Instance], + transformation: Transformation, + ) { + queue.write_buffer( + &self.uniforms, + 0, + bytemuck::bytes_of(&Uniforms { + transform: transformation.into(), + }), + ); + + self.nearest.upload(device, queue, nearest_instances); + self.linear.upload(device, queue, linear_instances); + } + + fn render<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { + self.nearest.render(render_pass); + self.linear.render(render_pass); + } +} + +#[derive(Debug)] +struct Data { + constants: wgpu::BindGroup, + instances: Buffer<Instance>, + instance_count: usize, +} + +impl Data { + pub fn new( + device: &wgpu::Device, + constant_layout: &wgpu::BindGroupLayout, + sampler: &wgpu::Sampler, + uniforms: &wgpu::Buffer, + ) -> Self { let constants = device.create_bind_group(&wgpu::BindGroupDescriptor { label: Some("iced_wgpu::image constants bind group"), layout: constant_layout, @@ -102,28 +152,18 @@ impl Layer { ); Self { - uniforms, constants, instances, instance_count: 0, } } - fn prepare( + fn upload( &mut self, device: &wgpu::Device, queue: &wgpu::Queue, instances: &[Instance], - transformation: Transformation, ) { - queue.write_buffer( - &self.uniforms, - 0, - bytemuck::bytes_of(&Uniforms { - transform: transformation.into(), - }), - ); - let _ = self.instances.resize(device, instances.len()); let _ = self.instances.write(queue, 0, instances); @@ -146,37 +186,25 @@ impl Pipeline { pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { use wgpu::util::DeviceExt; - let to_wgpu = |method: FilterMethod| match method { - FilterMethod::Linear => wgpu::FilterMode::Linear, - FilterMethod::Nearest => wgpu::FilterMode::Nearest, - }; + let nearest_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + min_filter: wgpu::FilterMode::Nearest, + mag_filter: wgpu::FilterMode::Nearest, + mipmap_filter: wgpu::FilterMode::Nearest, + ..Default::default() + }); - let mut sampler: [Option<Sampler>; SAMPLER_COUNT] = - [None, None, None, None]; - - let filter = [FilterMethod::Linear, FilterMethod::Nearest]; - for min in 0..filter.len() { - for mag in 0..filter.len() { - sampler[to_index(&TextureFilter { - min: filter[min], - mag: filter[mag], - })] = Some(device.create_sampler(&wgpu::SamplerDescriptor { - address_mode_u: wgpu::AddressMode::ClampToEdge, - address_mode_v: wgpu::AddressMode::ClampToEdge, - address_mode_w: wgpu::AddressMode::ClampToEdge, - mag_filter: to_wgpu(filter[mag]), - min_filter: to_wgpu(filter[min]), - mipmap_filter: wgpu::FilterMode::Linear, - ..Default::default() - })); - } - } - let sampler = [ - sampler[0].take().unwrap(), - sampler[1].take().unwrap(), - sampler[2].take().unwrap(), - sampler[3].take().unwrap(), - ]; + let linear_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + min_filter: wgpu::FilterMode::Linear, + mag_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + }); let constant_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { @@ -338,7 +366,8 @@ impl Pipeline { pipeline, vertices, indices, - sampler, + nearest_sampler, + linear_sampler, texture, texture_version: texture_atlas.layer_count(), texture_atlas, @@ -381,8 +410,8 @@ impl Pipeline { #[cfg(feature = "tracing")] let _ = info_span!("Wgpu::Image", "DRAW").entered(); - let mut instances: [Vec<Instance>; SAMPLER_COUNT] = - [Vec::new(), Vec::new(), Vec::new(), Vec::new()]; + let nearest_instances: &mut Vec<Instance> = &mut Vec::new(); + let linear_instances: &mut Vec<Instance> = &mut Vec::new(); #[cfg(feature = "image")] let mut raster_cache = self.raster_cache.borrow_mut(); @@ -393,7 +422,11 @@ impl Pipeline { for image in images { match &image { #[cfg(feature = "image")] - layer::Image::Raster { handle, bounds } => { + layer::Image::Raster { + handle, + filter_method, + bounds, + } => { if let Some(atlas_entry) = raster_cache.upload( device, encoder, @@ -404,7 +437,12 @@ impl Pipeline { [bounds.x, bounds.y], [bounds.width, bounds.height], atlas_entry, - &mut instances[to_index(handle.filter())], + match filter_method { + image::FilterMethod::Nearest => { + nearest_instances + } + image::FilterMethod::Linear => linear_instances, + }, ); } } @@ -432,7 +470,7 @@ impl Pipeline { [bounds.x, bounds.y], size, atlas_entry, - &mut instances[to_index(&TextureFilter::default())], + nearest_instances, ); } } @@ -441,7 +479,7 @@ impl Pipeline { } } - if instances.is_empty() { + if nearest_instances.is_empty() && linear_instances.is_empty() { return; } @@ -466,24 +504,24 @@ impl Pipeline { } if self.layers.len() <= self.prepare_layer { - self.layers.push([None, None, None, None]); + self.layers.push(Layer::new( + device, + &self.constant_layout, + &self.nearest_sampler, + &self.linear_sampler, + )); } - for (i, instances) in instances.iter_mut().enumerate() { - let layer = &mut self.layers[self.prepare_layer][i]; - if !instances.is_empty() { - if layer.is_none() { - *layer = Some(Layer::new( - device, - &self.constant_layout, - &self.sampler[i], - )) - } - } - if let Some(layer) = layer { - layer.prepare(device, queue, instances, transformation); - } - } + let layer = &mut self.layers[self.prepare_layer]; + + layer.prepare( + device, + queue, + &nearest_instances, + &linear_instances, + transformation, + ); + self.prepare_layer += 1; } @@ -493,28 +531,24 @@ impl Pipeline { bounds: Rectangle<u32>, render_pass: &mut wgpu::RenderPass<'a>, ) { - if let Some(layer_group) = self.layers.get(layer) { - for layer in layer_group.iter() { - if let Some(layer) = layer { - render_pass.set_pipeline(&self.pipeline); + if let Some(layer) = self.layers.get(layer) { + render_pass.set_pipeline(&self.pipeline); - render_pass.set_scissor_rect( - bounds.x, - bounds.y, - bounds.width, - bounds.height, - ); + render_pass.set_scissor_rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height, + ); - render_pass.set_bind_group(1, &self.texture, &[]); - render_pass.set_index_buffer( - self.indices.slice(..), - wgpu::IndexFormat::Uint16, - ); - render_pass.set_vertex_buffer(0, self.vertices.slice(..)); + render_pass.set_bind_group(1, &self.texture, &[]); + render_pass.set_index_buffer( + self.indices.slice(..), + wgpu::IndexFormat::Uint16, + ); + render_pass.set_vertex_buffer(0, self.vertices.slice(..)); - layer.render(render_pass); - } - } + layer.render(render_pass); } } @@ -529,14 +563,6 @@ impl Pipeline { } } -fn to_index(filter: &TextureFilter) -> usize { - let to_index = |m| match m { - FilterMethod::Linear => 0, - FilterMethod::Nearest => 1, - }; - return (to_index(filter.mag) << 1) | (to_index(filter.min)); -} - #[repr(C)] #[derive(Clone, Copy, Zeroable, Pod)] pub struct Vertex { @@ -571,7 +597,7 @@ struct Instance { } impl Instance { - pub const INITIAL: usize = 1_000; + pub const INITIAL: usize = 20; } #[repr(C)] diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index b251538e..286801e6 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -186,11 +186,16 @@ impl<'a> Layer<'a> { layer.quads.add(quad, background); } - Primitive::Image { handle, bounds } => { + Primitive::Image { + handle, + filter_method, + bounds, + } => { let layer = &mut layers[current_layer]; layer.images.push(Image::Raster { handle: handle.clone(), + filter_method: *filter_method, bounds: *bounds + translation, }); } diff --git a/wgpu/src/layer/image.rs b/wgpu/src/layer/image.rs index 0de589f8..facbe192 100644 --- a/wgpu/src/layer/image.rs +++ b/wgpu/src/layer/image.rs @@ -10,6 +10,9 @@ pub enum Image { /// The handle of a raster image. handle: image::Handle, + /// The filter method of a raster image. + filter_method: image::FilterMethod, + /// The bounds of the image. bounds: Rectangle, }, diff --git a/widget/src/image.rs b/widget/src/image.rs index 684f200c..67699102 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -13,7 +13,7 @@ use crate::core::{ use std::hash::Hash; -pub use image::{FilterMethod, Handle, TextureFilter}; +pub use image::{FilterMethod, Handle}; /// Creates a new [`Viewer`] with the given image `Handle`. pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> { @@ -37,6 +37,7 @@ pub struct Image<Handle> { width: Length, height: Length, content_fit: ContentFit, + filter_method: FilterMethod, } impl<Handle> Image<Handle> { @@ -47,6 +48,7 @@ impl<Handle> Image<Handle> { width: Length::Shrink, height: Length::Shrink, content_fit: ContentFit::Contain, + filter_method: FilterMethod::default(), } } @@ -65,11 +67,15 @@ impl<Handle> Image<Handle> { /// Sets the [`ContentFit`] of the [`Image`]. /// /// Defaults to [`ContentFit::Contain`] - pub fn content_fit(self, content_fit: ContentFit) -> Self { - Self { - content_fit, - ..self - } + pub fn content_fit(mut self, content_fit: ContentFit) -> Self { + self.content_fit = content_fit; + self + } + + /// Sets the [`FilterMethod`] of the [`Image`]. + pub fn filter_method(mut self, filter_method: FilterMethod) -> Self { + self.filter_method = filter_method; + self } } @@ -119,6 +125,7 @@ pub fn draw<Renderer, Handle>( layout: Layout<'_>, handle: &Handle, content_fit: ContentFit, + filter_method: FilterMethod, ) where Renderer: image::Renderer<Handle = Handle>, Handle: Clone + Hash, @@ -141,7 +148,7 @@ pub fn draw<Renderer, Handle>( ..bounds }; - renderer.draw(handle.clone(), drawing_bounds + offset); + renderer.draw(handle.clone(), filter_method, drawing_bounds + offset); }; if adjusted_fit.width > bounds.width || adjusted_fit.height > bounds.height @@ -191,7 +198,13 @@ where _cursor: mouse::Cursor, _viewport: &Rectangle, ) { - draw(renderer, layout, &self.handle, self.content_fit); + draw( + renderer, + layout, + &self.handle, + self.content_fit, + self.filter_method, + ); } } diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs index 44624fc8..68015ba8 100644 --- a/widget/src/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -22,19 +22,21 @@ pub struct Viewer<Handle> { max_scale: f32, scale_step: f32, handle: Handle, + filter_method: image::FilterMethod, } impl<Handle> Viewer<Handle> { /// Creates a new [`Viewer`] with the given [`State`]. pub fn new(handle: Handle) -> Self { Viewer { + handle, padding: 0.0, width: Length::Shrink, height: Length::Shrink, min_scale: 0.25, max_scale: 10.0, scale_step: 0.10, - handle, + filter_method: image::FilterMethod::default(), } } @@ -329,6 +331,7 @@ where image::Renderer::draw( renderer, self.handle.clone(), + self.filter_method, Rectangle { x: bounds.x, y: bounds.y, From 9d560c813566ba04be3e23ae1b14861365485b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 11 Nov 2023 07:27:38 +0100 Subject: [PATCH 138/286] Fix unnecessary references in `iced_wgpu::image` --- wgpu/src/image.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 1a88c6ae..b78802c7 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -131,7 +131,7 @@ impl Data { binding: 0, resource: wgpu::BindingResource::Buffer( wgpu::BufferBinding { - buffer: &uniforms, + buffer: uniforms, offset: 0, size: None, }, @@ -517,8 +517,8 @@ impl Pipeline { layer.prepare( device, queue, - &nearest_instances, - &linear_instances, + nearest_instances, + linear_instances, transformation, ); From ae2d59ae96ba1ec2daf6979beff0e3913ba9e0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 12 Nov 2023 03:17:02 +0100 Subject: [PATCH 139/286] Add `check` workflow to ensure `iced_widget` crate compiles --- .github/workflows/check.yml | 29 +++++++++++++++++++++++++++++ .github/workflows/test.yml | 21 +-------------------- 2 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 00000000..df9c480f --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,29 @@ +name: Check +on: [push, pull_request] +jobs: + widget: + runs-on: ubuntu-latest + steps: + - uses: hecrj/setup-rust-action@v1 + - uses: actions/checkout@master + - name: Check standalone `iced_widget` crate + run: cargo check --package iced_widget --features image,svg,canvas + + wasm: + runs-on: ubuntu-latest + env: + RUSTFLAGS: --cfg=web_sys_unstable_apis + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + targets: wasm32-unknown-unknown + - uses: actions/checkout@master + - name: Run checks + run: cargo check --package iced --target wasm32-unknown-unknown + - name: Check compilation of `tour` example + run: cargo build --package tour --target wasm32-unknown-unknown + - name: Check compilation of `todos` example + run: cargo build --package todos --target wasm32-unknown-unknown + - name: Check compilation of `integration` example + run: cargo build --package integration --target wasm32-unknown-unknown diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 215b616b..a08033c9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,7 +1,7 @@ name: Test on: [push, pull_request] jobs: - native: + all: runs-on: ${{ matrix.os }} strategy: matrix: @@ -22,22 +22,3 @@ jobs: run: | cargo test --verbose --workspace cargo test --verbose --workspace --all-features - - web: - runs-on: ubuntu-latest - env: - RUSTFLAGS: --cfg=web_sys_unstable_apis - steps: - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: stable - targets: wasm32-unknown-unknown - - uses: actions/checkout@master - - name: Run checks - run: cargo check --package iced --target wasm32-unknown-unknown - - name: Check compilation of `tour` example - run: cargo build --package tour --target wasm32-unknown-unknown - - name: Check compilation of `todos` example - run: cargo build --package todos --target wasm32-unknown-unknown - - name: Check compilation of `integration` example - run: cargo build --package integration --target wasm32-unknown-unknown From 9d5ff12063e05158ede74f1aec4167bf910c8730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 12 Nov 2023 03:22:43 +0100 Subject: [PATCH 140/286] Fix conditional compilation in `iced_renderer` --- renderer/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 43f9794b..78dec847 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -252,6 +252,7 @@ impl<T> crate::graphics::geometry::Renderer for Renderer<T> { crate::Geometry::TinySkia(primitive) => { renderer.draw_primitive(primitive); } + #[cfg(feature = "wgpu")] crate::Geometry::Wgpu(_) => unreachable!(), } } From 93416cbebd1dad04d250bc39ee7db9482d1e5e72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 12 Nov 2023 03:33:09 +0100 Subject: [PATCH 141/286] Deny warnings in `test` workflow --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 215b616b..e9e1d86b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,6 +3,8 @@ on: [push, pull_request] jobs: native: runs-on: ${{ matrix.os }} + env: + RUSTFLAGS: --deny warnings strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] From f98627a317615151681ca8b324052eb4a170b789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sun, 12 Nov 2023 03:40:32 +0100 Subject: [PATCH 142/286] Add missing `'static` lifetimes to constant slices --- examples/lazy/src/main.rs | 2 +- examples/modal/src/main.rs | 3 ++- examples/toast/src/main.rs | 2 +- highlighter/src/lib.rs | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/lazy/src/main.rs b/examples/lazy/src/main.rs index 9bf17c56..01560598 100644 --- a/examples/lazy/src/main.rs +++ b/examples/lazy/src/main.rs @@ -46,7 +46,7 @@ enum Color { } impl Color { - const ALL: &[Color] = &[ + const ALL: &'static [Color] = &[ Color::Black, Color::Red, Color::Orange, diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index b0e2c81b..3b69f5e6 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -205,7 +205,8 @@ enum Plan { } impl Plan { - pub const ALL: &[Self] = &[Self::Basic, Self::Pro, Self::Enterprise]; + pub const ALL: &'static [Self] = + &[Self::Basic, Self::Pro, Self::Enterprise]; } impl fmt::Display for Plan { diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 20c3dd42..5b089e8a 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -210,7 +210,7 @@ mod toast { } impl Status { - pub const ALL: &[Self] = + pub const ALL: &'static [Self] = &[Self::Primary, Self::Secondary, Self::Success, Self::Danger]; } diff --git a/highlighter/src/lib.rs b/highlighter/src/lib.rs index 5630756e..63f21fc0 100644 --- a/highlighter/src/lib.rs +++ b/highlighter/src/lib.rs @@ -168,7 +168,7 @@ pub enum Theme { } impl Theme { - pub const ALL: &[Self] = &[ + pub const ALL: &'static [Self] = &[ Self::SolarizedDark, Self::Base16Mocha, Self::Base16Ocean, From 781ef1f94c4859aeeb852f801b72be095b8ff82b Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Thu, 14 Sep 2023 13:58:36 -0700 Subject: [PATCH 143/286] Added support for custom shader widget for iced_wgpu backend. --- Cargo.toml | 2 +- core/src/rectangle.rs | 11 + examples/custom_shader/Cargo.toml | 13 + examples/custom_shader/src/camera.rs | 53 ++ examples/custom_shader/src/cubes.rs | 99 +++ examples/custom_shader/src/main.rs | 174 +++++ examples/custom_shader/src/pipeline.rs | 600 ++++++++++++++++++ examples/custom_shader/src/primitive.rs | 95 +++ .../custom_shader/src/primitive/buffer.rs | 39 ++ examples/custom_shader/src/primitive/cube.rs | 324 ++++++++++ .../custom_shader/src/primitive/uniforms.rs | 22 + .../custom_shader/src/primitive/vertex.rs | 29 + examples/custom_shader/src/shaders/cubes.wgsl | 123 ++++ examples/custom_shader/src/shaders/depth.wgsl | 48 ++ .../src/textures/ice_cube_normal_map.png | Bin 0 -> 1773656 bytes .../src/textures/skybox/neg_x.jpg | Bin 0 -> 7549 bytes .../src/textures/skybox/neg_y.jpg | Bin 0 -> 2722 bytes .../src/textures/skybox/neg_z.jpg | Bin 0 -> 3986 bytes .../src/textures/skybox/pos_x.jpg | Bin 0 -> 5522 bytes .../src/textures/skybox/pos_y.jpg | Bin 0 -> 3382 bytes .../src/textures/skybox/pos_z.jpg | Bin 0 -> 5205 bytes examples/integration/src/main.rs | 1 + graphics/Cargo.toml | 1 - renderer/src/lib.rs | 21 + renderer/src/widget.rs | 3 + renderer/src/widget/shader.rs | 215 +++++++ renderer/src/widget/shader/event.rs | 21 + renderer/src/widget/shader/program.rs | 60 ++ style/src/theme.rs | 2 +- wgpu/src/backend.rs | 64 +- wgpu/src/custom.rs | 66 ++ wgpu/src/layer.rs | 16 + wgpu/src/lib.rs | 1 + wgpu/src/primitive.rs | 36 ++ wgpu/src/window/compositor.rs | 2 + widget/Cargo.toml | 1 + widget/src/lib.rs | 3 + 37 files changed, 2139 insertions(+), 6 deletions(-) create mode 100644 examples/custom_shader/Cargo.toml create mode 100644 examples/custom_shader/src/camera.rs create mode 100644 examples/custom_shader/src/cubes.rs create mode 100644 examples/custom_shader/src/main.rs create mode 100644 examples/custom_shader/src/pipeline.rs create mode 100644 examples/custom_shader/src/primitive.rs create mode 100644 examples/custom_shader/src/primitive/buffer.rs create mode 100644 examples/custom_shader/src/primitive/cube.rs create mode 100644 examples/custom_shader/src/primitive/uniforms.rs create mode 100644 examples/custom_shader/src/primitive/vertex.rs create mode 100644 examples/custom_shader/src/shaders/cubes.wgsl create mode 100644 examples/custom_shader/src/shaders/depth.wgsl create mode 100644 examples/custom_shader/src/textures/ice_cube_normal_map.png create mode 100644 examples/custom_shader/src/textures/skybox/neg_x.jpg create mode 100644 examples/custom_shader/src/textures/skybox/neg_y.jpg create mode 100644 examples/custom_shader/src/textures/skybox/neg_z.jpg create mode 100644 examples/custom_shader/src/textures/skybox/pos_x.jpg create mode 100644 examples/custom_shader/src/textures/skybox/pos_y.jpg create mode 100644 examples/custom_shader/src/textures/skybox/pos_z.jpg create mode 100644 renderer/src/widget/shader.rs create mode 100644 renderer/src/widget/shader/event.rs create mode 100644 renderer/src/widget/shader/program.rs create mode 100644 wgpu/src/custom.rs diff --git a/Cargo.toml b/Cargo.toml index d69c95cf..ad4cd1bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ maintenance = { status = "actively-developed" } [features] default = ["wgpu"] # Enable the `wgpu` GPU-accelerated renderer backend -wgpu = ["iced_renderer/wgpu"] +wgpu = ["iced_renderer/wgpu", "iced_widget/wgpu"] # Enables the `Image` widget image = ["iced_widget/image", "dep:image"] # Enables the `Svg` widget diff --git a/core/src/rectangle.rs b/core/src/rectangle.rs index c1c2eeac..d5437d51 100644 --- a/core/src/rectangle.rs +++ b/core/src/rectangle.rs @@ -183,6 +183,17 @@ impl From<Rectangle<u32>> for Rectangle<f32> { } } +impl From<Rectangle<f32>> for Rectangle<u32> { + fn from(rectangle: Rectangle<f32>) -> Self { + Rectangle { + x: rectangle.x as u32, + y: rectangle.y as u32, + width: rectangle.width as u32, + height: rectangle.height as u32, + } + } +} + impl<T> std::ops::Add<Vector<T>> for Rectangle<T> where T: std::ops::Add<Output = T>, diff --git a/examples/custom_shader/Cargo.toml b/examples/custom_shader/Cargo.toml new file mode 100644 index 00000000..7a927811 --- /dev/null +++ b/examples/custom_shader/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "custom_shader" +version = "0.1.0" +authors = ["Bingus <shankern@protonmail.com>"] +edition = "2021" + +[dependencies] +iced = { path = "../..", features = ["debug", "advanced"]} +image = { version = "0.24.6"} +wgpu = "0.17" +bytemuck = { version = "1.13.1" } +glam = { version = "0.24.0", features = ["bytemuck"] } +rand = "0.8.5" diff --git a/examples/custom_shader/src/camera.rs b/examples/custom_shader/src/camera.rs new file mode 100644 index 00000000..2a49c102 --- /dev/null +++ b/examples/custom_shader/src/camera.rs @@ -0,0 +1,53 @@ +use glam::{mat4, vec3, vec4}; +use iced::Rectangle; + +#[derive(Copy, Clone)] +pub struct Camera { + eye: glam::Vec3, + target: glam::Vec3, + up: glam::Vec3, + fov_y: f32, + near: f32, + far: f32, +} + +impl Default for Camera { + fn default() -> Self { + Self { + eye: vec3(0.0, 2.0, 3.0), + target: glam::Vec3::ZERO, + up: glam::Vec3::Y, + fov_y: 45.0, + near: 0.1, + far: 100.0, + } + } +} + +pub const OPENGL_TO_WGPU_MATRIX: glam::Mat4 = mat4( + vec4(1.0, 0.0, 0.0, 0.0), + vec4(0.0, 1.0, 0.0, 0.0), + vec4(0.0, 0.0, 0.5, 0.0), + vec4(0.0, 0.0, 0.5, 1.0), +); + +impl Camera { + pub fn build_view_proj_matrix(&self, bounds: Rectangle) -> glam::Mat4 { + //TODO looks distorted without padding; base on surface texture size instead? + let aspect_ratio = bounds.width / (bounds.height + 150.0); + + let view = glam::Mat4::look_at_rh(self.eye, self.target, self.up); + let proj = glam::Mat4::perspective_rh( + self.fov_y, + aspect_ratio, + self.near, + self.far, + ); + + OPENGL_TO_WGPU_MATRIX * proj * view + } + + pub fn position(&self) -> glam::Vec4 { + glam::Vec4::from((self.eye, 0.0)) + } +} diff --git a/examples/custom_shader/src/cubes.rs b/examples/custom_shader/src/cubes.rs new file mode 100644 index 00000000..8dbba4b1 --- /dev/null +++ b/examples/custom_shader/src/cubes.rs @@ -0,0 +1,99 @@ +use crate::camera::Camera; +use crate::primitive; +use crate::primitive::cube::Cube; +use glam::Vec3; +use iced::widget::shader; +use iced::{mouse, Color, Rectangle}; +use rand::Rng; +use std::cmp::Ordering; +use std::iter; +use std::time::Duration; + +pub const MAX: u32 = 500; + +#[derive(Clone)] +pub struct Cubes { + pub size: f32, + pub cubes: Vec<Cube>, + pub camera: Camera, + pub show_depth_buffer: bool, + pub light_color: Color, +} + +impl Cubes { + pub fn new() -> Self { + let mut cubes = Self { + size: 0.2, + cubes: vec![], + camera: Camera::default(), + show_depth_buffer: false, + light_color: Color::WHITE, + }; + + cubes.adjust_num_cubes(MAX); + + cubes + } + + pub fn update(&mut self, time: Duration) { + for cube in self.cubes.iter_mut() { + cube.update(self.size, time.as_secs_f32()); + } + } + + pub fn adjust_num_cubes(&mut self, num_cubes: u32) { + let curr_cubes = self.cubes.len() as u32; + + match num_cubes.cmp(&curr_cubes) { + Ordering::Greater => { + // spawn + let cubes_2_spawn = (num_cubes - curr_cubes) as usize; + + let mut cubes = 0; + self.cubes.extend(iter::from_fn(|| { + if cubes < cubes_2_spawn { + cubes += 1; + Some(Cube::new(self.size, rnd_origin())) + } else { + None + } + })); + } + Ordering::Less => { + // chop + let cubes_2_cut = curr_cubes - num_cubes; + let new_len = self.cubes.len() - cubes_2_cut as usize; + self.cubes.truncate(new_len); + } + _ => {} + } + } +} + +impl<Message> shader::Program<Message> for Cubes { + type State = (); + type Primitive = primitive::Primitive; + + fn draw( + &self, + _state: &Self::State, + _cursor: mouse::Cursor, + bounds: Rectangle, + ) -> Self::Primitive { + primitive::Primitive::new( + &self.cubes, + &self.camera, + bounds, + self.show_depth_buffer, + self.light_color, + ) + } +} + +fn rnd_origin() -> Vec3 { + Vec3::new( + rand::thread_rng().gen_range(-4.0..4.0), + rand::thread_rng().gen_range(-4.0..4.0), + rand::thread_rng().gen_range(-4.0..2.0), + ) +} diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs new file mode 100644 index 00000000..76fa1625 --- /dev/null +++ b/examples/custom_shader/src/main.rs @@ -0,0 +1,174 @@ +mod camera; +mod cubes; +mod pipeline; +mod primitive; + +use crate::cubes::Cubes; +use iced::widget::{ + checkbox, column, container, row, slider, text, vertical_space, Shader, +}; +use iced::{ + executor, window, Alignment, Application, Color, Command, Element, Length, + Renderer, Subscription, Theme, +}; +use std::time::Instant; + +fn main() -> iced::Result { + IcedCubes::run(iced::Settings::default()) +} + +struct IcedCubes { + start: Instant, + cubes: Cubes, + num_cubes_slider: u32, +} + +impl Default for IcedCubes { + fn default() -> Self { + Self { + start: Instant::now(), + cubes: Cubes::new(), + num_cubes_slider: cubes::MAX, + } + } +} + +#[derive(Debug, Clone)] +enum Message { + CubeAmountChanged(u32), + CubeSizeChanged(f32), + Tick(Instant), + ShowDepthBuffer(bool), + LightColorChanged(Color), +} + +impl Application for IcedCubes { + type Executor = executor::Default; + type Message = Message; + type Theme = Theme; + type Flags = (); + + fn new(_flags: Self::Flags) -> (Self, Command<Self::Message>) { + (IcedCubes::default(), Command::none()) + } + + fn title(&self) -> String { + "Iced Cubes".to_string() + } + + fn update(&mut self, message: Self::Message) -> Command<Self::Message> { + match message { + Message::CubeAmountChanged(num) => { + self.num_cubes_slider = num; + self.cubes.adjust_num_cubes(num); + } + Message::CubeSizeChanged(size) => { + self.cubes.size = size; + } + Message::Tick(time) => { + self.cubes.update(time - self.start); + } + Message::ShowDepthBuffer(show) => { + self.cubes.show_depth_buffer = show; + } + Message::LightColorChanged(color) => { + self.cubes.light_color = color; + } + } + + Command::none() + } + + fn view(&self) -> Element<'_, Self::Message, Renderer<Self::Theme>> { + let top_controls = row![ + control( + "Amount", + slider( + 1..=cubes::MAX, + self.num_cubes_slider, + Message::CubeAmountChanged + ) + .width(100) + ), + control( + "Size", + slider(0.1..=0.25, self.cubes.size, Message::CubeSizeChanged) + .step(0.01) + .width(100), + ), + checkbox( + "Show Depth Buffer", + self.cubes.show_depth_buffer, + Message::ShowDepthBuffer + ), + ] + .spacing(40); + + let bottom_controls = row![ + control( + "R", + slider(0.0..=1.0, self.cubes.light_color.r, move |r| { + Message::LightColorChanged(Color { + r, + ..self.cubes.light_color + }) + }) + .step(0.01) + .width(100) + ), + control( + "G", + slider(0.0..=1.0, self.cubes.light_color.g, move |g| { + Message::LightColorChanged(Color { + g, + ..self.cubes.light_color + }) + }) + .step(0.01) + .width(100) + ), + control( + "B", + slider(0.0..=1.0, self.cubes.light_color.b, move |b| { + Message::LightColorChanged(Color { + b, + ..self.cubes.light_color + }) + }) + .step(0.01) + .width(100) + ) + ] + .spacing(40); + + let controls = column![top_controls, bottom_controls,] + .spacing(10) + .align_items(Alignment::Center); + + let shader = Shader::new(&self.cubes) + .width(Length::Fill) + .height(Length::Fill); + + container( + column![shader, controls, vertical_space(20),] + .spacing(40) + .align_items(Alignment::Center), + ) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() + } + + fn subscription(&self) -> Subscription<Self::Message> { + window::frames().map(Message::Tick) + } +} + +fn control<'a>( + label: &'static str, + control: impl Into<Element<'a, Message>>, +) -> Element<'a, Message> { + row![text(label), control.into()].spacing(10).into() +} diff --git a/examples/custom_shader/src/pipeline.rs b/examples/custom_shader/src/pipeline.rs new file mode 100644 index 00000000..9dd154e8 --- /dev/null +++ b/examples/custom_shader/src/pipeline.rs @@ -0,0 +1,600 @@ +use crate::primitive; +use crate::primitive::cube; +use crate::primitive::{Buffer, Uniforms}; +use iced::{Rectangle, Size}; +use wgpu::util::DeviceExt; + +const SKY_TEXTURE_SIZE: u32 = 128; + +pub struct Pipeline { + pipeline: wgpu::RenderPipeline, + vertices: wgpu::Buffer, + cubes: Buffer, + uniforms: wgpu::Buffer, + uniform_bind_group: wgpu::BindGroup, + depth_texture_size: Size<u32>, + depth_view: wgpu::TextureView, + depth_pipeline: DepthPipeline, +} + +impl Pipeline { + pub fn new( + device: &wgpu::Device, + queue: &wgpu::Queue, + format: wgpu::TextureFormat, + target_size: Size<u32>, + ) -> Self { + //vertices of one cube + let vertices = + device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("cubes vertex buffer"), + contents: bytemuck::cast_slice(&cube::Raw::vertices()), + usage: wgpu::BufferUsages::VERTEX, + }); + + //cube instance data + let cubes_buffer = Buffer::new( + device, + "cubes instance buffer", + std::mem::size_of::<cube::Raw>() as u64, + wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, + ); + + //uniforms for all cubes + let uniforms = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("cubes uniform buffer"), + size: std::mem::size_of::<Uniforms>() as u64, + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + mapped_at_creation: false, + }); + + //depth buffer + let depth_texture = device.create_texture(&wgpu::TextureDescriptor { + label: Some("cubes depth texture"), + size: wgpu::Extent3d { + width: target_size.width, + height: target_size.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Depth32Float, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }); + + let depth_view = + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()); + + let normal_map_data = load_normal_map_data(); + + //normal map + let normal_texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + label: Some("cubes normal map texture"), + size: wgpu::Extent3d { + width: 1024, + height: 1024, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8Unorm, + usage: wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }, + &normal_map_data, + ); + + let normal_view = + normal_texture.create_view(&wgpu::TextureViewDescriptor::default()); + + //skybox texture for reflection/refraction + let skybox_data = load_skybox_data(); + + let skybox_texture = device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor { + label: Some("cubes skybox texture"), + size: wgpu::Extent3d { + width: SKY_TEXTURE_SIZE, + height: SKY_TEXTURE_SIZE, + depth_or_array_layers: 6, //one for each face of the cube + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8Unorm, + usage: wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }, + &skybox_data, + ); + + let sky_view = + skybox_texture.create_view(&wgpu::TextureViewDescriptor { + label: Some("cubes skybox texture view"), + dimension: Some(wgpu::TextureViewDimension::Cube), + ..Default::default() + }); + + let sky_sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("cubes skybox sampler"), + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Linear, + ..Default::default() + }); + + let uniform_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("cubes uniform bind group layout"), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX_FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { + filterable: true, + }, + view_dimension: wgpu::TextureViewDimension::Cube, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler( + wgpu::SamplerBindingType::Filtering, + ), + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 3, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { + filterable: true, + }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + ], + }); + + let uniform_bind_group = + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("cubes uniform bind group"), + layout: &uniform_bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: uniforms.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&sky_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&sky_sampler), + }, + wgpu::BindGroupEntry { + binding: 3, + resource: wgpu::BindingResource::TextureView( + &normal_view, + ), + }, + ], + }); + + let layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("cubes pipeline layout"), + bind_group_layouts: &[&uniform_bind_group_layout], + push_constant_ranges: &[], + }); + + let shader = + device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("cubes shader"), + source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed( + include_str!("shaders/cubes.wgsl"), + )), + }); + + let pipeline = + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("cubes pipeline"), + layout: Some(&layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_main", + buffers: &[primitive::Vertex::desc(), cube::Raw::desc()], + }, + primitive: wgpu::PrimitiveState::default(), + depth_stencil: Some(wgpu::DepthStencilState { + format: wgpu::TextureFormat::Depth32Float, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState { + count: 1, + mask: !0, + alpha_to_coverage_enabled: false, + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_main", + targets: &[Some(wgpu::ColorTargetState { + format, + blend: Some(wgpu::BlendState { + color: wgpu::BlendComponent { + src_factor: wgpu::BlendFactor::SrcAlpha, + dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha, + operation: wgpu::BlendOperation::Add, + }, + alpha: wgpu::BlendComponent { + src_factor: wgpu::BlendFactor::One, + dst_factor: wgpu::BlendFactor::One, + operation: wgpu::BlendOperation::Max, + }, + }), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + multiview: None, + }); + + let depth_pipeline = DepthPipeline::new( + device, + format, + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()), + ); + + Self { + pipeline, + cubes: cubes_buffer, + uniforms, + uniform_bind_group, + vertices, + depth_texture_size: target_size, + depth_view, + depth_pipeline, + } + } + + fn update_depth_texture(&mut self, device: &wgpu::Device, size: Size<u32>) { + if self.depth_texture_size.height != size.height + || self.depth_texture_size.width != size.width + { + let text = device.create_texture(&wgpu::TextureDescriptor { + label: Some("cubes depth texture"), + size: wgpu::Extent3d { + width: size.width, + height: size.height, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Depth32Float, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING, + view_formats: &[], + }); + + self.depth_view = + text.create_view(&wgpu::TextureViewDescriptor::default()); + self.depth_texture_size = size; + + self.depth_pipeline.update(device, &text); + } + } + + pub fn update( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + target_size: Size<u32>, + uniforms: &Uniforms, + num_cubes: usize, + cubes: &[cube::Raw], + ) { + //recreate depth texture if surface texture size has changed + self.update_depth_texture(device, target_size); + + // update uniforms + queue.write_buffer(&self.uniforms, 0, bytemuck::bytes_of(uniforms)); + + //resize cubes vertex buffer if cubes amount changed + let new_size = num_cubes * std::mem::size_of::<cube::Raw>(); + self.cubes.resize(device, new_size as u64); + + //always write new cube data since they are constantly rotating + queue.write_buffer(&self.cubes.raw, 0, bytemuck::cast_slice(cubes)); + } + + pub fn render( + &self, + target: &wgpu::TextureView, + encoder: &mut wgpu::CommandEncoder, + bounds: Rectangle<u32>, + num_cubes: u32, + show_depth: bool, + ) { + { + let mut pass = + encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("cubes.pipeline.pass"), + color_attachments: &[Some( + wgpu::RenderPassColorAttachment { + view: target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: true, + }, + }, + )], + depth_stencil_attachment: Some( + wgpu::RenderPassDepthStencilAttachment { + view: &self.depth_view, + depth_ops: Some(wgpu::Operations { + load: wgpu::LoadOp::Clear(1.0), + store: true, + }), + stencil_ops: None, + }, + ), + }); + + pass.set_scissor_rect( + bounds.x, + bounds.y, + bounds.width, + bounds.height, + ); + pass.set_pipeline(&self.pipeline); + pass.set_bind_group(0, &self.uniform_bind_group, &[]); + pass.set_vertex_buffer(0, self.vertices.slice(..)); + pass.set_vertex_buffer(1, self.cubes.raw.slice(..)); + pass.draw(0..36, 0..num_cubes); + } + + if show_depth { + self.depth_pipeline.render(encoder, target, bounds); + } + } +} + +struct DepthPipeline { + pipeline: wgpu::RenderPipeline, + bind_group_layout: wgpu::BindGroupLayout, + bind_group: wgpu::BindGroup, + sampler: wgpu::Sampler, + depth_view: wgpu::TextureView, +} + +impl DepthPipeline { + pub fn new( + device: &wgpu::Device, + format: wgpu::TextureFormat, + depth_texture: wgpu::TextureView, + ) -> Self { + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("cubes.depth_pipeline.sampler"), + ..Default::default() + }); + + let bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("cubes.depth_pipeline.bind_group_layout"), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler( + wgpu::SamplerBindingType::NonFiltering, + ), + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { + filterable: false, + }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + ], + }); + + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("cubes.depth_pipeline.bind_group"), + layout: &bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Sampler(&sampler), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView( + &depth_texture, + ), + }, + ], + }); + + let layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("cubes.depth_pipeline.layout"), + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + + let shader = + device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("cubes.depth_pipeline.shader"), + source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed( + include_str!("shaders/depth.wgsl"), + )), + }); + + let pipeline = + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("cubes.depth_pipeline.pipeline"), + layout: Some(&layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_main", + buffers: &[], + }, + primitive: Default::default(), + depth_stencil: Some(wgpu::DepthStencilState { + format: wgpu::TextureFormat::Depth32Float, + depth_write_enabled: false, + depth_compare: wgpu::CompareFunction::Less, + stencil: Default::default(), + bias: Default::default(), + }), + multisample: Default::default(), + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_main", + targets: &[Some(wgpu::ColorTargetState { + format, + blend: Some(wgpu::BlendState::REPLACE), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + multiview: None, + }); + + Self { + pipeline, + bind_group_layout, + bind_group, + sampler, + depth_view: depth_texture, + } + } + + pub fn update( + &mut self, + device: &wgpu::Device, + depth_texture: &wgpu::Texture, + ) { + self.depth_view = + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()); + + self.bind_group = + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("cubes.depth_pipeline.bind_group"), + layout: &self.bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Sampler(&self.sampler), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView( + &self.depth_view, + ), + }, + ], + }); + } + + pub fn render( + &self, + encoder: &mut wgpu::CommandEncoder, + target: &wgpu::TextureView, + bounds: Rectangle<u32>, + ) { + let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("cubes.pipeline.depth_pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: true, + }, + })], + depth_stencil_attachment: Some( + wgpu::RenderPassDepthStencilAttachment { + view: &self.depth_view, + depth_ops: None, + stencil_ops: None, + }, + ), + }); + + pass.set_scissor_rect(bounds.x, bounds.y, bounds.width, bounds.height); + pass.set_pipeline(&self.pipeline); + pass.set_bind_group(0, &self.bind_group, &[]); + pass.draw(0..6, 0..1); + } +} + +fn load_skybox_data() -> Vec<u8> { + let pos_x: &[u8] = include_bytes!("textures/skybox/pos_x.jpg"); + let neg_x: &[u8] = include_bytes!("textures/skybox/neg_x.jpg"); + let pos_y: &[u8] = include_bytes!("textures/skybox/pos_y.jpg"); + let neg_y: &[u8] = include_bytes!("textures/skybox/neg_y.jpg"); + let pos_z: &[u8] = include_bytes!("textures/skybox/pos_z.jpg"); + let neg_z: &[u8] = include_bytes!("textures/skybox/neg_z.jpg"); + + let data: [&[u8]; 6] = [pos_x, neg_x, pos_y, neg_y, pos_z, neg_z]; + + data.iter().fold(vec![], |mut acc, bytes| { + let i = image::load_from_memory_with_format( + bytes, + image::ImageFormat::Jpeg, + ) + .unwrap() + .to_rgba8() + .into_raw(); + + acc.extend(i); + acc + }) +} + +fn load_normal_map_data() -> Vec<u8> { + let bytes: &[u8] = include_bytes!("textures/ice_cube_normal_map.png"); + + image::load_from_memory_with_format(bytes, image::ImageFormat::Png) + .unwrap() + .to_rgba8() + .into_raw() +} diff --git a/examples/custom_shader/src/primitive.rs b/examples/custom_shader/src/primitive.rs new file mode 100644 index 00000000..2201218f --- /dev/null +++ b/examples/custom_shader/src/primitive.rs @@ -0,0 +1,95 @@ +pub mod cube; +pub mod vertex; + +mod buffer; +mod uniforms; + +use crate::camera::Camera; +use crate::pipeline::Pipeline; +use crate::primitive::cube::Cube; +use iced::advanced::graphics::Transformation; +use iced::widget::shader; +use iced::{Color, Rectangle, Size}; + +pub use crate::primitive::vertex::Vertex; +pub use buffer::Buffer; +pub use uniforms::Uniforms; + +/// A collection of `Cube`s that can be rendered. +#[derive(Debug)] +pub struct Primitive { + cubes: Vec<cube::Raw>, + uniforms: Uniforms, + show_depth_buffer: bool, +} + +impl Primitive { + pub fn new( + cubes: &[Cube], + camera: &Camera, + bounds: Rectangle, + show_depth_buffer: bool, + light_color: Color, + ) -> Self { + let uniforms = Uniforms::new(camera, bounds, light_color); + + Self { + cubes: cubes + .iter() + .map(cube::Raw::from_cube) + .collect::<Vec<cube::Raw>>(), + uniforms, + show_depth_buffer, + } + } +} + +impl shader::Primitive for Primitive { + fn prepare( + &self, + format: wgpu::TextureFormat, + device: &wgpu::Device, + queue: &wgpu::Queue, + target_size: Size<u32>, + _scale_factor: f32, + _transform: Transformation, + storage: &mut shader::Storage, + ) { + if !storage.has::<Pipeline>() { + storage.store(Pipeline::new(device, queue, format, target_size)) + } + + let pipeline = storage.get_mut::<Pipeline>().unwrap(); + + //upload data to GPU + pipeline.update( + device, + queue, + target_size, + &self.uniforms, + self.cubes.len(), + &self.cubes, + ); + } + + fn render( + &self, + storage: &shader::Storage, + bounds: Rectangle<u32>, + target: &wgpu::TextureView, + _target_size: Size<u32>, + encoder: &mut wgpu::CommandEncoder, + ) { + //at this point our pipeline should always be initialized + let pipeline = storage.get::<Pipeline>().unwrap(); + + //render primitive + pipeline.render( + target, + encoder, + bounds, + self.cubes.len() as u32, + self.show_depth_buffer, + ) + } +} diff --git a/examples/custom_shader/src/primitive/buffer.rs b/examples/custom_shader/src/primitive/buffer.rs new file mode 100644 index 00000000..377ce1bb --- /dev/null +++ b/examples/custom_shader/src/primitive/buffer.rs @@ -0,0 +1,39 @@ +// A custom buffer container for dynamic resizing. +pub struct Buffer { + pub raw: wgpu::Buffer, + label: &'static str, + size: u64, + usage: wgpu::BufferUsages, +} + +impl Buffer { + pub fn new( + device: &wgpu::Device, + label: &'static str, + size: u64, + usage: wgpu::BufferUsages, + ) -> Self { + Self { + raw: device.create_buffer(&wgpu::BufferDescriptor { + label: Some(label), + size, + usage, + mapped_at_creation: false, + }), + label, + size, + usage, + } + } + + pub fn resize(&mut self, device: &wgpu::Device, new_size: u64) { + if new_size > self.size { + self.raw = device.create_buffer(&wgpu::BufferDescriptor { + label: Some(self.label), + size: new_size, + usage: self.usage, + mapped_at_creation: false, + }); + } + } +} diff --git a/examples/custom_shader/src/primitive/cube.rs b/examples/custom_shader/src/primitive/cube.rs new file mode 100644 index 00000000..c23f2132 --- /dev/null +++ b/examples/custom_shader/src/primitive/cube.rs @@ -0,0 +1,324 @@ +use crate::primitive::Vertex; +use glam::{vec2, vec3, Vec3}; +use rand::{thread_rng, Rng}; + +/// A single instance of a cube. +#[derive(Debug, Clone)] +pub struct Cube { + pub rotation: glam::Quat, + pub position: Vec3, + pub size: f32, + rotation_dir: f32, + rotation_axis: glam::Vec3, +} + +impl Default for Cube { + fn default() -> Self { + Self { + rotation: glam::Quat::IDENTITY, + position: glam::Vec3::ZERO, + size: 0.1, + rotation_dir: 1.0, + rotation_axis: glam::Vec3::Y, + } + } +} + +impl Cube { + pub fn new(size: f32, origin: Vec3) -> Self { + let rnd = thread_rng().gen_range(0.0..=1.0f32); + + Self { + rotation: glam::Quat::IDENTITY, + position: origin + Vec3::new(0.1, 0.1, 0.1), + size, + rotation_dir: if rnd <= 0.5 { -1.0 } else { 1.0 }, + rotation_axis: if rnd <= 0.33 { + glam::Vec3::Y + } else if rnd <= 0.66 { + glam::Vec3::X + } else { + glam::Vec3::Z + }, + } + } + + pub fn update(&mut self, size: f32, time: f32) { + self.rotation = glam::Quat::from_axis_angle( + self.rotation_axis, + time / 2.0 * self.rotation_dir, + ); + self.size = size; + } +} + +#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable, Debug)] +#[repr(C)] +pub struct Raw { + transformation: glam::Mat4, + normal: glam::Mat3, + _padding: [f32; 3], +} + +impl Raw { + const ATTRIBS: [wgpu::VertexAttribute; 7] = wgpu::vertex_attr_array![ + //cube transformation matrix + 4 => Float32x4, + 5 => Float32x4, + 6 => Float32x4, + 7 => Float32x4, + //normal rotation matrix + 8 => Float32x3, + 9 => Float32x3, + 10 => Float32x3, + ]; + + pub fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { + wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::<Self>() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Instance, + attributes: &Self::ATTRIBS, + } + } +} + +impl Raw { + pub fn from_cube(cube: &Cube) -> Raw { + Raw { + transformation: glam::Mat4::from_scale_rotation_translation( + glam::vec3(cube.size, cube.size, cube.size), + cube.rotation, + cube.position, + ), + normal: glam::Mat3::from_quat(cube.rotation), + _padding: [0.0; 3], + } + } + + pub fn vertices() -> [Vertex; 36] { + [ + //face 1 + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(0.5, -0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(0.5, 0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, 0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(0.0, 0.0, -1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + //face 2 + Vertex { + pos: vec3(-0.5, -0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(0.5, -0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, 0.5), + normal: vec3(0.0, 0.0, 1.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + //face 3 + Vertex { + pos: vec3(-0.5, 0.5, 0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, -0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, 0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, 0.5), + normal: vec3(-1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 1.0), + }, + //face 4 + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(0.5, 0.5, -0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(0.5, -0.5, -0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, -0.5, -0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, -0.5, 0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(1.0, 0.0, 0.0), + tangent: vec3(0.0, 0.0, -1.0), + uv: vec2(0.0, 1.0), + }, + //face 5 + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(0.5, -0.5, -0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(0.5, -0.5, 0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, -0.5, 0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, 0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, -0.5, -0.5), + normal: vec3(0.0, -1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + //face 6 + Vertex { + pos: vec3(-0.5, 0.5, -0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + Vertex { + pos: vec3(0.5, 0.5, -0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 1.0), + }, + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(0.5, 0.5, 0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(1.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, 0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 0.0), + }, + Vertex { + pos: vec3(-0.5, 0.5, -0.5), + normal: vec3(0.0, 1.0, 0.0), + tangent: vec3(1.0, 0.0, 0.0), + uv: vec2(0.0, 1.0), + }, + ] + } +} diff --git a/examples/custom_shader/src/primitive/uniforms.rs b/examples/custom_shader/src/primitive/uniforms.rs new file mode 100644 index 00000000..4fcb413b --- /dev/null +++ b/examples/custom_shader/src/primitive/uniforms.rs @@ -0,0 +1,22 @@ +use crate::camera::Camera; +use iced::{Color, Rectangle}; + +#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct Uniforms { + camera_proj: glam::Mat4, + camera_pos: glam::Vec4, + light_color: glam::Vec4, +} + +impl Uniforms { + pub fn new(camera: &Camera, bounds: Rectangle, light_color: Color) -> Self { + let camera_proj = camera.build_view_proj_matrix(bounds); + + Self { + camera_proj, + camera_pos: camera.position(), + light_color: glam::Vec4::from(light_color.into_linear()), + } + } +} diff --git a/examples/custom_shader/src/primitive/vertex.rs b/examples/custom_shader/src/primitive/vertex.rs new file mode 100644 index 00000000..6d17aa0f --- /dev/null +++ b/examples/custom_shader/src/primitive/vertex.rs @@ -0,0 +1,29 @@ +#[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] +#[repr(C)] +pub struct Vertex { + pub pos: glam::Vec3, + pub normal: glam::Vec3, + pub tangent: glam::Vec3, + pub uv: glam::Vec2, +} + +impl Vertex { + const ATTRIBS: [wgpu::VertexAttribute; 4] = wgpu::vertex_attr_array![ + //position + 0 => Float32x3, + //normal + 1 => Float32x3, + //tangent + 2 => Float32x3, + //uv + 3 => Float32x2, + ]; + + pub fn desc<'a>() -> wgpu::VertexBufferLayout<'a> { + wgpu::VertexBufferLayout { + array_stride: std::mem::size_of::<Self>() as wgpu::BufferAddress, + step_mode: wgpu::VertexStepMode::Vertex, + attributes: &Self::ATTRIBS, + } + } +} diff --git a/examples/custom_shader/src/shaders/cubes.wgsl b/examples/custom_shader/src/shaders/cubes.wgsl new file mode 100644 index 00000000..cd7f94d8 --- /dev/null +++ b/examples/custom_shader/src/shaders/cubes.wgsl @@ -0,0 +1,123 @@ +struct Uniforms { + projection: mat4x4<f32>, + camera_pos: vec4<f32>, + light_color: vec4<f32>, +} + +const LIGHT_POS: vec3<f32> = vec3<f32>(0.0, 3.0, 3.0); + +@group(0) @binding(0) var<uniform> uniforms: Uniforms; +@group(0) @binding(1) var sky_texture: texture_cube<f32>; +@group(0) @binding(2) var tex_sampler: sampler; +@group(0) @binding(3) var normal_texture: texture_2d<f32>; + +struct Vertex { + @location(0) position: vec3<f32>, + @location(1) normal: vec3<f32>, + @location(2) tangent: vec3<f32>, + @location(3) uv: vec2<f32>, +} + +struct Cube { + @location(4) matrix_0: vec4<f32>, + @location(5) matrix_1: vec4<f32>, + @location(6) matrix_2: vec4<f32>, + @location(7) matrix_3: vec4<f32>, + @location(8) normal_matrix_0: vec3<f32>, + @location(9) normal_matrix_1: vec3<f32>, + @location(10) normal_matrix_2: vec3<f32>, +} + +struct Output { + @builtin(position) clip_pos: vec4<f32>, + @location(0) uv: vec2<f32>, + @location(1) tangent_pos: vec3<f32>, + @location(2) tangent_camera_pos: vec3<f32>, + @location(3) tangent_light_pos: vec3<f32>, +} + +@vertex +fn vs_main(vertex: Vertex, cube: Cube) -> Output { + let cube_matrix = mat4x4<f32>( + cube.matrix_0, + cube.matrix_1, + cube.matrix_2, + cube.matrix_3, + ); + + let normal_matrix = mat3x3<f32>( + cube.normal_matrix_0, + cube.normal_matrix_1, + cube.normal_matrix_2, + ); + + //convert to tangent space to calculate lighting in same coordinate space as normal map sample + let tangent = normalize(normal_matrix * vertex.tangent); + let normal = normalize(normal_matrix * vertex.normal); + let bitangent = cross(tangent, normal); + + //shift everything into tangent space + let tbn = transpose(mat3x3<f32>(tangent, bitangent, normal)); + + let world_pos = cube_matrix * vec4<f32>(vertex.position, 1.0); + + var out: Output; + out.clip_pos = uniforms.projection * world_pos; + out.uv = vertex.uv; + out.tangent_pos = tbn * world_pos.xyz; + out.tangent_camera_pos = tbn * uniforms.camera_pos.xyz; + out.tangent_light_pos = tbn * LIGHT_POS; + + return out; +} + +//cube properties +const CUBE_BASE_COLOR: vec4<f32> = vec4<f32>(0.294118, 0.462745, 0.611765, 0.6); +const SHINE_DAMPER: f32 = 1.0; +const REFLECTIVITY: f32 = 0.8; +const REFRACTION_INDEX: f32 = 1.31; + +//fog, for the ~* cinematic effect *~ +const FOG_DENSITY: f32 = 0.15; +const FOG_GRADIENT: f32 = 8.0; +const FOG_COLOR: vec4<f32> = vec4<f32>(1.0, 1.0, 1.0, 1.0); + +@fragment +fn fs_main(in: Output) -> @location(0) vec4<f32> { + let to_camera = in.tangent_camera_pos - in.tangent_pos; + + //normal sample from texture + var normal = textureSample(normal_texture, tex_sampler, in.uv).xyz; + normal = normal * 2.0 - 1.0; + + //diffuse + let dir_to_light: vec3<f32> = normalize(in.tangent_light_pos - in.tangent_pos); + let brightness = max(dot(normal, dir_to_light), 0.0); + let diffuse: vec3<f32> = brightness * uniforms.light_color.xyz; + + //specular + let dir_to_camera = normalize(to_camera); + let light_dir = -dir_to_light; + let reflected_light_dir = reflect(light_dir, normal); + let specular_factor = max(dot(reflected_light_dir, dir_to_camera), 0.0); + let damped_factor = pow(specular_factor, SHINE_DAMPER); + let specular: vec3<f32> = damped_factor * uniforms.light_color.xyz * REFLECTIVITY; + + //fog + let distance = length(to_camera); + let visibility = clamp(exp(-pow((distance * FOG_DENSITY), FOG_GRADIENT)), 0.0, 1.0); + + //reflection + let reflection_dir = reflect(dir_to_camera, normal); + let reflection_color = textureSample(sky_texture, tex_sampler, reflection_dir); + let refraction_dir = refract(dir_to_camera, normal, REFRACTION_INDEX); + let refraction_color = textureSample(sky_texture, tex_sampler, refraction_dir); + let final_reflect_color = mix(reflection_color, refraction_color, 0.5); + + //mix it all together! + var color = vec4<f32>(CUBE_BASE_COLOR.xyz * diffuse + specular, CUBE_BASE_COLOR.w); + color = mix(color, final_reflect_color, 0.8); + color = mix(FOG_COLOR, color, visibility); + + return color; +} diff --git a/examples/custom_shader/src/shaders/depth.wgsl b/examples/custom_shader/src/shaders/depth.wgsl new file mode 100644 index 00000000..a3f7e5ec --- /dev/null +++ b/examples/custom_shader/src/shaders/depth.wgsl @@ -0,0 +1,48 @@ +var<private> positions: array<vec2<f32>, 6> = array<vec2<f32>, 6>( + vec2<f32>(-1.0, 1.0), + vec2<f32>(-1.0, -1.0), + vec2<f32>(1.0, -1.0), + vec2<f32>(-1.0, 1.0), + vec2<f32>(1.0, 1.0), + vec2<f32>(1.0, -1.0) +); + +var<private> uvs: array<vec2<f32>, 6> = array<vec2<f32>, 6>( + vec2<f32>(0.0, 0.0), + vec2<f32>(0.0, 1.0), + vec2<f32>(1.0, 1.0), + vec2<f32>(0.0, 0.0), + vec2<f32>(1.0, 0.0), + vec2<f32>(1.0, 1.0) +); + +@group(0) @binding(0) var depth_sampler: sampler; +@group(0) @binding(1) var depth_texture: texture_2d<f32>; + +struct Output { + @builtin(position) position: vec4<f32>, + @location(0) uv: vec2<f32>, +} + +@vertex +fn vs_main(@builtin(vertex_index) v_index: u32) -> Output { + var out: Output; + + out.position = vec4<f32>(positions[v_index], 0.0, 1.0); + out.uv = uvs[v_index]; + + return out; +} + +@fragment +fn fs_main(input: Output) -> @location(0) vec4<f32> { + let depth = textureSample(depth_texture, depth_sampler, input.uv).r; + + if (depth > .9999) { + discard; + } + + let c = 1.0 - depth; + + return vec4<f32>(c, c, c, 1.0); +} diff --git a/examples/custom_shader/src/textures/ice_cube_normal_map.png b/examples/custom_shader/src/textures/ice_cube_normal_map.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4b7228a7d5404fa8c062d4894875d4f9f9974c GIT binary patch literal 1773656 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 t>U-k)r)w`Ppr!#85mXv%(v^Q4*Y+o~9pis<G< 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%0A~_=c9_v5A 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ǔ!~dl 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θ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%0D?e$zs)8lfcMgF&&8=%JJvR*4(!S4r^=R%b(VQl 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®t!c@y5Q~+@q2xO-KC@CT>8vOn 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%0Av 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 ^!tocOJce7xs9p7<E!StR|Zn16lVSV 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%0Am=YwJ^8ArE)w_7NEN__Ad>2?ELh;SS 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�W$lX$a=m@#oCrJf3R<y*c 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 OSB`crwsjZp#{Cb-%>Rl2 literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/neg_x.jpg b/examples/custom_shader/src/textures/skybox/neg_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00cc783d6fba1222b84257e78b74bdc31ae1d4e8 GIT binary patch literal 7549 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 Fe*r`dHF5v| literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/neg_y.jpg b/examples/custom_shader/src/textures/skybox/neg_y.jpg new file mode 100644 index 0000000000000000000000000000000000000000..548f6445df4f984d54d91cda57c9fb646b6429a2 GIT binary patch literal 2722 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 literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/neg_z.jpg b/examples/custom_shader/src/textures/skybox/neg_z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5698512e647ebe3f5079bca985184e2ac54c19aa GIT binary patch literal 3986 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 Ll!ZE5Q-AyiDhFj1 literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/pos_x.jpg b/examples/custom_shader/src/textures/skybox/pos_x.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dddecba7114231d387b5b6589a95d7651c80497b GIT binary patch literal 5522 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 literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/pos_y.jpg b/examples/custom_shader/src/textures/skybox/pos_y.jpg new file mode 100644 index 0000000000000000000000000000000000000000..361427fd6405db7a97f03c00be16f531f34c13a5 GIT binary patch literal 3382 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 literal 0 HcmV?d00001 diff --git a/examples/custom_shader/src/textures/skybox/pos_z.jpg b/examples/custom_shader/src/textures/skybox/pos_z.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0085a49e23b6928dc358c7d222d8f0e8ca9b11d9 GIT binary patch literal 5205 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 literal 0 HcmV?d00001 diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index c26d52fe..0f32fca0 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -271,6 +271,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { &queue, &mut encoder, None, + frame.texture.format(), &view, primitive, &viewport, diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index a7aea352..6741d7cf 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -16,7 +16,6 @@ all-features = true [features] geometry = ["lyon_path"] -opengl = [] image = ["dep:image", "kamadak-exif"] web-colors = [] diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 78dec847..8c5ee2f0 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -7,6 +7,7 @@ pub mod compositor; pub mod geometry; mod settings; +pub mod widget; pub use iced_graphics as graphics; pub use iced_graphics::core; @@ -59,6 +60,26 @@ impl<T> Renderer<T> { } } } + + pub fn draw_custom<P: widget::shader::Primitive>( + &mut self, + bounds: Rectangle, + primitive: P, + ) { + match self { + Renderer::TinySkia(_) => { + log::warn!( + "Custom shader primitive is unavailable with tiny-skia." + ); + } + #[cfg(feature = "wgpu")] + Renderer::Wgpu(renderer) => { + renderer.draw_primitive(iced_wgpu::Primitive::Custom( + iced_wgpu::primitive::Custom::shader(bounds, primitive), + )) + } + } + } } impl<T> core::Renderer for Renderer<T> { diff --git a/renderer/src/widget.rs b/renderer/src/widget.rs index 6c0c2a83..0422c99c 100644 --- a/renderer/src/widget.rs +++ b/renderer/src/widget.rs @@ -9,3 +9,6 @@ pub mod qr_code; #[cfg(feature = "qr_code")] pub use qr_code::QRCode; + +#[cfg(feature = "wgpu")] +pub mod shader; diff --git a/renderer/src/widget/shader.rs b/renderer/src/widget/shader.rs new file mode 100644 index 00000000..da42a7dd --- /dev/null +++ b/renderer/src/widget/shader.rs @@ -0,0 +1,215 @@ +//! A custom shader widget for wgpu applications. +use crate::core::event::Status; +use crate::core::layout::{Limits, Node}; +use crate::core::mouse::{Cursor, Interaction}; +use crate::core::renderer::Style; +use crate::core::widget::tree::{State, Tag}; +use crate::core::widget::{tree, Tree}; +use crate::core::{ + self, layout, mouse, widget, Clipboard, Element, Layout, Length, Rectangle, + Shell, Size, Widget, +}; +use std::marker::PhantomData; + +mod event; +mod program; + +pub use event::Event; +pub use iced_wgpu::custom::Primitive; +pub use iced_wgpu::custom::Storage; +pub use program::Program; + +/// A widget which can render custom shaders with Iced's `wgpu` backend. +/// +/// Must be initialized with a [`Program`], which describes the internal widget state & how +/// its [`Program::Primitive`]s are drawn. +#[allow(missing_debug_implementations)] +pub struct Shader<Message, P: Program<Message>> { + width: Length, + height: Length, + program: P, + _message: PhantomData<Message>, +} + +impl<Message, P: Program<Message>> Shader<Message, P> { + /// Create a new custom [`Shader`]. + pub fn new(program: P) -> Self { + Self { + width: Length::Fixed(100.0), + height: Length::Fixed(100.0), + program, + _message: PhantomData, + } + } + + /// Set the `width` of the custom [`Shader`]. + pub fn width(mut self, width: impl Into<Length>) -> Self { + self.width = width.into(); + self + } + + /// Set the `height` of the custom [`Shader`]. + pub fn height(mut self, height: impl Into<Length>) -> Self { + self.height = height.into(); + self + } +} + +impl<P, Message, Theme> Widget<Message, crate::Renderer<Theme>> + for Shader<Message, P> +where + P: Program<Message>, +{ + fn tag(&self) -> Tag { + struct Tag<T>(T); + tree::Tag::of::<Tag<P::State>>() + } + + fn state(&self) -> State { + tree::State::new(P::State::default()) + } + + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + self.height + } + + fn layout( + &self, + _tree: &mut Tree, + _renderer: &crate::Renderer<Theme>, + limits: &Limits, + ) -> Node { + let limits = limits.width(self.width).height(self.height); + let size = limits.resolve(Size::ZERO); + + layout::Node::new(size) + } + + fn on_event( + &mut self, + tree: &mut Tree, + event: crate::core::Event, + layout: Layout<'_>, + cursor: Cursor, + _renderer: &crate::Renderer<Theme>, + _clipboard: &mut dyn Clipboard, + shell: &mut Shell<'_, Message>, + _viewport: &Rectangle, + ) -> Status { + let bounds = layout.bounds(); + + let custom_shader_event = match event { + core::Event::Mouse(mouse_event) => Some(Event::Mouse(mouse_event)), + core::Event::Keyboard(keyboard_event) => { + Some(Event::Keyboard(keyboard_event)) + } + core::Event::Touch(touch_event) => Some(Event::Touch(touch_event)), + _ => None, + }; + + if let Some(custom_shader_event) = custom_shader_event { + let state = tree.state.downcast_mut::<P::State>(); + + let (event_status, message) = self.program.update( + state, + custom_shader_event, + bounds, + cursor, + shell, + ); + + if let Some(message) = message { + shell.publish(message); + } + + return event_status; + } + + event::Status::Ignored + } + + fn mouse_interaction( + &self, + tree: &Tree, + layout: Layout<'_>, + cursor: Cursor, + _viewport: &Rectangle, + _renderer: &crate::Renderer<Theme>, + ) -> mouse::Interaction { + let bounds = layout.bounds(); + let state = tree.state.downcast_ref::<P::State>(); + + self.program.mouse_interaction(state, bounds, cursor) + } + + fn draw( + &self, + tree: &widget::Tree, + renderer: &mut crate::Renderer<Theme>, + _theme: &Theme, + _style: &Style, + layout: Layout<'_>, + cursor_position: mouse::Cursor, + _viewport: &Rectangle, + ) { + let bounds = layout.bounds(); + let state = tree.state.downcast_ref::<P::State>(); + + renderer.draw_custom( + bounds, + self.program.draw(state, cursor_position, bounds), + ); + } +} + +impl<'a, M, P, Theme> From<Shader<M, P>> + for Element<'a, M, crate::Renderer<Theme>> +where + M: 'a, + P: Program<M> + 'a, +{ + fn from(custom: Shader<M, P>) -> Element<'a, M, crate::Renderer<Theme>> { + Element::new(custom) + } +} + +impl<Message, T> Program<Message> for &T +where + T: Program<Message>, +{ + type State = T::State; + type Primitive = T::Primitive; + + fn update( + &self, + state: &mut Self::State, + event: Event, + bounds: Rectangle, + cursor: Cursor, + shell: &mut Shell<'_, Message>, + ) -> (Status, Option<Message>) { + T::update(self, state, event, bounds, cursor, shell) + } + + fn draw( + &self, + state: &Self::State, + cursor: Cursor, + bounds: Rectangle, + ) -> Self::Primitive { + T::draw(self, state, cursor, bounds) + } + + fn mouse_interaction( + &self, + state: &Self::State, + bounds: Rectangle, + cursor: Cursor, + ) -> Interaction { + T::mouse_interaction(self, state, bounds, cursor) + } +} diff --git a/renderer/src/widget/shader/event.rs b/renderer/src/widget/shader/event.rs new file mode 100644 index 00000000..981b30d7 --- /dev/null +++ b/renderer/src/widget/shader/event.rs @@ -0,0 +1,21 @@ +//! Handle events of a custom shader widget. +use crate::core::keyboard; +use crate::core::mouse; +use crate::core::touch; + +pub use crate::core::event::Status; + +/// A [`Shader`] event. +/// +/// [`Shader`]: crate::widget::shader::Shader; +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Event { + /// A mouse event. + Mouse(mouse::Event), + + /// A touch event. + Touch(touch::Event), + + /// A keyboard event. + Keyboard(keyboard::Event), +} diff --git a/renderer/src/widget/shader/program.rs b/renderer/src/widget/shader/program.rs new file mode 100644 index 00000000..b8871688 --- /dev/null +++ b/renderer/src/widget/shader/program.rs @@ -0,0 +1,60 @@ +use crate::core::{event, mouse, Rectangle, Shell}; +use crate::widget; +use widget::shader; + +/// The state and logic of a [`Shader`] widget. +/// +/// A [`Program`] can mutate the internal state of a [`Shader`] widget +/// and produce messages for an application. +/// +/// [`Shader`]: crate::widget::shader::Shader +pub trait Program<Message> { + /// The internal state of the [`Program`]. + type State: Default + 'static; + + /// The type of primitive this [`Program`] can draw. + type Primitive: shader::Primitive + 'static; + + /// Update the internal [`State`] of the [`Program`]. This can be used to reflect state changes + /// based on mouse & other events. You can use the [`Shell`] to publish messages, request a + /// redraw for the window, etc. + /// + /// By default, this method does and returns nothing. + /// + /// [`State`]: Self::State + fn update( + &self, + _state: &mut Self::State, + _event: shader::Event, + _bounds: Rectangle, + _cursor: mouse::Cursor, + _shell: &mut Shell<'_, Message>, + ) -> (event::Status, Option<Message>) { + (event::Status::Ignored, None) + } + + /// Draws the [`Primitive`]. + /// + /// [`Primitive`]: Self::Primitive + fn draw( + &self, + state: &Self::State, + cursor: mouse::Cursor, + bounds: Rectangle, + ) -> Self::Primitive; + + /// Returns the current mouse interaction of the [`Program`]. + /// + /// The interaction returned will be in effect even if the cursor position is out of + /// bounds of the [`Shader`]'s program. + /// + /// [`Shader`]: crate::widget::shader::Shader + fn mouse_interaction( + &self, + _state: &Self::State, + _bounds: Rectangle, + _cursor: mouse::Cursor, + ) -> mouse::Interaction { + mouse::Interaction::default() + } +} diff --git a/style/src/theme.rs b/style/src/theme.rs index 47010728..cc31d72d 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -1,7 +1,7 @@ //! Use the built-in theme and styles. pub mod palette; -pub use palette::Palette; +pub use self::palette::Palette; use crate::application; use crate::button; diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 2bd29f42..907611d9 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -3,9 +3,7 @@ use crate::graphics::backend; use crate::graphics::color; use crate::graphics::{Transformation, Viewport}; use crate::primitive::{self, Primitive}; -use crate::quad; -use crate::text; -use crate::triangle; +use crate::{custom, quad, text, triangle}; use crate::{Layer, Settings}; #[cfg(feature = "tracing")] @@ -25,6 +23,7 @@ pub struct Backend { quad_pipeline: quad::Pipeline, text_pipeline: text::Pipeline, triangle_pipeline: triangle::Pipeline, + pipeline_storage: custom::Storage, #[cfg(any(feature = "image", feature = "svg"))] image_pipeline: image::Pipeline, @@ -50,6 +49,7 @@ impl Backend { quad_pipeline, text_pipeline, triangle_pipeline, + pipeline_storage: custom::Storage::default(), #[cfg(any(feature = "image", feature = "svg"))] image_pipeline, @@ -66,6 +66,7 @@ impl Backend { queue: &wgpu::Queue, encoder: &mut wgpu::CommandEncoder, clear_color: Option<Color>, + format: wgpu::TextureFormat, frame: &wgpu::TextureView, primitives: &[Primitive], viewport: &Viewport, @@ -88,6 +89,7 @@ impl Backend { self.prepare( device, queue, + format, encoder, scale_factor, target_size, @@ -117,6 +119,7 @@ impl Backend { &mut self, device: &wgpu::Device, queue: &wgpu::Queue, + format: wgpu::TextureFormat, _encoder: &mut wgpu::CommandEncoder, scale_factor: f32, target_size: Size<u32>, @@ -179,6 +182,20 @@ impl Backend { target_size, ); } + + if !layer.shaders.is_empty() { + for shader in &layer.shaders { + shader.primitive.prepare( + format, + device, + queue, + target_size, + scale_factor, + transformation, + &mut self.pipeline_storage, + ); + } + } } } @@ -302,6 +319,47 @@ impl Backend { text_layer += 1; } + + // kill render pass to let custom shaders get mut access to encoder + let _ = ManuallyDrop::into_inner(render_pass); + + if !layer.shaders.is_empty() { + for shader in &layer.shaders { + //This extra check is needed since each custom pipeline must set it's own + //scissor rect, which will panic if bounds.w/h < 1 + let bounds = shader.bounds * scale_factor; + + if bounds.width < 1.0 || bounds.height < 1.0 { + continue; + } + + shader.primitive.render( + &self.pipeline_storage, + bounds.into(), + target, + target_size, + encoder, + ); + } + } + + // recreate and continue processing layers + render_pass = ManuallyDrop::new(encoder.begin_render_pass( + &wgpu::RenderPassDescriptor { + label: Some("iced_wgpu::quad render pass"), + color_attachments: &[Some( + wgpu::RenderPassColorAttachment { + view: target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: true, + }, + }, + )], + depth_stencil_attachment: None, + }, + )); } let _ = ManuallyDrop::into_inner(render_pass); diff --git a/wgpu/src/custom.rs b/wgpu/src/custom.rs new file mode 100644 index 00000000..65dd0496 --- /dev/null +++ b/wgpu/src/custom.rs @@ -0,0 +1,66 @@ +use crate::core::{Rectangle, Size}; +use crate::graphics::Transformation; +use std::any::{Any, TypeId}; +use std::collections::HashMap; +use std::fmt::Debug; + +/// Stores custom, user-provided pipelines. +#[derive(Default, Debug)] +pub struct Storage { + pipelines: HashMap<TypeId, Box<dyn Any>>, +} + +impl Storage { + /// Returns `true` if `Storage` contains a pipeline with type `T`. + pub fn has<T: 'static>(&self) -> bool { + self.pipelines.get(&TypeId::of::<T>()).is_some() + } + + /// Inserts the pipeline `T` in to [`Storage`]. + pub fn store<T: 'static>(&mut self, pipeline: T) { + let _ = self.pipelines.insert(TypeId::of::<T>(), Box::new(pipeline)); + } + + /// Returns a reference to pipeline with type `T` if it exists in [`Storage`]. + pub fn get<T: 'static>(&self) -> Option<&T> { + self.pipelines.get(&TypeId::of::<T>()).map(|pipeline| { + pipeline + .downcast_ref::<T>() + .expect("Pipeline with this type does not exist in Storage.") + }) + } + + /// Returns a mutable reference to pipeline `T` if it exists in [`Storage`]. + pub fn get_mut<T: 'static>(&mut self) -> Option<&mut T> { + self.pipelines.get_mut(&TypeId::of::<T>()).map(|pipeline| { + pipeline + .downcast_mut::<T>() + .expect("Pipeline with this type does not exist in Storage.") + }) + } +} + +/// A set of methods which allows a [`Primitive`] to be rendered. +pub trait Primitive: Debug + Send + Sync + 'static { + /// Processes the [`Primitive`], allowing for GPU buffer allocation. + fn prepare( + &self, + format: wgpu::TextureFormat, + device: &wgpu::Device, + queue: &wgpu::Queue, + target_size: Size<u32>, + scale_factor: f32, + transform: Transformation, + storage: &mut Storage, + ); + + /// Renders the [`Primitive`]. + fn render( + &self, + storage: &Storage, + bounds: Rectangle<u32>, + target: &wgpu::TextureView, + target_size: Size<u32>, + encoder: &mut wgpu::CommandEncoder, + ); +} diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 286801e6..d451cbfd 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -34,6 +34,9 @@ pub struct Layer<'a> { /// The images of the [`Layer`]. pub images: Vec<Image>, + + /// The custom shader primitives of this [`Layer`]. + pub shaders: Vec<primitive::Shader>, } impl<'a> Layer<'a> { @@ -45,6 +48,7 @@ impl<'a> Layer<'a> { meshes: Vec::new(), text: Vec::new(), images: Vec::new(), + shaders: Vec::new(), } } @@ -308,6 +312,18 @@ impl<'a> Layer<'a> { } } }, + primitive::Custom::Shader(shader) => { + let layer = &mut layers[current_layer]; + + let bounds = Rectangle::new( + Point::new(translation.x, translation.y), + shader.bounds.size(), + ); + + if layer.bounds.intersection(&bounds).is_some() { + layer.shaders.push(shader.clone()); + } + } }, } } diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 424dfeb3..13d8e886 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -29,6 +29,7 @@ rustdoc::broken_intra_doc_links )] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +pub mod custom; pub mod layer; pub mod primitive; pub mod settings; diff --git a/wgpu/src/primitive.rs b/wgpu/src/primitive.rs index 8dbf3008..4347dcda 100644 --- a/wgpu/src/primitive.rs +++ b/wgpu/src/primitive.rs @@ -1,6 +1,10 @@ //! Draw using different graphical primitives. use crate::core::Rectangle; +use crate::custom; use crate::graphics::{Damage, Mesh}; +use std::any::Any; +use std::fmt::Debug; +use std::sync::Arc; /// The graphical primitives supported by `iced_wgpu`. pub type Primitive = crate::graphics::Primitive<Custom>; @@ -10,12 +14,44 @@ pub type Primitive = crate::graphics::Primitive<Custom>; pub enum Custom { /// A mesh primitive. Mesh(Mesh), + /// A custom shader primitive + Shader(Shader), +} + +impl Custom { + /// Create a custom [`Shader`] primitive. + pub fn shader<P: custom::Primitive>( + bounds: Rectangle, + primitive: P, + ) -> Self { + Self::Shader(Shader { + bounds, + primitive: Arc::new(primitive), + }) + } } impl Damage for Custom { fn bounds(&self) -> Rectangle { match self { Self::Mesh(mesh) => mesh.bounds(), + Self::Shader(shader) => shader.bounds, } } } + +#[derive(Clone, Debug)] +/// A custom primitive which can be used to render primitives associated with a custom pipeline. +pub struct Shader { + /// The bounds of the [`Shader`]. + pub bounds: Rectangle, + + /// The [`custom::Primitive`] to render. + pub primitive: Arc<dyn custom::Primitive>, +} + +impl PartialEq for Shader { + fn eq(&self, other: &Self) -> bool { + self.primitive.type_id() == other.primitive.type_id() + } +} diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 1ddbe5fe..90d64e17 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -178,6 +178,7 @@ pub fn present<Theme, T: AsRef<str>>( &compositor.queue, &mut encoder, Some(background_color), + frame.texture.format(), view, primitives, viewport, @@ -357,6 +358,7 @@ pub fn screenshot<Theme, T: AsRef<str>>( &compositor.queue, &mut encoder, Some(background_color), + texture.format(), &view, primitives, viewport, diff --git a/widget/Cargo.toml b/widget/Cargo.toml index 6d62c181..032f801c 100644 --- a/widget/Cargo.toml +++ b/widget/Cargo.toml @@ -20,6 +20,7 @@ image = ["iced_renderer/image"] svg = ["iced_renderer/svg"] canvas = ["iced_renderer/geometry"] qr_code = ["canvas", "qrcode"] +wgpu = [] [dependencies] iced_renderer.workspace = true diff --git a/widget/src/lib.rs b/widget/src/lib.rs index 2f959370..e052f398 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -97,6 +97,9 @@ pub use tooltip::Tooltip; #[doc(no_inline)] pub use vertical_slider::VerticalSlider; +#[cfg(feature = "wgpu")] +pub use renderer::widget::shader::{self, Shader}; + #[cfg(feature = "svg")] pub mod svg; From 36e85215932079fa324cfefb620602ad79f7df3d Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Mon, 18 Sep 2023 09:04:28 -0700 Subject: [PATCH 144/286] Removed `Into` for Rectangle<f32> from u32 --- core/src/rectangle.rs | 11 ----------- wgpu/src/backend.rs | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/core/src/rectangle.rs b/core/src/rectangle.rs index d5437d51..c1c2eeac 100644 --- a/core/src/rectangle.rs +++ b/core/src/rectangle.rs @@ -183,17 +183,6 @@ impl From<Rectangle<u32>> for Rectangle<f32> { } } -impl From<Rectangle<f32>> for Rectangle<u32> { - fn from(rectangle: Rectangle<f32>) -> Self { - Rectangle { - x: rectangle.x as u32, - y: rectangle.y as u32, - width: rectangle.width as u32, - height: rectangle.height as u32, - } - } -} - impl<T> std::ops::Add<Vector<T>> for Rectangle<T> where T: std::ops::Add<Output = T>, diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 907611d9..ace2ef95 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -335,7 +335,7 @@ impl Backend { shader.primitive.render( &self.pipeline_storage, - bounds.into(), + bounds.snap(), target, target_size, encoder, From 91fca024b629b7ddf4de533a75f01593954362f6 Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Thu, 21 Sep 2023 13:24:54 -0700 Subject: [PATCH 145/286] Reexport Transformation from widget::shader --- renderer/src/widget/shader.rs | 1 + widget/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/renderer/src/widget/shader.rs b/renderer/src/widget/shader.rs index da42a7dd..85fc13c8 100644 --- a/renderer/src/widget/shader.rs +++ b/renderer/src/widget/shader.rs @@ -18,6 +18,7 @@ pub use event::Event; pub use iced_wgpu::custom::Primitive; pub use iced_wgpu::custom::Storage; pub use program::Program; +pub use iced_graphics::Transformation; /// A widget which can render custom shaders with Iced's `wgpu` backend. /// diff --git a/widget/src/lib.rs b/widget/src/lib.rs index e052f398..5220e83a 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -98,7 +98,7 @@ pub use tooltip::Tooltip; pub use vertical_slider::VerticalSlider; #[cfg(feature = "wgpu")] -pub use renderer::widget::shader::{self, Shader}; +pub use renderer::widget::shader::{self, Shader, Transformation}; #[cfg(feature = "svg")] pub mod svg; From 65f4ff060a36c6dc3afea20d75f541d72460d333 Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Thu, 28 Sep 2023 09:48:38 -0700 Subject: [PATCH 146/286] Added redraw request handling to widget events. --- renderer/src/widget/shader.rs | 8 ++++---- renderer/src/widget/shader/event.rs | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/renderer/src/widget/shader.rs b/renderer/src/widget/shader.rs index 85fc13c8..385fa981 100644 --- a/renderer/src/widget/shader.rs +++ b/renderer/src/widget/shader.rs @@ -5,10 +5,7 @@ use crate::core::mouse::{Cursor, Interaction}; use crate::core::renderer::Style; use crate::core::widget::tree::{State, Tag}; use crate::core::widget::{tree, Tree}; -use crate::core::{ - self, layout, mouse, widget, Clipboard, Element, Layout, Length, Rectangle, - Shell, Size, Widget, -}; +use crate::core::{self, layout, mouse, widget, Clipboard, Element, Layout, Length, Rectangle, Shell, Size, Widget, window}; use std::marker::PhantomData; mod event; @@ -109,6 +106,9 @@ where Some(Event::Keyboard(keyboard_event)) } core::Event::Touch(touch_event) => Some(Event::Touch(touch_event)), + core::Event::Window(window::Event::RedrawRequested(instant)) => { + Some(Event::RedrawRequested(instant)) + } _ => None, }; diff --git a/renderer/src/widget/shader/event.rs b/renderer/src/widget/shader/event.rs index 981b30d7..c1696580 100644 --- a/renderer/src/widget/shader/event.rs +++ b/renderer/src/widget/shader/event.rs @@ -1,4 +1,5 @@ //! Handle events of a custom shader widget. +use std::time::Instant; use crate::core::keyboard; use crate::core::mouse; use crate::core::touch; @@ -18,4 +19,7 @@ pub enum Event { /// A keyboard event. Keyboard(keyboard::Event), + + /// A window requested a redraw. + RedrawRequested(Instant), } From de9420e7df7d909bca611c360182dec54c5b1aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:33:04 +0100 Subject: [PATCH 147/286] Fix latest `wgpu` changes --- wgpu/src/backend.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index ace2ef95..27ef0b3c 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -353,11 +353,13 @@ impl Backend { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, }, )], depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, }, )); } From 46a48af97fa472e1158e07d4deb988c5601197e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:34:15 +0100 Subject: [PATCH 148/286] Write missing documentation for `custom` module in `iced_wgpu` --- wgpu/src/custom.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/wgpu/src/custom.rs b/wgpu/src/custom.rs index 65dd0496..65a6f133 100644 --- a/wgpu/src/custom.rs +++ b/wgpu/src/custom.rs @@ -1,3 +1,4 @@ +//! Draw custom primitives. use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; use std::any::{Any, TypeId}; From 3e8ed05356dde17a6e31a0dc927a3c19b593b09a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:38:16 +0100 Subject: [PATCH 149/286] Update `wgpu` in `custom_shader` example --- examples/custom_shader/Cargo.toml | 15 ++++++++++----- examples/custom_shader/src/pipeline.rs | 10 +++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/examples/custom_shader/Cargo.toml b/examples/custom_shader/Cargo.toml index 7a927811..0b8466a9 100644 --- a/examples/custom_shader/Cargo.toml +++ b/examples/custom_shader/Cargo.toml @@ -5,9 +5,14 @@ authors = ["Bingus <shankern@protonmail.com>"] edition = "2021" [dependencies] -iced = { path = "../..", features = ["debug", "advanced"]} -image = { version = "0.24.6"} -wgpu = "0.17" -bytemuck = { version = "1.13.1" } -glam = { version = "0.24.0", features = ["bytemuck"] } +iced.workspace = true +iced.features = ["debug", "advanced"] + +image.workspace = true +wgpu.workspace = true +bytemuck.workspace = true + +glam.workspace = true +glam.features = ["bytemuck"] + rand = "0.8.5" diff --git a/examples/custom_shader/src/pipeline.rs b/examples/custom_shader/src/pipeline.rs index 9dd154e8..eef1081d 100644 --- a/examples/custom_shader/src/pipeline.rs +++ b/examples/custom_shader/src/pipeline.rs @@ -355,7 +355,7 @@ impl Pipeline { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, }, )], @@ -364,11 +364,13 @@ impl Pipeline { view: &self.depth_view, depth_ops: Some(wgpu::Operations { load: wgpu::LoadOp::Clear(1.0), - store: true, + store: wgpu::StoreOp::Store, }), stencil_ops: None, }, ), + timestamp_writes: None, + occlusion_query_set: None, }); pass.set_scissor_rect( @@ -547,7 +549,7 @@ impl DepthPipeline { resolve_target: None, ops: wgpu::Operations { load: wgpu::LoadOp::Load, - store: true, + store: wgpu::StoreOp::Store, }, })], depth_stencil_attachment: Some( @@ -557,6 +559,8 @@ impl DepthPipeline { stencil_ops: None, }, ), + timestamp_writes: None, + occlusion_query_set: None, }); pass.set_scissor_rect(bounds.x, bounds.y, bounds.width, bounds.height); From 33f626294452aefd1cd04f455fa1d1dfcb7f549e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:43:38 +0100 Subject: [PATCH 150/286] Fix `clippy` lints :crab: --- examples/custom_shader/src/cubes.rs | 2 +- examples/custom_shader/src/pipeline.rs | 8 ++++---- examples/custom_shader/src/primitive.rs | 4 ++-- renderer/src/lib.rs | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/custom_shader/src/cubes.rs b/examples/custom_shader/src/cubes.rs index 8dbba4b1..00e608e3 100644 --- a/examples/custom_shader/src/cubes.rs +++ b/examples/custom_shader/src/cubes.rs @@ -65,7 +65,7 @@ impl Cubes { let new_len = self.cubes.len() - cubes_2_cut as usize; self.cubes.truncate(new_len); } - _ => {} + Ordering::Equal => {} } } } diff --git a/examples/custom_shader/src/pipeline.rs b/examples/custom_shader/src/pipeline.rs index eef1081d..44ad17a2 100644 --- a/examples/custom_shader/src/pipeline.rs +++ b/examples/custom_shader/src/pipeline.rs @@ -479,15 +479,15 @@ impl DepthPipeline { entry_point: "vs_main", buffers: &[], }, - primitive: Default::default(), + primitive: wgpu::PrimitiveState::default(), depth_stencil: Some(wgpu::DepthStencilState { format: wgpu::TextureFormat::Depth32Float, depth_write_enabled: false, depth_compare: wgpu::CompareFunction::Less, - stencil: Default::default(), - bias: Default::default(), + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), }), - multisample: Default::default(), + multisample: wgpu::MultisampleState::default(), fragment: Some(wgpu::FragmentState { module: &shader, entry_point: "fs_main", diff --git a/examples/custom_shader/src/primitive.rs b/examples/custom_shader/src/primitive.rs index 2201218f..f81ce95d 100644 --- a/examples/custom_shader/src/primitive.rs +++ b/examples/custom_shader/src/primitive.rs @@ -56,7 +56,7 @@ impl shader::Primitive for Primitive { storage: &mut shader::Storage, ) { if !storage.has::<Pipeline>() { - storage.store(Pipeline::new(device, queue, format, target_size)) + storage.store(Pipeline::new(device, queue, format, target_size)); } let pipeline = storage.get_mut::<Pipeline>().unwrap(); @@ -90,6 +90,6 @@ impl shader::Primitive for Primitive { bounds, self.cubes.len() as u32, self.show_depth_buffer, - ) + ); } } diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 8c5ee2f0..e4b1eda9 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -76,7 +76,7 @@ impl<T> Renderer<T> { Renderer::Wgpu(renderer) => { renderer.draw_primitive(iced_wgpu::Primitive::Custom( iced_wgpu::primitive::Custom::shader(bounds, primitive), - )) + )); } } } From 226eac35c3fa35be328f6390fdf2a52a38ed2b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:51:04 +0100 Subject: [PATCH 151/286] Remove old `widget` modules in `iced_renderer` --- renderer/src/widget.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/renderer/src/widget.rs b/renderer/src/widget.rs index 0422c99c..4b7dad5d 100644 --- a/renderer/src/widget.rs +++ b/renderer/src/widget.rs @@ -1,14 +1,2 @@ -#[cfg(feature = "canvas")] -pub mod canvas; - -#[cfg(feature = "canvas")] -pub use canvas::Canvas; - -#[cfg(feature = "qr_code")] -pub mod qr_code; - -#[cfg(feature = "qr_code")] -pub use qr_code::QRCode; - #[cfg(feature = "wgpu")] pub mod shader; From 2dda9132cda6d2a2279759f3447bae4e1c277555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 11:52:34 +0100 Subject: [PATCH 152/286] Run `cargo fmt` --- renderer/src/widget/shader.rs | 7 +++++-- renderer/src/widget/shader/event.rs | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/renderer/src/widget/shader.rs b/renderer/src/widget/shader.rs index 385fa981..e218f35a 100644 --- a/renderer/src/widget/shader.rs +++ b/renderer/src/widget/shader.rs @@ -5,17 +5,20 @@ use crate::core::mouse::{Cursor, Interaction}; use crate::core::renderer::Style; use crate::core::widget::tree::{State, Tag}; use crate::core::widget::{tree, Tree}; -use crate::core::{self, layout, mouse, widget, Clipboard, Element, Layout, Length, Rectangle, Shell, Size, Widget, window}; +use crate::core::{ + self, layout, mouse, widget, window, Clipboard, Element, Layout, Length, + Rectangle, Shell, Size, Widget, +}; use std::marker::PhantomData; mod event; mod program; pub use event::Event; +pub use iced_graphics::Transformation; pub use iced_wgpu::custom::Primitive; pub use iced_wgpu::custom::Storage; pub use program::Program; -pub use iced_graphics::Transformation; /// A widget which can render custom shaders with Iced's `wgpu` backend. /// diff --git a/renderer/src/widget/shader/event.rs b/renderer/src/widget/shader/event.rs index c1696580..8901fb31 100644 --- a/renderer/src/widget/shader/event.rs +++ b/renderer/src/widget/shader/event.rs @@ -1,8 +1,8 @@ //! Handle events of a custom shader widget. -use std::time::Instant; use crate::core::keyboard; use crate::core::mouse; use crate::core::touch; +use std::time::Instant; pub use crate::core::event::Status; From 9489e29e6619b14ed9f41a8887c4b34158266f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 12:49:49 +0100 Subject: [PATCH 153/286] Re-organize `custom` module as `pipeline` module ... and move `Shader` widget to `iced_widget` crate --- examples/custom_shader/src/main.rs | 11 +- examples/custom_shader/src/primitive.rs | 15 +-- renderer/src/lib.rs | 44 +++---- renderer/src/widget.rs | 2 - wgpu/src/backend.rs | 29 ++--- wgpu/src/custom.rs | 63 +--------- wgpu/src/layer.rs | 19 +-- wgpu/src/lib.rs | 1 - wgpu/src/primitive.rs | 43 ++----- wgpu/src/primitive/pipeline.rs | 117 ++++++++++++++++++ widget/src/lib.rs | 6 +- {renderer/src/widget => widget/src}/shader.rs | 82 ++++++------ .../src/widget => widget/src}/shader/event.rs | 1 + .../widget => widget/src}/shader/program.rs | 10 +- 14 files changed, 246 insertions(+), 197 deletions(-) delete mode 100644 renderer/src/widget.rs create mode 100644 wgpu/src/primitive/pipeline.rs rename {renderer/src/widget => widget/src}/shader.rs (76%) rename {renderer/src/widget => widget/src}/shader/event.rs (99%) rename {renderer/src/widget => widget/src}/shader/program.rs (89%) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index 76fa1625..f6370f46 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -3,15 +3,20 @@ mod cubes; mod pipeline; mod primitive; +use crate::camera::Camera; use crate::cubes::Cubes; +use crate::pipeline::Pipeline; + +use iced::executor; +use iced::time::Instant; use iced::widget::{ checkbox, column, container, row, slider, text, vertical_space, Shader, }; +use iced::window; use iced::{ - executor, window, Alignment, Application, Color, Command, Element, Length, - Renderer, Subscription, Theme, + Alignment, Application, Color, Command, Element, Length, Renderer, + Subscription, Theme, }; -use std::time::Instant; fn main() -> iced::Result { IcedCubes::run(iced::Settings::default()) diff --git a/examples/custom_shader/src/primitive.rs b/examples/custom_shader/src/primitive.rs index f81ce95d..520ceb8e 100644 --- a/examples/custom_shader/src/primitive.rs +++ b/examples/custom_shader/src/primitive.rs @@ -4,17 +4,18 @@ pub mod vertex; mod buffer; mod uniforms; -use crate::camera::Camera; -use crate::pipeline::Pipeline; -use crate::primitive::cube::Cube; +pub use buffer::Buffer; +pub use cube::Cube; +pub use uniforms::Uniforms; +pub use vertex::Vertex; + +use crate::Camera; +use crate::Pipeline; + use iced::advanced::graphics::Transformation; use iced::widget::shader; use iced::{Color, Rectangle, Size}; -pub use crate::primitive::vertex::Vertex; -pub use buffer::Buffer; -pub use uniforms::Uniforms; - /// A collection of `Cube`s that can be rendered. #[derive(Debug)] pub struct Primitive { diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index e4b1eda9..1fc4c86b 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -1,13 +1,15 @@ #![forbid(rust_2018_idioms)] #![deny(unsafe_code, unused_results, rustdoc::broken_intra_doc_links)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#[cfg(feature = "wgpu")] +pub use iced_wgpu as wgpu; + pub mod compositor; #[cfg(feature = "geometry")] pub mod geometry; mod settings; -pub mod widget; pub use iced_graphics as graphics; pub use iced_graphics::core; @@ -60,26 +62,6 @@ impl<T> Renderer<T> { } } } - - pub fn draw_custom<P: widget::shader::Primitive>( - &mut self, - bounds: Rectangle, - primitive: P, - ) { - match self { - Renderer::TinySkia(_) => { - log::warn!( - "Custom shader primitive is unavailable with tiny-skia." - ); - } - #[cfg(feature = "wgpu")] - Renderer::Wgpu(renderer) => { - renderer.draw_primitive(iced_wgpu::Primitive::Custom( - iced_wgpu::primitive::Custom::shader(bounds, primitive), - )); - } - } - } } impl<T> core::Renderer for Renderer<T> { @@ -292,3 +274,23 @@ impl<T> crate::graphics::geometry::Renderer for Renderer<T> { } } } + +#[cfg(feature = "wgpu")] +impl<T> iced_wgpu::primitive::pipeline::Renderer for Renderer<T> { + fn draw_pipeline_primitive( + &mut self, + bounds: Rectangle, + primitive: impl wgpu::primitive::pipeline::Primitive, + ) { + match self { + Self::TinySkia(_renderer) => { + log::warn!( + "Custom shader primitive is unavailable with tiny-skia." + ); + } + Self::Wgpu(renderer) => { + renderer.draw_pipeline_primitive(bounds, primitive); + } + } + } +} diff --git a/renderer/src/widget.rs b/renderer/src/widget.rs deleted file mode 100644 index 4b7dad5d..00000000 --- a/renderer/src/widget.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[cfg(feature = "wgpu")] -pub mod shader; diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 27ef0b3c..f89bcee1 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -2,8 +2,11 @@ use crate::core::{Color, Size}; use crate::graphics::backend; use crate::graphics::color; use crate::graphics::{Transformation, Viewport}; +use crate::primitive::pipeline; use crate::primitive::{self, Primitive}; -use crate::{custom, quad, text, triangle}; +use crate::quad; +use crate::text; +use crate::triangle; use crate::{Layer, Settings}; #[cfg(feature = "tracing")] @@ -23,7 +26,7 @@ pub struct Backend { quad_pipeline: quad::Pipeline, text_pipeline: text::Pipeline, triangle_pipeline: triangle::Pipeline, - pipeline_storage: custom::Storage, + pipeline_storage: pipeline::Storage, #[cfg(any(feature = "image", feature = "svg"))] image_pipeline: image::Pipeline, @@ -49,7 +52,7 @@ impl Backend { quad_pipeline, text_pipeline, triangle_pipeline, - pipeline_storage: custom::Storage::default(), + pipeline_storage: pipeline::Storage::default(), #[cfg(any(feature = "image", feature = "svg"))] image_pipeline, @@ -183,9 +186,9 @@ impl Backend { ); } - if !layer.shaders.is_empty() { - for shader in &layer.shaders { - shader.primitive.prepare( + if !layer.pipelines.is_empty() { + for pipeline in &layer.pipelines { + pipeline.primitive.prepare( format, device, queue, @@ -323,19 +326,17 @@ impl Backend { // kill render pass to let custom shaders get mut access to encoder let _ = ManuallyDrop::into_inner(render_pass); - if !layer.shaders.is_empty() { - for shader in &layer.shaders { - //This extra check is needed since each custom pipeline must set it's own - //scissor rect, which will panic if bounds.w/h < 1 - let bounds = shader.bounds * scale_factor; + if !layer.pipelines.is_empty() { + for pipeline in &layer.pipelines { + let bounds = (pipeline.bounds * scale_factor).snap(); - if bounds.width < 1.0 || bounds.height < 1.0 { + if bounds.width < 1 || bounds.height < 1 { continue; } - shader.primitive.render( + pipeline.primitive.render( &self.pipeline_storage, - bounds.snap(), + bounds, target, target_size, encoder, diff --git a/wgpu/src/custom.rs b/wgpu/src/custom.rs index 65a6f133..98e2b396 100644 --- a/wgpu/src/custom.rs +++ b/wgpu/src/custom.rs @@ -1,67 +1,8 @@ //! Draw custom primitives. use crate::core::{Rectangle, Size}; use crate::graphics::Transformation; +use crate::primitive; + use std::any::{Any, TypeId}; use std::collections::HashMap; use std::fmt::Debug; - -/// Stores custom, user-provided pipelines. -#[derive(Default, Debug)] -pub struct Storage { - pipelines: HashMap<TypeId, Box<dyn Any>>, -} - -impl Storage { - /// Returns `true` if `Storage` contains a pipeline with type `T`. - pub fn has<T: 'static>(&self) -> bool { - self.pipelines.get(&TypeId::of::<T>()).is_some() - } - - /// Inserts the pipeline `T` in to [`Storage`]. - pub fn store<T: 'static>(&mut self, pipeline: T) { - let _ = self.pipelines.insert(TypeId::of::<T>(), Box::new(pipeline)); - } - - /// Returns a reference to pipeline with type `T` if it exists in [`Storage`]. - pub fn get<T: 'static>(&self) -> Option<&T> { - self.pipelines.get(&TypeId::of::<T>()).map(|pipeline| { - pipeline - .downcast_ref::<T>() - .expect("Pipeline with this type does not exist in Storage.") - }) - } - - /// Returns a mutable reference to pipeline `T` if it exists in [`Storage`]. - pub fn get_mut<T: 'static>(&mut self) -> Option<&mut T> { - self.pipelines.get_mut(&TypeId::of::<T>()).map(|pipeline| { - pipeline - .downcast_mut::<T>() - .expect("Pipeline with this type does not exist in Storage.") - }) - } -} - -/// A set of methods which allows a [`Primitive`] to be rendered. -pub trait Primitive: Debug + Send + Sync + 'static { - /// Processes the [`Primitive`], allowing for GPU buffer allocation. - fn prepare( - &self, - format: wgpu::TextureFormat, - device: &wgpu::Device, - queue: &wgpu::Queue, - target_size: Size<u32>, - scale_factor: f32, - transform: Transformation, - storage: &mut Storage, - ); - - /// Renders the [`Primitive`]. - fn render( - &self, - storage: &Storage, - bounds: Rectangle<u32>, - target: &wgpu::TextureView, - target_size: Size<u32>, - encoder: &mut wgpu::CommandEncoder, - ); -} diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index d451cbfd..33aaf670 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -35,8 +35,8 @@ pub struct Layer<'a> { /// The images of the [`Layer`]. pub images: Vec<Image>, - /// The custom shader primitives of this [`Layer`]. - pub shaders: Vec<primitive::Shader>, + /// The custom pipelines of this [`Layer`]. + pub pipelines: Vec<primitive::Pipeline>, } impl<'a> Layer<'a> { @@ -48,7 +48,7 @@ impl<'a> Layer<'a> { meshes: Vec::new(), text: Vec::new(), images: Vec::new(), - shaders: Vec::new(), + pipelines: Vec::new(), } } @@ -312,16 +312,21 @@ impl<'a> Layer<'a> { } } }, - primitive::Custom::Shader(shader) => { + primitive::Custom::Pipeline(pipeline) => { let layer = &mut layers[current_layer]; let bounds = Rectangle::new( Point::new(translation.x, translation.y), - shader.bounds.size(), + pipeline.bounds.size(), ); - if layer.bounds.intersection(&bounds).is_some() { - layer.shaders.push(shader.clone()); + if let Some(clip_bounds) = + layer.bounds.intersection(&bounds) + { + layer.pipelines.push(primitive::Pipeline { + bounds: clip_bounds, + primitive: pipeline.primitive.clone(), + }); } } }, diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 13d8e886..424dfeb3 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -29,7 +29,6 @@ rustdoc::broken_intra_doc_links )] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -pub mod custom; pub mod layer; pub mod primitive; pub mod settings; diff --git a/wgpu/src/primitive.rs b/wgpu/src/primitive.rs index 4347dcda..fff927ea 100644 --- a/wgpu/src/primitive.rs +++ b/wgpu/src/primitive.rs @@ -1,10 +1,12 @@ //! Draw using different graphical primitives. +pub mod pipeline; + +pub use pipeline::Pipeline; + use crate::core::Rectangle; -use crate::custom; use crate::graphics::{Damage, Mesh}; -use std::any::Any; + use std::fmt::Debug; -use std::sync::Arc; /// The graphical primitives supported by `iced_wgpu`. pub type Primitive = crate::graphics::Primitive<Custom>; @@ -14,44 +16,15 @@ pub type Primitive = crate::graphics::Primitive<Custom>; pub enum Custom { /// A mesh primitive. Mesh(Mesh), - /// A custom shader primitive - Shader(Shader), -} - -impl Custom { - /// Create a custom [`Shader`] primitive. - pub fn shader<P: custom::Primitive>( - bounds: Rectangle, - primitive: P, - ) -> Self { - Self::Shader(Shader { - bounds, - primitive: Arc::new(primitive), - }) - } + /// A custom pipeline primitive. + Pipeline(Pipeline), } impl Damage for Custom { fn bounds(&self) -> Rectangle { match self { Self::Mesh(mesh) => mesh.bounds(), - Self::Shader(shader) => shader.bounds, + Self::Pipeline(pipeline) => pipeline.bounds, } } } - -#[derive(Clone, Debug)] -/// A custom primitive which can be used to render primitives associated with a custom pipeline. -pub struct Shader { - /// The bounds of the [`Shader`]. - pub bounds: Rectangle, - - /// The [`custom::Primitive`] to render. - pub primitive: Arc<dyn custom::Primitive>, -} - -impl PartialEq for Shader { - fn eq(&self, other: &Self) -> bool { - self.primitive.type_id() == other.primitive.type_id() - } -} diff --git a/wgpu/src/primitive/pipeline.rs b/wgpu/src/primitive/pipeline.rs new file mode 100644 index 00000000..b59aeff1 --- /dev/null +++ b/wgpu/src/primitive/pipeline.rs @@ -0,0 +1,117 @@ +//! Draw primitives using custom pipelines. +use crate::core::{Rectangle, Size}; +use crate::graphics::Transformation; + +use std::any::{Any, TypeId}; +use std::collections::HashMap; +use std::fmt::Debug; +use std::sync::Arc; + +#[derive(Clone, Debug)] +/// A custom primitive which can be used to render primitives associated with a custom pipeline. +pub struct Pipeline { + /// The bounds of the [`Shader`]. + pub bounds: Rectangle, + + /// The [`custom::Primitive`] to render. + pub primitive: Arc<dyn Primitive>, +} + +impl Pipeline { + /// Creates a new [`Pipeline`] with the given [`Primitive`]. + pub fn new(bounds: Rectangle, primitive: impl Primitive) -> Self { + Pipeline { + bounds, + primitive: Arc::new(primitive), + } + } +} + +impl PartialEq for Pipeline { + fn eq(&self, other: &Self) -> bool { + self.primitive.type_id() == other.primitive.type_id() + } +} + +/// A set of methods which allows a [`Primitive`] to be rendered. +pub trait Primitive: Debug + Send + Sync + 'static { + /// Processes the [`Primitive`], allowing for GPU buffer allocation. + fn prepare( + &self, + format: wgpu::TextureFormat, + device: &wgpu::Device, + queue: &wgpu::Queue, + target_size: Size<u32>, + scale_factor: f32, + transform: Transformation, + storage: &mut Storage, + ); + + /// Renders the [`Primitive`]. + fn render( + &self, + storage: &Storage, + bounds: Rectangle<u32>, + target: &wgpu::TextureView, + target_size: Size<u32>, + encoder: &mut wgpu::CommandEncoder, + ); +} + +/// A renderer than can draw custom pipeline primitives. +pub trait Renderer: crate::core::Renderer { + /// Draws a custom pipeline primitive. + fn draw_pipeline_primitive( + &mut self, + bounds: Rectangle, + primitive: impl Primitive, + ); +} + +impl<Theme> Renderer for crate::Renderer<Theme> { + fn draw_pipeline_primitive( + &mut self, + bounds: Rectangle, + primitive: impl Primitive, + ) { + self.draw_primitive(super::Primitive::Custom(super::Custom::Pipeline( + Pipeline::new(bounds, primitive), + ))); + } +} + +/// Stores custom, user-provided pipelines. +#[derive(Default, Debug)] +pub struct Storage { + pipelines: HashMap<TypeId, Box<dyn Any>>, +} + +impl Storage { + /// Returns `true` if `Storage` contains a pipeline with type `T`. + pub fn has<T: 'static>(&self) -> bool { + self.pipelines.get(&TypeId::of::<T>()).is_some() + } + + /// Inserts the pipeline `T` in to [`Storage`]. + pub fn store<T: 'static>(&mut self, pipeline: T) { + let _ = self.pipelines.insert(TypeId::of::<T>(), Box::new(pipeline)); + } + + /// Returns a reference to pipeline with type `T` if it exists in [`Storage`]. + pub fn get<T: 'static>(&self) -> Option<&T> { + self.pipelines.get(&TypeId::of::<T>()).map(|pipeline| { + pipeline + .downcast_ref::<T>() + .expect("Pipeline with this type does not exist in Storage.") + }) + } + + /// Returns a mutable reference to pipeline `T` if it exists in [`Storage`]. + pub fn get_mut<T: 'static>(&mut self) -> Option<&mut T> { + self.pipelines.get_mut(&TypeId::of::<T>()).map(|pipeline| { + pipeline + .downcast_mut::<T>() + .expect("Pipeline with this type does not exist in Storage.") + }) + } +} diff --git a/widget/src/lib.rs b/widget/src/lib.rs index 5220e83a..07378d83 100644 --- a/widget/src/lib.rs +++ b/widget/src/lib.rs @@ -98,7 +98,11 @@ pub use tooltip::Tooltip; pub use vertical_slider::VerticalSlider; #[cfg(feature = "wgpu")] -pub use renderer::widget::shader::{self, Shader, Transformation}; +pub mod shader; + +#[cfg(feature = "wgpu")] +#[doc(no_inline)] +pub use shader::Shader; #[cfg(feature = "svg")] pub mod svg; diff --git a/renderer/src/widget/shader.rs b/widget/src/shader.rs similarity index 76% rename from renderer/src/widget/shader.rs rename to widget/src/shader.rs index e218f35a..9d482537 100644 --- a/renderer/src/widget/shader.rs +++ b/widget/src/shader.rs @@ -1,25 +1,24 @@ //! A custom shader widget for wgpu applications. -use crate::core::event::Status; -use crate::core::layout::{Limits, Node}; -use crate::core::mouse::{Cursor, Interaction}; -use crate::core::renderer::Style; -use crate::core::widget::tree::{State, Tag}; -use crate::core::widget::{tree, Tree}; -use crate::core::{ - self, layout, mouse, widget, window, Clipboard, Element, Layout, Length, - Rectangle, Shell, Size, Widget, -}; -use std::marker::PhantomData; - mod event; mod program; pub use event::Event; -pub use iced_graphics::Transformation; -pub use iced_wgpu::custom::Primitive; -pub use iced_wgpu::custom::Storage; pub use program::Program; +use crate::core; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::widget::tree::{self, Tree}; +use crate::core::widget::{self, Widget}; +use crate::core::window; +use crate::core::{Clipboard, Element, Length, Rectangle, Shell, Size}; +use crate::renderer::wgpu::primitive::pipeline; + +use std::marker::PhantomData; + +pub use pipeline::{Primitive, Storage}; + /// A widget which can render custom shaders with Iced's `wgpu` backend. /// /// Must be initialized with a [`Program`], which describes the internal widget state & how @@ -56,17 +55,17 @@ impl<Message, P: Program<Message>> Shader<Message, P> { } } -impl<P, Message, Theme> Widget<Message, crate::Renderer<Theme>> - for Shader<Message, P> +impl<P, Message, Renderer> Widget<Message, Renderer> for Shader<Message, P> where P: Program<Message>, + Renderer: pipeline::Renderer, { - fn tag(&self) -> Tag { + fn tag(&self) -> tree::Tag { struct Tag<T>(T); tree::Tag::of::<Tag<P::State>>() } - fn state(&self) -> State { + fn state(&self) -> tree::State { tree::State::new(P::State::default()) } @@ -81,9 +80,9 @@ where fn layout( &self, _tree: &mut Tree, - _renderer: &crate::Renderer<Theme>, - limits: &Limits, - ) -> Node { + _renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { let limits = limits.width(self.width).height(self.height); let size = limits.resolve(Size::ZERO); @@ -95,12 +94,12 @@ where tree: &mut Tree, event: crate::core::Event, layout: Layout<'_>, - cursor: Cursor, - _renderer: &crate::Renderer<Theme>, + cursor: mouse::Cursor, + _renderer: &Renderer, _clipboard: &mut dyn Clipboard, shell: &mut Shell<'_, Message>, _viewport: &Rectangle, - ) -> Status { + ) -> event::Status { let bounds = layout.bounds(); let custom_shader_event = match event { @@ -140,9 +139,9 @@ where &self, tree: &Tree, layout: Layout<'_>, - cursor: Cursor, + cursor: mouse::Cursor, _viewport: &Rectangle, - _renderer: &crate::Renderer<Theme>, + _renderer: &Renderer, ) -> mouse::Interaction { let bounds = layout.bounds(); let state = tree.state.downcast_ref::<P::State>(); @@ -153,9 +152,9 @@ where fn draw( &self, tree: &widget::Tree, - renderer: &mut crate::Renderer<Theme>, - _theme: &Theme, - _style: &Style, + renderer: &mut Renderer, + _theme: &Renderer::Theme, + _style: &renderer::Style, layout: Layout<'_>, cursor_position: mouse::Cursor, _viewport: &Rectangle, @@ -163,20 +162,21 @@ where let bounds = layout.bounds(); let state = tree.state.downcast_ref::<P::State>(); - renderer.draw_custom( + renderer.draw_pipeline_primitive( bounds, self.program.draw(state, cursor_position, bounds), ); } } -impl<'a, M, P, Theme> From<Shader<M, P>> - for Element<'a, M, crate::Renderer<Theme>> +impl<'a, Message, Renderer, P> From<Shader<Message, P>> + for Element<'a, Message, Renderer> where - M: 'a, - P: Program<M> + 'a, + Message: 'a, + Renderer: pipeline::Renderer, + P: Program<Message> + 'a, { - fn from(custom: Shader<M, P>) -> Element<'a, M, crate::Renderer<Theme>> { + fn from(custom: Shader<Message, P>) -> Element<'a, Message, Renderer> { Element::new(custom) } } @@ -193,16 +193,16 @@ where state: &mut Self::State, event: Event, bounds: Rectangle, - cursor: Cursor, + cursor: mouse::Cursor, shell: &mut Shell<'_, Message>, - ) -> (Status, Option<Message>) { + ) -> (event::Status, Option<Message>) { T::update(self, state, event, bounds, cursor, shell) } fn draw( &self, state: &Self::State, - cursor: Cursor, + cursor: mouse::Cursor, bounds: Rectangle, ) -> Self::Primitive { T::draw(self, state, cursor, bounds) @@ -212,8 +212,8 @@ where &self, state: &Self::State, bounds: Rectangle, - cursor: Cursor, - ) -> Interaction { + cursor: mouse::Cursor, + ) -> mouse::Interaction { T::mouse_interaction(self, state, bounds, cursor) } } diff --git a/renderer/src/widget/shader/event.rs b/widget/src/shader/event.rs similarity index 99% rename from renderer/src/widget/shader/event.rs rename to widget/src/shader/event.rs index 8901fb31..e4d2b03d 100644 --- a/renderer/src/widget/shader/event.rs +++ b/widget/src/shader/event.rs @@ -2,6 +2,7 @@ use crate::core::keyboard; use crate::core::mouse; use crate::core::touch; + use std::time::Instant; pub use crate::core::event::Status; diff --git a/renderer/src/widget/shader/program.rs b/widget/src/shader/program.rs similarity index 89% rename from renderer/src/widget/shader/program.rs rename to widget/src/shader/program.rs index b8871688..0319844d 100644 --- a/renderer/src/widget/shader/program.rs +++ b/widget/src/shader/program.rs @@ -1,6 +1,8 @@ -use crate::core::{event, mouse, Rectangle, Shell}; -use crate::widget; -use widget::shader; +use crate::core::event; +use crate::core::mouse; +use crate::core::{Rectangle, Shell}; +use crate::renderer::wgpu::primitive::pipeline; +use crate::shader; /// The state and logic of a [`Shader`] widget. /// @@ -13,7 +15,7 @@ pub trait Program<Message> { type State: Default + 'static; /// The type of primitive this [`Program`] can draw. - type Primitive: shader::Primitive + 'static; + type Primitive: pipeline::Primitive + 'static; /// Update the internal [`State`] of the [`Program`]. This can be used to reflect state changes /// based on mouse & other events. You can use the [`Shell`] to publish messages, request a From 882ae304ac8da899d7d83aed433b7dd3311a0496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 12:51:08 +0100 Subject: [PATCH 154/286] Enable `iced_renderer/wgpu` feature in `iced_widget` --- widget/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/Cargo.toml b/widget/Cargo.toml index 032f801c..e8e363c4 100644 --- a/widget/Cargo.toml +++ b/widget/Cargo.toml @@ -20,7 +20,7 @@ image = ["iced_renderer/image"] svg = ["iced_renderer/svg"] canvas = ["iced_renderer/geometry"] qr_code = ["canvas", "qrcode"] -wgpu = [] +wgpu = ["iced_renderer/wgpu"] [dependencies] iced_renderer.workspace = true From c2baf18cbff721e25c3103b6235292530b419c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 12:52:03 +0100 Subject: [PATCH 155/286] Use `Instant` from `iced_core` instead of `std` This is needed for Wasm compatibility. --- widget/src/shader/event.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/widget/src/shader/event.rs b/widget/src/shader/event.rs index e4d2b03d..a5a7acaa 100644 --- a/widget/src/shader/event.rs +++ b/widget/src/shader/event.rs @@ -1,10 +1,9 @@ //! Handle events of a custom shader widget. use crate::core::keyboard; use crate::core::mouse; +use crate::core::time::Instant; use crate::core::touch; -use std::time::Instant; - pub use crate::core::event::Status; /// A [`Shader`] event. From 280d3736d59b62c4087fe980c187953cc2be83d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 13:23:28 +0100 Subject: [PATCH 156/286] Fix broken intra-doc links --- wgpu/src/primitive/pipeline.rs | 4 ++-- widget/src/shader/event.rs | 2 +- widget/src/shader/program.rs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wgpu/src/primitive/pipeline.rs b/wgpu/src/primitive/pipeline.rs index b59aeff1..5dbd6697 100644 --- a/wgpu/src/primitive/pipeline.rs +++ b/wgpu/src/primitive/pipeline.rs @@ -10,10 +10,10 @@ use std::sync::Arc; #[derive(Clone, Debug)] /// A custom primitive which can be used to render primitives associated with a custom pipeline. pub struct Pipeline { - /// The bounds of the [`Shader`]. + /// The bounds of the [`Pipeline`]. pub bounds: Rectangle, - /// The [`custom::Primitive`] to render. + /// The [`Primitive`] to render. pub primitive: Arc<dyn Primitive>, } diff --git a/widget/src/shader/event.rs b/widget/src/shader/event.rs index a5a7acaa..1cc484fb 100644 --- a/widget/src/shader/event.rs +++ b/widget/src/shader/event.rs @@ -8,7 +8,7 @@ pub use crate::core::event::Status; /// A [`Shader`] event. /// -/// [`Shader`]: crate::widget::shader::Shader; +/// [`Shader`]: crate::Shader #[derive(Debug, Clone, Copy, PartialEq)] pub enum Event { /// A mouse event. diff --git a/widget/src/shader/program.rs b/widget/src/shader/program.rs index 0319844d..6dd50404 100644 --- a/widget/src/shader/program.rs +++ b/widget/src/shader/program.rs @@ -9,7 +9,7 @@ use crate::shader; /// A [`Program`] can mutate the internal state of a [`Shader`] widget /// and produce messages for an application. /// -/// [`Shader`]: crate::widget::shader::Shader +/// [`Shader`]: crate::Shader pub trait Program<Message> { /// The internal state of the [`Program`]. type State: Default + 'static; @@ -50,7 +50,7 @@ pub trait Program<Message> { /// The interaction returned will be in effect even if the cursor position is out of /// bounds of the [`Shader`]'s program. /// - /// [`Shader`]: crate::widget::shader::Shader + /// [`Shader`]: crate::Shader fn mouse_interaction( &self, _state: &Self::State, From 91d7df52cdedd1b5c431fdb51a6356e827765b60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 13:25:49 +0100 Subject: [PATCH 157/286] Create `shader` function helper in `iced_widget` --- examples/custom_shader/src/main.rs | 7 +++---- widget/src/helpers.rs | 11 +++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index f6370f46..e9b6776f 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -10,7 +10,7 @@ use crate::pipeline::Pipeline; use iced::executor; use iced::time::Instant; use iced::widget::{ - checkbox, column, container, row, slider, text, vertical_space, Shader, + checkbox, column, container, row, shader, slider, text, vertical_space, }; use iced::window; use iced::{ @@ -150,9 +150,8 @@ impl Application for IcedCubes { .spacing(10) .align_items(Alignment::Center); - let shader = Shader::new(&self.cubes) - .width(Length::Fill) - .height(Length::Fill); + let shader = + shader(&self.cubes).width(Length::Fill).height(Length::Fill); container( column![shader, controls, vertical_space(20),] diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index e0b58722..115198fb 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -385,6 +385,17 @@ where crate::Canvas::new(program) } +/// Creates a new [`Shader`]. +/// +/// [`Shader`]: crate::Shader +#[cfg(feature = "wgpu")] +pub fn shader<Message, P>(program: P) -> crate::Shader<Message, P> +where + P: crate::shader::Program<Message>, +{ + crate::Shader::new(program) +} + /// Focuses the previous focusable widget. pub fn focus_previous<Message>() -> Command<Message> where From 63f36b04638f14af3455ead8b82d581a438a28a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:04:54 +0100 Subject: [PATCH 158/286] Export `wgpu` crate in `shader` module in `iced_widget` --- examples/custom_shader/Cargo.toml | 1 - examples/custom_shader/src/main.rs | 1 + examples/custom_shader/src/pipeline.rs | 4 +++- examples/custom_shader/src/primitive.rs | 1 + examples/custom_shader/src/primitive/buffer.rs | 2 ++ examples/custom_shader/src/primitive/cube.rs | 2 ++ examples/custom_shader/src/primitive/vertex.rs | 2 ++ widget/src/shader.rs | 1 + 8 files changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/custom_shader/Cargo.toml b/examples/custom_shader/Cargo.toml index 0b8466a9..b602f98d 100644 --- a/examples/custom_shader/Cargo.toml +++ b/examples/custom_shader/Cargo.toml @@ -9,7 +9,6 @@ iced.workspace = true iced.features = ["debug", "advanced"] image.workspace = true -wgpu.workspace = true bytemuck.workspace = true glam.workspace = true diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index e9b6776f..e7b07d78 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -9,6 +9,7 @@ use crate::pipeline::Pipeline; use iced::executor; use iced::time::Instant; +use iced::widget::shader::wgpu; use iced::widget::{ checkbox, column, container, row, shader, slider, text, vertical_space, }; diff --git a/examples/custom_shader/src/pipeline.rs b/examples/custom_shader/src/pipeline.rs index 44ad17a2..9343e5e0 100644 --- a/examples/custom_shader/src/pipeline.rs +++ b/examples/custom_shader/src/pipeline.rs @@ -1,8 +1,10 @@ use crate::primitive; use crate::primitive::cube; use crate::primitive::{Buffer, Uniforms}; +use crate::wgpu; +use crate::wgpu::util::DeviceExt; + use iced::{Rectangle, Size}; -use wgpu::util::DeviceExt; const SKY_TEXTURE_SIZE: u32 = 128; diff --git a/examples/custom_shader/src/primitive.rs b/examples/custom_shader/src/primitive.rs index 520ceb8e..f5862ab3 100644 --- a/examples/custom_shader/src/primitive.rs +++ b/examples/custom_shader/src/primitive.rs @@ -9,6 +9,7 @@ pub use cube::Cube; pub use uniforms::Uniforms; pub use vertex::Vertex; +use crate::wgpu; use crate::Camera; use crate::Pipeline; diff --git a/examples/custom_shader/src/primitive/buffer.rs b/examples/custom_shader/src/primitive/buffer.rs index 377ce1bb..ef4c41c9 100644 --- a/examples/custom_shader/src/primitive/buffer.rs +++ b/examples/custom_shader/src/primitive/buffer.rs @@ -1,3 +1,5 @@ +use crate::wgpu; + // A custom buffer container for dynamic resizing. pub struct Buffer { pub raw: wgpu::Buffer, diff --git a/examples/custom_shader/src/primitive/cube.rs b/examples/custom_shader/src/primitive/cube.rs index c23f2132..7ece685d 100644 --- a/examples/custom_shader/src/primitive/cube.rs +++ b/examples/custom_shader/src/primitive/cube.rs @@ -1,4 +1,6 @@ use crate::primitive::Vertex; +use crate::wgpu; + use glam::{vec2, vec3, Vec3}; use rand::{thread_rng, Rng}; diff --git a/examples/custom_shader/src/primitive/vertex.rs b/examples/custom_shader/src/primitive/vertex.rs index 6d17aa0f..e64cd926 100644 --- a/examples/custom_shader/src/primitive/vertex.rs +++ b/examples/custom_shader/src/primitive/vertex.rs @@ -1,3 +1,5 @@ +use crate::wgpu; + #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] #[repr(C)] pub struct Vertex { diff --git a/widget/src/shader.rs b/widget/src/shader.rs index 9d482537..fe6214db 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -17,6 +17,7 @@ use crate::renderer::wgpu::primitive::pipeline; use std::marker::PhantomData; +pub use crate::renderer::wgpu::wgpu; pub use pipeline::{Primitive, Storage}; /// A widget which can render custom shaders with Iced's `wgpu` backend. From 78a06384b1e6fc5e0c472dc19169fcaf11fe27b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:36:38 +0100 Subject: [PATCH 159/286] Use a single source for amount of cubes in `custom_shader` example --- examples/custom_shader/src/main.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index e7b07d78..3336e7f5 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -26,7 +26,6 @@ fn main() -> iced::Result { struct IcedCubes { start: Instant, cubes: Cubes, - num_cubes_slider: u32, } impl Default for IcedCubes { @@ -34,7 +33,6 @@ impl Default for IcedCubes { Self { start: Instant::now(), cubes: Cubes::new(), - num_cubes_slider: cubes::MAX, } } } @@ -65,7 +63,6 @@ impl Application for IcedCubes { fn update(&mut self, message: Self::Message) -> Command<Self::Message> { match message { Message::CubeAmountChanged(num) => { - self.num_cubes_slider = num; self.cubes.adjust_num_cubes(num); } Message::CubeSizeChanged(size) => { @@ -91,7 +88,7 @@ impl Application for IcedCubes { "Amount", slider( 1..=cubes::MAX, - self.num_cubes_slider, + self.cubes.cubes.len() as u32, Message::CubeAmountChanged ) .width(100) From 9ddfaf3ee73cef3e7bd122f4d11893f77647c2c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:41:48 +0100 Subject: [PATCH 160/286] Rename `cubes` to `scene` in `custom_shader` example --- examples/custom_shader/src/main.rs | 42 +++++++++---------- .../custom_shader/src/{cubes.rs => scene.rs} | 20 ++++----- 2 files changed, 31 insertions(+), 31 deletions(-) rename examples/custom_shader/src/{cubes.rs => scene.rs} (84%) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index 3336e7f5..f90061d7 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -1,11 +1,11 @@ mod camera; -mod cubes; mod pipeline; mod primitive; +mod scene; use crate::camera::Camera; -use crate::cubes::Cubes; use crate::pipeline::Pipeline; +use crate::scene::Scene; use iced::executor; use iced::time::Instant; @@ -25,14 +25,14 @@ fn main() -> iced::Result { struct IcedCubes { start: Instant, - cubes: Cubes, + scene: Scene, } impl Default for IcedCubes { fn default() -> Self { Self { start: Instant::now(), - cubes: Cubes::new(), + scene: Scene::new(), } } } @@ -62,20 +62,20 @@ impl Application for IcedCubes { fn update(&mut self, message: Self::Message) -> Command<Self::Message> { match message { - Message::CubeAmountChanged(num) => { - self.cubes.adjust_num_cubes(num); + Message::CubeAmountChanged(amount) => { + self.scene.change_amount(amount); } Message::CubeSizeChanged(size) => { - self.cubes.size = size; + self.scene.size = size; } Message::Tick(time) => { - self.cubes.update(time - self.start); + self.scene.update(time - self.start); } Message::ShowDepthBuffer(show) => { - self.cubes.show_depth_buffer = show; + self.scene.show_depth_buffer = show; } Message::LightColorChanged(color) => { - self.cubes.light_color = color; + self.scene.light_color = color; } } @@ -87,21 +87,21 @@ impl Application for IcedCubes { control( "Amount", slider( - 1..=cubes::MAX, - self.cubes.cubes.len() as u32, + 1..=scene::MAX, + self.scene.cubes.len() as u32, Message::CubeAmountChanged ) .width(100) ), control( "Size", - slider(0.1..=0.25, self.cubes.size, Message::CubeSizeChanged) + slider(0.1..=0.25, self.scene.size, Message::CubeSizeChanged) .step(0.01) .width(100), ), checkbox( "Show Depth Buffer", - self.cubes.show_depth_buffer, + self.scene.show_depth_buffer, Message::ShowDepthBuffer ), ] @@ -110,10 +110,10 @@ impl Application for IcedCubes { let bottom_controls = row![ control( "R", - slider(0.0..=1.0, self.cubes.light_color.r, move |r| { + slider(0.0..=1.0, self.scene.light_color.r, move |r| { Message::LightColorChanged(Color { r, - ..self.cubes.light_color + ..self.scene.light_color }) }) .step(0.01) @@ -121,10 +121,10 @@ impl Application for IcedCubes { ), control( "G", - slider(0.0..=1.0, self.cubes.light_color.g, move |g| { + slider(0.0..=1.0, self.scene.light_color.g, move |g| { Message::LightColorChanged(Color { g, - ..self.cubes.light_color + ..self.scene.light_color }) }) .step(0.01) @@ -132,10 +132,10 @@ impl Application for IcedCubes { ), control( "B", - slider(0.0..=1.0, self.cubes.light_color.b, move |b| { + slider(0.0..=1.0, self.scene.light_color.b, move |b| { Message::LightColorChanged(Color { b, - ..self.cubes.light_color + ..self.scene.light_color }) }) .step(0.01) @@ -149,7 +149,7 @@ impl Application for IcedCubes { .align_items(Alignment::Center); let shader = - shader(&self.cubes).width(Length::Fill).height(Length::Fill); + shader(&self.scene).width(Length::Fill).height(Length::Fill); container( column![shader, controls, vertical_space(20),] diff --git a/examples/custom_shader/src/cubes.rs b/examples/custom_shader/src/scene.rs similarity index 84% rename from examples/custom_shader/src/cubes.rs rename to examples/custom_shader/src/scene.rs index 00e608e3..ab923093 100644 --- a/examples/custom_shader/src/cubes.rs +++ b/examples/custom_shader/src/scene.rs @@ -12,7 +12,7 @@ use std::time::Duration; pub const MAX: u32 = 500; #[derive(Clone)] -pub struct Cubes { +pub struct Scene { pub size: f32, pub cubes: Vec<Cube>, pub camera: Camera, @@ -20,9 +20,9 @@ pub struct Cubes { pub light_color: Color, } -impl Cubes { +impl Scene { pub fn new() -> Self { - let mut cubes = Self { + let mut scene = Self { size: 0.2, cubes: vec![], camera: Camera::default(), @@ -30,9 +30,9 @@ impl Cubes { light_color: Color::WHITE, }; - cubes.adjust_num_cubes(MAX); + scene.change_amount(MAX); - cubes + scene } pub fn update(&mut self, time: Duration) { @@ -41,13 +41,13 @@ impl Cubes { } } - pub fn adjust_num_cubes(&mut self, num_cubes: u32) { + pub fn change_amount(&mut self, amount: u32) { let curr_cubes = self.cubes.len() as u32; - match num_cubes.cmp(&curr_cubes) { + match amount.cmp(&curr_cubes) { Ordering::Greater => { // spawn - let cubes_2_spawn = (num_cubes - curr_cubes) as usize; + let cubes_2_spawn = (amount - curr_cubes) as usize; let mut cubes = 0; self.cubes.extend(iter::from_fn(|| { @@ -61,7 +61,7 @@ impl Cubes { } Ordering::Less => { // chop - let cubes_2_cut = curr_cubes - num_cubes; + let cubes_2_cut = curr_cubes - amount; let new_len = self.cubes.len() - cubes_2_cut as usize; self.cubes.truncate(new_len); } @@ -70,7 +70,7 @@ impl Cubes { } } -impl<Message> shader::Program<Message> for Cubes { +impl<Message> shader::Program<Message> for Scene { type State = (); type Primitive = primitive::Primitive; From 34b5cb75ef9f97076dd9e306d8afb68058176883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:43:02 +0100 Subject: [PATCH 161/286] Remove `Default` implementation in `custom_shader` example --- examples/custom_shader/src/main.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index f90061d7..f4853507 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -28,15 +28,6 @@ struct IcedCubes { scene: Scene, } -impl Default for IcedCubes { - fn default() -> Self { - Self { - start: Instant::now(), - scene: Scene::new(), - } - } -} - #[derive(Debug, Clone)] enum Message { CubeAmountChanged(u32), @@ -53,7 +44,13 @@ impl Application for IcedCubes { type Flags = (); fn new(_flags: Self::Flags) -> (Self, Command<Self::Message>) { - (IcedCubes::default(), Command::none()) + ( + Self { + start: Instant::now(), + scene: Scene::new(), + }, + Command::none(), + ) } fn title(&self) -> String { From fee3bf0df4e3099ea74def738be8743b2b72d78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:47:29 +0100 Subject: [PATCH 162/286] Kill current render pass only when custom pipelines are present in layer --- wgpu/src/backend.rs | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index f89bcee1..91ae777b 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -323,10 +323,9 @@ impl Backend { text_layer += 1; } - // kill render pass to let custom shaders get mut access to encoder - let _ = ManuallyDrop::into_inner(render_pass); - if !layer.pipelines.is_empty() { + let _ = ManuallyDrop::into_inner(render_pass); + for pipeline in &layer.pipelines { let bounds = (pipeline.bounds * scale_factor).snap(); @@ -342,27 +341,26 @@ impl Backend { encoder, ); } - } - // recreate and continue processing layers - render_pass = ManuallyDrop::new(encoder.begin_render_pass( - &wgpu::RenderPassDescriptor { - label: Some("iced_wgpu::quad render pass"), - color_attachments: &[Some( - wgpu::RenderPassColorAttachment { - view: target, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Load, - store: wgpu::StoreOp::Store, + render_pass = ManuallyDrop::new(encoder.begin_render_pass( + &wgpu::RenderPassDescriptor { + label: Some("iced_wgpu::quad render pass"), + color_attachments: &[Some( + wgpu::RenderPassColorAttachment { + view: target, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: wgpu::StoreOp::Store, + }, }, - }, - )], - depth_stencil_attachment: None, - timestamp_writes: None, - occlusion_query_set: None, - }, - )); + )], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }, + )); + } } let _ = ManuallyDrop::into_inner(render_pass); From b1b2467b45e16185cc17df00b4c75700435cd46e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 14:50:57 +0100 Subject: [PATCH 163/286] Fix render pass label in `iced_wgpu` --- wgpu/src/backend.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 91ae777b..88caad06 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -222,7 +222,7 @@ impl Backend { let mut render_pass = ManuallyDrop::new(encoder.begin_render_pass( &wgpu::RenderPassDescriptor { - label: Some("iced_wgpu::quad render pass"), + label: Some("iced_wgpu render pass"), color_attachments: &[Some(wgpu::RenderPassColorAttachment { view: target, resolve_target: None, @@ -285,7 +285,7 @@ impl Backend { render_pass = ManuallyDrop::new(encoder.begin_render_pass( &wgpu::RenderPassDescriptor { - label: Some("iced_wgpu::quad render pass"), + label: Some("iced_wgpu render pass"), color_attachments: &[Some( wgpu::RenderPassColorAttachment { view: target, @@ -344,7 +344,7 @@ impl Backend { render_pass = ManuallyDrop::new(encoder.begin_render_pass( &wgpu::RenderPassDescriptor { - label: Some("iced_wgpu::quad render pass"), + label: Some("iced_wgpu render pass"), color_attachments: &[Some( wgpu::RenderPassColorAttachment { view: target, From 811aa673e9e832ebe38bf56a087f32fdc7aba59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 15:48:01 +0100 Subject: [PATCH 164/286] Improve module hierarchy of `custom_shader` example --- examples/custom_shader/src/main.rs | 7 +- examples/custom_shader/src/primitive.rs | 97 ----------------- examples/custom_shader/src/scene.rs | 103 ++++++++++++++++-- .../custom_shader/src/{ => scene}/camera.rs | 0 .../custom_shader/src/{ => scene}/pipeline.rs | 35 +++--- .../{primitive => scene/pipeline}/buffer.rs | 0 .../src/{primitive => scene/pipeline}/cube.rs | 2 +- .../{primitive => scene/pipeline}/uniforms.rs | 3 +- .../{primitive => scene/pipeline}/vertex.rs | 0 widget/src/shader.rs | 1 + 10 files changed, 122 insertions(+), 126 deletions(-) delete mode 100644 examples/custom_shader/src/primitive.rs rename examples/custom_shader/src/{ => scene}/camera.rs (100%) rename examples/custom_shader/src/{ => scene}/pipeline.rs (96%) rename examples/custom_shader/src/{primitive => scene/pipeline}/buffer.rs (100%) rename examples/custom_shader/src/{primitive => scene/pipeline}/cube.rs (99%) rename examples/custom_shader/src/{primitive => scene/pipeline}/uniforms.rs (95%) rename examples/custom_shader/src/{primitive => scene/pipeline}/vertex.rs (100%) diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index f4853507..2eb1ac4a 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -1,11 +1,6 @@ -mod camera; -mod pipeline; -mod primitive; mod scene; -use crate::camera::Camera; -use crate::pipeline::Pipeline; -use crate::scene::Scene; +use scene::Scene; use iced::executor; use iced::time::Instant; diff --git a/examples/custom_shader/src/primitive.rs b/examples/custom_shader/src/primitive.rs deleted file mode 100644 index f5862ab3..00000000 --- a/examples/custom_shader/src/primitive.rs +++ /dev/null @@ -1,97 +0,0 @@ -pub mod cube; -pub mod vertex; - -mod buffer; -mod uniforms; - -pub use buffer::Buffer; -pub use cube::Cube; -pub use uniforms::Uniforms; -pub use vertex::Vertex; - -use crate::wgpu; -use crate::Camera; -use crate::Pipeline; - -use iced::advanced::graphics::Transformation; -use iced::widget::shader; -use iced::{Color, Rectangle, Size}; - -/// A collection of `Cube`s that can be rendered. -#[derive(Debug)] -pub struct Primitive { - cubes: Vec<cube::Raw>, - uniforms: Uniforms, - show_depth_buffer: bool, -} - -impl Primitive { - pub fn new( - cubes: &[Cube], - camera: &Camera, - bounds: Rectangle, - show_depth_buffer: bool, - light_color: Color, - ) -> Self { - let uniforms = Uniforms::new(camera, bounds, light_color); - - Self { - cubes: cubes - .iter() - .map(cube::Raw::from_cube) - .collect::<Vec<cube::Raw>>(), - uniforms, - show_depth_buffer, - } - } -} - -impl shader::Primitive for Primitive { - fn prepare( - &self, - format: wgpu::TextureFormat, - device: &wgpu::Device, - queue: &wgpu::Queue, - target_size: Size<u32>, - _scale_factor: f32, - _transform: Transformation, - storage: &mut shader::Storage, - ) { - if !storage.has::<Pipeline>() { - storage.store(Pipeline::new(device, queue, format, target_size)); - } - - let pipeline = storage.get_mut::<Pipeline>().unwrap(); - - //upload data to GPU - pipeline.update( - device, - queue, - target_size, - &self.uniforms, - self.cubes.len(), - &self.cubes, - ); - } - - fn render( - &self, - storage: &shader::Storage, - bounds: Rectangle<u32>, - target: &wgpu::TextureView, - _target_size: Size<u32>, - encoder: &mut wgpu::CommandEncoder, - ) { - //at this point our pipeline should always be initialized - let pipeline = storage.get::<Pipeline>().unwrap(); - - //render primitive - pipeline.render( - target, - encoder, - bounds, - self.cubes.len() as u32, - self.show_depth_buffer, - ); - } -} diff --git a/examples/custom_shader/src/scene.rs b/examples/custom_shader/src/scene.rs index ab923093..3b291ce2 100644 --- a/examples/custom_shader/src/scene.rs +++ b/examples/custom_shader/src/scene.rs @@ -1,13 +1,21 @@ -use crate::camera::Camera; -use crate::primitive; -use crate::primitive::cube::Cube; -use glam::Vec3; +mod camera; +mod pipeline; + +use camera::Camera; +use pipeline::Pipeline; + +use crate::wgpu; +use pipeline::cube::{self, Cube}; + +use iced::mouse; +use iced::time::Duration; use iced::widget::shader; -use iced::{mouse, Color, Rectangle}; +use iced::{Color, Rectangle, Size}; + +use glam::Vec3; use rand::Rng; use std::cmp::Ordering; use std::iter; -use std::time::Duration; pub const MAX: u32 = 500; @@ -72,7 +80,7 @@ impl Scene { impl<Message> shader::Program<Message> for Scene { type State = (); - type Primitive = primitive::Primitive; + type Primitive = Primitive; fn draw( &self, @@ -80,7 +88,7 @@ impl<Message> shader::Program<Message> for Scene { _cursor: mouse::Cursor, bounds: Rectangle, ) -> Self::Primitive { - primitive::Primitive::new( + Primitive::new( &self.cubes, &self.camera, bounds, @@ -90,6 +98,85 @@ impl<Message> shader::Program<Message> for Scene { } } +/// A collection of `Cube`s that can be rendered. +#[derive(Debug)] +pub struct Primitive { + cubes: Vec<cube::Raw>, + uniforms: pipeline::Uniforms, + show_depth_buffer: bool, +} + +impl Primitive { + pub fn new( + cubes: &[Cube], + camera: &Camera, + bounds: Rectangle, + show_depth_buffer: bool, + light_color: Color, + ) -> Self { + let uniforms = pipeline::Uniforms::new(camera, bounds, light_color); + + Self { + cubes: cubes + .iter() + .map(cube::Raw::from_cube) + .collect::<Vec<cube::Raw>>(), + uniforms, + show_depth_buffer, + } + } +} + +impl shader::Primitive for Primitive { + fn prepare( + &self, + format: wgpu::TextureFormat, + device: &wgpu::Device, + queue: &wgpu::Queue, + target_size: Size<u32>, + _scale_factor: f32, + _transform: shader::Transformation, + storage: &mut shader::Storage, + ) { + if !storage.has::<Pipeline>() { + storage.store(Pipeline::new(device, queue, format, target_size)); + } + + let pipeline = storage.get_mut::<Pipeline>().unwrap(); + + //upload data to GPU + pipeline.update( + device, + queue, + target_size, + &self.uniforms, + self.cubes.len(), + &self.cubes, + ); + } + + fn render( + &self, + storage: &shader::Storage, + bounds: Rectangle<u32>, + target: &wgpu::TextureView, + _target_size: Size<u32>, + encoder: &mut wgpu::CommandEncoder, + ) { + //at this point our pipeline should always be initialized + let pipeline = storage.get::<Pipeline>().unwrap(); + + //render primitive + pipeline.render( + target, + encoder, + bounds, + self.cubes.len() as u32, + self.show_depth_buffer, + ); + } +} + fn rnd_origin() -> Vec3 { Vec3::new( rand::thread_rng().gen_range(-4.0..4.0), diff --git a/examples/custom_shader/src/camera.rs b/examples/custom_shader/src/scene/camera.rs similarity index 100% rename from examples/custom_shader/src/camera.rs rename to examples/custom_shader/src/scene/camera.rs diff --git a/examples/custom_shader/src/pipeline.rs b/examples/custom_shader/src/scene/pipeline.rs similarity index 96% rename from examples/custom_shader/src/pipeline.rs rename to examples/custom_shader/src/scene/pipeline.rs index 9343e5e0..0967e139 100644 --- a/examples/custom_shader/src/pipeline.rs +++ b/examples/custom_shader/src/scene/pipeline.rs @@ -1,6 +1,15 @@ -use crate::primitive; -use crate::primitive::cube; -use crate::primitive::{Buffer, Uniforms}; +pub mod cube; + +mod buffer; +mod uniforms; +mod vertex; + +pub use cube::Cube; +pub use uniforms::Uniforms; + +use buffer::Buffer; +use vertex::Vertex; + use crate::wgpu; use crate::wgpu::util::DeviceExt; @@ -221,7 +230,7 @@ impl Pipeline { device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("cubes shader"), source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed( - include_str!("shaders/cubes.wgsl"), + include_str!("../shaders/cubes.wgsl"), )), }); @@ -232,7 +241,7 @@ impl Pipeline { vertex: wgpu::VertexState { module: &shader, entry_point: "vs_main", - buffers: &[primitive::Vertex::desc(), cube::Raw::desc()], + buffers: &[Vertex::desc(), cube::Raw::desc()], }, primitive: wgpu::PrimitiveState::default(), depth_stencil: Some(wgpu::DepthStencilState { @@ -468,7 +477,7 @@ impl DepthPipeline { device.create_shader_module(wgpu::ShaderModuleDescriptor { label: Some("cubes.depth_pipeline.shader"), source: wgpu::ShaderSource::Wgsl(std::borrow::Cow::Borrowed( - include_str!("shaders/depth.wgsl"), + include_str!("../shaders/depth.wgsl"), )), }); @@ -573,12 +582,12 @@ impl DepthPipeline { } fn load_skybox_data() -> Vec<u8> { - let pos_x: &[u8] = include_bytes!("textures/skybox/pos_x.jpg"); - let neg_x: &[u8] = include_bytes!("textures/skybox/neg_x.jpg"); - let pos_y: &[u8] = include_bytes!("textures/skybox/pos_y.jpg"); - let neg_y: &[u8] = include_bytes!("textures/skybox/neg_y.jpg"); - let pos_z: &[u8] = include_bytes!("textures/skybox/pos_z.jpg"); - let neg_z: &[u8] = include_bytes!("textures/skybox/neg_z.jpg"); + let pos_x: &[u8] = include_bytes!("../textures/skybox/pos_x.jpg"); + let neg_x: &[u8] = include_bytes!("../textures/skybox/neg_x.jpg"); + let pos_y: &[u8] = include_bytes!("../textures/skybox/pos_y.jpg"); + let neg_y: &[u8] = include_bytes!("../textures/skybox/neg_y.jpg"); + let pos_z: &[u8] = include_bytes!("../textures/skybox/pos_z.jpg"); + let neg_z: &[u8] = include_bytes!("../textures/skybox/neg_z.jpg"); let data: [&[u8]; 6] = [pos_x, neg_x, pos_y, neg_y, pos_z, neg_z]; @@ -597,7 +606,7 @@ fn load_skybox_data() -> Vec<u8> { } fn load_normal_map_data() -> Vec<u8> { - let bytes: &[u8] = include_bytes!("textures/ice_cube_normal_map.png"); + let bytes: &[u8] = include_bytes!("../textures/ice_cube_normal_map.png"); image::load_from_memory_with_format(bytes, image::ImageFormat::Png) .unwrap() diff --git a/examples/custom_shader/src/primitive/buffer.rs b/examples/custom_shader/src/scene/pipeline/buffer.rs similarity index 100% rename from examples/custom_shader/src/primitive/buffer.rs rename to examples/custom_shader/src/scene/pipeline/buffer.rs diff --git a/examples/custom_shader/src/primitive/cube.rs b/examples/custom_shader/src/scene/pipeline/cube.rs similarity index 99% rename from examples/custom_shader/src/primitive/cube.rs rename to examples/custom_shader/src/scene/pipeline/cube.rs index 7ece685d..de8bad6c 100644 --- a/examples/custom_shader/src/primitive/cube.rs +++ b/examples/custom_shader/src/scene/pipeline/cube.rs @@ -1,4 +1,4 @@ -use crate::primitive::Vertex; +use crate::scene::pipeline::Vertex; use crate::wgpu; use glam::{vec2, vec3, Vec3}; diff --git a/examples/custom_shader/src/primitive/uniforms.rs b/examples/custom_shader/src/scene/pipeline/uniforms.rs similarity index 95% rename from examples/custom_shader/src/primitive/uniforms.rs rename to examples/custom_shader/src/scene/pipeline/uniforms.rs index 4fcb413b..1eac8292 100644 --- a/examples/custom_shader/src/primitive/uniforms.rs +++ b/examples/custom_shader/src/scene/pipeline/uniforms.rs @@ -1,4 +1,5 @@ -use crate::camera::Camera; +use crate::scene::Camera; + use iced::{Color, Rectangle}; #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] diff --git a/examples/custom_shader/src/primitive/vertex.rs b/examples/custom_shader/src/scene/pipeline/vertex.rs similarity index 100% rename from examples/custom_shader/src/primitive/vertex.rs rename to examples/custom_shader/src/scene/pipeline/vertex.rs diff --git a/widget/src/shader.rs b/widget/src/shader.rs index fe6214db..ca140627 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -17,6 +17,7 @@ use crate::renderer::wgpu::primitive::pipeline; use std::marker::PhantomData; +pub use crate::graphics::Transformation; pub use crate::renderer::wgpu::wgpu; pub use pipeline::{Primitive, Storage}; From 77dfa60c9640236df8b56084a6b1c58826b51e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 15:49:09 +0100 Subject: [PATCH 165/286] Move `textures` directory outside of `src` in `custom_shader` example --- examples/custom_shader/src/scene/pipeline.rs | 14 +++++++------- .../{src => }/textures/ice_cube_normal_map.png | Bin .../{src => }/textures/skybox/neg_x.jpg | Bin .../{src => }/textures/skybox/neg_y.jpg | Bin .../{src => }/textures/skybox/neg_z.jpg | Bin .../{src => }/textures/skybox/pos_x.jpg | Bin .../{src => }/textures/skybox/pos_y.jpg | Bin .../{src => }/textures/skybox/pos_z.jpg | Bin 8 files changed, 7 insertions(+), 7 deletions(-) rename examples/custom_shader/{src => }/textures/ice_cube_normal_map.png (100%) rename examples/custom_shader/{src => }/textures/skybox/neg_x.jpg (100%) rename examples/custom_shader/{src => }/textures/skybox/neg_y.jpg (100%) rename examples/custom_shader/{src => }/textures/skybox/neg_z.jpg (100%) rename examples/custom_shader/{src => }/textures/skybox/pos_x.jpg (100%) rename examples/custom_shader/{src => }/textures/skybox/pos_y.jpg (100%) rename examples/custom_shader/{src => }/textures/skybox/pos_z.jpg (100%) diff --git a/examples/custom_shader/src/scene/pipeline.rs b/examples/custom_shader/src/scene/pipeline.rs index 0967e139..3956c12e 100644 --- a/examples/custom_shader/src/scene/pipeline.rs +++ b/examples/custom_shader/src/scene/pipeline.rs @@ -582,12 +582,12 @@ impl DepthPipeline { } fn load_skybox_data() -> Vec<u8> { - let pos_x: &[u8] = include_bytes!("../textures/skybox/pos_x.jpg"); - let neg_x: &[u8] = include_bytes!("../textures/skybox/neg_x.jpg"); - let pos_y: &[u8] = include_bytes!("../textures/skybox/pos_y.jpg"); - let neg_y: &[u8] = include_bytes!("../textures/skybox/neg_y.jpg"); - let pos_z: &[u8] = include_bytes!("../textures/skybox/pos_z.jpg"); - let neg_z: &[u8] = include_bytes!("../textures/skybox/neg_z.jpg"); + let pos_x: &[u8] = include_bytes!("../../textures/skybox/pos_x.jpg"); + let neg_x: &[u8] = include_bytes!("../../textures/skybox/neg_x.jpg"); + let pos_y: &[u8] = include_bytes!("../../textures/skybox/pos_y.jpg"); + let neg_y: &[u8] = include_bytes!("../../textures/skybox/neg_y.jpg"); + let pos_z: &[u8] = include_bytes!("../../textures/skybox/pos_z.jpg"); + let neg_z: &[u8] = include_bytes!("../../textures/skybox/neg_z.jpg"); let data: [&[u8]; 6] = [pos_x, neg_x, pos_y, neg_y, pos_z, neg_z]; @@ -606,7 +606,7 @@ fn load_skybox_data() -> Vec<u8> { } fn load_normal_map_data() -> Vec<u8> { - let bytes: &[u8] = include_bytes!("../textures/ice_cube_normal_map.png"); + let bytes: &[u8] = include_bytes!("../../textures/ice_cube_normal_map.png"); image::load_from_memory_with_format(bytes, image::ImageFormat::Png) .unwrap() diff --git a/examples/custom_shader/src/textures/ice_cube_normal_map.png b/examples/custom_shader/textures/ice_cube_normal_map.png similarity index 100% rename from examples/custom_shader/src/textures/ice_cube_normal_map.png rename to examples/custom_shader/textures/ice_cube_normal_map.png diff --git a/examples/custom_shader/src/textures/skybox/neg_x.jpg b/examples/custom_shader/textures/skybox/neg_x.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/neg_x.jpg rename to examples/custom_shader/textures/skybox/neg_x.jpg diff --git a/examples/custom_shader/src/textures/skybox/neg_y.jpg b/examples/custom_shader/textures/skybox/neg_y.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/neg_y.jpg rename to examples/custom_shader/textures/skybox/neg_y.jpg diff --git a/examples/custom_shader/src/textures/skybox/neg_z.jpg b/examples/custom_shader/textures/skybox/neg_z.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/neg_z.jpg rename to examples/custom_shader/textures/skybox/neg_z.jpg diff --git a/examples/custom_shader/src/textures/skybox/pos_x.jpg b/examples/custom_shader/textures/skybox/pos_x.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/pos_x.jpg rename to examples/custom_shader/textures/skybox/pos_x.jpg diff --git a/examples/custom_shader/src/textures/skybox/pos_y.jpg b/examples/custom_shader/textures/skybox/pos_y.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/pos_y.jpg rename to examples/custom_shader/textures/skybox/pos_y.jpg diff --git a/examples/custom_shader/src/textures/skybox/pos_z.jpg b/examples/custom_shader/textures/skybox/pos_z.jpg similarity index 100% rename from examples/custom_shader/src/textures/skybox/pos_z.jpg rename to examples/custom_shader/textures/skybox/pos_z.jpg From 74b920a708afc2407cb495a2953e97114f7773b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 15:52:55 +0100 Subject: [PATCH 166/286] Remove unnecessary `self` in `iced_style::theme` --- style/src/theme.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/style/src/theme.rs b/style/src/theme.rs index cc31d72d..47010728 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -1,7 +1,7 @@ //! Use the built-in theme and styles. pub mod palette; -pub use self::palette::Palette; +pub use palette::Palette; use crate::application; use crate::button; From 8f384c83be242f9318685530ee52dd6c27b2bb62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 15:54:10 +0100 Subject: [PATCH 167/286] Remove unsused `custom.rs` file in `iced_wgpu` --- wgpu/src/custom.rs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 wgpu/src/custom.rs diff --git a/wgpu/src/custom.rs b/wgpu/src/custom.rs deleted file mode 100644 index 98e2b396..00000000 --- a/wgpu/src/custom.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Draw custom primitives. -use crate::core::{Rectangle, Size}; -use crate::graphics::Transformation; -use crate::primitive; - -use std::any::{Any, TypeId}; -use std::collections::HashMap; -use std::fmt::Debug; From 0968c5b64a528ff92a5a93f6586eef557546da25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 14 Nov 2023 15:58:32 +0100 Subject: [PATCH 168/286] Remove unused import in `custom_shader` example --- examples/custom_shader/src/scene/pipeline.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/custom_shader/src/scene/pipeline.rs b/examples/custom_shader/src/scene/pipeline.rs index 3956c12e..94c6c562 100644 --- a/examples/custom_shader/src/scene/pipeline.rs +++ b/examples/custom_shader/src/scene/pipeline.rs @@ -4,7 +4,6 @@ mod buffer; mod uniforms; mod vertex; -pub use cube::Cube; pub use uniforms::Uniforms; use buffer::Buffer; From 7dd32f3be43c72e11dac5e07918e9ad6d36b6555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 15 Nov 2023 10:27:26 +0100 Subject: [PATCH 169/286] Update `itertools` dependency for `game_of_life` example --- examples/game_of_life/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/game_of_life/Cargo.toml b/examples/game_of_life/Cargo.toml index 9b291de8..7596844c 100644 --- a/examples/game_of_life/Cargo.toml +++ b/examples/game_of_life/Cargo.toml @@ -9,7 +9,7 @@ publish = false iced.workspace = true iced.features = ["debug", "canvas", "tokio"] -itertools = "0.11" +itertools = "0.12" rustc-hash.workspace = true tokio = { workspace = true, features = ["sync"] } tracing-subscriber = "0.3" From 25006b9c6f2ae909d86871d3a13631d518c07158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 21 Nov 2023 14:41:22 +0100 Subject: [PATCH 170/286] Fix `Overlay` composition Translations were not easily composable. --- core/src/overlay.rs | 3 ++- core/src/overlay/element.rs | 20 ++++++++++++++++---- core/src/overlay/group.rs | 9 +++++---- runtime/src/overlay/nested.rs | 18 +++++++++++++----- runtime/src/user_interface.rs | 30 +++++++++++++++++++++++------- widget/src/lazy.rs | 5 +++-- widget/src/lazy/component.rs | 3 ++- widget/src/lazy/responsive.rs | 6 ++++-- widget/src/overlay/menu.rs | 1 + widget/src/tooltip.rs | 1 + 10 files changed, 70 insertions(+), 26 deletions(-) diff --git a/core/src/overlay.rs b/core/src/overlay.rs index f71f25f7..af10afee 100644 --- a/core/src/overlay.rs +++ b/core/src/overlay.rs @@ -11,7 +11,7 @@ use crate::mouse; use crate::renderer; use crate::widget; use crate::widget::Tree; -use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size}; +use crate::{Clipboard, Layout, Point, Rectangle, Shell, Size, Vector}; /// An interactive component that can be displayed on top of other widgets. pub trait Overlay<Message, Renderer> @@ -29,6 +29,7 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node; /// Draws the [`Overlay`] using the associated `Renderer`. diff --git a/core/src/overlay/element.rs b/core/src/overlay/element.rs index 3dd58f9b..a279fe28 100644 --- a/core/src/overlay/element.rs +++ b/core/src/overlay/element.rs @@ -13,6 +13,7 @@ use std::any::Any; #[allow(missing_debug_implementations)] pub struct Element<'a, Message, Renderer> { position: Point, + translation: Vector, overlay: Box<dyn Overlay<Message, Renderer> + 'a>, } @@ -25,7 +26,11 @@ where position: Point, overlay: Box<dyn Overlay<Message, Renderer> + 'a>, ) -> Self { - Self { position, overlay } + Self { + position, + overlay, + translation: Vector::ZERO, + } } /// Returns the position of the [`Element`]. @@ -36,6 +41,7 @@ where /// Translates the [`Element`]. pub fn translate(mut self, translation: Vector) -> Self { self.position = self.position + translation; + self.translation = self.translation + translation; self } @@ -48,6 +54,7 @@ where { Element { position: self.position, + translation: self.translation, overlay: Box::new(Map::new(self.overlay, f)), } } @@ -59,8 +66,12 @@ where bounds: Size, translation: Vector, ) -> layout::Node { - self.overlay - .layout(renderer, bounds, self.position + translation) + self.overlay.layout( + renderer, + bounds, + self.position + translation, + self.translation + translation, + ) } /// Processes a runtime [`Event`]. @@ -154,8 +165,9 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node { - self.content.layout(renderer, bounds, position) + self.content.layout(renderer, bounds, position, translation) } fn operate( diff --git a/core/src/overlay/group.rs b/core/src/overlay/group.rs index dccf6dba..e1e9727a 100644 --- a/core/src/overlay/group.rs +++ b/core/src/overlay/group.rs @@ -4,7 +4,9 @@ use crate::mouse; use crate::overlay; use crate::renderer; use crate::widget; -use crate::{Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size}; +use crate::{ + Clipboard, Event, Layout, Overlay, Point, Rectangle, Shell, Size, Vector, +}; /// An [`Overlay`] container that displays multiple overlay [`overlay::Element`] /// children. @@ -64,10 +66,9 @@ where &mut self, renderer: &Renderer, bounds: Size, - position: Point, + _position: Point, + translation: Vector, ) -> layout::Node { - let translation = position - Point::ORIGIN; - layout::Node::with_children( bounds, self.children diff --git a/runtime/src/overlay/nested.rs b/runtime/src/overlay/nested.rs index 062ccc72..b7cfc918 100644 --- a/runtime/src/overlay/nested.rs +++ b/runtime/src/overlay/nested.rs @@ -4,7 +4,9 @@ use crate::core::mouse; use crate::core::overlay; use crate::core::renderer; use crate::core::widget; -use crate::core::{Clipboard, Event, Layout, Point, Rectangle, Shell, Size}; +use crate::core::{ + Clipboard, Event, Layout, Point, Rectangle, Shell, Size, Vector, +}; /// An overlay container that displays nested overlays #[allow(missing_debug_implementations)] @@ -34,18 +36,18 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node { fn recurse<Message, Renderer>( element: &mut overlay::Element<'_, Message, Renderer>, renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node where Renderer: renderer::Renderer, { - let translation = position - Point::ORIGIN; - let node = element.layout(renderer, bounds, translation); if let Some(mut nested) = @@ -55,7 +57,13 @@ where node.size(), vec![ node, - recurse(&mut nested, renderer, bounds, position), + recurse( + &mut nested, + renderer, + bounds, + position, + translation, + ), ], ) } else { @@ -63,7 +71,7 @@ where } } - recurse(&mut self.overlay, renderer, bounds, position) + recurse(&mut self.overlay, renderer, bounds, position, translation) } /// Draws the [`Nested`] overlay using the associated `Renderer`. diff --git a/runtime/src/user_interface.rs b/runtime/src/user_interface.rs index dae9e0ac..3594ac18 100644 --- a/runtime/src/user_interface.rs +++ b/runtime/src/user_interface.rs @@ -5,7 +5,9 @@ use crate::core::mouse; use crate::core::renderer; use crate::core::widget; use crate::core::window; -use crate::core::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; +use crate::core::{ + Clipboard, Element, Layout, Point, Rectangle, Shell, Size, Vector, +}; use crate::overlay; /// A set of interactive graphical elements with a specific [`Layout`]. @@ -199,7 +201,8 @@ where let bounds = self.bounds; let mut overlay = manual_overlay.as_mut().unwrap(); - let mut layout = overlay.layout(renderer, bounds, Point::ORIGIN); + let mut layout = + overlay.layout(renderer, bounds, Point::ORIGIN, Vector::ZERO); let mut event_statuses = Vec::new(); for event in events.iter().cloned() { @@ -253,8 +256,12 @@ where overlay = manual_overlay.as_mut().unwrap(); shell.revalidate_layout(|| { - layout = - overlay.layout(renderer, bounds, Point::ORIGIN); + layout = overlay.layout( + renderer, + bounds, + Point::ORIGIN, + Vector::ZERO, + ); }); } @@ -448,7 +455,12 @@ where .map(overlay::Nested::new) { let overlay_layout = self.overlay.take().unwrap_or_else(|| { - overlay.layout(renderer, self.bounds, Point::ORIGIN) + overlay.layout( + renderer, + self.bounds, + Point::ORIGIN, + Vector::ZERO, + ) }); let cursor = if cursor @@ -566,8 +578,12 @@ where .map(overlay::Nested::new) { if self.overlay.is_none() { - self.overlay = - Some(overlay.layout(renderer, self.bounds, Point::ORIGIN)); + self.overlay = Some(overlay.layout( + renderer, + self.bounds, + Point::ORIGIN, + Vector::ZERO, + )); } overlay.operate( diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs index 589dd938..167a055d 100644 --- a/widget/src/lazy.rs +++ b/widget/src/lazy.rs @@ -18,7 +18,7 @@ use crate::core::widget::tree::{self, Tree}; use crate::core::widget::{self, Widget}; use crate::core::Element; use crate::core::{ - self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size, + self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size, Vector, }; use crate::runtime::overlay::Nested; @@ -333,9 +333,10 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node { self.with_overlay_maybe(|overlay| { - overlay.layout(renderer, bounds, position) + overlay.layout(renderer, bounds, position, translation) }) .unwrap_or_default() } diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index d454b72b..ad0c3823 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -577,9 +577,10 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node { self.with_overlay_maybe(|overlay| { - overlay.layout(renderer, bounds, position) + overlay.layout(renderer, bounds, position, translation) }) .unwrap_or_default() } diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index ed471988..86d37b6c 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -6,7 +6,8 @@ use crate::core::renderer; use crate::core::widget; use crate::core::widget::tree::{self, Tree}; use crate::core::{ - self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget, + self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, + Widget, }; use crate::horizontal_space; use crate::runtime::overlay::Nested; @@ -367,9 +368,10 @@ where renderer: &Renderer, bounds: Size, position: Point, + translation: Vector, ) -> layout::Node { self.with_overlay_maybe(|overlay| { - overlay.layout(renderer, bounds, position) + overlay.layout(renderer, bounds, position, translation) }) .unwrap_or_default() } diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index b293f9fa..5098fa17 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -236,6 +236,7 @@ where renderer: &Renderer, bounds: Size, position: Point, + _translation: Vector, ) -> layout::Node { let space_below = bounds.height - (position.y + self.target_height); let space_above = position.y; diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs index b041d2e9..d5ee3de2 100644 --- a/widget/src/tooltip.rs +++ b/widget/src/tooltip.rs @@ -325,6 +325,7 @@ where renderer: &Renderer, bounds: Size, position: Point, + _translation: Vector, ) -> layout::Node { let viewport = Rectangle::with_size(bounds); From 921ddec1285027a6a2feb88b0a5c29ec8f942f8b Mon Sep 17 00:00:00 2001 From: arslee07 <mail@arslee.me> Date: Wed, 22 Nov 2023 00:32:01 +0900 Subject: [PATCH 171/286] Use the correct GIF for the progress bar example --- examples/progress_bar/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/progress_bar/README.md b/examples/progress_bar/README.md index 1268ac6b..a87829c6 100644 --- a/examples/progress_bar/README.md +++ b/examples/progress_bar/README.md @@ -5,7 +5,7 @@ A simple progress bar that can be filled by using a slider. The __[`main`]__ file contains all the code of the example. <div align="center"> - <img src="https://iced.rs/examples/pokedex.gif"> + <img src="https://iced.rs/examples/progress_bar.gif"> </div> You can run it with `cargo run`: From a1439071d691be8096ce956df90d1553fe5b3694 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 21 Nov 2023 18:53:31 +0100 Subject: [PATCH 172/286] Remove unused `position` argument in `overlay::Nested` --- runtime/src/overlay/nested.rs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/runtime/src/overlay/nested.rs b/runtime/src/overlay/nested.rs index b7cfc918..4256efb7 100644 --- a/runtime/src/overlay/nested.rs +++ b/runtime/src/overlay/nested.rs @@ -35,14 +35,13 @@ where &mut self, renderer: &Renderer, bounds: Size, - position: Point, + _position: Point, translation: Vector, ) -> layout::Node { fn recurse<Message, Renderer>( element: &mut overlay::Element<'_, Message, Renderer>, renderer: &Renderer, bounds: Size, - position: Point, translation: Vector, ) -> layout::Node where @@ -57,13 +56,7 @@ where node.size(), vec![ node, - recurse( - &mut nested, - renderer, - bounds, - position, - translation, - ), + recurse(&mut nested, renderer, bounds, translation), ], ) } else { @@ -71,7 +64,7 @@ where } } - recurse(&mut self.overlay, renderer, bounds, position, translation) + recurse(&mut self.overlay, renderer, bounds, translation) } /// Draws the [`Nested`] overlay using the associated `Renderer`. From 89e3de7c08dc07eefbcc2617f0da63282aa1c8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 21 Nov 2023 18:55:53 +0100 Subject: [PATCH 173/286] Fix `modal` and `toast` examples --- examples/modal/src/main.rs | 2 ++ examples/toast/src/main.rs | 1 + 2 files changed, 3 insertions(+) diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index 3b69f5e6..acb14372 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -231,6 +231,7 @@ mod modal { use iced::mouse; use iced::{ BorderRadius, Color, Element, Event, Length, Point, Rectangle, Size, + Vector, }; /// A widget that centers a modal element over some base element @@ -413,6 +414,7 @@ mod modal { renderer: &Renderer, _bounds: Size, position: Point, + _translation: Vector, ) -> layout::Node { let limits = layout::Limits::new(Size::ZERO, self.size) .width(Length::Fill) diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 5b089e8a..934049d5 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -511,6 +511,7 @@ mod toast { renderer: &Renderer, bounds: Size, position: Point, + _translation: Vector, ) -> layout::Node { let limits = layout::Limits::new(Size::ZERO, bounds) .width(Length::Fill) From f67387f2d80e744618a5f4f107509ba24802146c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 21 Nov 2023 18:11:31 +0100 Subject: [PATCH 174/286] Invalidate layout when `Tooltip` changes `overlay` --- widget/src/tooltip.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs index b041d2e9..9745bc1c 100644 --- a/widget/src/tooltip.rs +++ b/widget/src/tooltip.rs @@ -157,11 +157,19 @@ where ) -> event::Status { let state = tree.state.downcast_mut::<State>(); + let was_idle = *state == State::Idle; + *state = cursor .position_over(layout.bounds()) .map(|cursor_position| State::Hovered { cursor_position }) .unwrap_or_default(); + let is_idle = *state == State::Idle; + + if was_idle != is_idle { + shell.invalidate_layout(); + } + self.content.as_widget_mut().on_event( &mut tree.children[0], event, @@ -289,7 +297,7 @@ pub enum Position { Right, } -#[derive(Debug, Clone, Copy, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Default)] enum State { #[default] Idle, From ab7dae554cac801aeed5d9aa4d3850d50be86263 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 28 Nov 2023 23:13:38 +0100 Subject: [PATCH 175/286] Provide actual bounds to `Shader` primitives ... and allow for proper translation and scissoring. --- examples/custom_shader/src/main.rs | 21 ++++++++------------ examples/custom_shader/src/scene.rs | 6 +++--- examples/custom_shader/src/scene/pipeline.rs | 21 ++++++++++++-------- wgpu/src/backend.rs | 8 ++++---- wgpu/src/layer.rs | 15 +++++++------- wgpu/src/layer/pipeline.rs | 17 ++++++++++++++++ wgpu/src/primitive/pipeline.rs | 5 ++--- widget/src/shader.rs | 1 - 8 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 wgpu/src/layer/pipeline.rs diff --git a/examples/custom_shader/src/main.rs b/examples/custom_shader/src/main.rs index 2eb1ac4a..3bfa3a43 100644 --- a/examples/custom_shader/src/main.rs +++ b/examples/custom_shader/src/main.rs @@ -5,9 +5,7 @@ use scene::Scene; use iced::executor; use iced::time::Instant; use iced::widget::shader::wgpu; -use iced::widget::{ - checkbox, column, container, row, shader, slider, text, vertical_space, -}; +use iced::widget::{checkbox, column, container, row, shader, slider, text}; use iced::window; use iced::{ Alignment, Application, Color, Command, Element, Length, Renderer, @@ -138,21 +136,18 @@ impl Application for IcedCubes { let controls = column![top_controls, bottom_controls,] .spacing(10) + .padding(20) .align_items(Alignment::Center); let shader = shader(&self.scene).width(Length::Fill).height(Length::Fill); - container( - column![shader, controls, vertical_space(20),] - .spacing(40) - .align_items(Alignment::Center), - ) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into() + container(column![shader, controls].align_items(Alignment::Center)) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() } fn subscription(&self) -> Subscription<Self::Message> { diff --git a/examples/custom_shader/src/scene.rs b/examples/custom_shader/src/scene.rs index 3b291ce2..a35efdd9 100644 --- a/examples/custom_shader/src/scene.rs +++ b/examples/custom_shader/src/scene.rs @@ -133,9 +133,9 @@ impl shader::Primitive for Primitive { format: wgpu::TextureFormat, device: &wgpu::Device, queue: &wgpu::Queue, + _bounds: Rectangle, target_size: Size<u32>, _scale_factor: f32, - _transform: shader::Transformation, storage: &mut shader::Storage, ) { if !storage.has::<Pipeline>() { @@ -158,9 +158,9 @@ impl shader::Primitive for Primitive { fn render( &self, storage: &shader::Storage, - bounds: Rectangle<u32>, target: &wgpu::TextureView, _target_size: Size<u32>, + viewport: Rectangle<u32>, encoder: &mut wgpu::CommandEncoder, ) { //at this point our pipeline should always be initialized @@ -170,7 +170,7 @@ impl shader::Primitive for Primitive { pipeline.render( target, encoder, - bounds, + viewport, self.cubes.len() as u32, self.show_depth_buffer, ); diff --git a/examples/custom_shader/src/scene/pipeline.rs b/examples/custom_shader/src/scene/pipeline.rs index 94c6c562..124b421f 100644 --- a/examples/custom_shader/src/scene/pipeline.rs +++ b/examples/custom_shader/src/scene/pipeline.rs @@ -351,7 +351,7 @@ impl Pipeline { &self, target: &wgpu::TextureView, encoder: &mut wgpu::CommandEncoder, - bounds: Rectangle<u32>, + viewport: Rectangle<u32>, num_cubes: u32, show_depth: bool, ) { @@ -384,10 +384,10 @@ impl Pipeline { }); pass.set_scissor_rect( - bounds.x, - bounds.y, - bounds.width, - bounds.height, + viewport.x, + viewport.y, + viewport.width, + viewport.height, ); pass.set_pipeline(&self.pipeline); pass.set_bind_group(0, &self.uniform_bind_group, &[]); @@ -397,7 +397,7 @@ impl Pipeline { } if show_depth { - self.depth_pipeline.render(encoder, target, bounds); + self.depth_pipeline.render(encoder, target, viewport); } } } @@ -550,7 +550,7 @@ impl DepthPipeline { &self, encoder: &mut wgpu::CommandEncoder, target: &wgpu::TextureView, - bounds: Rectangle<u32>, + viewport: Rectangle<u32>, ) { let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { label: Some("cubes.pipeline.depth_pass"), @@ -573,7 +573,12 @@ impl DepthPipeline { occlusion_query_set: None, }); - pass.set_scissor_rect(bounds.x, bounds.y, bounds.width, bounds.height); + pass.set_scissor_rect( + viewport.x, + viewport.y, + viewport.width, + viewport.height, + ); pass.set_pipeline(&self.pipeline); pass.set_bind_group(0, &self.bind_group, &[]); pass.draw(0..6, 0..1); diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 88caad06..25134d68 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -192,9 +192,9 @@ impl Backend { format, device, queue, + pipeline.bounds, target_size, scale_factor, - transformation, &mut self.pipeline_storage, ); } @@ -327,17 +327,17 @@ impl Backend { let _ = ManuallyDrop::into_inner(render_pass); for pipeline in &layer.pipelines { - let bounds = (pipeline.bounds * scale_factor).snap(); + let viewport = (pipeline.viewport * scale_factor).snap(); - if bounds.width < 1 || bounds.height < 1 { + if viewport.width < 1 || viewport.height < 1 { continue; } pipeline.primitive.render( &self.pipeline_storage, - bounds, target, target_size, + viewport, encoder, ); } diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 33aaf670..98e49f1a 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -1,11 +1,13 @@ //! Organize rendering primitives into a flattened list of layers. mod image; +mod pipeline; mod text; pub mod mesh; pub use image::Image; pub use mesh::Mesh; +pub use pipeline::Pipeline; pub use text::Text; use crate::core; @@ -36,7 +38,7 @@ pub struct Layer<'a> { pub images: Vec<Image>, /// The custom pipelines of this [`Layer`]. - pub pipelines: Vec<primitive::Pipeline>, + pub pipelines: Vec<Pipeline>, } impl<'a> Layer<'a> { @@ -314,17 +316,14 @@ impl<'a> Layer<'a> { }, primitive::Custom::Pipeline(pipeline) => { let layer = &mut layers[current_layer]; - - let bounds = Rectangle::new( - Point::new(translation.x, translation.y), - pipeline.bounds.size(), - ); + let bounds = pipeline.bounds + translation; if let Some(clip_bounds) = layer.bounds.intersection(&bounds) { - layer.pipelines.push(primitive::Pipeline { - bounds: clip_bounds, + layer.pipelines.push(Pipeline { + bounds, + viewport: clip_bounds, primitive: pipeline.primitive.clone(), }); } diff --git a/wgpu/src/layer/pipeline.rs b/wgpu/src/layer/pipeline.rs new file mode 100644 index 00000000..6dfe6750 --- /dev/null +++ b/wgpu/src/layer/pipeline.rs @@ -0,0 +1,17 @@ +use crate::core::Rectangle; +use crate::primitive::pipeline::Primitive; + +use std::sync::Arc; + +#[derive(Clone, Debug)] +/// A custom primitive which can be used to render primitives associated with a custom pipeline. +pub struct Pipeline { + /// The bounds of the [`Pipeline`]. + pub bounds: Rectangle, + + /// The viewport of the [`Pipeline`]. + pub viewport: Rectangle, + + /// The [`Primitive`] to render. + pub primitive: Arc<dyn Primitive>, +} diff --git a/wgpu/src/primitive/pipeline.rs b/wgpu/src/primitive/pipeline.rs index 5dbd6697..302e38f6 100644 --- a/wgpu/src/primitive/pipeline.rs +++ b/wgpu/src/primitive/pipeline.rs @@ -1,6 +1,5 @@ //! Draw primitives using custom pipelines. use crate::core::{Rectangle, Size}; -use crate::graphics::Transformation; use std::any::{Any, TypeId}; use std::collections::HashMap; @@ -41,9 +40,9 @@ pub trait Primitive: Debug + Send + Sync + 'static { format: wgpu::TextureFormat, device: &wgpu::Device, queue: &wgpu::Queue, + bounds: Rectangle, target_size: Size<u32>, scale_factor: f32, - transform: Transformation, storage: &mut Storage, ); @@ -51,9 +50,9 @@ pub trait Primitive: Debug + Send + Sync + 'static { fn render( &self, storage: &Storage, - bounds: Rectangle<u32>, target: &wgpu::TextureView, target_size: Size<u32>, + viewport: Rectangle<u32>, encoder: &mut wgpu::CommandEncoder, ); } diff --git a/widget/src/shader.rs b/widget/src/shader.rs index ca140627..fe6214db 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -17,7 +17,6 @@ use crate::renderer::wgpu::primitive::pipeline; use std::marker::PhantomData; -pub use crate::graphics::Transformation; pub use crate::renderer::wgpu::wgpu; pub use pipeline::{Primitive, Storage}; From 3b7d479534d9114ed12bb5d9ccd910e85d5c13c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 00:12:48 +0100 Subject: [PATCH 176/286] Implement `Command::run` for executing a `Stream` to completion --- futures/src/runtime.rs | 25 ++++++++++++++++++++++++- runtime/src/command.rs | 14 +++++++++++++- runtime/src/command/action.rs | 9 ++++++++- winit/src/application.rs | 3 +++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/futures/src/runtime.rs b/futures/src/runtime.rs index 16111b36..cac7b7e1 100644 --- a/futures/src/runtime.rs +++ b/futures/src/runtime.rs @@ -1,7 +1,7 @@ //! Run commands and keep track of subscriptions. use crate::core::event::{self, Event}; use crate::subscription; -use crate::{BoxFuture, Executor, MaybeSend}; +use crate::{BoxFuture, BoxStream, Executor, MaybeSend}; use futures::{channel::mpsc, Sink}; use std::marker::PhantomData; @@ -69,6 +69,29 @@ where self.executor.spawn(future); } + /// Runs a [`Stream`] in the [`Runtime`] until completion. + /// + /// The resulting `Message`s will be forwarded to the `Sender` of the + /// [`Runtime`]. + /// + /// [`Stream`]: BoxStream + pub fn run(&mut self, stream: BoxStream<Message>) { + use futures::{FutureExt, StreamExt}; + + let sender = self.sender.clone(); + let future = + stream.map(Ok).forward(sender).map(|result| match result { + Ok(()) => (), + Err(error) => { + log::warn!( + "Stream could not run until completion: {error}" + ); + } + }); + + self.executor.spawn(future); + } + /// Tracks a [`Subscription`] in the [`Runtime`]. /// /// It will spawn new streams or close old ones as necessary! See diff --git a/runtime/src/command.rs b/runtime/src/command.rs index b74097bd..b942f3ce 100644 --- a/runtime/src/command.rs +++ b/runtime/src/command.rs @@ -4,8 +4,10 @@ mod action; pub use action::Action; use crate::core::widget; +use crate::futures::futures; use crate::futures::MaybeSend; +use futures::Stream; use std::fmt; use std::future::Future; @@ -43,11 +45,21 @@ impl<T> Command<T> { future: impl Future<Output = A> + 'static + MaybeSend, f: impl FnOnce(A) -> T + 'static + MaybeSend, ) -> Command<T> { - use iced_futures::futures::FutureExt; + use futures::FutureExt; Command::single(Action::Future(Box::pin(future.map(f)))) } + /// Creates a [`Command`] that runs the given stream to completion. + pub fn run<A>( + stream: impl Stream<Item = A> + 'static + MaybeSend, + f: impl Fn(A) -> T + 'static + MaybeSend, + ) -> Command<T> { + use futures::StreamExt; + + Command::single(Action::Stream(Box::pin(stream.map(f)))) + } + /// Creates a [`Command`] that performs the actions of all the given /// commands. /// diff --git a/runtime/src/command/action.rs b/runtime/src/command/action.rs index 6c74f0ef..6551e233 100644 --- a/runtime/src/command/action.rs +++ b/runtime/src/command/action.rs @@ -18,6 +18,11 @@ pub enum Action<T> { /// [`Future`]: iced_futures::BoxFuture Future(iced_futures::BoxFuture<T>), + /// Run a [`Stream`] to completion. + /// + /// [`Stream`]: iced_futures::BoxStream + Stream(iced_futures::BoxStream<T>), + /// Run a clipboard action. Clipboard(clipboard::Action<T>), @@ -52,10 +57,11 @@ impl<T> Action<T> { A: 'static, T: 'static, { - use iced_futures::futures::FutureExt; + use iced_futures::futures::{FutureExt, StreamExt}; match self { Self::Future(future) => Action::Future(Box::pin(future.map(f))), + Self::Stream(stream) => Action::Stream(Box::pin(stream.map(f))), Self::Clipboard(action) => Action::Clipboard(action.map(f)), Self::Window(window) => Action::Window(window.map(f)), Self::System(system) => Action::System(system.map(f)), @@ -74,6 +80,7 @@ impl<T> fmt::Debug for Action<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Self::Future(_) => write!(f, "Action::Future"), + Self::Stream(_) => write!(f, "Action::Stream"), Self::Clipboard(action) => { write!(f, "Action::Clipboard({action:?})") } diff --git a/winit/src/application.rs b/winit/src/application.rs index 315e34d9..2c5c864a 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -736,6 +736,9 @@ pub fn run_command<A, C, E>( command::Action::Future(future) => { runtime.spawn(future); } + command::Action::Stream(stream) => { + runtime.run(stream); + } command::Action::Clipboard(action) => match action { clipboard::Action::Read(tag) => { let message = tag(clipboard.read()); From a761448858521d11dc646e2ef5217e9e06628932 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 00:14:27 +0100 Subject: [PATCH 177/286] Implement `command::channel` helper It is analogous to `subscription::channel`. --- runtime/src/command.rs | 21 +++++++++++++++++++++ src/lib.rs | 7 ++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/runtime/src/command.rs b/runtime/src/command.rs index b942f3ce..f70da915 100644 --- a/runtime/src/command.rs +++ b/runtime/src/command.rs @@ -7,6 +7,7 @@ use crate::core::widget; use crate::futures::futures; use crate::futures::MaybeSend; +use futures::channel::mpsc; use futures::Stream; use std::fmt; use std::future::Future; @@ -118,3 +119,23 @@ impl<T> fmt::Debug for Command<T> { command.fmt(f) } } + +/// Creates a [`Command`] that produces the `Message`s published from a [`Future`] +/// to an [`mpsc::Sender`] with the given bounds. +pub fn channel<Fut, Message>( + size: usize, + f: impl FnOnce(mpsc::Sender<Message>) -> Fut + MaybeSend + 'static, +) -> Command<Message> +where + Fut: Future<Output = ()> + MaybeSend + 'static, + Message: 'static + MaybeSend, +{ + use futures::future; + use futures::stream::{self, StreamExt}; + + let (sender, receiver) = mpsc::channel(size); + + let runner = stream::once(f(sender)).filter_map(|_| future::ready(None)); + + Command::single(Action::Stream(Box::pin(stream::select(receiver, runner)))) +} diff --git a/src/lib.rs b/src/lib.rs index f9f3952c..47766e6f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -190,7 +190,6 @@ pub use crate::core::{ color, Alignment, Background, BorderRadius, Color, ContentFit, Degrees, Gradient, Length, Padding, Pixels, Point, Radians, Rectangle, Size, Vector, }; -pub use crate::runtime::Command; pub mod clipboard { //! Access the clipboard. @@ -239,6 +238,11 @@ pub mod mouse { }; } +pub mod command { + //! Run asynchronous actions. + pub use crate::runtime::command::{channel, Command}; +} + pub mod subscription { //! Listen to external events in your application. pub use iced_futures::subscription::{ @@ -287,6 +291,7 @@ pub mod widget { } pub use application::Application; +pub use command::Command; pub use error::Error; pub use event::Event; pub use executor::Executor; From 7e7d65a23d864e4662c43028a41244ca30cac540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 01:06:58 +0100 Subject: [PATCH 178/286] Fix Discourse badge in `README` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 825219aa..eb2befbc 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![License](https://img.shields.io/crates/l/iced.svg)](https://github.com/iced-rs/iced/blob/master/LICENSE) [![Downloads](https://img.shields.io/crates/d/iced.svg)](https://crates.io/crates/iced) [![Test Status](https://img.shields.io/github/actions/workflow/status/iced-rs/iced/test.yml?branch=master&event=push&label=test)](https://github.com/iced-rs/iced/actions) -[![Discourse](https://img.shields.io/discourse/users?server=https%3A%2F%2Fdiscourse.iced.rs&color=5e7ce2)](https://discourse.iced.rs/) +[![Discourse](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdiscourse.iced.rs%2Fsite%2Fstatistics.json&query=%24.users_count&suffix=%20users&label=discourse&color=5e7ce2)](https://discourse.iced.rs/) [![Discord Server](https://img.shields.io/discord/628993209984614400?label=&labelColor=6A7EC2&logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/3xZJ65GAhd) A cross-platform GUI library for Rust focused on simplicity and type-safety. From 6dca076c8b18c3cdb702fa55045866cbd413cc55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:32:41 +0100 Subject: [PATCH 179/286] Use `workspace` dependency for `raw-window-handle` --- core/Cargo.toml | 4 ++-- winit/Cargo.toml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 7db4fa53..4672c754 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -23,8 +23,8 @@ palette.optional = true [target.'cfg(target_arch = "wasm32")'.dependencies] instant.workspace = true -[target.'cfg(windows)'.dependencies.raw-window-handle] -version = "0.5.2" +[target.'cfg(windows)'.dependencies] +raw-window-handle.workspace = true [dev-dependencies] approx = "0.5" diff --git a/winit/Cargo.toml b/winit/Cargo.toml index bab05b91..87e600ae 100644 --- a/winit/Cargo.toml +++ b/winit/Cargo.toml @@ -27,7 +27,6 @@ iced_runtime.workspace = true iced_style.workspace = true log.workspace = true -raw-window-handle.workspace = true thiserror.workspace = true tracing.workspace = true window_clipboard.workspace = true From abe13b530514c8ce63a0ef90172082258e35a43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:33:20 +0100 Subject: [PATCH 180/286] Move `multi-window` feature before the `advanced` one --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aba66f39..0afbcd51 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,10 +49,10 @@ web-colors = ["iced_renderer/web-colors"] webgl = ["iced_renderer/webgl"] # Enables the syntax `highlighter` module highlighter = ["iced_highlighter"] -# Enables the advanced module -advanced = [] # Enables experimental multi-window support. multi-window = ["iced_winit/multi-window"] +# Enables the advanced module +advanced = [] [dependencies] iced_core.workspace = true From 9b34b2ac19a8fdd424581d160bc702e096a2b46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:33:41 +0100 Subject: [PATCH 181/286] Run `cargo fmt` --- winit/src/multi_window/windows.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs index 1f606b31..6846abb3 100644 --- a/winit/src/multi_window/windows.rs +++ b/winit/src/multi_window/windows.rs @@ -176,11 +176,12 @@ where /// Returns the windows that need to be requested to closed, and also the windows that can be /// closed immediately. - pub fn partition_close_requests(&self) -> (Vec<window::Id>, Vec<window::Id>) { + pub fn partition_close_requests( + &self, + ) -> (Vec<window::Id>, Vec<window::Id>) { self.exit_on_close_requested.iter().enumerate().fold( (vec![], vec![]), - |(mut close_immediately, mut needs_request_closed), - (i, close)| { + |(mut close_immediately, mut needs_request_closed), (i, close)| { let id = self.ids[i]; if *close { From 7def3ee38a3f0f24a331d722b09f325fc9584625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:37:54 +0100 Subject: [PATCH 182/286] Fix `clippy` lints --- runtime/src/multi_window/state.rs | 2 +- winit/src/application.rs | 7 ++++--- winit/src/multi_window.rs | 24 ++++++++++++++---------- winit/src/multi_window/windows.rs | 14 +++++++++----- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/runtime/src/multi_window/state.rs b/runtime/src/multi_window/state.rs index 78c35e6c..05036a07 100644 --- a/runtime/src/multi_window/state.rs +++ b/runtime/src/multi_window/state.rs @@ -228,7 +228,7 @@ where match operation.finish() { operation::Outcome::None => {} operation::Outcome::Some(message) => { - self.queued_messages.push(message) + self.queued_messages.push(message); } operation::Outcome::Chain(next) => { current_operation = Some(next); diff --git a/winit/src/application.rs b/winit/src/application.rs index 8457fd92..b197c4ed 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -720,9 +720,10 @@ pub fn run_command<A, C, E>( let _res = window.drag_window(); } window::Action::Spawn { .. } => { - log::info!( - "Spawning a window is only available with multi-window applications." - ) + log::warn!( + "Spawning a window is only available with \ + multi-window applications." + ); } window::Action::Resize(size) => { window.set_inner_size(winit::dpi::LogicalSize { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index f2452eb3..b233564a 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -912,7 +912,7 @@ pub fn run_command<A, C, E>( size.width, size.height, )))) - .expect("Send message to event loop") + .expect("Send message to event loop"); } window::Action::Maximize(maximized) => { windows.with_raw(id).set_maximized(maximized); @@ -934,7 +934,9 @@ pub fn run_command<A, C, E>( )); } window::Action::ChangeIcon(icon) => { - windows.with_raw(id).set_window_icon(conversion::icon(icon)) + windows + .with_raw(id) + .set_window_icon(conversion::icon(icon)); } window::Action::FetchMode(tag) => { let window = windows.with_raw(id); @@ -969,12 +971,14 @@ pub fn run_command<A, C, E>( .with_raw(id) .set_window_level(conversion::window_level(level)); } - window::Action::FetchId(tag) => proxy - .send_event(Event::Application(tag(windows - .with_raw(id) - .id() - .into()))) - .expect("Event loop doesn't exist."), + window::Action::FetchId(tag) => { + proxy + .send_event(Event::Application(tag(windows + .with_raw(id) + .id() + .into()))) + .expect("Event loop doesn't exist."); + } window::Action::Screenshot(tag) => { let i = windows.index_from_id(id); let state = &windows.states[i]; @@ -996,7 +1000,7 @@ pub fn run_command<A, C, E>( state.physical_size(), ), ))) - .expect("Event loop doesn't exist.") + .expect("Event loop doesn't exist."); } }, command::Action::System(action) => match action { @@ -1014,7 +1018,7 @@ pub fn run_command<A, C, E>( proxy .send_event(Event::Application(message)) - .expect("Event loop doesn't exist.") + .expect("Event loop doesn't exist."); }); } } diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs index 6846abb3..a4841a45 100644 --- a/winit/src/multi_window/windows.rs +++ b/winit/src/multi_window/windows.rs @@ -1,10 +1,12 @@ use crate::core::{window, Size}; +use crate::graphics::Compositor; use crate::multi_window::{Application, State}; -use iced_graphics::Compositor; -use iced_style::application::StyleSheet; -use std::fmt::{Debug, Formatter}; +use crate::style::application::StyleSheet; + use winit::monitor::MonitorHandle; +use std::fmt::{Debug, Formatter}; + pub struct Windows<A: Application, C: Compositor> where <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, @@ -33,7 +35,7 @@ where &self .raw .iter() - .map(|raw| raw.id()) + .map(winit::window::Window::id) .collect::<Vec<winit::window::WindowId>>(), ) .field("states", &self.states) @@ -131,7 +133,9 @@ where } pub fn last_monitor(&self) -> Option<MonitorHandle> { - self.raw.last().and_then(|w| w.current_monitor()) + self.raw + .last() + .and_then(winit::window::Window::current_monitor) } pub fn last(&self) -> usize { From 6740c2c5d6b24399dab1343abdfec5daf4b03c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:46:47 +0100 Subject: [PATCH 183/286] Fix broken intra-doc links --- graphics/src/compositor.rs | 2 +- runtime/src/multi_window/state.rs | 2 +- runtime/src/window/action.rs | 2 +- src/multi_window/application.rs | 2 ++ winit/src/conversion.rs | 2 +- winit/src/multi_window.rs | 23 ++++------------------- winit/src/multi_window/state.rs | 4 +--- winit/src/settings.rs | 2 +- 8 files changed, 12 insertions(+), 27 deletions(-) diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index e0b1e20f..78731a98 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -24,7 +24,7 @@ pub trait Compositor: Sized { compatible_window: Option<&W>, ) -> Result<(Self, Self::Renderer), Error>; - /// Creates a [`Renderer`] for the [`Compositor`]. + /// Creates a [`Self::Renderer`] for the [`Compositor`]. fn renderer(&self) -> Self::Renderer; /// Crates a new [`Surface`] for the given window. diff --git a/runtime/src/multi_window/state.rs b/runtime/src/multi_window/state.rs index 05036a07..49f72c39 100644 --- a/runtime/src/multi_window/state.rs +++ b/runtime/src/multi_window/state.rs @@ -201,7 +201,7 @@ where (uncaptured_events, commands) } - /// Applies [`widget::Operation`]s to the [`State`] + /// Applies widget [`Operation`]s to the [`State`]. pub fn operate( &mut self, renderer: &mut P::Renderer, diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index d631cee1..2a31bbd6 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -17,7 +17,7 @@ pub enum Action<T> { Drag, /// Spawns a new window. Spawn { - /// The settings of the [`Window`]. + /// The settings of the window. settings: Settings, }, /// Resize the window. diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index 0486159e..b6f15149 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -62,6 +62,8 @@ pub use crate::style::application::{Appearance, StyleSheet}; /// } /// } /// ``` +/// +/// [`Sandbox`]: crate::Sandbox pub trait Application: Sized { /// The [`Executor`] that will run commands and subscriptions. /// diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 22e6b9be..68c2b905 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -272,7 +272,7 @@ pub fn window_level(level: window::Level) -> winit::window::WindowLevel { } } -/// Converts a [`Position`] to a [`winit`] logical position for a given monitor. +/// Converts a [`window::Position`] to a [`winit`] logical position for a given monitor. /// /// [`winit`]: https://github.com/rust-windowing/winit pub fn position( diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index b233564a..0e08a081 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -23,34 +23,19 @@ use std::mem::ManuallyDrop; use std::time::Instant; use winit::monitor::MonitorHandle; -/// This is a wrapper around the `Application::Message` associate type -/// to allows the `shell` to create internal messages, while still having -/// the current user-specified custom messages. #[derive(Debug)] -pub enum Event<Message> { - /// An internal event which contains an [`Application`] generated message. +enum Event<Message> { Application(Message), - /// An internal event which spawns a new window. NewWindow { - /// The [window::Id] of the newly spawned [`Window`]. id: window::Id, - /// The [settings::Window] of the newly spawned [`Window`]. settings: window::Settings, - /// The title of the newly spawned [`Window`]. title: String, - /// The monitor on which to spawn the window. If `None`, will use monitor of the last window - /// spawned. monitor: Option<MonitorHandle>, }, - /// An internal event for closing a window. CloseWindow(window::Id), - /// An internal event for when the window has finished being created. WindowCreated { - /// The internal ID of the window. id: window::Id, - /// The raw window. window: winit::window::Window, - /// Whether or not the window should close when a user requests it does. exit_on_close_request: bool, }, } @@ -771,7 +756,7 @@ async fn run_instance<A, E, C>( } /// Builds a window's [`UserInterface`] for the [`Application`]. -pub fn build_user_interface<'a, A: Application>( +fn build_user_interface<'a, A: Application>( application: &'a A, cache: user_interface::Cache, renderer: &mut A::Renderer, @@ -795,7 +780,7 @@ where /// Updates a multi-window [`Application`] by feeding it messages, spawning any /// resulting [`Command`], and tracking its [`Subscription`]. -pub fn update<A: Application, C, E: Executor>( +fn update<A: Application, C, E: Executor>( application: &mut A, compositor: &mut C, runtime: &mut Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, @@ -834,7 +819,7 @@ pub fn update<A: Application, C, E: Executor>( } /// Runs the actions of a [`Command`]. -pub fn run_command<A, C, E>( +fn run_command<A, C, E>( application: &A, compositor: &mut C, command: Command<A::Message>, diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index f2741c3c..e9a9f91a 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -200,9 +200,7 @@ where /// window. /// /// Normally, an [`Application`] should be synchronized with its [`State`] - /// and window after calling [`Application::update`]. - /// - /// [`Application::update`]: crate::Program::update + /// and window after calling [`State::update`]. pub fn synchronize( &mut self, application: &A, diff --git a/winit/src/settings.rs b/winit/src/settings.rs index dc0f65a5..2e541128 100644 --- a/winit/src/settings.rs +++ b/winit/src/settings.rs @@ -12,7 +12,7 @@ pub struct Settings<Flags> { /// communicate with it through the windowing system. pub id: Option<String>, - /// The [`Window`] settings. + /// The [`window::Settings`]. pub window: window::Settings, /// The data needed to initialize an [`Application`]. From 8c4e7d80a1ba128864ee82770a4670b8dbba619a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:47:46 +0100 Subject: [PATCH 184/286] Fix `renderer` method in `iced_renderer::Compositor` --- renderer/src/compositor.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 5fc5a459..5bec1639 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -55,10 +55,6 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { Compositor::Wgpu(compositor) => { Renderer::Wgpu(compositor.renderer()) } - #[cfg(not(feature = "wgpu"))] - Self::Wgpu => { - panic!("`wgpu` feature was not enabled in `iced_renderer`") - } } } From ac12d2d099d9ae996d0ccfdc7e5b82d9cef990ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:50:35 +0100 Subject: [PATCH 185/286] Remove unnecessary unsafe `Send` marker in `iced_winit` --- winit/src/multi_window.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 0e08a081..ef142c77 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -40,9 +40,6 @@ enum Event<Message> { }, } -#[allow(unsafe_code)] -unsafe impl<Message> std::marker::Send for Event<Message> {} - /// An interactive, native, cross-platform, multi-windowed application. /// /// This trait is the main entrypoint of multi-window Iced. Once implemented, you can run From 3b39ba7029832cab5235fb5538b46148d599daa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 22:52:46 +0100 Subject: [PATCH 186/286] Fix unused import in `multi_window::application` --- src/multi_window/application.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/multi_window/application.rs b/src/multi_window/application.rs index b6f15149..4a91bdf4 100644 --- a/src/multi_window/application.rs +++ b/src/multi_window/application.rs @@ -1,8 +1,7 @@ +use crate::style::application::StyleSheet; use crate::window; use crate::{Command, Element, Executor, Settings, Subscription}; -pub use crate::style::application::{Appearance, StyleSheet}; - /// An interactive cross-platform multi-window application. /// /// This trait is the main entrypoint of Iced. Once implemented, you can run From d34bc4e4a251bb28854770575d379d4a53f2db12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 29 Nov 2023 23:55:17 +0100 Subject: [PATCH 187/286] Refactor event loop <-> instance communication in `multi_window` --- winit/src/multi_window.rs | 905 ++++++++++++++++++++------------------ 1 file changed, 469 insertions(+), 436 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index ef142c77..f4ebbe09 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -8,7 +8,7 @@ use crate::conversion; use crate::core::widget::operation; use crate::core::{self, mouse, renderer, window, Size}; use crate::futures::futures::channel::mpsc; -use crate::futures::futures::{task, Future, FutureExt, StreamExt}; +use crate::futures::futures::{task, Future, StreamExt}; use crate::futures::{Executor, Runtime, Subscription}; use crate::graphics::{compositor, Compositor}; use crate::multi_window::windows::Windows; @@ -21,23 +21,24 @@ use crate::{Clipboard, Error, Proxy, Settings}; use std::mem::ManuallyDrop; use std::time::Instant; -use winit::monitor::MonitorHandle; -#[derive(Debug)] -enum Event<Message> { - Application(Message), - NewWindow { - id: window::Id, - settings: window::Settings, - title: String, - monitor: Option<MonitorHandle>, - }, - CloseWindow(window::Id), +enum Event<Message: 'static> { WindowCreated { id: window::Id, window: winit::window::Window, exit_on_close_request: bool, }, + EventLoopAwakened(winit::event::Event<'static, Message>), +} + +enum Control { + ChangeFlow(winit::event_loop::ControlFlow), + CreateWindow { + id: window::Id, + settings: window::Settings, + title: String, + monitor: Option<winit::monitor::MonitorHandle>, + }, } /// An interactive, native, cross-platform, multi-windowed application. @@ -243,44 +244,57 @@ where event: winit::event::WindowEvent::Resized(*new_inner_size), window_id, }), - winit::event::Event::UserEvent(Event::NewWindow { - id, - settings, - title, - monitor, - }) => { - let exit_on_close_request = settings.exit_on_close_request; - - let window = conversion::window_settings( - settings, &title, monitor, None, - ) - .build(window_target) - .expect("Failed to build window"); - - Some(winit::event::Event::UserEvent(Event::WindowCreated { - id, - window, - exit_on_close_request, - })) - } _ => event.to_static(), }; if let Some(event) = event { - event_sender.start_send(event).expect("Send event"); + event_sender + .start_send(Event::EventLoopAwakened(event)) + .expect("Send event"); - let poll = instance.as_mut().poll(&mut context); + loop { + let poll = instance.as_mut().poll(&mut context); - match poll { - task::Poll::Pending => { - if let Ok(Some(flow)) = control_receiver.try_next() { - *control_flow = flow; + match poll { + task::Poll::Pending => match control_receiver.try_next() { + Ok(Some(control)) => match control { + Control::ChangeFlow(flow) => { + *control_flow = flow; + } + Control::CreateWindow { + id, + settings, + title, + monitor, + } => { + let exit_on_close_request = + settings.exit_on_close_request; + + let window = conversion::window_settings( + settings, &title, monitor, None, + ) + .build(window_target) + .expect("Failed to build window"); + + event_sender + .start_send(Event::WindowCreated { + id, + window, + exit_on_close_request, + }) + .expect("Send event"); + } + }, + _ => { + break; + } + }, + task::Poll::Ready(_) => { + *control_flow = ControlFlow::Exit; + break; } - } - task::Poll::Ready(_) => { - *control_flow = ControlFlow::Exit; - } - }; + }; + } } }) } @@ -288,13 +302,11 @@ where async fn run_instance<A, E, C>( mut application: A, mut compositor: C, - mut runtime: Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, - mut proxy: winit::event_loop::EventLoopProxy<Event<A::Message>>, + mut runtime: Runtime<E, Proxy<A::Message>, A::Message>, + mut proxy: winit::event_loop::EventLoopProxy<A::Message>, mut debug: Debug, - mut event_receiver: mpsc::UnboundedReceiver< - winit::event::Event<'_, Event<A::Message>>, - >, - mut control_sender: mpsc::UnboundedSender<winit::event_loop::ControlFlow>, + mut event_receiver: mpsc::UnboundedReceiver<Event<A::Message>>, + mut control_sender: mpsc::UnboundedSender<Control>, init_command: Command<A::Message>, mut windows: Windows<A, C>, should_main_window_be_visible: bool, @@ -327,18 +339,14 @@ async fn run_instance<A, E, C>( init_command, &mut runtime, &mut clipboard, + &mut control_sender, &mut proxy, &mut debug, &mut windows, &mut ui_caches, ); - runtime.track( - application - .subscription() - .map(Event::Application) - .into_recipes(), - ); + runtime.track(application.subscription().into_recipes()); let mut mouse_interaction = mouse::Interaction::default(); @@ -361,391 +369,409 @@ async fn run_instance<A, E, C>( 'main: while let Some(event) = event_receiver.next().await { match event { - event::Event::NewEvents(start_cause) => { - redraw_pending = matches!( - start_cause, - event::StartCause::Init - | event::StartCause::Poll - | event::StartCause::ResumeTimeReached { .. } + Event::WindowCreated { + id, + window, + exit_on_close_request, + } => { + let bounds = logical_bounds_of(&window); + + let (inner_size, i) = windows.add( + &application, + &mut compositor, + id, + window, + exit_on_close_request, ); - } - event::Event::MainEventsCleared => { - debug.event_processing_started(); - let mut uis_stale = false; - for (i, id) in windows.ids.iter().enumerate() { - let mut window_events = vec![]; + user_interfaces.push(build_user_interface( + &application, + user_interface::Cache::default(), + &mut windows.renderers[i], + inner_size, + &mut debug, + id, + )); + ui_caches.push(user_interface::Cache::default()); - events.retain(|(window_id, event)| { - if *window_id == Some(*id) || window_id.is_none() { - window_events.push(event.clone()); - false - } else { - true - } - }); - - if !redraw_pending - && window_events.is_empty() - && messages.is_empty() - { - continue; - } - - let (ui_state, statuses) = user_interfaces[i].update( - &window_events, - windows.states[i].cursor(), - &mut windows.renderers[i], - &mut clipboard, - &mut messages, - ); - - if !uis_stale { - uis_stale = - matches!(ui_state, user_interface::State::Outdated); - } - - for (event, status) in - window_events.into_iter().zip(statuses.into_iter()) - { - runtime.broadcast(event, status); - } - } - - debug.event_processing_finished(); - - // TODO mw application update returns which window IDs to update - if !messages.is_empty() || uis_stale { - let mut cached_interfaces: Vec<user_interface::Cache> = - ManuallyDrop::into_inner(user_interfaces) - .drain(..) - .map(UserInterface::into_cache) - .collect(); - - // Update application - update( - &mut application, - &mut compositor, - &mut runtime, - &mut clipboard, - &mut proxy, - &mut debug, - &mut messages, - &mut windows, - &mut cached_interfaces, - ); - - // we must synchronize all window states with application state after an - // application update since we don't know what changed - for (state, (id, window)) in windows - .states - .iter_mut() - .zip(windows.ids.iter().zip(windows.raw.iter())) - { - state.synchronize(&application, *id, window); - } - - // rebuild UIs with the synchronized states - user_interfaces = ManuallyDrop::new(build_user_interfaces( - &application, - &mut debug, - &mut windows, - cached_interfaces, + if let Some(bounds) = bounds { + events.push(( + Some(id), + core::Event::Window( + id, + window::Event::Created { + position: bounds.0, + size: bounds.1, + }, + ), )); } - - debug.draw_started(); - - for (i, id) in windows.ids.iter().enumerate() { - // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes - // - // Then, we can use the `interface_state` here to decide if a redraw - // is needed right away, or simply wait until a specific time. - let redraw_event = core::Event::Window( - *id, - window::Event::RedrawRequested(Instant::now()), - ); - - let cursor = windows.states[i].cursor(); - - let (ui_state, _) = user_interfaces[i].update( - &[redraw_event.clone()], - cursor, - &mut windows.renderers[i], - &mut clipboard, - &mut messages, - ); - - let new_mouse_interaction = { - let state = &windows.states[i]; - - user_interfaces[i].draw( - &mut windows.renderers[i], - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - cursor, - ) - }; - - if new_mouse_interaction != mouse_interaction { - windows.raw[i].set_cursor_icon( - conversion::mouse_interaction( - new_mouse_interaction, - ), - ); - - mouse_interaction = new_mouse_interaction; - } - - // TODO once widgets can request to be redrawn, we can avoid always requesting a - // redraw - windows.raw[i].request_redraw(); - - runtime.broadcast( - redraw_event.clone(), - core::event::Status::Ignored, - ); - - let _ = control_sender.start_send(match ui_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => { - ControlFlow::Poll - } - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }); - } - - redraw_pending = false; - - debug.draw_finished(); } - event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( - event::MacOS::ReceivedUrl(url), - )) => { - use crate::core::event; + Event::EventLoopAwakened(event) => { + match event { + event::Event::NewEvents(start_cause) => { + redraw_pending = matches!( + start_cause, + event::StartCause::Init + | event::StartCause::Poll + | event::StartCause::ResumeTimeReached { .. } + ); + } + event::Event::MainEventsCleared => { + debug.event_processing_started(); + let mut uis_stale = false; - events.push(( - None, + for (i, id) in windows.ids.iter().enumerate() { + let mut window_events = vec![]; + + events.retain(|(window_id, event)| { + if *window_id == Some(*id) + || window_id.is_none() + { + window_events.push(event.clone()); + false + } else { + true + } + }); + + if !redraw_pending + && window_events.is_empty() + && messages.is_empty() + { + continue; + } + + let (ui_state, statuses) = user_interfaces[i] + .update( + &window_events, + windows.states[i].cursor(), + &mut windows.renderers[i], + &mut clipboard, + &mut messages, + ); + + if !uis_stale { + uis_stale = matches!( + ui_state, + user_interface::State::Outdated + ); + } + + for (event, status) in window_events + .into_iter() + .zip(statuses.into_iter()) + { + runtime.broadcast(event, status); + } + } + + debug.event_processing_finished(); + + // TODO mw application update returns which window IDs to update + if !messages.is_empty() || uis_stale { + let mut cached_interfaces: Vec< + user_interface::Cache, + > = ManuallyDrop::into_inner(user_interfaces) + .drain(..) + .map(UserInterface::into_cache) + .collect(); + + // Update application + update( + &mut application, + &mut compositor, + &mut runtime, + &mut clipboard, + &mut control_sender, + &mut proxy, + &mut debug, + &mut messages, + &mut windows, + &mut cached_interfaces, + ); + + // we must synchronize all window states with application state after an + // application update since we don't know what changed + for (state, (id, window)) in windows + .states + .iter_mut() + .zip(windows.ids.iter().zip(windows.raw.iter())) + { + state.synchronize(&application, *id, window); + } + + // rebuild UIs with the synchronized states + user_interfaces = + ManuallyDrop::new(build_user_interfaces( + &application, + &mut debug, + &mut windows, + cached_interfaces, + )); + } + + debug.draw_started(); + + for (i, id) in windows.ids.iter().enumerate() { + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = core::Event::Window( + *id, + window::Event::RedrawRequested(Instant::now()), + ); + + let cursor = windows.states[i].cursor(); + + let (ui_state, _) = user_interfaces[i].update( + &[redraw_event.clone()], + cursor, + &mut windows.renderers[i], + &mut clipboard, + &mut messages, + ); + + let new_mouse_interaction = { + let state = &windows.states[i]; + + user_interfaces[i].draw( + &mut windows.renderers[i], + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + cursor, + ) + }; + + if new_mouse_interaction != mouse_interaction { + windows.raw[i].set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); + + mouse_interaction = new_mouse_interaction; + } + + // TODO once widgets can request to be redrawn, we can avoid always requesting a + // redraw + windows.raw[i].request_redraw(); + + runtime.broadcast( + redraw_event.clone(), + core::event::Status::Ignored, + ); + + let _ = control_sender.start_send( + Control::ChangeFlow(match ui_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => { + ControlFlow::Poll + } + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }), + ); + } + + redraw_pending = false; + + debug.draw_finished(); + } event::Event::PlatformSpecific( event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), ), - ), - )); - } - event::Event::UserEvent(event) => match event { - Event::Application(message) => { - messages.push(message); - } - Event::WindowCreated { - id, - window, - exit_on_close_request, - } => { - let bounds = logical_bounds_of(&window); + ) => { + use crate::core::event; - let (inner_size, i) = windows.add( - &application, - &mut compositor, - id, - window, - exit_on_close_request, - ); - - user_interfaces.push(build_user_interface( - &application, - user_interface::Cache::default(), - &mut windows.renderers[i], - inner_size, - &mut debug, - id, - )); - ui_caches.push(user_interface::Cache::default()); - - if let Some(bounds) = bounds { events.push(( - Some(id), - core::Event::Window( - id, - window::Event::Created { - position: bounds.0, - size: bounds.1, - }, + None, + event::Event::PlatformSpecific( + event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + ), ), )); } - } - Event::CloseWindow(id) => { - let i = windows.delete(id); - let _ = user_interfaces.remove(i); - let _ = ui_caches.remove(i); - - if windows.is_empty() { - break 'main; + event::Event::UserEvent(message) => { + messages.push(message); } - } - Event::NewWindow { .. } => unreachable!(), - }, - event::Event::RedrawRequested(id) => { - let i = windows.index_from_raw(id); - let state = &windows.states[i]; - let physical_size = state.physical_size(); + event::Event::RedrawRequested(id) => { + let i = windows.index_from_raw(id); + let state = &windows.states[i]; + let physical_size = state.physical_size(); - if physical_size.width == 0 || physical_size.height == 0 { - continue; - } - - debug.render_started(); - let current_viewport_version = state.viewport_version(); - let window_viewport_version = windows.viewport_versions[i]; - - if window_viewport_version != current_viewport_version { - let logical_size = state.logical_size(); - - debug.layout_started(); - - let renderer = &mut windows.renderers[i]; - let ui = user_interfaces.remove(i); - - user_interfaces - .insert(i, ui.relayout(logical_size, renderer)); - - debug.layout_finished(); - - debug.draw_started(); - let new_mouse_interaction = user_interfaces[i].draw( - renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor(), - ); - - if new_mouse_interaction != mouse_interaction { - windows.raw[i].set_cursor_icon( - conversion::mouse_interaction( - new_mouse_interaction, - ), - ); - - mouse_interaction = new_mouse_interaction; - } - debug.draw_finished(); - - compositor.configure_surface( - &mut windows.surfaces[i], - physical_size.width, - physical_size.height, - ); - - windows.viewport_versions[i] = current_viewport_version; - } - - match compositor.present( - &mut windows.renderers[i], - &mut windows.surfaces[i], - state.viewport(), - state.background_color(), - &debug.overlay(), - ) { - Ok(()) => { - debug.render_finished(); - - // TODO: Handle animations! - // Maybe we can use `ControlFlow::WaitUntil` for this. - } - Err(error) => match error { - // This is an unrecoverable error. - compositor::SurfaceError::OutOfMemory => { - panic!("{:?}", error); + if physical_size.width == 0 || physical_size.height == 0 + { + continue; } - _ => { - debug.render_finished(); - log::error!( + + debug.render_started(); + let current_viewport_version = state.viewport_version(); + let window_viewport_version = + windows.viewport_versions[i]; + + if window_viewport_version != current_viewport_version { + let logical_size = state.logical_size(); + + debug.layout_started(); + + let renderer = &mut windows.renderers[i]; + let ui = user_interfaces.remove(i); + + user_interfaces + .insert(i, ui.relayout(logical_size, renderer)); + + debug.layout_finished(); + + debug.draw_started(); + let new_mouse_interaction = user_interfaces[i] + .draw( + renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + state.cursor(), + ); + + if new_mouse_interaction != mouse_interaction { + windows.raw[i].set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); + + mouse_interaction = new_mouse_interaction; + } + debug.draw_finished(); + + compositor.configure_surface( + &mut windows.surfaces[i], + physical_size.width, + physical_size.height, + ); + + windows.viewport_versions[i] = + current_viewport_version; + } + + match compositor.present( + &mut windows.renderers[i], + &mut windows.surfaces[i], + state.viewport(), + state.background_color(), + &debug.overlay(), + ) { + Ok(()) => { + debug.render_finished(); + + // TODO: Handle animations! + // Maybe we can use `ControlFlow::WaitUntil` for this. + } + Err(error) => match error { + // This is an unrecoverable error. + compositor::SurfaceError::OutOfMemory => { + panic!("{:?}", error); + } + _ => { + debug.render_finished(); + log::error!( "Error {error:?} when presenting surface." ); - // Try rendering all windows again next frame. - for window in &windows.raw { - window.request_redraw(); - } + // Try rendering all windows again next frame. + for window in &windows.raw { + window.request_redraw(); + } + } + }, } - }, - } - } - event::Event::WindowEvent { - event: window_event, - window_id, - } => { - let window_index = - windows.raw.iter().position(|w| w.id() == window_id); + } + event::Event::WindowEvent { + event: window_event, + window_id, + } => { + let window_index = windows + .raw + .iter() + .position(|w| w.id() == window_id); - match window_index { - Some(i) => { - let id = windows.ids[i]; - let raw = &windows.raw[i]; - let exit_on_close_request = - windows.exit_on_close_requested[i]; + match window_index { + Some(i) => { + let id = windows.ids[i]; + let raw = &windows.raw[i]; + let exit_on_close_request = + windows.exit_on_close_requested[i]; - if matches!( - window_event, - winit::event::WindowEvent::CloseRequested - ) && exit_on_close_request - { - let i = windows.delete(id); - let _ = user_interfaces.remove(i); - let _ = ui_caches.remove(i); + if matches!( + window_event, + winit::event::WindowEvent::CloseRequested + ) && exit_on_close_request + { + let i = windows.delete(id); + let _ = user_interfaces.remove(i); + let _ = ui_caches.remove(i); - if windows.is_empty() { - break 'main; + if windows.is_empty() { + break 'main; + } + } else { + let state = &mut windows.states[i]; + state.update( + raw, + &window_event, + &mut debug, + ); + + if let Some(event) = + conversion::window_event( + id, + &window_event, + state.scale_factor(), + state.modifiers(), + ) + { + events.push((Some(id), event)); + } + } } - } else { - let state = &mut windows.states[i]; - state.update(raw, &window_event, &mut debug); + None => { + // This is the only special case, since in order to trigger the Destroyed event the + // window reference from winit must be dropped, but we still want to inform the + // user that the window was destroyed so they can clean up any specific window + // code for this window + if matches!( + window_event, + winit::event::WindowEvent::Destroyed + ) { + let id = + windows.get_pending_destroy(window_id); - if let Some(event) = conversion::window_event( - id, - &window_event, - state.scale_factor(), - state.modifiers(), - ) { - events.push((Some(id), event)); + events.push(( + None, + core::Event::Window( + id, + window::Event::Destroyed, + ), + )); + } } } } - None => { - // This is the only special case, since in order to trigger the Destroyed event the - // window reference from winit must be dropped, but we still want to inform the - // user that the window was destroyed so they can clean up any specific window - // code for this window - if matches!( - window_event, - winit::event::WindowEvent::Destroyed - ) { - let id = windows.get_pending_destroy(window_id); - - events.push(( - None, - core::Event::Window( - id, - window::Event::Destroyed, - ), - )); - } - } + _ => {} } } - _ => {} } } @@ -780,9 +806,10 @@ where fn update<A: Application, C, E: Executor>( application: &mut A, compositor: &mut C, - runtime: &mut Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, + runtime: &mut Runtime<E, Proxy<A::Message>, A::Message>, clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy<Event<A::Message>>, + control_sender: &mut mpsc::UnboundedSender<Control>, + proxy: &mut winit::event_loop::EventLoopProxy<A::Message>, debug: &mut Debug, messages: &mut Vec<A::Message>, windows: &mut Windows<A, C>, @@ -804,6 +831,7 @@ fn update<A: Application, C, E: Executor>( command, runtime, clipboard, + control_sender, proxy, debug, windows, @@ -811,7 +839,7 @@ fn update<A: Application, C, E: Executor>( ); } - let subscription = application.subscription().map(Event::Application); + let subscription = application.subscription(); runtime.track(subscription.into_recipes()); } @@ -820,9 +848,10 @@ fn run_command<A, C, E>( application: &A, compositor: &mut C, command: Command<A::Message>, - runtime: &mut Runtime<E, Proxy<Event<A::Message>>, Event<A::Message>>, + runtime: &mut Runtime<E, Proxy<A::Message>, A::Message>, clipboard: &mut Clipboard, - proxy: &mut winit::event_loop::EventLoopProxy<Event<A::Message>>, + control_sender: &mut mpsc::UnboundedSender<Control>, + proxy: &mut winit::event_loop::EventLoopProxy<A::Message>, debug: &mut Debug, windows: &mut Windows<A, C>, ui_caches: &mut Vec<user_interface::Cache>, @@ -839,17 +868,17 @@ fn run_command<A, C, E>( for action in command.actions() { match action { command::Action::Future(future) => { - runtime.spawn(Box::pin(future.map(Event::Application))); + runtime.spawn(Box::pin(future)); } command::Action::Stream(stream) => { - runtime.run(Box::pin(stream.map(Event::Application))); + runtime.run(Box::pin(stream)); } command::Action::Clipboard(action) => match action { clipboard::Action::Read(tag) => { let message = tag(clipboard.read()); proxy - .send_event(Event::Application(message)) + .send_event(message) .expect("Send message to event loop"); } clipboard::Action::Write(contents) => { @@ -860,19 +889,28 @@ fn run_command<A, C, E>( window::Action::Spawn { settings } => { let monitor = windows.last_monitor(); - proxy - .send_event(Event::NewWindow { + control_sender + .start_send(Control::CreateWindow { id, settings, title: application.title(id), monitor, }) - .expect("Send message to event loop"); + .expect("Send control action"); } window::Action::Close => { - proxy - .send_event(Event::CloseWindow(id)) - .expect("Send message to event loop"); + use winit::event_loop::ControlFlow; + + let i = windows.delete(id); + let _ = ui_caches.remove(i); + + if windows.is_empty() { + control_sender + .start_send(Control::ChangeFlow( + ControlFlow::ExitWithCode(0), + )) + .expect("Send control action"); + } } window::Action::Drag => { let _ = windows.with_raw(id).drag_window(); @@ -890,10 +928,10 @@ fn run_command<A, C, E>( let size = window.inner_size(); proxy - .send_event(Event::Application(callback(Size::new( + .send_event(callback(Size::new( size.width, size.height, - )))) + ))) .expect("Send message to event loop"); } window::Action::Maximize(maximized) => { @@ -929,7 +967,7 @@ fn run_command<A, C, E>( }; proxy - .send_event(Event::Application(tag(mode))) + .send_event(tag(mode)) .expect("Event loop doesn't exist."); } window::Action::ToggleMaximize => { @@ -955,10 +993,7 @@ fn run_command<A, C, E>( } window::Action::FetchId(tag) => { proxy - .send_event(Event::Application(tag(windows - .with_raw(id) - .id() - .into()))) + .send_event(tag(windows.with_raw(id).id().into())) .expect("Event loop doesn't exist."); } window::Action::Screenshot(tag) => { @@ -976,11 +1011,9 @@ fn run_command<A, C, E>( ); proxy - .send_event(Event::Application(tag( - window::Screenshot::new( - bytes, - state.physical_size(), - ), + .send_event(tag(window::Screenshot::new( + bytes, + state.physical_size(), ))) .expect("Event loop doesn't exist."); } @@ -999,7 +1032,7 @@ fn run_command<A, C, E>( let message = _tag(information); proxy - .send_event(Event::Application(message)) + .send_event(message) .expect("Event loop doesn't exist."); }); } @@ -1025,7 +1058,7 @@ fn run_command<A, C, E>( operation::Outcome::None => {} operation::Outcome::Some(message) => { proxy - .send_event(Event::Application(message)) + .send_event(message) .expect("Event loop doesn't exist."); // operation completed, don't need to try to operate on rest of UIs @@ -1051,7 +1084,7 @@ fn run_command<A, C, E>( } proxy - .send_event(Event::Application(tagger(Ok(())))) + .send_event(tagger(Ok(()))) .expect("Send message to event loop"); } } From 9f29aec128ccf51c620a8b69a9fbd64186ab8c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 30 Nov 2023 00:01:32 +0100 Subject: [PATCH 188/286] Move `Event` and `Control` types after `multi_window::run` --- winit/src/multi_window.rs | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index f4ebbe09..f8cedcb8 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -22,25 +22,6 @@ use crate::{Clipboard, Error, Proxy, Settings}; use std::mem::ManuallyDrop; use std::time::Instant; -enum Event<Message: 'static> { - WindowCreated { - id: window::Id, - window: winit::window::Window, - exit_on_close_request: bool, - }, - EventLoopAwakened(winit::event::Event<'static, Message>), -} - -enum Control { - ChangeFlow(winit::event_loop::ControlFlow), - CreateWindow { - id: window::Id, - settings: window::Settings, - title: String, - monitor: Option<winit::monitor::MonitorHandle>, - }, -} - /// An interactive, native, cross-platform, multi-windowed application. /// /// This trait is the main entrypoint of multi-window Iced. Once implemented, you can run @@ -299,6 +280,25 @@ where }) } +enum Event<Message: 'static> { + WindowCreated { + id: window::Id, + window: winit::window::Window, + exit_on_close_request: bool, + }, + EventLoopAwakened(winit::event::Event<'static, Message>), +} + +enum Control { + ChangeFlow(winit::event_loop::ControlFlow), + CreateWindow { + id: window::Id, + settings: window::Settings, + title: String, + monitor: Option<winit::monitor::MonitorHandle>, + }, +} + async fn run_instance<A, E, C>( mut application: A, mut compositor: C, From 67408311f45d341509538f8cc185978da66b6ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 30 Nov 2023 23:40:33 +0100 Subject: [PATCH 189/286] Use actual floats for logical coordinates --- core/src/point.rs | 58 ++++++++++++++------ core/src/window/event.rs | 18 +++---- core/src/window/position.rs | 6 ++- core/src/window/settings.rs | 11 ++-- examples/multi_window/src/main.rs | 15 +++--- examples/solar_system/src/main.rs | 14 ++--- examples/todos/src/main.rs | 4 +- runtime/src/window.rs | 13 ++--- runtime/src/window/action.rs | 25 ++++----- winit/src/application.rs | 9 ++-- winit/src/conversion.rs | 39 ++++++++------ winit/src/multi_window.rs | 89 ++++++++++++++++--------------- 12 files changed, 165 insertions(+), 136 deletions(-) diff --git a/core/src/point.rs b/core/src/point.rs index 9bf7726b..ef42852f 100644 --- a/core/src/point.rs +++ b/core/src/point.rs @@ -1,26 +1,34 @@ use crate::Vector; +use num_traits::{Float, Num}; +use std::fmt; + /// A 2D point. -#[derive(Debug, Clone, Copy, PartialEq, Default)] -pub struct Point { +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct Point<T = f32> { /// The X coordinate. - pub x: f32, + pub x: T, /// The Y coordinate. - pub y: f32, + pub y: T, } impl Point { /// The origin (i.e. a [`Point`] at (0, 0)). - pub const ORIGIN: Point = Point::new(0.0, 0.0); + pub const ORIGIN: Self = Self::new(0.0, 0.0); +} +impl<T: Num> Point<T> { /// Creates a new [`Point`] with the given coordinates. - pub const fn new(x: f32, y: f32) -> Self { + pub const fn new(x: T, y: T) -> Self { Self { x, y } } /// Computes the distance to another [`Point`]. - pub fn distance(&self, to: Point) -> f32 { + pub fn distance(&self, to: Self) -> T + where + T: Float, + { let a = self.x - to.x; let b = self.y - to.y; @@ -34,9 +42,9 @@ impl From<[f32; 2]> for Point { } } -impl From<[u16; 2]> for Point { +impl From<[u16; 2]> for Point<u16> { fn from([x, y]: [u16; 2]) -> Self { - Point::new(x.into(), y.into()) + Point::new(x, y) } } @@ -46,10 +54,13 @@ impl From<Point> for [f32; 2] { } } -impl std::ops::Add<Vector> for Point { +impl<T> std::ops::Add<Vector<T>> for Point<T> +where + T: std::ops::Add<Output = T>, +{ type Output = Self; - fn add(self, vector: Vector) -> Self { + fn add(self, vector: Vector<T>) -> Self { Self { x: self.x + vector.x, y: self.y + vector.y, @@ -57,10 +68,13 @@ impl std::ops::Add<Vector> for Point { } } -impl std::ops::Sub<Vector> for Point { +impl<T> std::ops::Sub<Vector<T>> for Point<T> +where + T: std::ops::Sub<Output = T>, +{ type Output = Self; - fn sub(self, vector: Vector) -> Self { + fn sub(self, vector: Vector<T>) -> Self { Self { x: self.x - vector.x, y: self.y - vector.y, @@ -68,10 +82,22 @@ impl std::ops::Sub<Vector> for Point { } } -impl std::ops::Sub<Point> for Point { - type Output = Vector; +impl<T> std::ops::Sub<Point<T>> for Point<T> +where + T: std::ops::Sub<Output = T>, +{ + type Output = Vector<T>; - fn sub(self, point: Point) -> Vector { + fn sub(self, point: Self) -> Vector<T> { Vector::new(self.x - point.x, self.y - point.y) } } + +impl<T> fmt::Display for Point<T> +where + T: fmt::Display, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Point {{ x: {}, y: {} }}", self.x, self.y) + } +} diff --git a/core/src/window/event.rs b/core/src/window/event.rs index f7759435..3ab7cd81 100644 --- a/core/src/window/event.rs +++ b/core/src/window/event.rs @@ -1,10 +1,10 @@ use crate::time::Instant; -use crate::Size; +use crate::{Point, Size}; use std::path::PathBuf; /// A window-related event. -#[derive(PartialEq, Eq, Clone, Debug)] +#[derive(PartialEq, Clone, Debug)] pub enum Event { /// A window was moved. Moved { @@ -30,22 +30,22 @@ pub enum Event { /// The user has requested for the window to close. CloseRequested, - /// A window was destroyed by the runtime. - Destroyed, - /// A window was created. - /// - /// **Note:** this event is not supported on Wayland. Created { /// The position of the created window. This is relative to the top-left corner of the desktop /// the window is on, including virtual desktops. Refers to window's "inner" position, /// or the client area, in logical pixels. - position: (i32, i32), + /// + /// **Note**: Not available in Wayland. + position: Option<Point>, /// The size of the created window. This is its "inner" size, or the size of the /// client area, in logical pixels. - size: Size<u32>, + size: Size, }, + /// A window was destroyed by the runtime. + Destroyed, + /// A window was focused. Focused, diff --git a/core/src/window/position.rs b/core/src/window/position.rs index c260c29e..73391e75 100644 --- a/core/src/window/position.rs +++ b/core/src/window/position.rs @@ -1,5 +1,7 @@ +use crate::Point; + /// The position of a window in a given screen. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum Position { /// The platform-specific default position for a new window. Default, @@ -12,7 +14,7 @@ pub enum Position { /// position. So if you have decorations enabled and want the window to be /// at (0, 0) you would have to set the position to /// `(PADDING_X, PADDING_Y)`. - Specific(i32, i32), + Specific(Point), } impl Default for Position { diff --git a/core/src/window/settings.rs b/core/src/window/settings.rs index 25df8159..fbbf86ab 100644 --- a/core/src/window/settings.rs +++ b/core/src/window/settings.rs @@ -25,22 +25,23 @@ mod platform; mod platform; use crate::window::{Icon, Level, Position}; +use crate::Size; pub use platform::PlatformSpecific; /// The window settings of an application. #[derive(Debug, Clone)] pub struct Settings { - /// The initial size of the window. - pub size: (u32, u32), + /// The initial logical dimensions of the window. + pub size: Size, /// The initial position of the window. pub position: Position, /// The minimum size of the window. - pub min_size: Option<(u32, u32)>, + pub min_size: Option<Size>, /// The maximum size of the window. - pub max_size: Option<(u32, u32)>, + pub max_size: Option<Size>, /// Whether the window should be visible or not. pub visible: bool, @@ -77,7 +78,7 @@ pub struct Settings { impl Default for Settings { fn default() -> Self { Self { - size: (1024, 768), + size: Size::new(1024.0, 768.0), position: Position::default(), min_size: None, max_size: None, diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 7d1f1e91..16beb46e 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -4,8 +4,10 @@ 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, + Alignment, Command, Element, Length, Point, Settings, Subscription, Theme, + Vector, }; + use std::collections::HashMap; fn main() -> iced::Result { @@ -33,8 +35,8 @@ enum Message { ScaleChanged(window::Id, String), TitleChanged(window::Id, String), CloseWindow(window::Id), + WindowCreated(window::Id, Option<Point>), WindowDestroyed(window::Id), - WindowCreated(window::Id, (i32, i32)), NewWindow, } @@ -90,10 +92,11 @@ impl multi_window::Application for Example { self.windows.remove(&id); } Message::WindowCreated(id, position) => { - self.next_window_pos = window::Position::Specific( - position.0 + 20, - position.1 + 20, - ); + if let Some(position) = position { + self.next_window_pos = window::Position::Specific( + position + Vector::new(20.0, 20.0), + ); + } if let Some(window) = self.windows.get(&id) { return text_input::focus(window.input_id.clone()); diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 8295dded..82421a86 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -114,14 +114,14 @@ impl State { pub fn new() -> State { let now = Instant::now(); - let (width, height) = window::Settings::default().size; + let size = window::Settings::default().size; State { space_cache: canvas::Cache::default(), system_cache: canvas::Cache::default(), start: now, now, - stars: Self::generate_stars(width, height), + stars: Self::generate_stars(size.width, size.height), } } @@ -130,7 +130,7 @@ impl State { self.system_cache.clear(); } - fn generate_stars(width: u32, height: u32) -> Vec<(Point, f32)> { + fn generate_stars(width: f32, height: f32) -> Vec<(Point, f32)> { use rand::Rng; let mut rng = rand::thread_rng(); @@ -139,12 +139,8 @@ impl State { .map(|_| { ( Point::new( - rng.gen_range( - (-(width as f32) / 2.0)..(width as f32 / 2.0), - ), - rng.gen_range( - (-(height as f32) / 2.0)..(height as f32 / 2.0), - ), + rng.gen_range((-width / 2.0)..(width / 2.0)), + rng.gen_range((-height / 2.0)..(height / 2.0)), ), rng.gen_range(0.5..1.0), ) diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index a7ba69b9..4dac032c 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -8,7 +8,7 @@ use iced::widget::{ }; use iced::window; use iced::{Application, Element}; -use iced::{Color, Command, Length, Settings, Subscription}; +use iced::{Color, Command, Length, Settings, Size, Subscription}; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; @@ -22,7 +22,7 @@ pub fn main() -> iced::Result { Todos::run(Settings { window: window::Settings { - size: (500, 800), + size: Size::new(500.0, 800.0), ..window::Settings::default() }, ..Settings::default() diff --git a/runtime/src/window.rs b/runtime/src/window.rs index 375ce889..f46ac1b8 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -10,7 +10,7 @@ pub use screenshot::Screenshot; use crate::command::{self, Command}; use crate::core::time::Instant; use crate::core::window::{self, Event, Icon, Level, Mode, UserAttention}; -use crate::core::Size; +use crate::core::{Point, Size}; use crate::futures::event; use crate::futures::Subscription; @@ -48,17 +48,14 @@ pub fn drag<Message>(id: window::Id) -> Command<Message> { } /// Resizes the window to the given logical dimensions. -pub fn resize<Message>( - id: window::Id, - new_size: Size<u32>, -) -> Command<Message> { +pub fn resize<Message>(id: window::Id, new_size: Size) -> Command<Message> { Command::single(command::Action::Window(id, Action::Resize(new_size))) } /// Fetches the window's size in logical dimensions. pub fn fetch_size<Message>( id: window::Id, - f: impl FnOnce(Size<u32>) -> Message + 'static, + f: impl FnOnce(Size) -> Message + 'static, ) -> Command<Message> { Command::single(command::Action::Window(id, Action::FetchSize(Box::new(f)))) } @@ -74,8 +71,8 @@ pub fn minimize<Message>(id: window::Id, minimized: bool) -> Command<Message> { } /// Moves the window to the given logical coordinates. -pub fn move_to<Message>(id: window::Id, x: i32, y: i32) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Move { x, y })) +pub fn move_to<Message>(id: window::Id, position: Point) -> Command<Message> { + Command::single(command::Action::Window(id, Action::Move(position))) } /// Changes the [`Mode`] of the window. diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index 2a31bbd6..5afe0389 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -1,5 +1,5 @@ use crate::core::window::{Icon, Level, Mode, Settings, UserAttention}; -use crate::core::Size; +use crate::core::{Point, Size}; use crate::futures::MaybeSend; use crate::window::Screenshot; @@ -20,23 +20,18 @@ pub enum Action<T> { /// The settings of the window. settings: Settings, }, - /// Resize the window. - Resize(Size<u32>), - /// Fetch the current size of the window. - FetchSize(Box<dyn FnOnce(Size<u32>) -> T + 'static>), + /// Resize the window to the given logical dimensions. + Resize(Size), + /// Fetch the current logical dimensions of the window. + FetchSize(Box<dyn FnOnce(Size) -> T + 'static>), /// Set the window to maximized or back Maximize(bool), /// Set the window to minimized or back Minimize(bool), - /// Move the window. + /// Move the window to the given logical coordinates. /// /// Unsupported on Wayland. - Move { - /// The new logical x location of the window - x: i32, - /// The new logical y location of the window - y: i32, - }, + Move(Point), /// Change the [`Mode`] of the window. ChangeMode(Mode), /// Fetch the current [`Mode`] of the window. @@ -114,7 +109,7 @@ impl<T> Action<T> { Self::FetchSize(o) => Action::FetchSize(Box::new(move |s| f(o(s)))), Self::Maximize(maximized) => Action::Maximize(maximized), Self::Minimize(minimized) => Action::Minimize(minimized), - Self::Move { x, y } => Action::Move { x, y }, + Self::Move(position) => Action::Move(position), Self::ChangeMode(mode) => Action::ChangeMode(mode), Self::FetchMode(o) => Action::FetchMode(Box::new(move |s| f(o(s)))), Self::ToggleMaximize => Action::ToggleMaximize, @@ -151,8 +146,8 @@ impl<T> fmt::Debug for Action<T> { Self::Minimize(minimized) => { write!(f, "Action::Minimize({minimized}") } - Self::Move { x, y } => { - write!(f, "Action::Move {{ x: {x}, y: {y} }}") + Self::Move(position) => { + write!(f, "Action::Move({position})") } Self::ChangeMode(mode) => write!(f, "Action::SetMode({mode:?})"), Self::FetchMode(_) => write!(f, "Action::FetchMode"), diff --git a/winit/src/application.rs b/winit/src/application.rs index b197c4ed..4e6a879f 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -732,7 +732,8 @@ pub fn run_command<A, C, E>( }); } window::Action::FetchSize(callback) => { - let size = window.inner_size(); + let size = + window.inner_size().to_logical(window.scale_factor()); proxy .send_event(callback(Size::new( @@ -747,10 +748,10 @@ pub fn run_command<A, C, E>( window::Action::Minimize(minimized) => { window.set_minimized(minimized); } - window::Action::Move { x, y } => { + window::Action::Move(position) => { window.set_outer_position(winit::dpi::LogicalPosition { - x, - y, + x: position.x, + y: position.y, }); } window::Action::ChangeMode(mode) => { diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 68c2b905..7e51a2d4 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -6,7 +6,7 @@ use crate::core::keyboard; use crate::core::mouse; use crate::core::touch; use crate::core::window; -use crate::core::{Event, Point}; +use crate::core::{Event, Point, Size}; /// Converts some [`window::Settings`] into a `WindowBuilder` from `winit`. pub fn window_settings( @@ -17,11 +17,12 @@ pub fn window_settings( ) -> winit::window::WindowBuilder { let mut window_builder = winit::window::WindowBuilder::new(); - let (width, height) = settings.size; - window_builder = window_builder .with_title(title) - .with_inner_size(winit::dpi::LogicalSize { width, height }) + .with_inner_size(winit::dpi::LogicalSize { + width: settings.size.width, + height: settings.size.height, + }) .with_resizable(settings.resizable) .with_enabled_buttons(if settings.resizable { winit::window::WindowButtons::all() @@ -41,14 +42,20 @@ pub fn window_settings( window_builder = window_builder.with_position(position); } - if let Some((width, height)) = settings.min_size { - window_builder = window_builder - .with_min_inner_size(winit::dpi::LogicalSize { width, height }); + if let Some(min_size) = settings.min_size { + window_builder = + window_builder.with_min_inner_size(winit::dpi::LogicalSize { + width: min_size.width, + height: min_size.height, + }); } - if let Some((width, height)) = settings.max_size { - window_builder = window_builder - .with_max_inner_size(winit::dpi::LogicalSize { width, height }); + if let Some(max_size) = settings.max_size { + window_builder = + window_builder.with_max_inner_size(winit::dpi::LogicalSize { + width: max_size.width, + height: max_size.height, + }); } #[cfg(any( @@ -277,15 +284,15 @@ pub fn window_level(level: window::Level) -> winit::window::WindowLevel { /// [`winit`]: https://github.com/rust-windowing/winit pub fn position( monitor: Option<&winit::monitor::MonitorHandle>, - (width, height): (u32, u32), + size: Size, position: window::Position, ) -> Option<winit::dpi::Position> { match position { window::Position::Default => None, - window::Position::Specific(x, y) => { + window::Position::Specific(position) => { Some(winit::dpi::Position::Logical(winit::dpi::LogicalPosition { - x: f64::from(x), - y: f64::from(y), + x: f64::from(position.x), + y: f64::from(position.y), })) } window::Position::Centered => { @@ -297,8 +304,8 @@ pub fn position( let centered: winit::dpi::PhysicalPosition<i32> = winit::dpi::LogicalPosition { - x: (resolution.width - f64::from(width)) / 2.0, - y: (resolution.height - f64::from(height)) / 2.0, + x: (resolution.width - f64::from(size.width)) / 2.0, + y: (resolution.height - f64::from(size.height)) / 2.0, } .to_physical(monitor.scale_factor()); diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index f8cedcb8..73476452 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -5,8 +5,12 @@ mod windows; pub use state::State; use crate::conversion; +use crate::core; +use crate::core::mouse; +use crate::core::renderer; use crate::core::widget::operation; -use crate::core::{self, mouse, renderer, window, Size}; +use crate::core::window; +use crate::core::{Point, Size}; use crate::futures::futures::channel::mpsc; use crate::futures::futures::{task, Future, StreamExt}; use crate::futures::{Executor, Runtime, Subscription}; @@ -350,18 +354,18 @@ async fn run_instance<A, E, C>( let mut mouse_interaction = mouse::Interaction::default(); - let mut events = - if let Some((position, size)) = logical_bounds_of(windows.main()) { - vec![( - Some(window::Id::MAIN), - core::Event::Window( - window::Id::MAIN, - window::Event::Created { position, size }, - ), - )] - } else { - Vec::new() - }; + let mut events = { + let (position, size) = logical_bounds_of(windows.main()); + + vec![( + Some(window::Id::MAIN), + core::Event::Window( + window::Id::MAIN, + window::Event::Created { position, size }, + ), + )] + }; + let mut messages = Vec::new(); let mut redraw_pending = false; @@ -374,7 +378,7 @@ async fn run_instance<A, E, C>( window, exit_on_close_request, } => { - let bounds = logical_bounds_of(&window); + let (position, size) = logical_bounds_of(&window); let (inner_size, i) = windows.add( &application, @@ -394,18 +398,13 @@ async fn run_instance<A, E, C>( )); ui_caches.push(user_interface::Cache::default()); - if let Some(bounds) = bounds { - events.push(( - Some(id), - core::Event::Window( - id, - window::Event::Created { - position: bounds.0, - size: bounds.1, - }, - ), - )); - } + events.push(( + Some(id), + core::Event::Window( + id, + window::Event::Created { position, size }, + ), + )); } Event::EventLoopAwakened(event) => { match event { @@ -925,7 +924,8 @@ fn run_command<A, C, E>( } window::Action::FetchSize(callback) => { let window = windows.with_raw(id); - let size = window.inner_size(); + let size = + window.inner_size().to_logical(window.scale_factor()); proxy .send_event(callback(Size::new( @@ -940,9 +940,12 @@ fn run_command<A, C, E>( window::Action::Minimize(minimized) => { windows.with_raw(id).set_minimized(minimized); } - window::Action::Move { x, y } => { + window::Action::Move(position) => { windows.with_raw(id).set_outer_position( - winit::dpi::LogicalPosition { x, y }, + winit::dpi::LogicalPosition { + x: position.x, + y: position.y, + }, ); } window::Action::ChangeMode(mode) => { @@ -1145,25 +1148,23 @@ pub fn user_force_quit( } } -fn logical_bounds_of( - window: &winit::window::Window, -) -> Option<((i32, i32), Size<u32>)> { - let scale = window.scale_factor(); - let pos = window +fn logical_bounds_of(window: &winit::window::Window) -> (Option<Point>, Size) { + let position = window .inner_position() - .map(|pos| { - ((pos.x as f64 / scale) as i32, (pos.y as f64 / scale) as i32) - }) - .ok()?; + .ok() + .map(|position| position.to_logical(window.scale_factor())) + .map(|position| Point { + x: position.x, + y: position.y, + }); + let size = { - let size = window.inner_size(); - Size::new( - (size.width as f64 / scale) as u32, - (size.height as f64 / scale) as u32, - ) + let size = window.inner_size().to_logical(window.scale_factor()); + + Size::new(size.width, size.height) }; - Some((pos, size)) + (position, size) } #[cfg(not(target_arch = "wasm32"))] From 99899d49cc93cdec3832f7b5ecad867fdd421e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 1 Dec 2023 15:04:08 +0100 Subject: [PATCH 190/286] Clamp `text::measure` to `Buffer::size` --- graphics/src/text.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/graphics/src/text.rs b/graphics/src/text.rs index 7261900e..fc7694c2 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -76,7 +76,12 @@ pub fn measure(buffer: &cosmic_text::Buffer) -> Size { (run.line_w.max(width), total_lines + 1) }); - Size::new(width, total_lines as f32 * buffer.metrics().line_height) + let (max_width, max_height) = buffer.size(); + + Size::new( + width.min(max_width), + (total_lines as f32 * buffer.metrics().line_height).min(max_height), + ) } /// Returns the attributes of the given [`Font`]. From 936d480267578d7e80675e78ec1880aaaaab72d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 1 Dec 2023 16:04:27 +0100 Subject: [PATCH 191/286] Clip text to `viewport` bounds instead of layout bounds --- core/src/renderer/null.rs | 3 ++ core/src/text.rs | 5 +++- core/src/widget/text.rs | 5 +++- graphics/src/primitive.rs | 26 ++++++++++------- graphics/src/renderer.rs | 6 ++++ renderer/src/lib.rs | 13 +++++++-- tiny_skia/src/backend.rs | 17 +++++------ tiny_skia/src/geometry.rs | 15 ++++++---- wgpu/src/geometry.rs | 15 ++++++---- wgpu/src/layer.rs | 7 +++++ wgpu/src/layer/text.rs | 5 ++++ wgpu/src/text.rs | 23 +++++++++------ widget/src/checkbox.rs | 4 ++- widget/src/column.rs | 20 +++++++------ widget/src/combo_box.rs | 3 +- widget/src/container.rs | 30 ++++++++++--------- widget/src/overlay/menu.rs | 1 + widget/src/pick_list.rs | 6 +++- widget/src/radio.rs | 3 +- widget/src/row.rs | 20 +++++++------ widget/src/text_editor.rs | 3 +- widget/src/text_input.rs | 59 ++++++++++++++++++-------------------- widget/src/toggler.rs | 3 +- 23 files changed, 177 insertions(+), 115 deletions(-) diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index da0f32de..3ce6a4f5 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -64,6 +64,7 @@ impl text::Renderer for Null { _paragraph: &Self::Paragraph, _position: Point, _color: Color, + _viewport: Rectangle, ) { } @@ -72,6 +73,7 @@ impl text::Renderer for Null { _editor: &Self::Editor, _position: Point, _color: Color, + _viewport: Rectangle, ) { } @@ -80,6 +82,7 @@ impl text::Renderer for Null { _paragraph: Text<'_, Self::Font>, _position: Point, _color: Color, + _viewport: Rectangle, ) { } } diff --git a/core/src/text.rs b/core/src/text.rs index 546d0b5c..697fa628 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -9,7 +9,7 @@ pub use highlighter::Highlighter; pub use paragraph::Paragraph; use crate::alignment; -use crate::{Color, Pixels, Point, Size}; +use crate::{Color, Pixels, Point, Rectangle, Size}; use std::borrow::Cow; use std::hash::{Hash, Hasher}; @@ -202,6 +202,7 @@ pub trait Renderer: crate::Renderer { text: &Self::Paragraph, position: Point, color: Color, + viewport: Rectangle, ); /// Draws the given [`Editor`] at the given position and with the given @@ -211,6 +212,7 @@ pub trait Renderer: crate::Renderer { editor: &Self::Editor, position: Point, color: Color, + viewport: Rectangle, ); /// Draws the given [`Text`] at the given position and with the given @@ -220,5 +222,6 @@ pub trait Renderer: crate::Renderer { text: Text<'_, Self::Font>, position: Point, color: Color, + viewport: Rectangle, ); } diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 97e0acac..e020b030 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -172,7 +172,7 @@ where style: &renderer::Style, layout: Layout<'_>, _cursor_position: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let state = tree.state.downcast_ref::<State<Renderer::Paragraph>>(); @@ -182,6 +182,7 @@ where layout, state, theme.appearance(self.style.clone()), + viewport, ); } } @@ -244,6 +245,7 @@ pub fn draw<Renderer>( layout: Layout<'_>, state: &State<Renderer::Paragraph>, appearance: Appearance, + viewport: &Rectangle, ) where Renderer: text::Renderer, { @@ -266,6 +268,7 @@ pub fn draw<Renderer>( paragraph, Point::new(x, y), appearance.color.unwrap_or(style.text_color), + *viewport, ); } diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 4ed512c1..837eb77a 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -14,24 +14,26 @@ use std::sync::Arc; pub enum Primitive<T> { /// A text primitive Text { - /// The contents of the text + /// The contents of the text. content: String, - /// The bounds of the text + /// The bounds of the text. bounds: Rectangle, - /// The color of the text + /// The color of the text. color: Color, - /// The size of the text in logical pixels + /// The size of the text in logical pixels. size: Pixels, - /// The line height of the text + /// The line height of the text. line_height: text::LineHeight, - /// The font of the text + /// The font of the text. font: Font, - /// The horizontal alignment of the text + /// The horizontal alignment of the text. horizontal_alignment: alignment::Horizontal, - /// The vertical alignment of the text + /// The vertical alignment of the text. vertical_alignment: alignment::Vertical, /// The shaping strategy of the text. shaping: text::Shaping, + /// The viewport of the text. + viewport: Rectangle, }, /// A paragraph primitive Paragraph { @@ -41,15 +43,19 @@ pub enum Primitive<T> { position: Point, /// The color of the paragraph. color: Color, + /// The viewport of the paragraph. + viewport: Rectangle, }, /// An editor primitive Editor { /// The [`editor::Weak`] reference. editor: editor::Weak, - /// The position of the paragraph. + /// The position of the editor. position: Point, - /// The color of the paragraph. + /// The color of the editor. color: Color, + /// The viewport of the editor. + viewport: Rectangle, }, /// A quad primitive Quad { diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index d7613e36..0d3b11a7 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -164,11 +164,13 @@ where paragraph: &Self::Paragraph, position: Point, color: Color, + viewport: Rectangle, ) { self.primitives.push(Primitive::Paragraph { paragraph: paragraph.downgrade(), position, color, + viewport, }); } @@ -177,11 +179,13 @@ where editor: &Self::Editor, position: Point, color: Color, + viewport: Rectangle, ) { self.primitives.push(Primitive::Editor { editor: editor.downgrade(), position, color, + viewport, }); } @@ -190,6 +194,7 @@ where text: Text<'_, Self::Font>, position: Point, color: Color, + viewport: Rectangle, ) { self.primitives.push(Primitive::Text { content: text.content.to_string(), @@ -201,6 +206,7 @@ where horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, + viewport, }); } } diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 1fc4c86b..90a7262b 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -175,11 +175,12 @@ impl<T> text::Renderer for Renderer<T> { paragraph: &Self::Paragraph, position: Point, color: Color, + viewport: Rectangle, ) { delegate!( self, renderer, - renderer.fill_paragraph(paragraph, position, color) + renderer.fill_paragraph(paragraph, position, color, viewport) ); } @@ -188,11 +189,12 @@ impl<T> text::Renderer for Renderer<T> { editor: &Self::Editor, position: Point, color: Color, + viewport: Rectangle, ) { delegate!( self, renderer, - renderer.fill_editor(editor, position, color) + renderer.fill_editor(editor, position, color, viewport) ); } @@ -201,8 +203,13 @@ impl<T> text::Renderer for Renderer<T> { text: Text<'_, Self::Font>, position: Point, color: Color, + viewport: Rectangle, ) { - delegate!(self, renderer, renderer.fill_text(text, position, color)); + delegate!( + self, + renderer, + renderer.fill_text(text, position, color, viewport) + ); } } diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index f2905b00..cc0f72d1 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -1,6 +1,6 @@ use crate::core::{Background, Color, Gradient, Rectangle, Vector}; use crate::graphics::backend; -use crate::graphics::{Damage, Viewport}; +use crate::graphics::Viewport; use crate::primitive::{self, Primitive}; use std::borrow::Cow; @@ -361,11 +361,9 @@ impl Backend { paragraph, position, color, + viewport, } => { - let physical_bounds = - (Rectangle::new(*position, paragraph.min_bounds) - + translation) - * scale_factor; + let physical_bounds = (*viewport + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; @@ -387,10 +385,9 @@ impl Backend { editor, position, color, + viewport, } => { - let physical_bounds = - (Rectangle::new(*position, editor.bounds) + translation) - * scale_factor; + let physical_bounds = (*viewport + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; @@ -418,9 +415,9 @@ impl Backend { horizontal_alignment, vertical_alignment, shaping, + viewport, } => { - let physical_bounds = - (primitive.bounds() + translation) * scale_factor; + let physical_bounds = (*viewport + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 1d14aa03..b73f84a9 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -109,15 +109,17 @@ impl Frame { Point::new(transformed[0].x, transformed[0].y) }; + let bounds = Rectangle { + x: position.x, + y: position.y, + width: f32::INFINITY, + height: f32::INFINITY, + }; + // TODO: Use vectorial text instead of primitive self.primitives.push(Primitive::Text { content: text.content, - bounds: Rectangle { - x: position.x, - y: position.y, - width: f32::INFINITY, - height: f32::INFINITY, - }, + bounds, color: text.color, size: text.size, line_height: text.line_height, @@ -125,6 +127,7 @@ impl Frame { horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, + viewport: bounds, }); } diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index 655362b7..c82b9ffb 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -328,15 +328,17 @@ impl Frame { Point::new(transformed.x, transformed.y) }; + let bounds = Rectangle { + x: position.x, + y: position.y, + width: f32::INFINITY, + height: f32::INFINITY, + }; + // TODO: Use vectorial text instead of primitive self.primitives.push(Primitive::Text { content: text.content, - bounds: Rectangle { - x: position.x, - y: position.y, - width: f32::INFINITY, - height: f32::INFINITY, - }, + bounds, color: text.color, size: text.size, line_height: text.line_height, @@ -344,6 +346,7 @@ impl Frame { horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, + viewport: bounds, }); } diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 98e49f1a..60da3543 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -75,6 +75,7 @@ impl<'a> Layer<'a> { horizontal_alignment: alignment::Horizontal::Left, vertical_alignment: alignment::Vertical::Top, shaping: core::text::Shaping::Basic, + viewport: Rectangle::with_size(Size::INFINITY), }; overlay.text.push(Text::Cached(text.clone())); @@ -123,6 +124,7 @@ impl<'a> Layer<'a> { paragraph, position, color, + viewport, } => { let layer = &mut layers[current_layer]; @@ -130,12 +132,14 @@ impl<'a> Layer<'a> { paragraph: paragraph.clone(), position: *position + translation, color: *color, + viewport: *viewport + translation, }); } Primitive::Editor { editor, position, color, + viewport, } => { let layer = &mut layers[current_layer]; @@ -143,6 +147,7 @@ impl<'a> Layer<'a> { editor: editor.clone(), position: *position + translation, color: *color, + viewport: *viewport + translation, }); } Primitive::Text { @@ -155,6 +160,7 @@ impl<'a> Layer<'a> { horizontal_alignment, vertical_alignment, shaping, + viewport, } => { let layer = &mut layers[current_layer]; @@ -168,6 +174,7 @@ impl<'a> Layer<'a> { horizontal_alignment: *horizontal_alignment, vertical_alignment: *vertical_alignment, shaping: *shaping, + viewport: *viewport + translation, })); } Primitive::Quad { diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index 66417cec..c4ea9185 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -13,6 +13,7 @@ pub enum Text<'a> { paragraph: paragraph::Weak, position: Point, color: Color, + viewport: Rectangle, }, /// An editor. #[allow(missing_docs)] @@ -20,6 +21,7 @@ pub enum Text<'a> { editor: editor::Weak, position: Point, color: Color, + viewport: Rectangle, }, /// A cached text. Cached(Cached<'a>), @@ -53,4 +55,7 @@ pub struct Cached<'a> { /// The shaping strategy of the text. pub shaping: text::Shaping, + + /// The viewport of the text. + pub viewport: Rectangle, } diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 08a8bea6..7d73c87b 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -120,9 +120,13 @@ impl Pipeline { horizontal_alignment, vertical_alignment, color, + viewport, ) = match section { Text::Paragraph { - position, color, .. + position, + color, + viewport, + .. } => { use crate::core::text::Paragraph as _; @@ -137,10 +141,14 @@ impl Pipeline { paragraph.horizontal_alignment(), paragraph.vertical_alignment(), *color, + *viewport, ) } Text::Editor { - position, color, .. + position, + color, + viewport, + .. } => { use crate::core::text::Editor as _; @@ -155,6 +163,7 @@ impl Pipeline { alignment::Horizontal::Left, alignment::Vertical::Top, *color, + *viewport, ) } Text::Cached(text) => { @@ -173,6 +182,7 @@ impl Pipeline { text.horizontal_alignment, text.vertical_alignment, text.color, + text.viewport, ) } }; @@ -195,13 +205,8 @@ impl Pipeline { alignment::Vertical::Bottom => bounds.y - bounds.height, }; - let section_bounds = Rectangle { - x: left, - y: top, - ..bounds - }; - - let clip_bounds = layer_bounds.intersection(§ion_bounds)?; + let clip_bounds = + layer_bounds.intersection(&(viewport * scale_factor))?; Some(glyphon::TextArea { buffer, diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index d7fdf339..a0d9559b 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -266,7 +266,7 @@ where style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let is_mouse_over = cursor.is_over(layout.bounds()); @@ -315,6 +315,7 @@ where }, bounds.center(), custom_style.icon_color, + *viewport, ); } } @@ -330,6 +331,7 @@ where crate::text::Appearance { color: custom_style.text_color, }, + viewport, ); } } diff --git a/widget/src/column.rs b/widget/src/column.rs index 42e90ac1..abb522be 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -224,15 +224,17 @@ where cursor: mouse::Cursor, viewport: &Rectangle, ) { - for ((child, state), layout) in self - .children - .iter() - .zip(&tree.children) - .zip(layout.children()) - { - child - .as_widget() - .draw(state, renderer, theme, style, layout, cursor, viewport); + if let Some(viewport) = layout.bounds().intersection(viewport) { + for ((child, state), layout) in self + .children + .iter() + .zip(&tree.children) + .zip(layout.children()) + { + child.as_widget().draw( + state, renderer, theme, style, layout, cursor, &viewport, + ); + } } } diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 768c2402..31ec27fc 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -622,7 +622,7 @@ where _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let is_focused = { let text_input_state = tree.children[0] @@ -645,6 +645,7 @@ where layout, cursor, selection, + viewport, ); } diff --git a/widget/src/container.rs b/widget/src/container.rs index ee7a4965..5dd7705b 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -252,21 +252,23 @@ where ) { let style = theme.appearance(&self.style); - draw_background(renderer, &style, layout.bounds()); + if let Some(viewport) = layout.bounds().intersection(viewport) { + draw_background(renderer, &style, layout.bounds()); - self.content.as_widget().draw( - tree, - renderer, - theme, - &renderer::Style { - text_color: style - .text_color - .unwrap_or(renderer_style.text_color), - }, - layout.children().next().unwrap(), - cursor, - viewport, - ); + self.content.as_widget().draw( + tree, + renderer, + theme, + &renderer::Style { + text_color: style + .text_color + .unwrap_or(renderer_style.text_color), + }, + layout.children().next().unwrap(), + cursor, + &viewport, + ); + } } fn overlay<'b>( diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 5098fa17..e45b44ae 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -544,6 +544,7 @@ where } else { appearance.text_color }, + *viewport, ); } } diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 00c1a7ff..022ca8d9 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -235,7 +235,7 @@ where _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let font = self.font.unwrap_or_else(|| renderer.default_font()); draw( @@ -253,6 +253,7 @@ where &self.handle, &self.style, || tree.state.downcast_ref::<State<Renderer::Paragraph>>(), + viewport, ); } @@ -631,6 +632,7 @@ pub fn draw<'a, T, Renderer>( handle: &Handle<Renderer::Font>, style: &<Renderer::Theme as StyleSheet>::Style, state: impl FnOnce() -> &'a State<Renderer::Paragraph>, + viewport: &Rectangle, ) where Renderer: text::Renderer, Renderer::Theme: StyleSheet, @@ -715,6 +717,7 @@ pub fn draw<'a, T, Renderer>( bounds.center_y(), ), style.handle_color, + *viewport, ); } @@ -743,6 +746,7 @@ pub fn draw<'a, T, Renderer>( } else { style.placeholder_color }, + *viewport, ); } } diff --git a/widget/src/radio.rs b/widget/src/radio.rs index 57acc033..ae2365dd 100644 --- a/widget/src/radio.rs +++ b/widget/src/radio.rs @@ -291,7 +291,7 @@ where style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let is_mouse_over = cursor.is_over(layout.bounds()); @@ -349,6 +349,7 @@ where crate::text::Appearance { color: custom_style.text_color, }, + viewport, ); } } diff --git a/widget/src/row.rs b/widget/src/row.rs index 7ca90fbb..d52b8c43 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -213,15 +213,17 @@ where cursor: mouse::Cursor, viewport: &Rectangle, ) { - for ((child, state), layout) in self - .children - .iter() - .zip(&tree.children) - .zip(layout.children()) - { - child - .as_widget() - .draw(state, renderer, theme, style, layout, cursor, viewport); + if let Some(viewport) = layout.bounds().intersection(viewport) { + for ((child, state), layout) in self + .children + .iter() + .zip(&tree.children) + .zip(layout.children()) + { + child.as_widget().draw( + state, renderer, theme, style, layout, cursor, &viewport, + ); + } } } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 1708a2e5..63d48868 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -429,7 +429,7 @@ where style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let bounds = layout.bounds(); @@ -470,6 +470,7 @@ where bounds.position() + Vector::new(self.padding.left, self.padding.top), style.text_color, + *viewport, ); let translation = Vector::new( diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 27efe755..b56e3167 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -238,6 +238,7 @@ where layout: Layout<'_>, cursor: mouse::Cursor, value: Option<&Value>, + viewport: &Rectangle, ) { draw( renderer, @@ -250,6 +251,7 @@ where self.is_secure, self.icon.as_ref(), &self.style, + viewport, ); } } @@ -362,7 +364,7 @@ where _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { draw( renderer, @@ -375,6 +377,7 @@ where self.is_secure, self.icon.as_ref(), &self.style, + viewport, ); } @@ -1055,6 +1058,7 @@ pub fn draw<Renderer>( is_secure: bool, icon: Option<&Icon<Renderer::Font>>, style: &<Renderer::Theme as StyleSheet>::Style, + viewport: &Rectangle, ) where Renderer: text::Renderer, Renderer::Theme: StyleSheet, @@ -1096,6 +1100,7 @@ pub fn draw<Renderer>( &state.icon, icon_layout.bounds().center(), appearance.icon_color, + *viewport, ); } @@ -1189,39 +1194,31 @@ pub fn draw<Renderer>( (None, 0.0) }; - let text_width = state.value.min_width(); - - let render = |renderer: &mut Renderer| { - if let Some((cursor, color)) = cursor { - renderer.fill_quad(cursor, color); - } else { - renderer.with_translation(Vector::ZERO, |_| {}); - } - - renderer.fill_paragraph( - if text.is_empty() { - &state.placeholder - } else { - &state.value - }, - Point::new(text_bounds.x, text_bounds.center_y()), - if text.is_empty() { - theme.placeholder_color(style) - } else if is_disabled { - theme.disabled_color(style) - } else { - theme.value_color(style) - }, - ); - }; - - if text_width > text_bounds.width { - renderer.with_layer(text_bounds, |renderer| { - renderer.with_translation(Vector::new(-offset, 0.0), render); + if let Some((cursor, color)) = cursor { + renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { + renderer.fill_quad(cursor, color) }); } else { - render(renderer); + renderer.with_translation(Vector::ZERO, |_| {}); } + + renderer.fill_paragraph( + if text.is_empty() { + &state.placeholder + } else { + &state.value + }, + Point::new(text_bounds.x, text_bounds.center_y()) + - Vector::new(offset, 0.0), + if text.is_empty() { + theme.placeholder_color(style) + } else if is_disabled { + theme.disabled_color(style) + } else { + theme.value_color(style) + }, + text_bounds, + ); } /// Computes the current [`mouse::Interaction`] of the [`TextInput`]. diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs index 476c8330..d8723080 100644 --- a/widget/src/toggler.rs +++ b/widget/src/toggler.rs @@ -266,7 +266,7 @@ where style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { /// Makes sure that the border radius of the toggler looks good at every size. const BORDER_RADIUS_RATIO: f32 = 32.0 / 13.0; @@ -287,6 +287,7 @@ where label_layout, tree.state.downcast_ref(), crate::text::Appearance::default(), + viewport, ); } From 43a7cc2222750b1cada1663b29278b29d3ea232c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 1 Dec 2023 16:10:37 +0100 Subject: [PATCH 192/286] Fix `clippy` lint --- widget/src/text_input.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index b56e3167..ab0e2412 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1196,7 +1196,7 @@ pub fn draw<Renderer>( if let Some((cursor, color)) = cursor { renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { - renderer.fill_quad(cursor, color) + renderer.fill_quad(cursor, color); }); } else { renderer.with_translation(Vector::ZERO, |_| {}); From b526ce4958b28208395276dd4078ffe0d780e1d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 2 Dec 2023 15:53:02 +0100 Subject: [PATCH 193/286] Rename `viewport` to `clip_bounds` --- core/src/renderer/null.rs | 6 +++--- core/src/text.rs | 6 +++--- graphics/src/primitive.rs | 12 ++++++------ graphics/src/renderer.rs | 12 ++++++------ renderer/src/lib.rs | 12 ++++++------ tiny_skia/src/backend.rs | 15 +++++++++------ tiny_skia/src/geometry.rs | 2 +- wgpu/src/geometry.rs | 2 +- wgpu/src/layer.rs | 14 +++++++------- wgpu/src/layer/text.rs | 8 ++++---- wgpu/src/text.rs | 14 +++++++------- 11 files changed, 53 insertions(+), 50 deletions(-) diff --git a/core/src/renderer/null.rs b/core/src/renderer/null.rs index 3ce6a4f5..7accd34e 100644 --- a/core/src/renderer/null.rs +++ b/core/src/renderer/null.rs @@ -64,7 +64,7 @@ impl text::Renderer for Null { _paragraph: &Self::Paragraph, _position: Point, _color: Color, - _viewport: Rectangle, + _clip_bounds: Rectangle, ) { } @@ -73,7 +73,7 @@ impl text::Renderer for Null { _editor: &Self::Editor, _position: Point, _color: Color, - _viewport: Rectangle, + _clip_bounds: Rectangle, ) { } @@ -82,7 +82,7 @@ impl text::Renderer for Null { _paragraph: Text<'_, Self::Font>, _position: Point, _color: Color, - _viewport: Rectangle, + _clip_bounds: Rectangle, ) { } } diff --git a/core/src/text.rs b/core/src/text.rs index 697fa628..edef79c2 100644 --- a/core/src/text.rs +++ b/core/src/text.rs @@ -202,7 +202,7 @@ pub trait Renderer: crate::Renderer { text: &Self::Paragraph, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ); /// Draws the given [`Editor`] at the given position and with the given @@ -212,7 +212,7 @@ pub trait Renderer: crate::Renderer { editor: &Self::Editor, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ); /// Draws the given [`Text`] at the given position and with the given @@ -222,6 +222,6 @@ pub trait Renderer: crate::Renderer { text: Text<'_, Self::Font>, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ); } diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index 837eb77a..ed75776c 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -32,8 +32,8 @@ pub enum Primitive<T> { vertical_alignment: alignment::Vertical, /// The shaping strategy of the text. shaping: text::Shaping, - /// The viewport of the text. - viewport: Rectangle, + /// The clip bounds of the text. + clip_bounds: Rectangle, }, /// A paragraph primitive Paragraph { @@ -43,8 +43,8 @@ pub enum Primitive<T> { position: Point, /// The color of the paragraph. color: Color, - /// The viewport of the paragraph. - viewport: Rectangle, + /// The clip bounds of the paragraph. + clip_bounds: Rectangle, }, /// An editor primitive Editor { @@ -54,8 +54,8 @@ pub enum Primitive<T> { position: Point, /// The color of the editor. color: Color, - /// The viewport of the editor. - viewport: Rectangle, + /// The clip bounds of the editor. + clip_bounds: Rectangle, }, /// A quad primitive Quad { diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs index 0d3b11a7..1b0f5c5b 100644 --- a/graphics/src/renderer.rs +++ b/graphics/src/renderer.rs @@ -164,13 +164,13 @@ where paragraph: &Self::Paragraph, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { self.primitives.push(Primitive::Paragraph { paragraph: paragraph.downgrade(), position, color, - viewport, + clip_bounds, }); } @@ -179,13 +179,13 @@ where editor: &Self::Editor, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { self.primitives.push(Primitive::Editor { editor: editor.downgrade(), position, color, - viewport, + clip_bounds, }); } @@ -194,7 +194,7 @@ where text: Text<'_, Self::Font>, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { self.primitives.push(Primitive::Text { content: text.content.to_string(), @@ -206,7 +206,7 @@ where horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, - viewport, + clip_bounds, }); } } diff --git a/renderer/src/lib.rs b/renderer/src/lib.rs index 90a7262b..f2acfa00 100644 --- a/renderer/src/lib.rs +++ b/renderer/src/lib.rs @@ -175,12 +175,12 @@ impl<T> text::Renderer for Renderer<T> { paragraph: &Self::Paragraph, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { delegate!( self, renderer, - renderer.fill_paragraph(paragraph, position, color, viewport) + renderer.fill_paragraph(paragraph, position, color, clip_bounds) ); } @@ -189,12 +189,12 @@ impl<T> text::Renderer for Renderer<T> { editor: &Self::Editor, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { delegate!( self, renderer, - renderer.fill_editor(editor, position, color, viewport) + renderer.fill_editor(editor, position, color, clip_bounds) ); } @@ -203,12 +203,12 @@ impl<T> text::Renderer for Renderer<T> { text: Text<'_, Self::Font>, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, ) { delegate!( self, renderer, - renderer.fill_text(text, position, color, viewport) + renderer.fill_text(text, position, color, clip_bounds) ); } } diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index cc0f72d1..3e9bd2a5 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -361,9 +361,10 @@ impl Backend { paragraph, position, color, - viewport, + clip_bounds: text_clip_bounds, } => { - let physical_bounds = (*viewport + translation) * scale_factor; + let physical_bounds = + (*text_clip_bounds + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; @@ -385,9 +386,10 @@ impl Backend { editor, position, color, - viewport, + clip_bounds: text_clip_bounds, } => { - let physical_bounds = (*viewport + translation) * scale_factor; + let physical_bounds = + (*text_clip_bounds + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; @@ -415,9 +417,10 @@ impl Backend { horizontal_alignment, vertical_alignment, shaping, - viewport, + clip_bounds: text_clip_bounds, } => { - let physical_bounds = (*viewport + translation) * scale_factor; + let physical_bounds = + (*text_clip_bounds + translation) * scale_factor; if !clip_bounds.intersects(&physical_bounds) { return; diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index b73f84a9..5f28b737 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -127,7 +127,7 @@ impl Frame { horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, - viewport: bounds, + clip_bounds: Rectangle::with_size(Size::INFINITY), }); } diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index c82b9ffb..e0bff67e 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -346,7 +346,7 @@ impl Frame { horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, shaping: text.shaping, - viewport: bounds, + clip_bounds: Rectangle::with_size(Size::INFINITY), }); } diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 60da3543..557a7633 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -75,7 +75,7 @@ impl<'a> Layer<'a> { horizontal_alignment: alignment::Horizontal::Left, vertical_alignment: alignment::Vertical::Top, shaping: core::text::Shaping::Basic, - viewport: Rectangle::with_size(Size::INFINITY), + clip_bounds: Rectangle::with_size(Size::INFINITY), }; overlay.text.push(Text::Cached(text.clone())); @@ -124,7 +124,7 @@ impl<'a> Layer<'a> { paragraph, position, color, - viewport, + clip_bounds, } => { let layer = &mut layers[current_layer]; @@ -132,14 +132,14 @@ impl<'a> Layer<'a> { paragraph: paragraph.clone(), position: *position + translation, color: *color, - viewport: *viewport + translation, + clip_bounds: *clip_bounds + translation, }); } Primitive::Editor { editor, position, color, - viewport, + clip_bounds, } => { let layer = &mut layers[current_layer]; @@ -147,7 +147,7 @@ impl<'a> Layer<'a> { editor: editor.clone(), position: *position + translation, color: *color, - viewport: *viewport + translation, + clip_bounds: *clip_bounds + translation, }); } Primitive::Text { @@ -160,7 +160,7 @@ impl<'a> Layer<'a> { horizontal_alignment, vertical_alignment, shaping, - viewport, + clip_bounds, } => { let layer = &mut layers[current_layer]; @@ -174,7 +174,7 @@ impl<'a> Layer<'a> { horizontal_alignment: *horizontal_alignment, vertical_alignment: *vertical_alignment, shaping: *shaping, - viewport: *viewport + translation, + clip_bounds: *clip_bounds + translation, })); } Primitive::Quad { diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index c4ea9185..df2f2875 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -13,7 +13,7 @@ pub enum Text<'a> { paragraph: paragraph::Weak, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, }, /// An editor. #[allow(missing_docs)] @@ -21,7 +21,7 @@ pub enum Text<'a> { editor: editor::Weak, position: Point, color: Color, - viewport: Rectangle, + clip_bounds: Rectangle, }, /// A cached text. Cached(Cached<'a>), @@ -56,6 +56,6 @@ pub struct Cached<'a> { /// The shaping strategy of the text. pub shaping: text::Shaping, - /// The viewport of the text. - pub viewport: Rectangle, + /// The clip bounds of the text. + pub clip_bounds: Rectangle, } diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 7d73c87b..888b1924 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -120,12 +120,12 @@ impl Pipeline { horizontal_alignment, vertical_alignment, color, - viewport, + clip_bounds, ) = match section { Text::Paragraph { position, color, - viewport, + clip_bounds, .. } => { use crate::core::text::Paragraph as _; @@ -141,13 +141,13 @@ impl Pipeline { paragraph.horizontal_alignment(), paragraph.vertical_alignment(), *color, - *viewport, + *clip_bounds, ) } Text::Editor { position, color, - viewport, + clip_bounds, .. } => { use crate::core::text::Editor as _; @@ -163,7 +163,7 @@ impl Pipeline { alignment::Horizontal::Left, alignment::Vertical::Top, *color, - *viewport, + *clip_bounds, ) } Text::Cached(text) => { @@ -182,7 +182,7 @@ impl Pipeline { text.horizontal_alignment, text.vertical_alignment, text.color, - text.viewport, + text.clip_bounds, ) } }; @@ -206,7 +206,7 @@ impl Pipeline { }; let clip_bounds = - layer_bounds.intersection(&(viewport * scale_factor))?; + layer_bounds.intersection(&(clip_bounds * scale_factor))?; Some(glyphon::TextArea { buffer, From ea42af766f345715ff7a7168182d3896ee79cfbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 2 Dec 2023 20:41:58 +0100 Subject: [PATCH 194/286] Use `AtomicU64` for `window::Id` --- core/src/window/event.rs | 32 +++--- core/src/window/id.rs | 14 +-- examples/multi_window/src/main.rs | 49 ++++----- runtime/src/command/action.rs | 8 +- runtime/src/multi_window/program.rs | 4 +- runtime/src/window.rs | 99 +++++++++--------- runtime/src/window/action.rs | 154 +++++++++++++++------------- winit/src/application.rs | 36 +++---- winit/src/multi_window.rs | 44 ++++---- 9 files changed, 228 insertions(+), 212 deletions(-) diff --git a/core/src/window/event.rs b/core/src/window/event.rs index 3ab7cd81..b9ee7aca 100644 --- a/core/src/window/event.rs +++ b/core/src/window/event.rs @@ -6,6 +6,22 @@ use std::path::PathBuf; /// A window-related event. #[derive(PartialEq, Clone, Debug)] pub enum Event { + /// A window was opened. + Opened { + /// The position of the opened window. This is relative to the top-left corner of the desktop + /// the window is on, including virtual desktops. Refers to window's "inner" position, + /// or the client area, in logical pixels. + /// + /// **Note**: Not available in Wayland. + position: Option<Point>, + /// The size of the created window. This is its "inner" size, or the size of the + /// client area, in logical pixels. + size: Size, + }, + + /// A window was closed. + Closed, + /// A window was moved. Moved { /// The new logical x location of the window @@ -30,22 +46,6 @@ pub enum Event { /// The user has requested for the window to close. CloseRequested, - /// A window was created. - Created { - /// The position of the created window. This is relative to the top-left corner of the desktop - /// the window is on, including virtual desktops. Refers to window's "inner" position, - /// or the client area, in logical pixels. - /// - /// **Note**: Not available in Wayland. - position: Option<Point>, - /// The size of the created window. This is its "inner" size, or the size of the - /// client area, in logical pixels. - size: Size, - }, - - /// A window was destroyed by the runtime. - Destroyed, - /// A window was focused. Focused, diff --git a/core/src/window/id.rs b/core/src/window/id.rs index 65002d43..20474c8f 100644 --- a/core/src/window/id.rs +++ b/core/src/window/id.rs @@ -1,5 +1,6 @@ -use std::collections::hash_map::DefaultHasher; -use std::hash::{Hash, Hasher}; +use std::hash::Hash; + +use std::sync::atomic::{self, AtomicU64}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] /// The id of the window. @@ -7,15 +8,14 @@ use std::hash::{Hash, Hasher}; /// Internally Iced reserves `window::Id::MAIN` for the first window spawned. pub struct Id(u64); +static COUNT: AtomicU64 = AtomicU64::new(1); + impl Id { /// The reserved window [`Id`] for the first window in an Iced application. pub const MAIN: Self = Id(0); /// Creates a new unique window [`Id`]. - pub fn new(id: impl Hash) -> Id { - let mut hasher = DefaultHasher::new(); - id.hash(&mut hasher); - - Id(hasher.finish()) + pub fn unique() -> Id { + Id(COUNT.fetch_add(1, atomic::Ordering::Relaxed)) } } diff --git a/examples/multi_window/src/main.rs b/examples/multi_window/src/main.rs index 16beb46e..5a5e70c1 100644 --- a/examples/multi_window/src/main.rs +++ b/examples/multi_window/src/main.rs @@ -35,8 +35,8 @@ enum Message { ScaleChanged(window::Id, String), TitleChanged(window::Id, String), CloseWindow(window::Id), - WindowCreated(window::Id, Option<Point>), - WindowDestroyed(window::Id), + WindowOpened(window::Id, Option<Point>), + WindowClosed(window::Id), NewWindow, } @@ -69,6 +69,8 @@ impl multi_window::Application for Example { let window = self.windows.get_mut(&id).expect("Window not found!"); window.scale_input = scale; + + Command::none() } Message::ScaleChanged(id, scale) => { let window = @@ -78,20 +80,23 @@ impl multi_window::Application for Example { .parse::<f64>() .unwrap_or(window.current_scale) .clamp(0.5, 5.0); + + Command::none() } Message::TitleChanged(id, title) => { let window = self.windows.get_mut(&id).expect("Window not found."); window.title = title; + + Command::none() } - Message::CloseWindow(id) => { - return window::close(id); - } - Message::WindowDestroyed(id) => { + Message::CloseWindow(id) => window::close(id), + Message::WindowClosed(id) => { self.windows.remove(&id); + Command::none() } - Message::WindowCreated(id, position) => { + Message::WindowOpened(id, position) => { if let Some(position) = position { self.next_window_pos = window::Position::Specific( position + Vector::new(20.0, 20.0), @@ -99,27 +104,25 @@ impl multi_window::Application for Example { } if let Some(window) = self.windows.get(&id) { - return text_input::focus(window.input_id.clone()); + text_input::focus(window.input_id.clone()) + } else { + Command::none() } } Message::NewWindow => { let count = self.windows.len() + 1; - let id = window::Id::new(count); + + let (id, spawn_window) = window::spawn(window::Settings { + position: self.next_window_pos, + exit_on_close_request: count % 2 == 0, + ..Default::default() + }); 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() - }, - ); + spawn_window } } - - Command::none() } fn view(&self, window: window::Id) -> Element<Message> { @@ -151,12 +154,10 @@ impl multi_window::Application for Example { window::Event::CloseRequested => { Some(Message::CloseWindow(id)) } - window::Event::Destroyed => { - Some(Message::WindowDestroyed(id)) - } - window::Event::Created { position, .. } => { - Some(Message::WindowCreated(id, position)) + window::Event::Opened { position, .. } => { + Some(Message::WindowOpened(id, position)) } + window::Event::Closed => Some(Message::WindowClosed(id)), _ => None, } } else { diff --git a/runtime/src/command/action.rs b/runtime/src/command/action.rs index 7a70920e..cb0936df 100644 --- a/runtime/src/command/action.rs +++ b/runtime/src/command/action.rs @@ -27,7 +27,7 @@ pub enum Action<T> { Clipboard(clipboard::Action<T>), /// Run a window action. - Window(window::Id, window::Action<T>), + Window(window::Action<T>), /// Run a system action. System(system::Action<T>), @@ -63,7 +63,7 @@ impl<T> Action<T> { Self::Future(future) => Action::Future(Box::pin(future.map(f))), Self::Stream(stream) => Action::Stream(Box::pin(stream.map(f))), Self::Clipboard(action) => Action::Clipboard(action.map(f)), - Self::Window(id, window) => Action::Window(id, window.map(f)), + Self::Window(window) => Action::Window(window.map(f)), Self::System(system) => Action::System(system.map(f)), Self::Widget(operation) => { Action::Widget(Box::new(widget::operation::map(operation, f))) @@ -84,8 +84,8 @@ impl<T> fmt::Debug for Action<T> { Self::Clipboard(action) => { write!(f, "Action::Clipboard({action:?})") } - Self::Window(id, action) => { - write!(f, "Action::Window({id:?}, {action:?})") + Self::Window(action) => { + write!(f, "Action::Window({action:?})") } Self::System(action) => write!(f, "Action::System({action:?})"), Self::Widget(_action) => write!(f, "Action::Widget"), diff --git a/runtime/src/multi_window/program.rs b/runtime/src/multi_window/program.rs index c3989d0d..591b3e9a 100644 --- a/runtime/src/multi_window/program.rs +++ b/runtime/src/multi_window/program.rs @@ -1,8 +1,8 @@ //! Build interactive programs using The Elm Architecture. -use crate::{window, Command}; - use crate::core::text; +use crate::core::window; use crate::core::{Element, Renderer}; +use crate::Command; /// The core of a user interface for a multi-window application following The Elm Architecture. pub trait Program: Sized { diff --git a/runtime/src/window.rs b/runtime/src/window.rs index f46ac1b8..f9d943f6 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -3,13 +3,14 @@ mod action; pub mod screenshot; -pub use crate::core::window::Id; pub use action::Action; pub use screenshot::Screenshot; use crate::command::{self, Command}; use crate::core::time::Instant; -use crate::core::window::{self, Event, Icon, Level, Mode, UserAttention}; +use crate::core::window::{ + Event, Icon, Id, Level, Mode, Settings, UserAttention, +}; use crate::core::{Point, Size}; use crate::futures::event; use crate::futures::Subscription; @@ -29,73 +30,77 @@ pub fn frames() -> Subscription<Instant> { }) } -/// Spawns a new window with the given `id` and `settings`. -pub fn spawn<Message>( - id: window::Id, - settings: window::Settings, -) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Spawn { settings })) +/// Spawns a new window with the given `settings`. +/// +/// Returns the new window [`Id`] alongside the [`Command`]. +pub fn spawn<Message>(settings: Settings) -> (Id, Command<Message>) { + let id = Id::unique(); + + ( + id, + Command::single(command::Action::Window(Action::Spawn(id, settings))), + ) } /// Closes the window with `id`. -pub fn close<Message>(id: window::Id) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Close)) +pub fn close<Message>(id: Id) -> Command<Message> { + Command::single(command::Action::Window(Action::Close(id))) } /// Begins dragging the window while the left mouse button is held. -pub fn drag<Message>(id: window::Id) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Drag)) +pub fn drag<Message>(id: Id) -> Command<Message> { + Command::single(command::Action::Window(Action::Drag(id))) } /// Resizes the window to the given logical dimensions. -pub fn resize<Message>(id: window::Id, new_size: Size) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Resize(new_size))) +pub fn resize<Message>(id: Id, new_size: Size) -> Command<Message> { + Command::single(command::Action::Window(Action::Resize(id, new_size))) } /// Fetches the window's size in logical dimensions. pub fn fetch_size<Message>( - id: window::Id, + id: Id, f: impl FnOnce(Size) -> Message + 'static, ) -> Command<Message> { - Command::single(command::Action::Window(id, Action::FetchSize(Box::new(f)))) + Command::single(command::Action::Window(Action::FetchSize(id, Box::new(f)))) } /// Maximizes the window. -pub fn maximize<Message>(id: window::Id, maximized: bool) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Maximize(maximized))) +pub fn maximize<Message>(id: Id, maximized: bool) -> Command<Message> { + Command::single(command::Action::Window(Action::Maximize(id, maximized))) } /// Minimizes the window. -pub fn minimize<Message>(id: window::Id, minimized: bool) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Minimize(minimized))) +pub fn minimize<Message>(id: Id, minimized: bool) -> Command<Message> { + Command::single(command::Action::Window(Action::Minimize(id, minimized))) } /// Moves the window to the given logical coordinates. -pub fn move_to<Message>(id: window::Id, position: Point) -> Command<Message> { - Command::single(command::Action::Window(id, Action::Move(position))) +pub fn move_to<Message>(id: Id, position: Point) -> Command<Message> { + Command::single(command::Action::Window(Action::Move(id, position))) } /// Changes the [`Mode`] of the window. -pub fn change_mode<Message>(id: window::Id, mode: Mode) -> Command<Message> { - Command::single(command::Action::Window(id, Action::ChangeMode(mode))) +pub fn change_mode<Message>(id: Id, mode: Mode) -> Command<Message> { + Command::single(command::Action::Window(Action::ChangeMode(id, mode))) } /// Fetches the current [`Mode`] of the window. pub fn fetch_mode<Message>( - id: window::Id, + id: Id, f: impl FnOnce(Mode) -> Message + 'static, ) -> Command<Message> { - Command::single(command::Action::Window(id, Action::FetchMode(Box::new(f)))) + Command::single(command::Action::Window(Action::FetchMode(id, Box::new(f)))) } /// Toggles the window to maximized or back. -pub fn toggle_maximize<Message>(id: window::Id) -> Command<Message> { - Command::single(command::Action::Window(id, Action::ToggleMaximize)) +pub fn toggle_maximize<Message>(id: Id) -> Command<Message> { + Command::single(command::Action::Window(Action::ToggleMaximize(id))) } /// Toggles the window decorations. -pub fn toggle_decorations<Message>(id: window::Id) -> Command<Message> { - Command::single(command::Action::Window(id, Action::ToggleDecorations)) +pub fn toggle_decorations<Message>(id: Id) -> Command<Message> { + Command::single(command::Action::Window(Action::ToggleDecorations(id))) } /// Request user attention to the window. This has no effect if the application @@ -105,13 +110,13 @@ pub fn toggle_decorations<Message>(id: window::Id) -> Command<Message> { /// Providing `None` will unset the request for user attention. Unsetting the request for /// user attention might not be done automatically by the WM when the window receives input. pub fn request_user_attention<Message>( - id: window::Id, + id: Id, user_attention: Option<UserAttention>, ) -> Command<Message> { - Command::single(command::Action::Window( + Command::single(command::Action::Window(Action::RequestUserAttention( id, - Action::RequestUserAttention(user_attention), - )) + user_attention, + ))) } /// Brings the window to the front and sets input focus. Has no effect if the window is @@ -120,36 +125,36 @@ pub fn request_user_attention<Message>( /// This [`Command`] steals input focus from other applications. Do not use this method unless /// you are certain that's what the user wants. Focus stealing can cause an extremely disruptive /// user experience. -pub fn gain_focus<Message>(id: window::Id) -> Command<Message> { - Command::single(command::Action::Window(id, Action::GainFocus)) +pub fn gain_focus<Message>(id: Id) -> Command<Message> { + Command::single(command::Action::Window(Action::GainFocus(id))) } /// Changes the window [`Level`]. -pub fn change_level<Message>(id: window::Id, level: Level) -> Command<Message> { - Command::single(command::Action::Window(id, Action::ChangeLevel(level))) +pub fn change_level<Message>(id: Id, level: Level) -> Command<Message> { + Command::single(command::Action::Window(Action::ChangeLevel(id, level))) } /// Fetches an identifier unique to the window, provided by the underlying windowing system. This is -/// not to be confused with [`window::Id`]. +/// not to be confused with [`Id`]. pub fn fetch_id<Message>( - id: window::Id, + id: Id, f: impl FnOnce(u64) -> Message + 'static, ) -> Command<Message> { - Command::single(command::Action::Window(id, Action::FetchId(Box::new(f)))) + Command::single(command::Action::Window(Action::FetchId(id, Box::new(f)))) } /// Changes the [`Icon`] of the window. -pub fn change_icon<Message>(id: window::Id, icon: Icon) -> Command<Message> { - Command::single(command::Action::Window(id, Action::ChangeIcon(icon))) +pub fn change_icon<Message>(id: Id, icon: Icon) -> Command<Message> { + Command::single(command::Action::Window(Action::ChangeIcon(id, icon))) } /// Captures a [`Screenshot`] from the window. pub fn screenshot<Message>( - id: window::Id, + id: Id, f: impl FnOnce(Screenshot) -> Message + Send + 'static, ) -> Command<Message> { - Command::single(command::Action::Window( + Command::single(command::Action::Window(Action::Screenshot( id, - Action::Screenshot(Box::new(f)), - )) + Box::new(f), + ))) } diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index 5afe0389..2d98b607 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -1,4 +1,4 @@ -use crate::core::window::{Icon, Level, Mode, Settings, UserAttention}; +use crate::core::window::{Icon, Id, Level, Mode, Settings, UserAttention}; use crate::core::{Point, Size}; use crate::futures::MaybeSend; use crate::window::Screenshot; @@ -7,43 +7,40 @@ use std::fmt; /// An operation to be performed on some window. pub enum Action<T> { - /// Close the current window and exits the application. - Close, + /// Spawns a new window with some [`Settings`]. + Spawn(Id, Settings), + /// Close the window and exits the application. + Close(Id), /// Move the window with the left mouse button until the button is /// released. /// /// There’s no guarantee that this will work unless the left mouse /// button was pressed immediately before this function is called. - Drag, - /// Spawns a new window. - Spawn { - /// The settings of the window. - settings: Settings, - }, + Drag(Id), /// Resize the window to the given logical dimensions. - Resize(Size), + Resize(Id, Size), /// Fetch the current logical dimensions of the window. - FetchSize(Box<dyn FnOnce(Size) -> T + 'static>), + FetchSize(Id, Box<dyn FnOnce(Size) -> T + 'static>), /// Set the window to maximized or back - Maximize(bool), + Maximize(Id, bool), /// Set the window to minimized or back - Minimize(bool), + Minimize(Id, bool), /// Move the window to the given logical coordinates. /// /// Unsupported on Wayland. - Move(Point), + Move(Id, Point), /// Change the [`Mode`] of the window. - ChangeMode(Mode), + ChangeMode(Id, Mode), /// Fetch the current [`Mode`] of the window. - FetchMode(Box<dyn FnOnce(Mode) -> T + 'static>), + FetchMode(Id, Box<dyn FnOnce(Mode) -> T + 'static>), /// Toggle the window to maximized or back - ToggleMaximize, + ToggleMaximize(Id), /// Toggle whether window has decorations. /// /// ## Platform-specific /// - **X11:** Not implemented. /// - **Web:** Unsupported. - ToggleDecorations, + ToggleDecorations(Id), /// Request user attention to the window, this has no effect if the application /// is already focused. How requesting for user attention manifests is platform dependent, /// see [`UserAttention`] for details. @@ -57,7 +54,7 @@ pub enum Action<T> { /// - **macOS:** `None` has no effect. /// - **X11:** Requests for user attention must be manually cleared. /// - **Wayland:** Requires `xdg_activation_v1` protocol, `None` has no effect. - RequestUserAttention(Option<UserAttention>), + RequestUserAttention(Id, Option<UserAttention>), /// Bring the window to the front and sets input focus. Has no effect if the window is /// already in focus, minimized, or not visible. /// @@ -68,11 +65,11 @@ pub enum Action<T> { /// ## Platform-specific /// /// - **Web / Wayland:** Unsupported. - GainFocus, + GainFocus(Id), /// Change the window [`Level`]. - ChangeLevel(Level), - /// Fetch an identifier unique to the window. - FetchId(Box<dyn FnOnce(u64) -> T + 'static>), + ChangeLevel(Id, Level), + /// Fetch the raw identifier unique to the window. + FetchId(Id, Box<dyn FnOnce(u64) -> T + 'static>), /// Change the window [`Icon`]. /// /// On Windows and X11, this is typically the small icon in the top-left @@ -87,9 +84,9 @@ pub enum Action<T> { /// /// - **X11:** Has no universal guidelines for icon sizes, so you're at the whims of the WM. That /// said, it's usually in the same ballpark as on Windows. - ChangeIcon(Icon), + ChangeIcon(Id, Icon), /// Screenshot the viewport of the window. - Screenshot(Box<dyn FnOnce(Screenshot) -> T + 'static>), + Screenshot(Id, Box<dyn FnOnce(Screenshot) -> T + 'static>), } impl<T> Action<T> { @@ -102,30 +99,35 @@ impl<T> Action<T> { T: 'static, { match self { - Self::Close => Action::Close, - Self::Drag => Action::Drag, - Self::Spawn { settings } => Action::Spawn { settings }, - Self::Resize(size) => Action::Resize(size), - Self::FetchSize(o) => Action::FetchSize(Box::new(move |s| f(o(s)))), - Self::Maximize(maximized) => Action::Maximize(maximized), - Self::Minimize(minimized) => Action::Minimize(minimized), - Self::Move(position) => Action::Move(position), - Self::ChangeMode(mode) => Action::ChangeMode(mode), - Self::FetchMode(o) => Action::FetchMode(Box::new(move |s| f(o(s)))), - Self::ToggleMaximize => Action::ToggleMaximize, - Self::ToggleDecorations => Action::ToggleDecorations, - Self::RequestUserAttention(attention_type) => { - Action::RequestUserAttention(attention_type) + Self::Spawn(id, settings) => Action::Spawn(id, settings), + Self::Close(id) => Action::Close(id), + Self::Drag(id) => Action::Drag(id), + Self::Resize(id, size) => Action::Resize(id, size), + Self::FetchSize(id, o) => { + Action::FetchSize(id, Box::new(move |s| f(o(s)))) } - Self::GainFocus => Action::GainFocus, - Self::ChangeLevel(level) => Action::ChangeLevel(level), - Self::FetchId(o) => Action::FetchId(Box::new(move |s| f(o(s)))), - Self::ChangeIcon(icon) => Action::ChangeIcon(icon), - Self::Screenshot(tag) => { - Action::Screenshot(Box::new(move |screenshot| { - f(tag(screenshot)) - })) + Self::Maximize(id, maximized) => Action::Maximize(id, maximized), + Self::Minimize(id, minimized) => Action::Minimize(id, minimized), + Self::Move(id, position) => Action::Move(id, position), + Self::ChangeMode(id, mode) => Action::ChangeMode(id, mode), + Self::FetchMode(id, o) => { + Action::FetchMode(id, Box::new(move |s| f(o(s)))) } + Self::ToggleMaximize(id) => Action::ToggleMaximize(id), + Self::ToggleDecorations(id) => Action::ToggleDecorations(id), + Self::RequestUserAttention(id, attention_type) => { + Action::RequestUserAttention(id, attention_type) + } + Self::GainFocus(id) => Action::GainFocus(id), + Self::ChangeLevel(id, level) => Action::ChangeLevel(id, level), + Self::FetchId(id, o) => { + Action::FetchId(id, Box::new(move |s| f(o(s)))) + } + Self::ChangeIcon(id, icon) => Action::ChangeIcon(id, icon), + Self::Screenshot(id, tag) => Action::Screenshot( + id, + Box::new(move |screenshot| f(tag(screenshot))), + ), } } } @@ -133,38 +135,46 @@ impl<T> Action<T> { impl<T> fmt::Debug for Action<T> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::Close => write!(f, "Action::Close"), - Self::Drag => write!(f, "Action::Drag"), - Self::Spawn { settings } => { - write!(f, "Action::Spawn {{ settings: {:?} }}", settings) + Self::Spawn(id, settings) => { + write!(f, "Action::Spawn({id:?}, {settings:?})") } - Self::Resize(size) => write!(f, "Action::Resize({size:?})"), - Self::FetchSize(_) => write!(f, "Action::FetchSize"), - Self::Maximize(maximized) => { - write!(f, "Action::Maximize({maximized})") + Self::Close(id) => write!(f, "Action::Close({id:?})"), + Self::Drag(id) => write!(f, "Action::Drag({id:?})"), + Self::Resize(id, size) => { + write!(f, "Action::Resize({id:?}, {size:?})") } - Self::Minimize(minimized) => { - write!(f, "Action::Minimize({minimized}") + Self::FetchSize(id, _) => write!(f, "Action::FetchSize({id:?})"), + Self::Maximize(id, maximized) => { + write!(f, "Action::Maximize({id:?}, {maximized})") } - Self::Move(position) => { - write!(f, "Action::Move({position})") + Self::Minimize(id, minimized) => { + write!(f, "Action::Minimize({id:?}, {minimized}") } - Self::ChangeMode(mode) => write!(f, "Action::SetMode({mode:?})"), - Self::FetchMode(_) => write!(f, "Action::FetchMode"), - Self::ToggleMaximize => write!(f, "Action::ToggleMaximize"), - Self::ToggleDecorations => write!(f, "Action::ToggleDecorations"), - Self::RequestUserAttention(_) => { - write!(f, "Action::RequestUserAttention") + Self::Move(id, position) => { + write!(f, "Action::Move({id:?}, {position})") } - Self::GainFocus => write!(f, "Action::GainFocus"), - Self::ChangeLevel(level) => { - write!(f, "Action::ChangeLevel({level:?})") + Self::ChangeMode(id, mode) => { + write!(f, "Action::SetMode({id:?}, {mode:?})") } - Self::FetchId(_) => write!(f, "Action::FetchId"), - Self::ChangeIcon(_icon) => { - write!(f, "Action::ChangeIcon(icon)") + Self::FetchMode(id, _) => write!(f, "Action::FetchMode({id:?})"), + Self::ToggleMaximize(id) => { + write!(f, "Action::ToggleMaximize({id:?})") } - Self::Screenshot(_) => write!(f, "Action::Screenshot"), + Self::ToggleDecorations(id) => { + write!(f, "Action::ToggleDecorations({id:?})") + } + Self::RequestUserAttention(id, _) => { + write!(f, "Action::RequestUserAttention({id:?})") + } + Self::GainFocus(id) => write!(f, "Action::GainFocus({id:?})"), + Self::ChangeLevel(id, level) => { + write!(f, "Action::ChangeLevel({id:?}, {level:?})") + } + Self::FetchId(id, _) => write!(f, "Action::FetchId({id:?})"), + Self::ChangeIcon(id, _icon) => { + write!(f, "Action::ChangeIcon({id:?})") + } + Self::Screenshot(id, _) => write!(f, "Action::Screenshot({id:?})"), } } } diff --git a/winit/src/application.rs b/winit/src/application.rs index 4e6a879f..cc1db8cb 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -712,11 +712,11 @@ pub fn run_command<A, C, E>( clipboard.write(contents); } }, - command::Action::Window(_, action) => match action { - window::Action::Close => { + command::Action::Window(action) => match action { + window::Action::Close(_id) => { *should_exit = true; } - window::Action::Drag => { + window::Action::Drag(_id) => { let _res = window.drag_window(); } window::Action::Spawn { .. } => { @@ -725,13 +725,13 @@ pub fn run_command<A, C, E>( multi-window applications." ); } - window::Action::Resize(size) => { + window::Action::Resize(_id, size) => { window.set_inner_size(winit::dpi::LogicalSize { width: size.width, height: size.height, }); } - window::Action::FetchSize(callback) => { + window::Action::FetchSize(_id, callback) => { let size = window.inner_size().to_logical(window.scale_factor()); @@ -742,29 +742,29 @@ pub fn run_command<A, C, E>( ))) .expect("Send message to event loop"); } - window::Action::Maximize(maximized) => { + window::Action::Maximize(_id, maximized) => { window.set_maximized(maximized); } - window::Action::Minimize(minimized) => { + window::Action::Minimize(_id, minimized) => { window.set_minimized(minimized); } - window::Action::Move(position) => { + window::Action::Move(_id, position) => { window.set_outer_position(winit::dpi::LogicalPosition { x: position.x, y: position.y, }); } - window::Action::ChangeMode(mode) => { + window::Action::ChangeMode(_id, mode) => { window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( window.current_monitor(), mode, )); } - window::Action::ChangeIcon(icon) => { + window::Action::ChangeIcon(_id, icon) => { window.set_window_icon(conversion::icon(icon)); } - window::Action::FetchMode(tag) => { + window::Action::FetchMode(_id, tag) => { let mode = if window.is_visible().unwrap_or(true) { conversion::mode(window.fullscreen()) } else { @@ -775,29 +775,29 @@ pub fn run_command<A, C, E>( .send_event(tag(mode)) .expect("Send message to event loop"); } - window::Action::ToggleMaximize => { + window::Action::ToggleMaximize(_id) => { window.set_maximized(!window.is_maximized()); } - window::Action::ToggleDecorations => { + window::Action::ToggleDecorations(_id) => { window.set_decorations(!window.is_decorated()); } - window::Action::RequestUserAttention(user_attention) => { + window::Action::RequestUserAttention(_id, user_attention) => { window.request_user_attention( user_attention.map(conversion::user_attention), ); } - window::Action::GainFocus => { + window::Action::GainFocus(_id) => { window.focus_window(); } - window::Action::ChangeLevel(level) => { + window::Action::ChangeLevel(_id, level) => { window.set_window_level(conversion::window_level(level)); } - window::Action::FetchId(tag) => { + window::Action::FetchId(_id, tag) => { proxy .send_event(tag(window.id().into())) .expect("Send message to event loop"); } - window::Action::Screenshot(tag) => { + window::Action::Screenshot(_id, tag) => { let bytes = compositor.screenshot( renderer, surface, diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 73476452..aeb2c5e1 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -361,7 +361,7 @@ async fn run_instance<A, E, C>( Some(window::Id::MAIN), core::Event::Window( window::Id::MAIN, - window::Event::Created { position, size }, + window::Event::Opened { position, size }, ), )] }; @@ -402,7 +402,7 @@ async fn run_instance<A, E, C>( Some(id), core::Event::Window( id, - window::Event::Created { position, size }, + window::Event::Opened { position, size }, ), )); } @@ -761,7 +761,7 @@ async fn run_instance<A, E, C>( None, core::Event::Window( id, - window::Event::Destroyed, + window::Event::Closed, ), )); } @@ -884,8 +884,8 @@ fn run_command<A, C, E>( clipboard.write(contents); } }, - command::Action::Window(id, action) => match action { - window::Action::Spawn { settings } => { + command::Action::Window(action) => match action { + window::Action::Spawn(id, settings) => { let monitor = windows.last_monitor(); control_sender @@ -897,7 +897,7 @@ fn run_command<A, C, E>( }) .expect("Send control action"); } - window::Action::Close => { + window::Action::Close(id) => { use winit::event_loop::ControlFlow; let i = windows.delete(id); @@ -911,10 +911,10 @@ fn run_command<A, C, E>( .expect("Send control action"); } } - window::Action::Drag => { + window::Action::Drag(id) => { let _ = windows.with_raw(id).drag_window(); } - window::Action::Resize(size) => { + window::Action::Resize(id, size) => { windows.with_raw(id).set_inner_size( winit::dpi::LogicalSize { width: size.width, @@ -922,7 +922,7 @@ fn run_command<A, C, E>( }, ); } - window::Action::FetchSize(callback) => { + window::Action::FetchSize(id, callback) => { let window = windows.with_raw(id); let size = window.inner_size().to_logical(window.scale_factor()); @@ -934,13 +934,13 @@ fn run_command<A, C, E>( ))) .expect("Send message to event loop"); } - window::Action::Maximize(maximized) => { + window::Action::Maximize(id, maximized) => { windows.with_raw(id).set_maximized(maximized); } - window::Action::Minimize(minimized) => { + window::Action::Minimize(id, minimized) => { windows.with_raw(id).set_minimized(minimized); } - window::Action::Move(position) => { + window::Action::Move(id, position) => { windows.with_raw(id).set_outer_position( winit::dpi::LogicalPosition { x: position.x, @@ -948,7 +948,7 @@ fn run_command<A, C, E>( }, ); } - window::Action::ChangeMode(mode) => { + window::Action::ChangeMode(id, mode) => { let window = windows.with_raw(id); window.set_visible(conversion::visible(mode)); window.set_fullscreen(conversion::fullscreen( @@ -956,12 +956,12 @@ fn run_command<A, C, E>( mode, )); } - window::Action::ChangeIcon(icon) => { + window::Action::ChangeIcon(id, icon) => { windows .with_raw(id) .set_window_icon(conversion::icon(icon)); } - window::Action::FetchMode(tag) => { + window::Action::FetchMode(id, tag) => { let window = windows.with_raw(id); let mode = if window.is_visible().unwrap_or(true) { conversion::mode(window.fullscreen()) @@ -973,33 +973,33 @@ fn run_command<A, C, E>( .send_event(tag(mode)) .expect("Event loop doesn't exist."); } - window::Action::ToggleMaximize => { + window::Action::ToggleMaximize(id) => { let window = windows.with_raw(id); window.set_maximized(!window.is_maximized()); } - window::Action::ToggleDecorations => { + window::Action::ToggleDecorations(id) => { let window = windows.with_raw(id); window.set_decorations(!window.is_decorated()); } - window::Action::RequestUserAttention(attention_type) => { + window::Action::RequestUserAttention(id, attention_type) => { windows.with_raw(id).request_user_attention( attention_type.map(conversion::user_attention), ); } - window::Action::GainFocus => { + window::Action::GainFocus(id) => { windows.with_raw(id).focus_window(); } - window::Action::ChangeLevel(level) => { + window::Action::ChangeLevel(id, level) => { windows .with_raw(id) .set_window_level(conversion::window_level(level)); } - window::Action::FetchId(tag) => { + window::Action::FetchId(id, tag) => { proxy .send_event(tag(windows.with_raw(id).id().into())) .expect("Event loop doesn't exist."); } - window::Action::Screenshot(tag) => { + window::Action::Screenshot(id, tag) => { let i = windows.index_from_id(id); let state = &windows.states[i]; let surface = &mut windows.surfaces[i]; From b152ecda63238136f77b6eda3c582fa1eff99737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 2 Dec 2023 20:49:47 +0100 Subject: [PATCH 195/286] Separate `Compositor::new` from `Compositor::create_renderer` --- graphics/src/compositor.rs | 4 +-- renderer/src/compositor.rs | 47 ++++++++++-------------------- tiny_skia/src/window/compositor.rs | 28 +++++------------- wgpu/src/window/compositor.rs | 21 ++++--------- winit/src/application.rs | 4 +-- winit/src/multi_window.rs | 4 +-- winit/src/multi_window/windows.rs | 2 +- 7 files changed, 35 insertions(+), 75 deletions(-) diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index 78731a98..b8b575b4 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -22,10 +22,10 @@ pub trait Compositor: Sized { fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Self::Settings, compatible_window: Option<&W>, - ) -> Result<(Self, Self::Renderer), Error>; + ) -> Result<Self, Error>; /// Creates a [`Self::Renderer`] for the [`Compositor`]. - fn renderer(&self) -> Self::Renderer; + fn create_renderer(&self) -> Self::Renderer; /// Crates a new [`Surface`] for the given window. /// diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 5bec1639..9d0ff9ab 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -26,7 +26,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Self::Settings, compatible_window: Option<&W>, - ) -> Result<(Self, Self::Renderer), Error> { + ) -> Result<Self, Error> { let candidates = Candidate::list_from_env().unwrap_or(Candidate::default_list()); @@ -34,9 +34,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { for candidate in candidates { match candidate.build(settings, compatible_window) { - Ok((compositor, renderer)) => { - return Ok((compositor, renderer)) - } + Ok(compositor) => return Ok(compositor), Err(new_error) => { error = new_error; } @@ -46,14 +44,14 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { Err(error) } - fn renderer(&self) -> Self::Renderer { + fn create_renderer(&self) -> Self::Renderer { match self { Compositor::TinySkia(compositor) => { - Renderer::TinySkia(compositor.renderer()) + Renderer::TinySkia(compositor.create_renderer()) } #[cfg(feature = "wgpu")] Compositor::Wgpu(compositor) => { - Renderer::Wgpu(compositor.renderer()) + Renderer::Wgpu(compositor.create_renderer()) } } } @@ -232,29 +230,21 @@ impl Candidate { self, settings: Settings, _compatible_window: Option<&W>, - ) -> Result<(Compositor<Theme>, Renderer<Theme>), Error> { + ) -> Result<Compositor<Theme>, Error> { match self { Self::TinySkia => { - let (compositor, backend) = - iced_tiny_skia::window::compositor::new( - iced_tiny_skia::Settings { - default_font: settings.default_font, - default_text_size: settings.default_text_size, - }, - ); + let compositor = iced_tiny_skia::window::compositor::new( + iced_tiny_skia::Settings { + default_font: settings.default_font, + default_text_size: settings.default_text_size, + }, + ); - Ok(( - Compositor::TinySkia(compositor), - Renderer::TinySkia(iced_tiny_skia::Renderer::new( - backend, - settings.default_font, - settings.default_text_size, - )), - )) + Ok(Compositor::TinySkia(compositor)) } #[cfg(feature = "wgpu")] Self::Wgpu => { - let (compositor, backend) = iced_wgpu::window::compositor::new( + let compositor = iced_wgpu::window::compositor::new( iced_wgpu::Settings { default_font: settings.default_font, default_text_size: settings.default_text_size, @@ -264,14 +254,7 @@ impl Candidate { _compatible_window, )?; - Ok(( - Compositor::Wgpu(compositor), - Renderer::Wgpu(iced_wgpu::Renderer::new( - backend, - settings.default_font, - settings.default_text_size, - )), - )) + Ok(Compositor::Wgpu(compositor)) } #[cfg(not(feature = "wgpu"))] Self::Wgpu => { diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 32095e23..87ded746 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -28,20 +28,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Self::Settings, _compatible_window: Option<&W>, - ) -> Result<(Self, Self::Renderer), Error> { - let (compositor, backend) = new(settings); - - Ok(( - compositor, - Renderer::new( - backend, - settings.default_font, - settings.default_text_size, - ), - )) + ) -> Result<Self, Error> { + Ok(new(settings)) } - fn renderer(&self) -> Self::Renderer { + fn create_renderer(&self) -> Self::Renderer { Renderer::new( Backend::new(), self.settings.default_font, @@ -130,14 +121,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { } } -pub fn new<Theme>(settings: Settings) -> (Compositor<Theme>, Backend) { - ( - Compositor { - settings, - _theme: PhantomData, - }, - Backend::new(), - ) +pub fn new<Theme>(settings: Settings) -> Compositor<Theme> { + Compositor { + settings, + _theme: PhantomData, + } } pub fn present<T: AsRef<str>>( diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 21406134..090e0e9f 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -139,16 +139,14 @@ impl<Theme> Compositor<Theme> { pub fn new<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Settings, compatible_window: Option<&W>, -) -> Result<(Compositor<Theme>, Backend), Error> { +) -> Result<Compositor<Theme>, Error> { let compositor = futures::executor::block_on(Compositor::request( settings, compatible_window, )) .ok_or(Error::GraphicsAdapterNotFound)?; - let backend = compositor.create_backend(); - - Ok((compositor, backend)) + Ok(compositor) } /// Presents the given primitives with the given [`Compositor`] and [`Backend`]. @@ -214,20 +212,11 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Self::Settings, compatible_window: Option<&W>, - ) -> Result<(Self, Self::Renderer), Error> { - let (compositor, backend) = new(settings, compatible_window)?; - - Ok(( - compositor, - Renderer::new( - backend, - settings.default_font, - settings.default_text_size, - ), - )) + ) -> Result<Self, Error> { + new(settings, compatible_window) } - fn renderer(&self) -> Self::Renderer { + fn create_renderer(&self) -> Self::Renderer { Renderer::new( self.create_backend(), self.settings.default_font, diff --git a/winit/src/application.rs b/winit/src/application.rs index cc1db8cb..d9700075 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -181,8 +181,8 @@ where }; } - let (compositor, mut renderer) = - C::new(compositor_settings, Some(&window))?; + let compositor = C::new(compositor_settings, Some(&window))?; + let mut renderer = compositor.create_renderer(); for font in settings.fonts { use crate::core::text::Renderer; diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index aeb2c5e1..31c27a6d 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -181,8 +181,8 @@ where }; } - let (mut compositor, renderer) = - C::new(compositor_settings, Some(&main_window))?; + let mut compositor = C::new(compositor_settings, Some(&main_window))?; + let renderer = compositor.create_renderer(); let windows = Windows::new( &application, diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs index a4841a45..5a33b7b4 100644 --- a/winit/src/multi_window/windows.rs +++ b/winit/src/multi_window/windows.rs @@ -97,7 +97,7 @@ where physical_size.width, physical_size.height, ); - let renderer = compositor.renderer(); + let renderer = compositor.create_renderer(); self.ids.push(id); self.raw.push(window); From 31cccd8f7b9b92d486cdcbf39ede112652c9dafa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 2 Dec 2023 20:56:55 +0100 Subject: [PATCH 196/286] Remove unnecessary re-exports in `iced_winit` --- winit/src/lib.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/winit/src/lib.rs b/winit/src/lib.rs index cc886354..948576a2 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -54,6 +54,3 @@ pub use clipboard::Clipboard; pub use error::Error; pub use proxy::Proxy; pub use settings::Settings; - -pub use crate::core::window::*; -pub use iced_graphics::Viewport; From 5c5e7653bed248ba63faa6563e4d673e4441415e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Sat, 2 Dec 2023 22:26:01 +0100 Subject: [PATCH 197/286] Refactor `Windows` abstraction into `WindowManager` --- winit/src/multi_window.rs | 608 ++++++++++++----------- winit/src/multi_window/state.rs | 4 +- winit/src/multi_window/window_manager.rs | 156 ++++++ winit/src/multi_window/windows.rs | 201 -------- 4 files changed, 464 insertions(+), 505 deletions(-) create mode 100644 winit/src/multi_window/window_manager.rs delete mode 100644 winit/src/multi_window/windows.rs diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 31c27a6d..84651d40 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -1,21 +1,20 @@ //! Create interactive, native cross-platform applications for WGPU. mod state; -mod windows; +mod window_manager; pub use state::State; use crate::conversion; use crate::core; -use crate::core::mouse; use crate::core::renderer; use crate::core::widget::operation; use crate::core::window; -use crate::core::{Point, Size}; +use crate::core::Size; use crate::futures::futures::channel::mpsc; use crate::futures::futures::{task, Future, StreamExt}; use crate::futures::{Executor, Runtime, Subscription}; use crate::graphics::{compositor, Compositor}; -use crate::multi_window::windows::Windows; +use crate::multi_window::window_manager::WindowManager; use crate::runtime::command::{self, Command}; use crate::runtime::multi_window::Program; use crate::runtime::user_interface::{self, UserInterface}; @@ -23,6 +22,7 @@ use crate::runtime::Debug; use crate::style::application::StyleSheet; use crate::{Clipboard, Error, Proxy, Settings}; +use std::collections::HashMap; use std::mem::ManuallyDrop; use std::time::Instant; @@ -182,13 +182,13 @@ where } let mut compositor = C::new(compositor_settings, Some(&main_window))?; - let renderer = compositor.create_renderer(); - let windows = Windows::new( + let mut window_manager = WindowManager::new(); + let _ = window_manager.insert( + window::Id::MAIN, + main_window, &application, &mut compositor, - renderer, - main_window, exit_on_close_request, ); @@ -204,7 +204,7 @@ where event_receiver, control_sender, init_command, - windows, + window_manager, should_main_be_visible, )); @@ -312,7 +312,7 @@ async fn run_instance<A, E, C>( mut event_receiver: mpsc::UnboundedReceiver<Event<A::Message>>, mut control_sender: mpsc::UnboundedSender<Control>, init_command: Command<A::Message>, - mut windows: Windows<A, C>, + mut window_manager: WindowManager<A, C>, should_main_window_be_visible: bool, ) where A: Application + 'static, @@ -323,20 +323,39 @@ async fn run_instance<A, E, C>( use winit::event; use winit::event_loop::ControlFlow; - let mut clipboard = Clipboard::connect(windows.main()); + let main_window = window_manager + .get_mut(window::Id::MAIN) + .expect("Get main window"); - let mut ui_caches = vec![user_interface::Cache::default()]; + if should_main_window_be_visible { + main_window.raw.set_visible(true); + } + + let mut clipboard = Clipboard::connect(&main_window.raw); + let mut events = { + vec![( + Some(window::Id::MAIN), + core::Event::Window( + window::Id::MAIN, + window::Event::Opened { + position: main_window.position(), + size: main_window.size(), + }, + ), + )] + }; + + let mut ui_caches = HashMap::new(); let mut user_interfaces = ManuallyDrop::new(build_user_interfaces( &application, &mut debug, - &mut windows, - vec![user_interface::Cache::default()], + &mut window_manager, + HashMap::from_iter([( + window::Id::MAIN, + user_interface::Cache::default(), + )]), )); - if should_main_window_be_visible { - windows.main().set_visible(true); - } - run_command( &application, &mut compositor, @@ -346,26 +365,12 @@ async fn run_instance<A, E, C>( &mut control_sender, &mut proxy, &mut debug, - &mut windows, + &mut window_manager, &mut ui_caches, ); runtime.track(application.subscription().into_recipes()); - let mut mouse_interaction = mouse::Interaction::default(); - - let mut events = { - let (position, size) = logical_bounds_of(windows.main()); - - vec![( - Some(window::Id::MAIN), - core::Event::Window( - window::Id::MAIN, - window::Event::Opened { position, size }, - ), - )] - }; - let mut messages = Vec::new(); let mut redraw_pending = false; @@ -378,31 +383,37 @@ async fn run_instance<A, E, C>( window, exit_on_close_request, } => { - let (position, size) = logical_bounds_of(&window); - - let (inner_size, i) = windows.add( - &application, - &mut compositor, + let window = window_manager.insert( id, window, + &application, + &mut compositor, exit_on_close_request, ); - user_interfaces.push(build_user_interface( - &application, - user_interface::Cache::default(), - &mut windows.renderers[i], - inner_size, - &mut debug, + let logical_size = window.state.logical_size(); + + let _ = user_interfaces.insert( id, - )); - ui_caches.push(user_interface::Cache::default()); + build_user_interface( + &application, + user_interface::Cache::default(), + &mut window.renderer, + logical_size, + &mut debug, + id, + ), + ); + let _ = ui_caches.insert(id, user_interface::Cache::default()); events.push(( Some(id), core::Event::Window( id, - window::Event::Opened { position, size }, + window::Event::Opened { + position: window.position(), + size: window.size(), + }, ), )); } @@ -420,12 +431,11 @@ async fn run_instance<A, E, C>( debug.event_processing_started(); let mut uis_stale = false; - for (i, id) in windows.ids.iter().enumerate() { + for (id, window) in window_manager.iter_mut() { let mut window_events = vec![]; events.retain(|(window_id, event)| { - if *window_id == Some(*id) - || window_id.is_none() + if *window_id == Some(id) || window_id.is_none() { window_events.push(event.clone()); false @@ -441,11 +451,13 @@ async fn run_instance<A, E, C>( continue; } - let (ui_state, statuses) = user_interfaces[i] + let (ui_state, statuses) = user_interfaces + .get_mut(&id) + .expect("Get user interface") .update( &window_events, - windows.states[i].cursor(), - &mut windows.renderers[i], + window.state.cursor(), + &mut window.renderer, &mut clipboard, &mut messages, ); @@ -469,11 +481,12 @@ async fn run_instance<A, E, C>( // TODO mw application update returns which window IDs to update if !messages.is_empty() || uis_stale { - let mut cached_interfaces: Vec< + let mut cached_interfaces: HashMap< + window::Id, user_interface::Cache, > = ManuallyDrop::into_inner(user_interfaces) - .drain(..) - .map(UserInterface::into_cache) + .drain() + .map(|(id, ui)| (id, ui.into_cache())) .collect(); // Update application @@ -486,18 +499,18 @@ async fn run_instance<A, E, C>( &mut proxy, &mut debug, &mut messages, - &mut windows, + &mut window_manager, &mut cached_interfaces, ); // we must synchronize all window states with application state after an // application update since we don't know what changed - for (state, (id, window)) in windows - .states - .iter_mut() - .zip(windows.ids.iter().zip(windows.raw.iter())) - { - state.synchronize(&application, *id, window); + for (id, window) in window_manager.iter_mut() { + window.state.synchronize( + &application, + id, + &window.raw, + ); } // rebuild UIs with the synchronized states @@ -505,39 +518,43 @@ async fn run_instance<A, E, C>( ManuallyDrop::new(build_user_interfaces( &application, &mut debug, - &mut windows, + &mut window_manager, cached_interfaces, )); } debug.draw_started(); - for (i, id) in windows.ids.iter().enumerate() { + for (id, window) in window_manager.iter_mut() { // TODO: Avoid redrawing all the time by forcing widgets to // request redraws on state changes // // Then, we can use the `interface_state` here to decide if a redraw // is needed right away, or simply wait until a specific time. let redraw_event = core::Event::Window( - *id, + id, window::Event::RedrawRequested(Instant::now()), ); - let cursor = windows.states[i].cursor(); + let cursor = window.state.cursor(); - let (ui_state, _) = user_interfaces[i].update( + let ui = user_interfaces + .get_mut(&id) + .expect("Get user interface"); + + let (ui_state, _) = ui.update( &[redraw_event.clone()], cursor, - &mut windows.renderers[i], + &mut window.renderer, &mut clipboard, &mut messages, ); let new_mouse_interaction = { - let state = &windows.states[i]; + let state = &window.state; - user_interfaces[i].draw( - &mut windows.renderers[i], + ui.draw( + &mut window.renderer, state.theme(), &renderer::Style { text_color: state.text_color(), @@ -546,19 +563,21 @@ async fn run_instance<A, E, C>( ) }; - if new_mouse_interaction != mouse_interaction { - windows.raw[i].set_cursor_icon( + if new_mouse_interaction != window.mouse_interaction + { + window.raw.set_cursor_icon( conversion::mouse_interaction( new_mouse_interaction, ), ); - mouse_interaction = new_mouse_interaction; + window.mouse_interaction = + new_mouse_interaction; } // TODO once widgets can request to be redrawn, we can avoid always requesting a // redraw - windows.raw[i].request_redraw(); + window.raw.request_redraw(); runtime.broadcast( redraw_event.clone(), @@ -606,9 +625,13 @@ async fn run_instance<A, E, C>( messages.push(message); } event::Event::RedrawRequested(id) => { - let i = windows.index_from_raw(id); - let state = &windows.states[i]; - let physical_size = state.physical_size(); + let Some((id, window)) = + window_manager.get_mut_alias(id) + else { + continue; + }; + + let physical_size = window.state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { @@ -616,60 +639,65 @@ async fn run_instance<A, E, C>( } debug.render_started(); - let current_viewport_version = state.viewport_version(); - let window_viewport_version = - windows.viewport_versions[i]; - - if window_viewport_version != current_viewport_version { - let logical_size = state.logical_size(); + if window.viewport_version + != window.state.viewport_version() + { + let logical_size = window.state.logical_size(); debug.layout_started(); - let renderer = &mut windows.renderers[i]; - let ui = user_interfaces.remove(i); + let ui = user_interfaces + .remove(&id) + .expect("Remove user interface"); - user_interfaces - .insert(i, ui.relayout(logical_size, renderer)); + let _ = user_interfaces.insert( + id, + ui.relayout(logical_size, &mut window.renderer), + ); debug.layout_finished(); debug.draw_started(); - let new_mouse_interaction = user_interfaces[i] + let new_mouse_interaction = user_interfaces + .get_mut(&id) + .expect("Get user interface") .draw( - renderer, - state.theme(), + &mut window.renderer, + window.state.theme(), &renderer::Style { - text_color: state.text_color(), + text_color: window.state.text_color(), }, - state.cursor(), + window.state.cursor(), ); - if new_mouse_interaction != mouse_interaction { - windows.raw[i].set_cursor_icon( + if new_mouse_interaction != window.mouse_interaction + { + window.raw.set_cursor_icon( conversion::mouse_interaction( new_mouse_interaction, ), ); - mouse_interaction = new_mouse_interaction; + window.mouse_interaction = + new_mouse_interaction; } debug.draw_finished(); compositor.configure_surface( - &mut windows.surfaces[i], + &mut window.surface, physical_size.width, physical_size.height, ); - windows.viewport_versions[i] = - current_viewport_version; + window.viewport_version = + window.state.viewport_version(); } match compositor.present( - &mut windows.renderers[i], - &mut windows.surfaces[i], - state.viewport(), - state.background_color(), + &mut window.renderer, + &mut window.surface, + window.state.viewport(), + window.state.background_color(), &debug.overlay(), ) { Ok(()) => { @@ -690,8 +718,10 @@ async fn run_instance<A, E, C>( ); // Try rendering all windows again next frame. - for window in &windows.raw { - window.request_redraw(); + for (_id, window) in + window_manager.iter_mut() + { + window.raw.request_redraw(); } } }, @@ -701,70 +731,43 @@ async fn run_instance<A, E, C>( event: window_event, window_id, } => { - let window_index = windows - .raw - .iter() - .position(|w| w.id() == window_id); + let Some((id, window)) = + window_manager.get_mut_alias(window_id) + else { + continue; + }; - match window_index { - Some(i) => { - let id = windows.ids[i]; - let raw = &windows.raw[i]; - let exit_on_close_request = - windows.exit_on_close_requested[i]; + if matches!( + window_event, + winit::event::WindowEvent::CloseRequested + ) && window.exit_on_close_request + { + let _ = window_manager.remove(id); + let _ = user_interfaces.remove(&id); + let _ = ui_caches.remove(&id); - if matches!( - window_event, - winit::event::WindowEvent::CloseRequested - ) && exit_on_close_request - { - let i = windows.delete(id); - let _ = user_interfaces.remove(i); - let _ = ui_caches.remove(i); + events.push(( + None, + core::Event::Window(id, window::Event::Closed), + )); - if windows.is_empty() { - break 'main; - } - } else { - let state = &mut windows.states[i]; - state.update( - raw, - &window_event, - &mut debug, - ); - - if let Some(event) = - conversion::window_event( - id, - &window_event, - state.scale_factor(), - state.modifiers(), - ) - { - events.push((Some(id), event)); - } - } + if window_manager.is_empty() { + break 'main; } - None => { - // This is the only special case, since in order to trigger the Destroyed event the - // window reference from winit must be dropped, but we still want to inform the - // user that the window was destroyed so they can clean up any specific window - // code for this window - if matches!( - window_event, - winit::event::WindowEvent::Destroyed - ) { - let id = - windows.get_pending_destroy(window_id); + } else { + window.state.update( + &window.raw, + &window_event, + &mut debug, + ); - events.push(( - None, - core::Event::Window( - id, - window::Event::Closed, - ), - )); - } + if let Some(event) = conversion::window_event( + id, + &window_event, + window.state.scale_factor(), + window.state.modifiers(), + ) { + events.push((Some(id), event)); } } } @@ -811,8 +814,8 @@ fn update<A: Application, C, E: Executor>( proxy: &mut winit::event_loop::EventLoopProxy<A::Message>, debug: &mut Debug, messages: &mut Vec<A::Message>, - windows: &mut Windows<A, C>, - ui_caches: &mut Vec<user_interface::Cache>, + window_manager: &mut WindowManager<A, C>, + ui_caches: &mut HashMap<window::Id, user_interface::Cache>, ) where C: Compositor<Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, @@ -833,7 +836,7 @@ fn update<A: Application, C, E: Executor>( control_sender, proxy, debug, - windows, + window_manager, ui_caches, ); } @@ -852,8 +855,8 @@ fn run_command<A, C, E>( control_sender: &mut mpsc::UnboundedSender<Control>, proxy: &mut winit::event_loop::EventLoopProxy<A::Message>, debug: &mut Debug, - windows: &mut Windows<A, C>, - ui_caches: &mut Vec<user_interface::Cache>, + window_manager: &mut WindowManager<A, C>, + ui_caches: &mut HashMap<window::Id, user_interface::Cache>, ) where A: Application, E: Executor, @@ -886,7 +889,7 @@ fn run_command<A, C, E>( }, command::Action::Window(action) => match action { window::Action::Spawn(id, settings) => { - let monitor = windows.last_monitor(); + let monitor = window_manager.last_monitor(); control_sender .start_send(Control::CreateWindow { @@ -900,10 +903,10 @@ fn run_command<A, C, E>( window::Action::Close(id) => { use winit::event_loop::ControlFlow; - let i = windows.delete(id); - let _ = ui_caches.remove(i); + let _ = window_manager.remove(id); + let _ = ui_caches.remove(&id); - if windows.is_empty() { + if window_manager.is_empty() { control_sender .start_send(Control::ChangeFlow( ControlFlow::ExitWithCode(0), @@ -912,113 +915,133 @@ fn run_command<A, C, E>( } } window::Action::Drag(id) => { - let _ = windows.with_raw(id).drag_window(); + if let Some(window) = window_manager.get_mut(id) { + let _ = window.raw.drag_window(); + } } window::Action::Resize(id, size) => { - windows.with_raw(id).set_inner_size( - winit::dpi::LogicalSize { + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_inner_size(winit::dpi::LogicalSize { width: size.width, height: size.height, - }, - ); + }); + } } window::Action::FetchSize(id, callback) => { - let window = windows.with_raw(id); - let size = - window.inner_size().to_logical(window.scale_factor()); + if let Some(window) = window_manager.get_mut(id) { + let size = window + .raw + .inner_size() + .to_logical(window.raw.scale_factor()); - proxy - .send_event(callback(Size::new( - size.width, - size.height, - ))) - .expect("Send message to event loop"); + proxy + .send_event(callback(Size::new( + size.width, + size.height, + ))) + .expect("Send message to event loop"); + } } window::Action::Maximize(id, maximized) => { - windows.with_raw(id).set_maximized(maximized); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_maximized(maximized); + } } window::Action::Minimize(id, minimized) => { - windows.with_raw(id).set_minimized(minimized); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_minimized(minimized); + } } window::Action::Move(id, position) => { - windows.with_raw(id).set_outer_position( - winit::dpi::LogicalPosition { - x: position.x, - y: position.y, - }, - ); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_outer_position( + winit::dpi::LogicalPosition { + x: position.x, + y: position.y, + }, + ); + } } window::Action::ChangeMode(id, mode) => { - let window = windows.with_raw(id); - window.set_visible(conversion::visible(mode)); - window.set_fullscreen(conversion::fullscreen( - window.current_monitor(), - mode, - )); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_visible(conversion::visible(mode)); + window.raw.set_fullscreen(conversion::fullscreen( + window.raw.current_monitor(), + mode, + )); + } } window::Action::ChangeIcon(id, icon) => { - windows - .with_raw(id) - .set_window_icon(conversion::icon(icon)); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_window_icon(conversion::icon(icon)); + } } window::Action::FetchMode(id, tag) => { - let window = windows.with_raw(id); - let mode = if window.is_visible().unwrap_or(true) { - conversion::mode(window.fullscreen()) - } else { - core::window::Mode::Hidden - }; + if let Some(window) = window_manager.get_mut(id) { + let mode = if window.raw.is_visible().unwrap_or(true) { + conversion::mode(window.raw.fullscreen()) + } else { + core::window::Mode::Hidden + }; - proxy - .send_event(tag(mode)) - .expect("Event loop doesn't exist."); + proxy + .send_event(tag(mode)) + .expect("Event loop doesn't exist."); + } } window::Action::ToggleMaximize(id) => { - let window = windows.with_raw(id); - window.set_maximized(!window.is_maximized()); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_maximized(!window.raw.is_maximized()); + } } window::Action::ToggleDecorations(id) => { - let window = windows.with_raw(id); - window.set_decorations(!window.is_decorated()); + if let Some(window) = window_manager.get_mut(id) { + window.raw.set_decorations(!window.raw.is_decorated()); + } } window::Action::RequestUserAttention(id, attention_type) => { - windows.with_raw(id).request_user_attention( - attention_type.map(conversion::user_attention), - ); + if let Some(window) = window_manager.get_mut(id) { + window.raw.request_user_attention( + attention_type.map(conversion::user_attention), + ); + } } window::Action::GainFocus(id) => { - windows.with_raw(id).focus_window(); + if let Some(window) = window_manager.get_mut(id) { + window.raw.focus_window(); + } } window::Action::ChangeLevel(id, level) => { - windows - .with_raw(id) - .set_window_level(conversion::window_level(level)); + if let Some(window) = window_manager.get_mut(id) { + window + .raw + .set_window_level(conversion::window_level(level)); + } } window::Action::FetchId(id, tag) => { - proxy - .send_event(tag(windows.with_raw(id).id().into())) - .expect("Event loop doesn't exist."); + if let Some(window) = window_manager.get_mut(id) { + proxy + .send_event(tag(window.raw.id().into())) + .expect("Event loop doesn't exist."); + } } window::Action::Screenshot(id, tag) => { - let i = windows.index_from_id(id); - let state = &windows.states[i]; - let surface = &mut windows.surfaces[i]; - let renderer = &mut windows.renderers[i]; + if let Some(window) = window_manager.get_mut(id) { + let bytes = compositor.screenshot( + &mut window.renderer, + &mut window.surface, + window.state.viewport(), + window.state.background_color(), + &debug.overlay(), + ); - let bytes = compositor.screenshot( - renderer, - surface, - state.viewport(), - state.background_color(), - &debug.overlay(), - ); - - proxy - .send_event(tag(window::Screenshot::new( - bytes, - state.physical_size(), - ))) - .expect("Event loop doesn't exist."); + proxy + .send_event(tag(window::Screenshot::new( + bytes, + window.state.physical_size(), + ))) + .expect("Event loop doesn't exist."); + } } }, command::Action::System(action) => match action { @@ -1047,43 +1070,45 @@ fn run_command<A, C, E>( let mut uis = build_user_interfaces( application, debug, - windows, + window_manager, std::mem::take(ui_caches), ); 'operate: while let Some(mut operation) = current_operation.take() { - for (i, ui) in uis.iter_mut().enumerate() { - ui.operate(&windows.renderers[i], operation.as_mut()); + for (id, ui) in uis.iter_mut() { + if let Some(window) = window_manager.get_mut(*id) { + ui.operate(&window.renderer, operation.as_mut()); - match operation.finish() { - operation::Outcome::None => {} - operation::Outcome::Some(message) => { - proxy - .send_event(message) - .expect("Event loop doesn't exist."); + match operation.finish() { + operation::Outcome::None => {} + operation::Outcome::Some(message) => { + proxy + .send_event(message) + .expect("Event loop doesn't exist."); - // operation completed, don't need to try to operate on rest of UIs - break 'operate; - } - operation::Outcome::Chain(next) => { - current_operation = Some(next); + // operation completed, don't need to try to operate on rest of UIs + break 'operate; + } + operation::Outcome::Chain(next) => { + current_operation = Some(next); + } } } } } *ui_caches = - uis.drain(..).map(UserInterface::into_cache).collect(); + uis.drain().map(|(id, ui)| (id, ui.into_cache())).collect(); } command::Action::LoadFont { bytes, tagger } => { use crate::core::text::Renderer; // TODO change this once we change each renderer to having a single backend reference.. :pain: // TODO: Error handling (?) - for renderer in &mut windows.renderers { - renderer.load_font(bytes.clone()); + for (_, window) in window_manager.iter_mut() { + window.renderer.load_font(bytes.clone()); } proxy @@ -1098,33 +1123,31 @@ fn run_command<A, C, E>( pub fn build_user_interfaces<'a, A: Application, C: Compositor>( application: &'a A, debug: &mut Debug, - windows: &mut Windows<A, C>, - mut cached_user_interfaces: Vec<user_interface::Cache>, -) -> Vec<UserInterface<'a, A::Message, A::Renderer>> + window_manager: &mut WindowManager<A, C>, + mut cached_user_interfaces: HashMap<window::Id, user_interface::Cache>, +) -> HashMap<window::Id, UserInterface<'a, A::Message, A::Renderer>> where <A::Renderer as core::Renderer>::Theme: StyleSheet, C: Compositor<Renderer = A::Renderer>, { cached_user_interfaces - .drain(..) - .zip( - windows - .ids - .iter() - .zip(windows.states.iter().zip(windows.renderers.iter_mut())), - ) - .fold(vec![], |mut uis, (cache, (id, (state, renderer)))| { - uis.push(build_user_interface( - application, - cache, - renderer, - state.logical_size(), - debug, - *id, - )); + .drain() + .filter_map(|(id, cache)| { + let window = window_manager.get_mut(id)?; - uis + Some(( + id, + build_user_interface( + application, + cache, + &mut window.renderer, + window.state.logical_size(), + debug, + id, + ), + )) }) + .collect() } /// Returns true if the provided event should cause an [`Application`] to @@ -1148,25 +1171,6 @@ pub fn user_force_quit( } } -fn logical_bounds_of(window: &winit::window::Window) -> (Option<Point>, Size) { - let position = window - .inner_position() - .ok() - .map(|position| position.to_logical(window.scale_factor())) - .map(|position| Point { - x: position.x, - y: position.y, - }); - - let size = { - let size = window.inner_size().to_logical(window.scale_factor()); - - Size::new(size.width, size.height) - }; - - (position, size) -} - #[cfg(not(target_arch = "wasm32"))] mod platform { pub fn run<T, F>( diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index e9a9f91a..03da5ad7 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -19,7 +19,7 @@ where title: String, scale_factor: f64, viewport: Viewport, - viewport_version: usize, + viewport_version: u64, cursor_position: Option<winit::dpi::PhysicalPosition<f64>>, modifiers: winit::event::ModifiersState, theme: <A::Renderer as core::Renderer>::Theme, @@ -86,7 +86,7 @@ where /// Returns the version of the [`Viewport`] of the [`State`]. /// /// The version is incremented every time the [`Viewport`] changes. - pub fn viewport_version(&self) -> usize { + pub fn viewport_version(&self) -> u64 { self.viewport_version } diff --git a/winit/src/multi_window/window_manager.rs b/winit/src/multi_window/window_manager.rs new file mode 100644 index 00000000..d54156e7 --- /dev/null +++ b/winit/src/multi_window/window_manager.rs @@ -0,0 +1,156 @@ +use crate::core::mouse; +use crate::core::window::Id; +use crate::core::{Point, Size}; +use crate::graphics::Compositor; +use crate::multi_window::{Application, State}; +use crate::style::application::StyleSheet; + +use std::collections::BTreeMap; +use winit::monitor::MonitorHandle; + +#[allow(missing_debug_implementations)] +pub struct WindowManager<A: Application, C: Compositor> +where + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, + C: Compositor<Renderer = A::Renderer>, +{ + aliases: BTreeMap<winit::window::WindowId, Id>, + entries: BTreeMap<Id, Window<A, C>>, +} + +impl<A, C> WindowManager<A, C> +where + A: Application, + C: Compositor<Renderer = A::Renderer>, + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, +{ + pub fn new() -> Self { + Self { + aliases: BTreeMap::new(), + entries: BTreeMap::new(), + } + } + + pub fn insert( + &mut self, + id: Id, + window: winit::window::Window, + application: &A, + compositor: &mut C, + exit_on_close_request: bool, + ) -> &mut Window<A, C> { + let state = State::new(application, id, &window); + let viewport_version = state.viewport_version(); + let physical_size = state.physical_size(); + let surface = compositor.create_surface( + &window, + physical_size.width, + physical_size.height, + ); + let renderer = compositor.create_renderer(); + + let _ = self.aliases.insert(window.id(), id); + + let _ = self.entries.insert( + id, + Window { + raw: window, + state, + viewport_version, + exit_on_close_request, + surface, + renderer, + mouse_interaction: mouse::Interaction::Idle, + }, + ); + + self.entries + .get_mut(&id) + .expect("Get window that was just inserted") + } + + pub fn is_empty(&self) -> bool { + self.entries.is_empty() + } + + pub fn iter_mut( + &mut self, + ) -> impl Iterator<Item = (Id, &mut Window<A, C>)> { + self.entries.iter_mut().map(|(k, v)| (*k, v)) + } + + pub fn get_mut(&mut self, id: Id) -> Option<&mut Window<A, C>> { + self.entries.get_mut(&id) + } + + pub fn get_mut_alias( + &mut self, + id: winit::window::WindowId, + ) -> Option<(Id, &mut Window<A, C>)> { + let id = self.aliases.get(&id).copied()?; + + Some((id, self.get_mut(id)?)) + } + + pub fn last_monitor(&self) -> Option<MonitorHandle> { + self.entries.values().last()?.raw.current_monitor() + } + + pub fn remove(&mut self, id: Id) -> Option<Window<A, C>> { + let window = self.entries.remove(&id)?; + let _ = self.aliases.remove(&window.raw.id()); + + Some(window) + } +} + +impl<A, C> Default for WindowManager<A, C> +where + A: Application, + C: Compositor<Renderer = A::Renderer>, + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, +{ + fn default() -> Self { + Self::new() + } +} + +#[allow(missing_debug_implementations)] +pub struct Window<A, C> +where + A: Application, + C: Compositor<Renderer = A::Renderer>, + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, +{ + pub raw: winit::window::Window, + pub state: State<A>, + pub viewport_version: u64, + pub exit_on_close_request: bool, + pub mouse_interaction: mouse::Interaction, + pub surface: C::Surface, + pub renderer: A::Renderer, +} + +impl<A, C> Window<A, C> +where + A: Application, + C: Compositor<Renderer = A::Renderer>, + <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, +{ + pub fn position(&self) -> Option<Point> { + self.raw + .inner_position() + .ok() + .map(|position| position.to_logical(self.raw.scale_factor())) + .map(|position| Point { + x: position.x, + y: position.y, + }) + } + + pub fn size(&self) -> Size { + let size = self.raw.inner_size().to_logical(self.raw.scale_factor()); + + Size::new(size.width, size.height) + } +} diff --git a/winit/src/multi_window/windows.rs b/winit/src/multi_window/windows.rs deleted file mode 100644 index 5a33b7b4..00000000 --- a/winit/src/multi_window/windows.rs +++ /dev/null @@ -1,201 +0,0 @@ -use crate::core::{window, Size}; -use crate::graphics::Compositor; -use crate::multi_window::{Application, State}; -use crate::style::application::StyleSheet; - -use winit::monitor::MonitorHandle; - -use std::fmt::{Debug, Formatter}; - -pub struct Windows<A: Application, C: Compositor> -where - <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, - C: Compositor<Renderer = A::Renderer>, -{ - pub ids: Vec<window::Id>, - pub raw: Vec<winit::window::Window>, - pub states: Vec<State<A>>, - pub viewport_versions: Vec<usize>, - pub exit_on_close_requested: Vec<bool>, - pub surfaces: Vec<C::Surface>, - pub renderers: Vec<A::Renderer>, - pub pending_destroy: Vec<(window::Id, winit::window::WindowId)>, -} - -impl<A: Application, C: Compositor> Debug for Windows<A, C> -where - <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, - C: Compositor<Renderer = A::Renderer>, -{ - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Windows") - .field("ids", &self.ids) - .field( - "raw", - &self - .raw - .iter() - .map(winit::window::Window::id) - .collect::<Vec<winit::window::WindowId>>(), - ) - .field("states", &self.states) - .field("viewport_versions", &self.viewport_versions) - .finish() - } -} - -impl<A: Application, C: Compositor> Windows<A, C> -where - <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, - C: Compositor<Renderer = A::Renderer>, -{ - /// Creates a new [`Windows`] with a single `window::Id::MAIN` window. - pub fn new( - application: &A, - compositor: &mut C, - renderer: A::Renderer, - main: winit::window::Window, - exit_on_close_requested: bool, - ) -> Self { - let state = State::new(application, window::Id::MAIN, &main); - let viewport_version = state.viewport_version(); - let physical_size = state.physical_size(); - let surface = compositor.create_surface( - &main, - physical_size.width, - physical_size.height, - ); - - Self { - ids: vec![window::Id::MAIN], - raw: vec![main], - states: vec![state], - viewport_versions: vec![viewport_version], - exit_on_close_requested: vec![exit_on_close_requested], - surfaces: vec![surface], - renderers: vec![renderer], - pending_destroy: vec![], - } - } - - /// Adds a new window to [`Windows`]. Returns the size of the newly created window in logical - /// pixels & the index of the window within [`Windows`]. - pub fn add( - &mut self, - application: &A, - compositor: &mut C, - id: window::Id, - window: winit::window::Window, - exit_on_close_requested: bool, - ) -> (Size, usize) { - let state = State::new(application, id, &window); - let window_size = state.logical_size(); - let viewport_version = state.viewport_version(); - let physical_size = state.physical_size(); - let surface = compositor.create_surface( - &window, - physical_size.width, - physical_size.height, - ); - let renderer = compositor.create_renderer(); - - self.ids.push(id); - self.raw.push(window); - self.states.push(state); - self.exit_on_close_requested.push(exit_on_close_requested); - self.viewport_versions.push(viewport_version); - self.surfaces.push(surface); - self.renderers.push(renderer); - - (window_size, self.ids.len() - 1) - } - - pub fn is_empty(&self) -> bool { - self.ids.is_empty() - } - - pub fn main(&self) -> &winit::window::Window { - &self.raw[0] - } - - pub fn index_from_raw(&self, id: winit::window::WindowId) -> usize { - self.raw - .iter() - .position(|window| window.id() == id) - .expect("No raw window in multi_window::Windows") - } - - pub fn index_from_id(&self, id: window::Id) -> usize { - self.ids - .iter() - .position(|window_id| *window_id == id) - .expect("No window in multi_window::Windows") - } - - pub fn last_monitor(&self) -> Option<MonitorHandle> { - self.raw - .last() - .and_then(winit::window::Window::current_monitor) - } - - pub fn last(&self) -> usize { - self.ids.len() - 1 - } - - pub fn with_raw(&self, id: window::Id) -> &winit::window::Window { - let i = self.index_from_id(id); - &self.raw[i] - } - - /// Deletes the window with `id` from [`Windows`]. Returns the index that the window had. - pub fn delete(&mut self, id: window::Id) -> usize { - let i = self.index_from_id(id); - - let id = self.ids.remove(i); - let window = self.raw.remove(i); - let _ = self.states.remove(i); - let _ = self.exit_on_close_requested.remove(i); - let _ = self.viewport_versions.remove(i); - let _ = self.surfaces.remove(i); - - self.pending_destroy.push((id, window.id())); - - i - } - - /// Gets the winit `window` that is pending to be destroyed if it exists. - pub fn get_pending_destroy( - &mut self, - window: winit::window::WindowId, - ) -> window::Id { - let i = self - .pending_destroy - .iter() - .position(|(_, window_id)| window == *window_id) - .unwrap(); - - let (id, _) = self.pending_destroy.remove(i); - id - } - - /// Returns the windows that need to be requested to closed, and also the windows that can be - /// closed immediately. - pub fn partition_close_requests( - &self, - ) -> (Vec<window::Id>, Vec<window::Id>) { - self.exit_on_close_requested.iter().enumerate().fold( - (vec![], vec![]), - |(mut close_immediately, mut needs_request_closed), (i, close)| { - let id = self.ids[i]; - - if *close { - close_immediately.push(id); - } else { - needs_request_closed.push(id); - } - - (close_immediately, needs_request_closed) - }, - ) - } -} From 603832e66c710ea39a95009ddc905de20c6856bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 5 Dec 2023 02:19:17 +0100 Subject: [PATCH 198/286] Introduce `RawText` to `Primitive` in `iced_graphics` This should allow users to directly render a `cosmic_text::Buffer`. --- graphics/src/damage.rs | 5 +++++ graphics/src/primitive.rs | 2 ++ graphics/src/text.rs | 27 +++++++++++++++++++++++++-- tiny_skia/src/backend.rs | 30 ++++++++++++++++++++++++++++++ tiny_skia/src/text.rs | 29 ++++++++++++++++++++++++++++- wgpu/src/layer.rs | 15 +++++++++++++++ wgpu/src/layer/text.rs | 5 ++++- wgpu/src/text.rs | 22 ++++++++++++++++++++++ 8 files changed, 131 insertions(+), 4 deletions(-) diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs index 595cc274..59e9f5b4 100644 --- a/graphics/src/damage.rs +++ b/graphics/src/damage.rs @@ -73,6 +73,11 @@ impl<T: Damage> Damage for Primitive<T> { bounds.expand(1.5) } + Self::RawText(raw) => { + // TODO: Add `size` field to `raw` to compute more accurate + // damage bounds (?) + raw.clip_bounds.expand(1.5) + } Self::Quad { bounds, .. } | Self::Image { bounds, .. } | Self::Svg { bounds, .. } => bounds.expand(1.0), diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs index ed75776c..20affaaf 100644 --- a/graphics/src/primitive.rs +++ b/graphics/src/primitive.rs @@ -57,6 +57,8 @@ pub enum Primitive<T> { /// The clip bounds of the editor. clip_bounds: Rectangle, }, + /// A raw `cosmic-text` primitive + RawText(crate::text::Raw), /// A quad primitive Quad { /// The bounds of the quad diff --git a/graphics/src/text.rs b/graphics/src/text.rs index fc7694c2..8fd037fe 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -12,11 +12,11 @@ pub use cosmic_text; use crate::color; use crate::core::font::{self, Font}; use crate::core::text::Shaping; -use crate::core::{Color, Size}; +use crate::core::{Color, Point, Rectangle, Size}; use once_cell::sync::OnceCell; use std::borrow::Cow; -use std::sync::{Arc, RwLock}; +use std::sync::{Arc, RwLock, Weak}; /// Returns the global [`FontSystem`]. pub fn font_system() -> &'static RwLock<FontSystem> { @@ -68,6 +68,29 @@ impl FontSystem { #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct Version(u32); +/// A weak reference to a [`cosmic-text::Buffer`] that can be drawn. +#[derive(Debug, Clone)] +pub struct Raw { + /// A weak reference to a [`cosmic_text::Buffer`]. + pub buffer: Weak<cosmic_text::Buffer>, + /// The position of the text. + pub position: Point, + /// The color of the text. + pub color: Color, + /// The clip bounds of the text. + pub clip_bounds: Rectangle, +} + +impl PartialEq for Raw { + fn eq(&self, _other: &Self) -> bool { + // TODO: There is no proper way to compare raw buffers + // For now, no two instances of `Raw` text will be equal. + // This should be fine, but could trigger unnecessary redraws + // in the future. + false + } +} + /// Measures the dimensions of the given [`cosmic_text::Buffer`]. pub fn measure(buffer: &cosmic_text::Buffer) -> Size { let (width, total_lines) = buffer diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index 3e9bd2a5..706db40e 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -1,5 +1,6 @@ use crate::core::{Background, Color, Gradient, Rectangle, Vector}; use crate::graphics::backend; +use crate::graphics::text; use crate::graphics::Viewport; use crate::primitive::{self, Primitive}; @@ -444,6 +445,35 @@ impl Backend { clip_mask, ); } + Primitive::RawText(text::Raw { + buffer, + position, + color, + clip_bounds: text_clip_bounds, + }) => { + let Some(buffer) = buffer.upgrade() else { + return; + }; + + let physical_bounds = + (*text_clip_bounds + translation) * scale_factor; + + if !clip_bounds.intersects(&physical_bounds) { + return; + } + + let clip_mask = (!physical_bounds.is_within(&clip_bounds)) + .then_some(clip_mask as &_); + + self.text_pipeline.draw_raw( + &buffer, + *position + translation, + *color, + scale_factor, + pixels, + clip_mask, + ); + } #[cfg(feature = "image")] Primitive::Image { handle, diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index 70e95d01..a5a0a1b6 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -1,6 +1,6 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; -use crate::core::{Color, Font, Pixels, Point, Rectangle}; +use crate::core::{Color, Font, Pixels, Point, Rectangle, Size}; use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; use crate::graphics::text::editor; @@ -149,6 +149,33 @@ impl Pipeline { ); } + pub fn draw_raw( + &mut self, + buffer: &cosmic_text::Buffer, + position: Point, + color: Color, + scale_factor: f32, + pixels: &mut tiny_skia::PixmapMut<'_>, + clip_mask: Option<&tiny_skia::Mask>, + ) { + let mut font_system = font_system().write().expect("Write font system"); + + let (width, height) = buffer.size(); + + draw( + font_system.raw(), + &mut self.glyph_cache, + buffer, + Rectangle::new(position, Size::new(width, height)), + color, + alignment::Horizontal::Left, + alignment::Vertical::Top, + scale_factor, + pixels, + clip_mask, + ); + } + pub fn trim_cache(&mut self) { self.cache.get_mut().trim(); self.glyph_cache.trim(); diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 557a7633..4ad12a88 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -177,6 +177,21 @@ impl<'a> Layer<'a> { clip_bounds: *clip_bounds + translation, })); } + graphics::Primitive::RawText(graphics::text::Raw { + buffer, + position, + color, + clip_bounds, + }) => { + let layer = &mut layers[current_layer]; + + layer.text.push(Text::Raw(graphics::text::Raw { + buffer: buffer.clone(), + position: *position + translation, + color: *color, + clip_bounds: *clip_bounds + translation, + })); + } Primitive::Quad { bounds, background, diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index df2f2875..37ee5247 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -1,6 +1,7 @@ use crate::core::alignment; use crate::core::text; use crate::core::{Color, Font, Pixels, Point, Rectangle}; +use crate::graphics; use crate::graphics::text::editor; use crate::graphics::text::paragraph; @@ -23,8 +24,10 @@ pub enum Text<'a> { color: Color, clip_bounds: Rectangle, }, - /// A cached text. + /// Some cached text. Cached(Cached<'a>), + /// Some raw text. + Raw(graphics::text::Raw), } #[derive(Debug, Clone)] diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index 888b1924..dca09cb8 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -7,6 +7,7 @@ use crate::layer::Text; use std::borrow::Cow; use std::cell::RefCell; +use std::sync::Arc; #[allow(missing_debug_implementations)] pub struct Pipeline { @@ -76,6 +77,7 @@ impl Pipeline { Paragraph(Paragraph), Editor(Editor), Cache(cache::KeyHash), + Raw(Arc<glyphon::Buffer>), } let allocations: Vec<_> = sections @@ -107,6 +109,7 @@ impl Pipeline { Some(Allocation::Cache(key)) } + Text::Raw(text) => text.buffer.upgrade().map(Allocation::Raw), }) .collect(); @@ -185,6 +188,25 @@ impl Pipeline { text.clip_bounds, ) } + Text::Raw(text) => { + let Some(Allocation::Raw(buffer)) = allocation else { + return None; + }; + + let (width, height) = buffer.size(); + + ( + buffer.as_ref(), + Rectangle::new( + text.position, + Size::new(width, height), + ), + alignment::Horizontal::Left, + alignment::Vertical::Top, + text.color, + text.clip_bounds, + ) + } }; let bounds = bounds * scale_factor; From 07b0aed5d35013a17deea7ce7824c744decef568 Mon Sep 17 00:00:00 2001 From: Bingus <shankern@protonmail.com> Date: Wed, 6 Dec 2023 14:52:53 -0800 Subject: [PATCH 199/286] Added the ability to change the style of a TextEditor --- widget/src/text_editor.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 63d48868..a2a186f0 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -128,6 +128,15 @@ where highlighter_format: to_format, } } + + /// Sets the style of the [`TextEditor`]. + pub fn style( + mut self, + style: impl Into<<Renderer::Theme as StyleSheet>::Style>, + ) -> Self { + self.style = style.into(); + self + } } /// The content of a [`TextEditor`]. From a2a96adf7a19f8b2f7879fc19ff139b930fb102e Mon Sep 17 00:00:00 2001 From: Cory Frenette <cory@frenette.dev> Date: Sun, 10 Dec 2023 22:12:46 -0500 Subject: [PATCH 200/286] implement svg text fix for native renderer Signed-off-by: Cory Frenette <cory@frenette.dev> --- wgpu/src/image/vector.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs index 6582bb82..1efc5342 100644 --- a/wgpu/src/image/vector.rs +++ b/wgpu/src/image/vector.rs @@ -2,8 +2,9 @@ use crate::core::svg; use crate::core::{Color, Size}; use crate::image::atlas::{self, Atlas}; +use iced_graphics::text; use resvg::tiny_skia; -use resvg::usvg; +use resvg::usvg::{self, TreeTextToPath}; use std::collections::{HashMap, HashSet}; use std::fs; @@ -51,11 +52,23 @@ impl Cache { let svg = match handle.data() { svg::Data::Path(path) => { - let tree = fs::read_to_string(path).ok().and_then(|contents| { - usvg::Tree::from_str(&contents, &usvg::Options::default()) + let mut tree = + fs::read_to_string(path).ok().and_then(|contents| { + usvg::Tree::from_str( + &contents, + &usvg::Options::default(), + ) .ok() - }); - + }); + // If there are text nodes in the tree load fonts and convert the text to paths + if let Some(svg_tree) = &mut tree { + if svg_tree.has_text_nodes() { + let mut font_system = text::font_system() + .write() + .expect("Read font system"); + svg_tree.convert_text(font_system.raw().db_mut()); + } + } tree.map(Svg::Loaded).unwrap_or(Svg::NotFound) } svg::Data::Bytes(bytes) => { From bb30b137d8b836b7e877d938c4cc62feefb9113f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 11 Dec 2023 10:47:17 +0100 Subject: [PATCH 201/286] Fix `expect` message in `iced_tiny_skia::vector` --- tiny_skia/src/vector.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tiny_skia/src/vector.rs b/tiny_skia/src/vector.rs index 9c2893a2..fd1ab3de 100644 --- a/tiny_skia/src/vector.rs +++ b/tiny_skia/src/vector.rs @@ -96,7 +96,7 @@ impl Cache { if let Some(svg) = &mut svg { if svg.has_text_nodes() { let mut font_system = - text::font_system().write().expect("Read font system"); + text::font_system().write().expect("Write font system"); svg.convert_text(font_system.raw().db_mut()); } From 33f92b1be78e2f09290e36f0c9b77af899609bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 11 Dec 2023 10:47:53 +0100 Subject: [PATCH 202/286] Fix import styling in `iced_wgpu::image::vector` --- wgpu/src/image/vector.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs index 1efc5342..f4819095 100644 --- a/wgpu/src/image/vector.rs +++ b/wgpu/src/image/vector.rs @@ -1,8 +1,8 @@ use crate::core::svg; use crate::core::{Color, Size}; +use crate::graphics::text; use crate::image::atlas::{self, Atlas}; -use iced_graphics::text; use resvg::tiny_skia; use resvg::usvg::{self, TreeTextToPath}; use std::collections::{HashMap, HashSet}; From 04e8e529a0e80499b129395664f1806de8102d01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 11 Dec 2023 10:48:07 +0100 Subject: [PATCH 203/286] Convert SVG text nodes for in-memory SVGs in `iced_wgpu` --- wgpu/src/image/vector.rs | 37 +++++++++++++++++-------------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs index f4819095..d9be50d7 100644 --- a/wgpu/src/image/vector.rs +++ b/wgpu/src/image/vector.rs @@ -50,27 +50,15 @@ impl Cache { return self.svgs.get(&handle.id()).unwrap(); } - let svg = match handle.data() { - svg::Data::Path(path) => { - let mut tree = - fs::read_to_string(path).ok().and_then(|contents| { - usvg::Tree::from_str( - &contents, - &usvg::Options::default(), - ) + let mut svg = match handle.data() { + svg::Data::Path(path) => fs::read_to_string(path) + .ok() + .and_then(|contents| { + usvg::Tree::from_str(&contents, &usvg::Options::default()) .ok() - }); - // If there are text nodes in the tree load fonts and convert the text to paths - if let Some(svg_tree) = &mut tree { - if svg_tree.has_text_nodes() { - let mut font_system = text::font_system() - .write() - .expect("Read font system"); - svg_tree.convert_text(font_system.raw().db_mut()); - } - } - tree.map(Svg::Loaded).unwrap_or(Svg::NotFound) - } + }) + .map(Svg::Loaded) + .unwrap_or(Svg::NotFound), svg::Data::Bytes(bytes) => { match usvg::Tree::from_data(bytes, &usvg::Options::default()) { Ok(tree) => Svg::Loaded(tree), @@ -79,6 +67,15 @@ impl Cache { } }; + if let Svg::Loaded(svg) = &mut svg { + if svg.has_text_nodes() { + let mut font_system = + text::font_system().write().expect("Write font system"); + + svg.convert_text(font_system.raw().db_mut()); + } + } + let _ = self.svgs.insert(handle.id(), svg); self.svgs.get(&handle.id()).unwrap() } From dd249a1d11c68b8fee1828d58bae158946ee2ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 11 Dec 2023 10:57:48 +0100 Subject: [PATCH 204/286] Update `async-tungstenite` in `websocket` example --- examples/websocket/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/websocket/Cargo.toml b/examples/websocket/Cargo.toml index 2756e8e0..8f1b876a 100644 --- a/examples/websocket/Cargo.toml +++ b/examples/websocket/Cargo.toml @@ -13,7 +13,7 @@ once_cell.workspace = true warp = "0.3" [dependencies.async-tungstenite] -version = "0.23" +version = "0.24" features = ["tokio-rustls-webpki-roots"] [dependencies.tokio] From b54f27d30deec672012c4a63c65d34641b40a9d5 Mon Sep 17 00:00:00 2001 From: hicaru <lich666black@gmail.com> Date: Tue, 12 Dec 2023 14:02:15 +0500 Subject: [PATCH 205/286] added svg hover, for styles impl --- style/src/svg.rs | 3 +++ style/src/theme.rs | 8 ++++++++ widget/src/svg.rs | 9 +++++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/style/src/svg.rs b/style/src/svg.rs index 9378c1a7..5053f9f8 100644 --- a/style/src/svg.rs +++ b/style/src/svg.rs @@ -20,4 +20,7 @@ pub trait StyleSheet { /// Produces the [`Appearance`] of the svg. fn appearance(&self, style: &Self::Style) -> Appearance; + + /// Produces the hovered [`Appearance`] of a svg content. + fn hovered(&self, style: &Self::Style) -> Appearance; } diff --git a/style/src/theme.rs b/style/src/theme.rs index 47010728..4af07794 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -909,6 +909,10 @@ impl svg::StyleSheet for Theme { Svg::Custom(custom) => custom.appearance(self), } } + + fn hovered(&self, style: &Self::Style) -> svg::Appearance { + self.appearance(style) + } } impl svg::StyleSheet for fn(&Theme) -> svg::Appearance { @@ -917,6 +921,10 @@ impl svg::StyleSheet for fn(&Theme) -> svg::Appearance { fn appearance(&self, style: &Self::Style) -> svg::Appearance { (self)(style) } + + fn hovered(&self, style: &Self::Style) -> svg::Appearance { + self.appearance(style) + } } /// The style of a scrollable. diff --git a/widget/src/svg.rs b/widget/src/svg.rs index 2d01d1ab..f9b16e1a 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -145,7 +145,7 @@ where theme: &Renderer::Theme, _style: &renderer::Style, layout: Layout<'_>, - _cursor: mouse::Cursor, + cursor: mouse::Cursor, _viewport: &Rectangle, ) { let Size { width, height } = renderer.dimensions(&self.handle); @@ -153,6 +153,7 @@ where let bounds = layout.bounds(); let adjusted_fit = self.content_fit.fit(image_size, bounds.size()); + let is_mouse_over = cursor.is_over(bounds); let render = |renderer: &mut Renderer| { let offset = Vector::new( @@ -166,7 +167,11 @@ where ..bounds }; - let appearance = theme.appearance(&self.style); + let appearance = if is_mouse_over { + theme.appearance(&self.style) + } else { + theme.hovered(&self.style) + }; renderer.draw( self.handle.clone(), From 116fb666b05d57df6f70631b11fc8732ed33f71b Mon Sep 17 00:00:00 2001 From: Joao Freitas <51237625+jhff@users.noreply.github.com> Date: Fri, 15 Dec 2023 10:02:13 +0000 Subject: [PATCH 206/286] Add deadband distance before initiating drag action on pane grid --- widget/src/pane_grid.rs | 69 ++++++++++++++++++++++++++--------- widget/src/pane_grid/state.rs | 17 +++++++++ 2 files changed, 68 insertions(+), 18 deletions(-) diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 2d25a543..7057fe59 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -531,6 +531,8 @@ pub fn update<'a, Message, T: Draggable>( on_drag: &Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, on_resize: &Option<(f32, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>, ) -> event::Status { + const DRAG_DEADBAND_DISTANCE: f32 = 10.0; + let mut event_status = event::Status::Ignored; match event { @@ -572,7 +574,6 @@ pub fn update<'a, Message, T: Draggable>( shell, contents, on_click, - on_drag, ); } } @@ -584,7 +585,6 @@ pub fn update<'a, Message, T: Draggable>( shell, contents, on_click, - on_drag, ); } } @@ -637,7 +637,49 @@ pub fn update<'a, Message, T: Draggable>( } Event::Mouse(mouse::Event::CursorMoved { .. }) | Event::Touch(touch::Event::FingerMoved { .. }) => { - if let Some((_, on_resize)) = on_resize { + if let Some((_, origin)) = action.clicked_pane() { + if let Some(on_drag) = &on_drag { + let bounds = layout.bounds(); + + if let Some(cursor_position) = cursor.position_over(bounds) + { + let mut clicked_region = contents + .zip(layout.children()) + .filter(|(_, layout)| { + layout.bounds().contains(cursor_position) + }); + + if let Some(((pane, content), layout)) = + clicked_region.next() + { + if content + .can_be_dragged_at(layout, cursor_position) + { + let pane_position = layout.position(); + + let new_origin = cursor_position + - Vector::new( + pane_position.x, + pane_position.y, + ); + + if new_origin.distance(origin) + > DRAG_DEADBAND_DISTANCE + { + *action = state::Action::Dragging { + pane, + origin, + }; + + shell.publish(on_drag(DragEvent::Picked { + pane, + })); + } + } + } + } + } + } else if let Some((_, on_resize)) = on_resize { if let Some((split, _)) = action.picked_split() { let bounds = layout.bounds(); @@ -712,7 +754,6 @@ fn click_pane<'a, Message, T>( shell: &mut Shell<'_, Message>, contents: impl Iterator<Item = (Pane, T)>, on_click: &Option<Box<dyn Fn(Pane) -> Message + 'a>>, - on_drag: &Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, ) where T: Draggable, { @@ -720,23 +761,15 @@ fn click_pane<'a, Message, T>( .zip(layout.children()) .filter(|(_, layout)| layout.bounds().contains(cursor_position)); - if let Some(((pane, content), layout)) = clicked_region.next() { + if let Some(((pane, _), layout)) = clicked_region.next() { if let Some(on_click) = &on_click { shell.publish(on_click(pane)); } - if let Some(on_drag) = &on_drag { - if content.can_be_dragged_at(layout, cursor_position) { - let pane_position = layout.position(); - - let origin = cursor_position - - Vector::new(pane_position.x, pane_position.y); - - *action = state::Action::Dragging { pane, origin }; - - shell.publish(on_drag(DragEvent::Picked { pane })); - } - } + let pane_position = layout.position(); + let origin = + cursor_position - Vector::new(pane_position.x, pane_position.y); + *action = state::Action::Clicking { pane, origin }; } } @@ -749,7 +782,7 @@ pub fn mouse_interaction( spacing: f32, resize_leeway: Option<f32>, ) -> Option<mouse::Interaction> { - if action.picked_pane().is_some() { + if action.clicked_pane().is_some() || action.picked_pane().is_some() { return Some(mouse::Interaction::Grabbing); } diff --git a/widget/src/pane_grid/state.rs b/widget/src/pane_grid/state.rs index 481cd770..5d1fe254 100644 --- a/widget/src/pane_grid/state.rs +++ b/widget/src/pane_grid/state.rs @@ -403,6 +403,15 @@ pub enum Action { /// /// [`PaneGrid`]: super::PaneGrid Idle, + /// A [`Pane`] in the [`PaneGrid`] is being clicked. + /// + /// [`PaneGrid`]: super::PaneGrid + Clicking { + /// The [`Pane`] being clicked. + pane: Pane, + /// The starting [`Point`] of the click interaction. + origin: Point, + }, /// A [`Pane`] in the [`PaneGrid`] is being dragged. /// /// [`PaneGrid`]: super::PaneGrid @@ -432,6 +441,14 @@ impl Action { } } + /// Returns the current [`Pane`] that is being clicked, if any. + pub fn clicked_pane(&self) -> Option<(Pane, Point)> { + match *self { + Action::Clicking { pane, origin, .. } => Some((pane, origin)), + _ => None, + } + } + /// Returns the current [`Split`] that is being dragged, if any. pub fn picked_split(&self) -> Option<(Split, Axis)> { match *self { From e819c2390bad76e811265245bd5fab63fc30a8b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 13:15:44 +0100 Subject: [PATCH 207/286] Update `winit` to `0.29.4` --- Cargo.toml | 4 +- core/Cargo.toml | 4 +- core/src/keyboard/event.rs | 8 +- core/src/mouse/button.rs | 6 + core/src/time.rs | 13 +- examples/integration/src/main.rs | 124 ++++---- examples/modal/src/main.rs | 1 + examples/pokedex/Cargo.toml | 2 +- examples/toast/src/main.rs | 1 + futures/src/keyboard.rs | 1 + widget/src/canvas/event.rs | 2 +- widget/src/shader/event.rs | 2 +- widget/src/text_editor.rs | 12 +- widget/src/text_input.rs | 56 ++-- winit/src/application.rs | 343 +++++++++----------- winit/src/application/state.rs | 24 +- winit/src/conversion.rs | 350 +++++++++------------ winit/src/multi_window.rs | 523 ++++++++++++++----------------- winit/src/multi_window/state.rs | 24 +- 19 files changed, 654 insertions(+), 846 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0afbcd51..a78d0f8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -130,7 +130,6 @@ glyphon = { git = "https://github.com/grovesNL/glyphon.git", rev = "2caa9fc5e592 guillotiere = "0.6" half = "2.2" image = "0.24" -instant = "0.1" kamadak-exif = "0.5" kurbo = "0.9" log = "0.4" @@ -157,7 +156,8 @@ unicode-segmentation = "1.0" wasm-bindgen-futures = "0.4" wasm-timer = "0.2" web-sys = "0.3" +web-time = "0.2" wgpu = "0.18" winapi = "0.3" window_clipboard = "0.3" -winit = { git = "https://github.com/iced-rs/winit.git", rev = "c52db2045d0a2f1b8d9923870de1d4ab1994146e", default-features = false } +winit = { git = "https://github.com/iced-rs/winit.git", rev = "3bcdb9abcd7459978ec689523bc21943d38da0f9", default-features = false, features = ["rwh_05", "x11", "wayland"] } diff --git a/core/Cargo.toml b/core/Cargo.toml index 4672c754..c95477c4 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -16,13 +16,11 @@ log.workspace = true thiserror.workspace = true xxhash-rust.workspace = true num-traits.workspace = true +web-time.workspace = true palette.workspace = true palette.optional = true -[target.'cfg(target_arch = "wasm32")'.dependencies] -instant.workspace = true - [target.'cfg(windows)'.dependencies] raw-window-handle.workspace = true diff --git a/core/src/keyboard/event.rs b/core/src/keyboard/event.rs index 016761af..884fc502 100644 --- a/core/src/keyboard/event.rs +++ b/core/src/keyboard/event.rs @@ -6,7 +6,7 @@ use super::{KeyCode, Modifiers}; /// additional events, feel free to [open an issue] and share your use case!_ /// /// [open an issue]: https://github.com/iced-rs/iced/issues -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, PartialEq, Eq)] pub enum Event { /// A keyboard key was pressed. KeyPressed { @@ -15,6 +15,9 @@ pub enum Event { /// The state of the modifier keys modifiers: Modifiers, + + /// The text produced by the key press, if any. + text: Option<String>, }, /// A keyboard key was released. @@ -26,9 +29,6 @@ pub enum Event { modifiers: Modifiers, }, - /// A unicode character was received. - CharacterReceived(char), - /// The keyboard modifiers have changed. ModifiersChanged(Modifiers), } diff --git a/core/src/mouse/button.rs b/core/src/mouse/button.rs index 3eec7f42..a8f90329 100644 --- a/core/src/mouse/button.rs +++ b/core/src/mouse/button.rs @@ -10,6 +10,12 @@ pub enum Button { /// The middle (wheel) button. Middle, + /// The back mouse button. + Back, + + /// The forward mouse button. + Forward, + /// Some other button. Other(u16), } diff --git a/core/src/time.rs b/core/src/time.rs index 9355ae6d..dcfe4e41 100644 --- a/core/src/time.rs +++ b/core/src/time.rs @@ -1,13 +1,4 @@ //! Keep track of time, both in native and web platforms! -#[cfg(target_arch = "wasm32")] -pub use instant::Instant; - -#[cfg(target_arch = "wasm32")] -pub use instant::Duration; - -#[cfg(not(target_arch = "wasm32"))] -pub use std::time::Instant; - -#[cfg(not(target_arch = "wasm32"))] -pub use std::time::Duration; +pub use web_time::Duration; +pub use web_time::Instant; diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index 276794c8..fab81553 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -19,8 +19,9 @@ use iced_winit::winit; use iced_winit::Clipboard; use winit::{ - event::{Event, ModifiersState, WindowEvent}, + event::{Event, WindowEvent}, event_loop::{ControlFlow, EventLoop}, + keyboard::ModifiersState, }; #[cfg(target_arch = "wasm32")] @@ -48,7 +49,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { tracing_subscriber::fmt::init(); // Initialize winit - let event_loop = EventLoop::new(); + let event_loop = EventLoop::new()?; #[cfg(target_arch = "wasm32")] let window = winit::window::WindowBuilder::new() @@ -160,67 +161,15 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { ); // Run event loop - event_loop.run(move |event, _, control_flow| { + event_loop.run(move |event, window_target| { // You should change this if you want to render continuosly - *control_flow = ControlFlow::Wait; + window_target.set_control_flow(ControlFlow::Wait); match event { - Event::WindowEvent { event, .. } => { - match event { - WindowEvent::CursorMoved { position, .. } => { - cursor_position = Some(position); - } - WindowEvent::ModifiersChanged(new_modifiers) => { - modifiers = new_modifiers; - } - WindowEvent::Resized(_) => { - resized = true; - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => {} - } - - // Map window event to iced event - if let Some(event) = iced_winit::conversion::window_event( - window::Id::MAIN, - &event, - window.scale_factor(), - modifiers, - ) { - state.queue_event(event); - } - } - Event::MainEventsCleared => { - // If there are events pending - if !state.is_queue_empty() { - // We update iced - let _ = state.update( - viewport.logical_size(), - cursor_position - .map(|p| { - conversion::cursor_position( - p, - viewport.scale_factor(), - ) - }) - .map(mouse::Cursor::Available) - .unwrap_or(mouse::Cursor::Unavailable), - &mut renderer, - &Theme::Dark, - &renderer::Style { - text_color: Color::WHITE, - }, - &mut clipboard, - &mut debug, - ); - - // and request a redraw - window.request_redraw(); - } - } - Event::RedrawRequested(_) => { + Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } => { if resized { let size = window.inner_size(); @@ -309,7 +258,60 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { }, } } + Event::WindowEvent { event, .. } => { + match event { + WindowEvent::CursorMoved { position, .. } => { + cursor_position = Some(position); + } + WindowEvent::ModifiersChanged(new_modifiers) => { + modifiers = new_modifiers.state(); + } + WindowEvent::Resized(_) => { + resized = true; + } + WindowEvent::CloseRequested => { + window_target.exit(); + } + _ => {} + } + + // Map window event to iced event + if let Some(event) = iced_winit::conversion::window_event( + window::Id::MAIN, + &event, + window.scale_factor(), + modifiers, + ) { + state.queue_event(event); + } + } _ => {} } - }) + + // If there are events pending + if !state.is_queue_empty() { + // We update iced + let _ = state.update( + viewport.logical_size(), + cursor_position + .map(|p| { + conversion::cursor_position(p, viewport.scale_factor()) + }) + .map(mouse::Cursor::Available) + .unwrap_or(mouse::Cursor::Unavailable), + &mut renderer, + &Theme::Dark, + &renderer::Style { + text_color: Color::WHITE, + }, + &mut clipboard, + &mut debug, + ); + + // and request a redraw + window.request_redraw(); + } + })?; + + Ok(()) } diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index acb14372..05461dab 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -87,6 +87,7 @@ impl Application for App { Event::Keyboard(keyboard::Event::KeyPressed { key_code: keyboard::KeyCode::Tab, modifiers, + .. }) => { if modifiers.shift() { widget::focus_previous() diff --git a/examples/pokedex/Cargo.toml b/examples/pokedex/Cargo.toml index bf7e1e35..4a55f943 100644 --- a/examples/pokedex/Cargo.toml +++ b/examples/pokedex/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["image", "debug", "tokio"] +iced.features = ["image", "debug", "tokio", "webgl"] serde_json = "1.0" diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 31b6f191..e8317589 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -95,6 +95,7 @@ impl Application for App { Message::Event(Event::Keyboard(keyboard::Event::KeyPressed { key_code: keyboard::KeyCode::Tab, modifiers, + .. })) if modifiers.shift() => widget::focus_previous(), Message::Event(Event::Keyboard(keyboard::Event::KeyPressed { key_code: keyboard::KeyCode::Tab, diff --git a/futures/src/keyboard.rs b/futures/src/keyboard.rs index af68e1f2..855eecd4 100644 --- a/futures/src/keyboard.rs +++ b/futures/src/keyboard.rs @@ -24,6 +24,7 @@ where core::Event::Keyboard(Event::KeyPressed { key_code, modifiers, + .. }), core::event::Status::Ignored, ) => f(key_code, modifiers), diff --git a/widget/src/canvas/event.rs b/widget/src/canvas/event.rs index 1288365f..a8eb47f7 100644 --- a/widget/src/canvas/event.rs +++ b/widget/src/canvas/event.rs @@ -8,7 +8,7 @@ pub use crate::core::event::Status; /// A [`Canvas`] event. /// /// [`Canvas`]: crate::Canvas -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub enum Event { /// A mouse event. Mouse(mouse::Event), diff --git a/widget/src/shader/event.rs b/widget/src/shader/event.rs index 1cc484fb..005c8725 100644 --- a/widget/src/shader/event.rs +++ b/widget/src/shader/event.rs @@ -9,7 +9,7 @@ pub use crate::core::event::Status; /// A [`Shader`] event. /// /// [`Shader`]: crate::Shader -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub enum Event { /// A mouse event. Mouse(mouse::Event), diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index a2a186f0..3c0a1806 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -649,6 +649,7 @@ impl Update { keyboard::Event::KeyPressed { key_code, modifiers, + text, } if state.is_focused => { if let Some(motion) = motion(key_code) { let motion = @@ -678,12 +679,15 @@ impl Update { { Some(Self::Paste) } - _ => None, + _ => { + let text = text?; + + edit(Edit::Insert( + text.chars().next().unwrap_or_default(), + )) + } } } - keyboard::Event::CharacterReceived(c) if state.is_focused => { - edit(Edit::Insert(c)) - } _ => None, }, _ => None, diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 65d3e1eb..8ba4bd71 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -752,34 +752,9 @@ where return event::Status::Captured; } } - Event::Keyboard(keyboard::Event::CharacterReceived(c)) => { - let state = state(); - - if let Some(focus) = &mut state.is_focused { - let Some(on_input) = on_input else { - return event::Status::Ignored; - }; - - if state.is_pasting.is_none() - && !state.keyboard_modifiers.command() - && !c.is_control() - { - let mut editor = Editor::new(value, &mut state.cursor); - - editor.insert(c); - - let message = (on_input)(editor.contents()); - shell.publish(message); - - focus.updated_at = Instant::now(); - - update_cache(state, value); - - return event::Status::Captured; - } - } - } - Event::Keyboard(keyboard::Event::KeyPressed { key_code, .. }) => { + Event::Keyboard(keyboard::Event::KeyPressed { + key_code, text, .. + }) => { let state = state(); if let Some(focus) = &mut state.is_focused { @@ -971,7 +946,30 @@ where | keyboard::KeyCode::Down => { return event::Status::Ignored; } - _ => {} + _ => { + if let Some(text) = text { + let c = text.chars().next().unwrap_or_default(); + + if state.is_pasting.is_none() + && !state.keyboard_modifiers.command() + && !c.is_control() + { + let mut editor = + Editor::new(value, &mut state.cursor); + + editor.insert(c); + + let message = (on_input)(editor.contents()); + shell.publish(message); + + focus.updated_at = Instant::now(); + + update_cache(state, value); + + return event::Status::Captured; + } + } + } } return event::Status::Captured; diff --git a/winit/src/application.rs b/winit/src/application.rs index d9700075..ed6ba9eb 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -115,7 +115,9 @@ where let mut debug = Debug::new(); debug.startup_started(); - let event_loop = EventLoopBuilder::with_user_event().build(); + let event_loop = EventLoopBuilder::with_user_event() + .build() + .expect("Create event loop"); let proxy = event_loop.create_proxy(); let runtime = { @@ -155,7 +157,7 @@ where { use winit::platform::web::WindowExtWebSys; - let canvas = window.canvas(); + let canvas = window.canvas().expect("Get window canvas"); let window = web_sys::window().unwrap(); let document = window.document().unwrap(); @@ -210,45 +212,28 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); - platform::run(event_loop, move |event, _, control_flow| { - use winit::event_loop::ControlFlow; - - if let ControlFlow::ExitWithCode(_) = control_flow { + let _ = event_loop.run(move |event, event_loop| { + if event_loop.exiting() { return; } - let event = match event { - winit::event::Event::WindowEvent { - event: - winit::event::WindowEvent::ScaleFactorChanged { - new_inner_size, - .. - }, - window_id, - } => Some(winit::event::Event::WindowEvent { - event: winit::event::WindowEvent::Resized(*new_inner_size), - window_id, - }), - _ => event.to_static(), + event_sender.start_send(event).expect("Send event"); + + let poll = instance.as_mut().poll(&mut context); + + match poll { + task::Poll::Pending => { + if let Ok(Some(flow)) = control_receiver.try_next() { + event_loop.set_control_flow(flow); + } + } + task::Poll::Ready(_) => { + event_loop.exit(); + } }; + }); - if let Some(event) = event { - event_sender.start_send(event).expect("Send event"); - - let poll = instance.as_mut().poll(&mut context); - - match poll { - task::Poll::Pending => { - if let Ok(Some(flow)) = control_receiver.try_next() { - *control_flow = flow; - } - } - task::Poll::Ready(_) => { - *control_flow = ControlFlow::Exit; - } - }; - } - }) + Ok(()) } async fn run_instance<A, E, C>( @@ -259,7 +244,7 @@ async fn run_instance<A, E, C>( mut proxy: winit::event_loop::EventLoopProxy<A::Message>, mut debug: Debug, mut event_receiver: mpsc::UnboundedReceiver< - winit::event::Event<'_, A::Message>, + winit::event::Event<A::Message>, >, mut control_sender: mpsc::UnboundedSender<winit::event_loop::ControlFlow>, init_command: Command<A::Message>, @@ -335,89 +320,24 @@ async fn run_instance<A, E, C>( | event::StartCause::ResumeTimeReached { .. } ); } - event::Event::MainEventsCleared => { - if !redraw_pending && events.is_empty() && messages.is_empty() { - continue; - } - - debug.event_processing_started(); - - let (interface_state, statuses) = user_interface.update( - &events, - state.cursor(), - &mut renderer, - &mut clipboard, - &mut messages, - ); - - debug.event_processing_finished(); - - for (event, status) in - events.drain(..).zip(statuses.into_iter()) - { - runtime.broadcast(event, status); - } - - if !messages.is_empty() - || matches!( - interface_state, - user_interface::State::Outdated - ) - { - let mut cache = - ManuallyDrop::into_inner(user_interface).into_cache(); - - // Update application - update( - &mut application, - &mut compositor, - &mut surface, - &mut cache, - &state, - &mut renderer, - &mut runtime, - &mut clipboard, - &mut should_exit, - &mut proxy, - &mut debug, - &mut messages, - &window, - ); - - // Update window - state.synchronize(&application, &window); - - user_interface = ManuallyDrop::new(build_user_interface( - &application, - cache, - &mut renderer, - state.logical_size(), - &mut debug, - )); - - if should_exit { - break; - } - } - - // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes - // - // Then, we can use the `interface_state` here to decide if a redraw - // is needed right away, or simply wait until a specific time. - let redraw_event = Event::Window( - window::Id::MAIN, - window::Event::RedrawRequested(Instant::now()), - ); - - let (interface_state, _) = user_interface.update( - &[redraw_event.clone()], - state.cursor(), - &mut renderer, - &mut clipboard, - &mut messages, - ); + event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( + event::MacOS::ReceivedUrl(url), + )) => { + use crate::core::event; + events.push(Event::PlatformSpecific( + event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl( + url, + )), + )); + } + event::Event::UserEvent(message) => { + messages.push(message); + } + event::Event::WindowEvent { + event: event::WindowEvent::RedrawRequested { .. }, + .. + } => { debug.draw_started(); let new_mouse_interaction = user_interface.draw( &mut renderer, @@ -437,38 +357,6 @@ async fn run_instance<A, E, C>( mouse_interaction = new_mouse_interaction; } - window.request_redraw(); - runtime.broadcast(redraw_event, core::event::Status::Ignored); - - let _ = control_sender.start_send(match interface_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => ControlFlow::Poll, - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }); - - redraw_pending = false; - } - event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( - event::MacOS::ReceivedUrl(url), - )) => { - use crate::core::event; - - events.push(Event::PlatformSpecific( - event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl( - url, - )), - )); - } - event::Event::UserEvent(message) => { - messages.push(message); - } - event::Event::RedrawRequested(_) => { let physical_size = state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 { @@ -566,6 +454,98 @@ async fn run_instance<A, E, C>( } _ => {} } + + if !redraw_pending && events.is_empty() && messages.is_empty() { + continue; + } + + debug.event_processing_started(); + + let (interface_state, statuses) = user_interface.update( + &events, + state.cursor(), + &mut renderer, + &mut clipboard, + &mut messages, + ); + + debug.event_processing_finished(); + + for (event, status) in events.drain(..).zip(statuses.into_iter()) { + runtime.broadcast(event, status); + } + + if !messages.is_empty() + || matches!(interface_state, user_interface::State::Outdated) + { + let mut cache = + ManuallyDrop::into_inner(user_interface).into_cache(); + + // Update application + update( + &mut application, + &mut compositor, + &mut surface, + &mut cache, + &state, + &mut renderer, + &mut runtime, + &mut clipboard, + &mut should_exit, + &mut proxy, + &mut debug, + &mut messages, + &window, + ); + + // Update window + state.synchronize(&application, &window); + + user_interface = ManuallyDrop::new(build_user_interface( + &application, + cache, + &mut renderer, + state.logical_size(), + &mut debug, + )); + + if should_exit { + break; + } + } + + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = Event::Window( + window::Id::MAIN, + window::Event::RedrawRequested(Instant::now()), + ); + + let (interface_state, _) = user_interface.update( + &[redraw_event.clone()], + state.cursor(), + &mut renderer, + &mut clipboard, + &mut messages, + ); + + window.request_redraw(); + runtime.broadcast(redraw_event, core::event::Status::Ignored); + + let _ = control_sender.start_send(match interface_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => ControlFlow::Poll, + window::RedrawRequest::At(at) => ControlFlow::WaitUntil(at), + }, + _ => ControlFlow::Wait, + }); + + redraw_pending = false; } // Manually drop the user interface @@ -575,8 +555,8 @@ async fn run_instance<A, E, C>( /// Returns true if the provided event should cause an [`Application`] to /// exit. pub fn requests_exit( - event: &winit::event::WindowEvent<'_>, - _modifiers: winit::event::ModifiersState, + event: &winit::event::WindowEvent, + _modifiers: winit::keyboard::ModifiersState, ) -> bool { use winit::event::WindowEvent; @@ -584,14 +564,14 @@ pub fn requests_exit( WindowEvent::CloseRequested => true, #[cfg(target_os = "macos")] WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::Q), + event: + winit::event::KeyEvent { + logical_key: winit::keyboard::Key::Character(c), state: winit::event::ElementState::Pressed, .. }, .. - } if _modifiers.logo() => true, + } if c == "q" && _modifiers.super_key() => true, _ => false, } } @@ -726,10 +706,11 @@ pub fn run_command<A, C, E>( ); } window::Action::Resize(_id, size) => { - window.set_inner_size(winit::dpi::LogicalSize { - width: size.width, - height: size.height, - }); + let _ = + window.request_inner_size(winit::dpi::LogicalSize { + width: size.width, + height: size.height, + }); } window::Action::FetchSize(_id, callback) => { let size = @@ -878,43 +859,3 @@ pub fn run_command<A, C, E>( } } } - -#[cfg(not(target_arch = "wasm32"))] -mod platform { - pub fn run<T, F>( - mut event_loop: winit::event_loop::EventLoop<T>, - event_handler: F, - ) -> Result<(), super::Error> - where - F: 'static - + FnMut( - winit::event::Event<'_, T>, - &winit::event_loop::EventLoopWindowTarget<T>, - &mut winit::event_loop::ControlFlow, - ), - { - use winit::platform::run_return::EventLoopExtRunReturn; - - let _ = event_loop.run_return(event_handler); - - Ok(()) - } -} - -#[cfg(target_arch = "wasm32")] -mod platform { - pub fn run<T, F>( - event_loop: winit::event_loop::EventLoop<T>, - event_handler: F, - ) -> ! - where - F: 'static - + FnMut( - winit::event::Event<'_, T>, - &winit::event_loop::EventLoopWindowTarget<T>, - &mut winit::event_loop::ControlFlow, - ), - { - event_loop.run(event_handler) - } -} diff --git a/winit/src/application/state.rs b/winit/src/application/state.rs index e655529a..8c9b20e0 100644 --- a/winit/src/application/state.rs +++ b/winit/src/application/state.rs @@ -22,7 +22,7 @@ where viewport: Viewport, viewport_version: usize, cursor_position: Option<winit::dpi::PhysicalPosition<f64>>, - modifiers: winit::event::ModifiersState, + modifiers: winit::keyboard::ModifiersState, theme: <A::Renderer as core::Renderer>::Theme, appearance: application::Appearance, application: PhantomData<A>, @@ -54,7 +54,7 @@ where viewport, viewport_version: 0, cursor_position: None, - modifiers: winit::event::ModifiersState::default(), + modifiers: winit::keyboard::ModifiersState::default(), theme, appearance, application: PhantomData, @@ -102,7 +102,7 @@ where } /// Returns the current keyboard modifiers of the [`State`]. - pub fn modifiers(&self) -> winit::event::ModifiersState { + pub fn modifiers(&self) -> winit::keyboard::ModifiersState { self.modifiers } @@ -126,7 +126,7 @@ where pub fn update( &mut self, window: &Window, - event: &WindowEvent<'_>, + event: &WindowEvent, _debug: &mut Debug, ) { match event { @@ -142,10 +142,9 @@ where } WindowEvent::ScaleFactorChanged { scale_factor: new_scale_factor, - new_inner_size, + .. } => { - let size = - Size::new(new_inner_size.width, new_inner_size.height); + let size = self.viewport.physical_size(); self.viewport = Viewport::with_physical_size( size, @@ -164,13 +163,16 @@ where self.cursor_position = None; } WindowEvent::ModifiersChanged(new_modifiers) => { - self.modifiers = *new_modifiers; + self.modifiers = new_modifiers.state(); } #[cfg(feature = "debug")] WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::F12), + event: + winit::event::KeyEvent { + logical_key: + winit::keyboard::Key::Named( + winit::keyboard::NamedKey::F12, + ), state: winit::event::ElementState::Pressed, .. }, diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 7e51a2d4..ecc34320 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -128,9 +128,9 @@ pub fn window_settings( /// Converts a winit window event into an iced event. pub fn window_event( id: window::Id, - event: &winit::event::WindowEvent<'_>, + event: &winit::event::WindowEvent, scale_factor: f64, - modifiers: winit::event::ModifiersState, + modifiers: winit::keyboard::ModifiersState, ) -> Option<Event> { use winit::event::WindowEvent; @@ -146,17 +146,6 @@ pub fn window_event( }, )) } - WindowEvent::ScaleFactorChanged { new_inner_size, .. } => { - let logical_size = new_inner_size.to_logical(scale_factor); - - Some(Event::Window( - id, - window::Event::Resized { - width: logical_size.width, - height: logical_size.height, - }, - )) - } WindowEvent::CloseRequested => { Some(Event::Window(id, window::Event::CloseRequested)) } @@ -203,19 +192,17 @@ pub fn window_event( })) } }, - WindowEvent::ReceivedCharacter(c) if !is_private_use_character(*c) => { - Some(Event::Keyboard(keyboard::Event::CharacterReceived(*c))) - } WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(virtual_keycode), + event: + winit::event::KeyEvent { + logical_key, state, + text, .. }, .. } => Some(Event::Keyboard({ - let key_code = key_code(*virtual_keycode); + let key_code = key_code(logical_key); let modifiers = self::modifiers(modifiers); match state { @@ -223,6 +210,9 @@ pub fn window_event( keyboard::Event::KeyPressed { key_code, modifiers, + text: text + .as_ref() + .map(winit::keyboard::SmolStr::to_string), } } winit::event::ElementState::Released => { @@ -233,9 +223,11 @@ pub fn window_event( } } })), - WindowEvent::ModifiersChanged(new_modifiers) => Some(Event::Keyboard( - keyboard::Event::ModifiersChanged(self::modifiers(*new_modifiers)), - )), + WindowEvent::ModifiersChanged(new_modifiers) => { + Some(Event::Keyboard(keyboard::Event::ModifiersChanged( + self::modifiers(new_modifiers.state()), + ))) + } WindowEvent::Focused(focused) => Some(Event::Window( id, if *focused { @@ -365,7 +357,7 @@ pub fn mouse_interaction( match interaction { Interaction::Idle => winit::window::CursorIcon::Default, - Interaction::Pointer => winit::window::CursorIcon::Hand, + Interaction::Pointer => winit::window::CursorIcon::Pointer, Interaction::Working => winit::window::CursorIcon::Progress, Interaction::Grab => winit::window::CursorIcon::Grab, Interaction::Grabbing => winit::window::CursorIcon::Grabbing, @@ -388,6 +380,8 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button { winit::event::MouseButton::Left => mouse::Button::Left, winit::event::MouseButton::Right => mouse::Button::Right, winit::event::MouseButton::Middle => mouse::Button::Middle, + winit::event::MouseButton::Back => mouse::Button::Back, + winit::event::MouseButton::Forward => mouse::Button::Forward, winit::event::MouseButton::Other(other) => mouse::Button::Other(other), } } @@ -398,14 +392,14 @@ pub fn mouse_button(mouse_button: winit::event::MouseButton) -> mouse::Button { /// [`winit`]: https://github.com/rust-windowing/winit /// [`iced`]: https://github.com/iced-rs/iced/tree/0.10 pub fn modifiers( - modifiers: winit::event::ModifiersState, + modifiers: winit::keyboard::ModifiersState, ) -> keyboard::Modifiers { let mut result = keyboard::Modifiers::empty(); - result.set(keyboard::Modifiers::SHIFT, modifiers.shift()); - result.set(keyboard::Modifiers::CTRL, modifiers.ctrl()); - result.set(keyboard::Modifiers::ALT, modifiers.alt()); - result.set(keyboard::Modifiers::LOGO, modifiers.logo()); + result.set(keyboard::Modifiers::SHIFT, modifiers.shift_key()); + result.set(keyboard::Modifiers::CTRL, modifiers.control_key()); + result.set(keyboard::Modifiers::ALT, modifiers.alt_key()); + result.set(keyboard::Modifiers::LOGO, modifiers.super_key()); result } @@ -455,179 +449,125 @@ pub fn touch_event( /// /// [`winit`]: https://github.com/rust-windowing/winit /// [`iced`]: https://github.com/iced-rs/iced/tree/0.10 -pub fn key_code( - virtual_keycode: winit::event::VirtualKeyCode, -) -> keyboard::KeyCode { +pub fn key_code(key: &winit::keyboard::Key) -> keyboard::KeyCode { use keyboard::KeyCode; + use winit::keyboard::NamedKey; - match virtual_keycode { - winit::event::VirtualKeyCode::Key1 => KeyCode::Key1, - winit::event::VirtualKeyCode::Key2 => KeyCode::Key2, - winit::event::VirtualKeyCode::Key3 => KeyCode::Key3, - winit::event::VirtualKeyCode::Key4 => KeyCode::Key4, - winit::event::VirtualKeyCode::Key5 => KeyCode::Key5, - winit::event::VirtualKeyCode::Key6 => KeyCode::Key6, - winit::event::VirtualKeyCode::Key7 => KeyCode::Key7, - winit::event::VirtualKeyCode::Key8 => KeyCode::Key8, - winit::event::VirtualKeyCode::Key9 => KeyCode::Key9, - winit::event::VirtualKeyCode::Key0 => KeyCode::Key0, - winit::event::VirtualKeyCode::A => KeyCode::A, - winit::event::VirtualKeyCode::B => KeyCode::B, - winit::event::VirtualKeyCode::C => KeyCode::C, - winit::event::VirtualKeyCode::D => KeyCode::D, - winit::event::VirtualKeyCode::E => KeyCode::E, - winit::event::VirtualKeyCode::F => KeyCode::F, - winit::event::VirtualKeyCode::G => KeyCode::G, - winit::event::VirtualKeyCode::H => KeyCode::H, - winit::event::VirtualKeyCode::I => KeyCode::I, - winit::event::VirtualKeyCode::J => KeyCode::J, - winit::event::VirtualKeyCode::K => KeyCode::K, - winit::event::VirtualKeyCode::L => KeyCode::L, - winit::event::VirtualKeyCode::M => KeyCode::M, - winit::event::VirtualKeyCode::N => KeyCode::N, - winit::event::VirtualKeyCode::O => KeyCode::O, - winit::event::VirtualKeyCode::P => KeyCode::P, - winit::event::VirtualKeyCode::Q => KeyCode::Q, - winit::event::VirtualKeyCode::R => KeyCode::R, - winit::event::VirtualKeyCode::S => KeyCode::S, - winit::event::VirtualKeyCode::T => KeyCode::T, - winit::event::VirtualKeyCode::U => KeyCode::U, - winit::event::VirtualKeyCode::V => KeyCode::V, - winit::event::VirtualKeyCode::W => KeyCode::W, - winit::event::VirtualKeyCode::X => KeyCode::X, - winit::event::VirtualKeyCode::Y => KeyCode::Y, - winit::event::VirtualKeyCode::Z => KeyCode::Z, - winit::event::VirtualKeyCode::Escape => KeyCode::Escape, - winit::event::VirtualKeyCode::F1 => KeyCode::F1, - winit::event::VirtualKeyCode::F2 => KeyCode::F2, - winit::event::VirtualKeyCode::F3 => KeyCode::F3, - winit::event::VirtualKeyCode::F4 => KeyCode::F4, - winit::event::VirtualKeyCode::F5 => KeyCode::F5, - winit::event::VirtualKeyCode::F6 => KeyCode::F6, - winit::event::VirtualKeyCode::F7 => KeyCode::F7, - winit::event::VirtualKeyCode::F8 => KeyCode::F8, - winit::event::VirtualKeyCode::F9 => KeyCode::F9, - winit::event::VirtualKeyCode::F10 => KeyCode::F10, - winit::event::VirtualKeyCode::F11 => KeyCode::F11, - winit::event::VirtualKeyCode::F12 => KeyCode::F12, - winit::event::VirtualKeyCode::F13 => KeyCode::F13, - winit::event::VirtualKeyCode::F14 => KeyCode::F14, - winit::event::VirtualKeyCode::F15 => KeyCode::F15, - winit::event::VirtualKeyCode::F16 => KeyCode::F16, - winit::event::VirtualKeyCode::F17 => KeyCode::F17, - winit::event::VirtualKeyCode::F18 => KeyCode::F18, - winit::event::VirtualKeyCode::F19 => KeyCode::F19, - winit::event::VirtualKeyCode::F20 => KeyCode::F20, - winit::event::VirtualKeyCode::F21 => KeyCode::F21, - winit::event::VirtualKeyCode::F22 => KeyCode::F22, - winit::event::VirtualKeyCode::F23 => KeyCode::F23, - winit::event::VirtualKeyCode::F24 => KeyCode::F24, - winit::event::VirtualKeyCode::Snapshot => KeyCode::Snapshot, - winit::event::VirtualKeyCode::Scroll => KeyCode::Scroll, - winit::event::VirtualKeyCode::Pause => KeyCode::Pause, - winit::event::VirtualKeyCode::Insert => KeyCode::Insert, - winit::event::VirtualKeyCode::Home => KeyCode::Home, - winit::event::VirtualKeyCode::Delete => KeyCode::Delete, - winit::event::VirtualKeyCode::End => KeyCode::End, - winit::event::VirtualKeyCode::PageDown => KeyCode::PageDown, - winit::event::VirtualKeyCode::PageUp => KeyCode::PageUp, - winit::event::VirtualKeyCode::Left => KeyCode::Left, - winit::event::VirtualKeyCode::Up => KeyCode::Up, - winit::event::VirtualKeyCode::Right => KeyCode::Right, - winit::event::VirtualKeyCode::Down => KeyCode::Down, - winit::event::VirtualKeyCode::Back => KeyCode::Backspace, - winit::event::VirtualKeyCode::Return => KeyCode::Enter, - winit::event::VirtualKeyCode::Space => KeyCode::Space, - winit::event::VirtualKeyCode::Compose => KeyCode::Compose, - winit::event::VirtualKeyCode::Caret => KeyCode::Caret, - winit::event::VirtualKeyCode::Numlock => KeyCode::Numlock, - winit::event::VirtualKeyCode::Numpad0 => KeyCode::Numpad0, - winit::event::VirtualKeyCode::Numpad1 => KeyCode::Numpad1, - winit::event::VirtualKeyCode::Numpad2 => KeyCode::Numpad2, - winit::event::VirtualKeyCode::Numpad3 => KeyCode::Numpad3, - winit::event::VirtualKeyCode::Numpad4 => KeyCode::Numpad4, - winit::event::VirtualKeyCode::Numpad5 => KeyCode::Numpad5, - winit::event::VirtualKeyCode::Numpad6 => KeyCode::Numpad6, - winit::event::VirtualKeyCode::Numpad7 => KeyCode::Numpad7, - winit::event::VirtualKeyCode::Numpad8 => KeyCode::Numpad8, - winit::event::VirtualKeyCode::Numpad9 => KeyCode::Numpad9, - winit::event::VirtualKeyCode::AbntC1 => KeyCode::AbntC1, - winit::event::VirtualKeyCode::AbntC2 => KeyCode::AbntC2, - winit::event::VirtualKeyCode::NumpadAdd => KeyCode::NumpadAdd, - winit::event::VirtualKeyCode::Plus => KeyCode::Plus, - winit::event::VirtualKeyCode::Apostrophe => KeyCode::Apostrophe, - winit::event::VirtualKeyCode::Apps => KeyCode::Apps, - winit::event::VirtualKeyCode::At => KeyCode::At, - winit::event::VirtualKeyCode::Ax => KeyCode::Ax, - winit::event::VirtualKeyCode::Backslash => KeyCode::Backslash, - winit::event::VirtualKeyCode::Calculator => KeyCode::Calculator, - winit::event::VirtualKeyCode::Capital => KeyCode::Capital, - winit::event::VirtualKeyCode::Colon => KeyCode::Colon, - winit::event::VirtualKeyCode::Comma => KeyCode::Comma, - winit::event::VirtualKeyCode::Convert => KeyCode::Convert, - winit::event::VirtualKeyCode::NumpadDecimal => KeyCode::NumpadDecimal, - winit::event::VirtualKeyCode::NumpadDivide => KeyCode::NumpadDivide, - winit::event::VirtualKeyCode::Equals => KeyCode::Equals, - winit::event::VirtualKeyCode::Grave => KeyCode::Grave, - winit::event::VirtualKeyCode::Kana => KeyCode::Kana, - winit::event::VirtualKeyCode::Kanji => KeyCode::Kanji, - winit::event::VirtualKeyCode::LAlt => KeyCode::LAlt, - winit::event::VirtualKeyCode::LBracket => KeyCode::LBracket, - winit::event::VirtualKeyCode::LControl => KeyCode::LControl, - winit::event::VirtualKeyCode::LShift => KeyCode::LShift, - winit::event::VirtualKeyCode::LWin => KeyCode::LWin, - winit::event::VirtualKeyCode::Mail => KeyCode::Mail, - winit::event::VirtualKeyCode::MediaSelect => KeyCode::MediaSelect, - winit::event::VirtualKeyCode::MediaStop => KeyCode::MediaStop, - winit::event::VirtualKeyCode::Minus => KeyCode::Minus, - winit::event::VirtualKeyCode::NumpadMultiply => KeyCode::NumpadMultiply, - winit::event::VirtualKeyCode::Mute => KeyCode::Mute, - winit::event::VirtualKeyCode::MyComputer => KeyCode::MyComputer, - winit::event::VirtualKeyCode::NavigateForward => { - KeyCode::NavigateForward - } - winit::event::VirtualKeyCode::NavigateBackward => { - KeyCode::NavigateBackward - } - winit::event::VirtualKeyCode::NextTrack => KeyCode::NextTrack, - winit::event::VirtualKeyCode::NoConvert => KeyCode::NoConvert, - winit::event::VirtualKeyCode::NumpadComma => KeyCode::NumpadComma, - winit::event::VirtualKeyCode::NumpadEnter => KeyCode::NumpadEnter, - winit::event::VirtualKeyCode::NumpadEquals => KeyCode::NumpadEquals, - winit::event::VirtualKeyCode::OEM102 => KeyCode::OEM102, - winit::event::VirtualKeyCode::Period => KeyCode::Period, - winit::event::VirtualKeyCode::PlayPause => KeyCode::PlayPause, - winit::event::VirtualKeyCode::Power => KeyCode::Power, - winit::event::VirtualKeyCode::PrevTrack => KeyCode::PrevTrack, - winit::event::VirtualKeyCode::RAlt => KeyCode::RAlt, - winit::event::VirtualKeyCode::RBracket => KeyCode::RBracket, - winit::event::VirtualKeyCode::RControl => KeyCode::RControl, - winit::event::VirtualKeyCode::RShift => KeyCode::RShift, - winit::event::VirtualKeyCode::RWin => KeyCode::RWin, - winit::event::VirtualKeyCode::Semicolon => KeyCode::Semicolon, - winit::event::VirtualKeyCode::Slash => KeyCode::Slash, - winit::event::VirtualKeyCode::Sleep => KeyCode::Sleep, - winit::event::VirtualKeyCode::Stop => KeyCode::Stop, - winit::event::VirtualKeyCode::NumpadSubtract => KeyCode::NumpadSubtract, - winit::event::VirtualKeyCode::Sysrq => KeyCode::Sysrq, - winit::event::VirtualKeyCode::Tab => KeyCode::Tab, - winit::event::VirtualKeyCode::Underline => KeyCode::Underline, - winit::event::VirtualKeyCode::Unlabeled => KeyCode::Unlabeled, - winit::event::VirtualKeyCode::VolumeDown => KeyCode::VolumeDown, - winit::event::VirtualKeyCode::VolumeUp => KeyCode::VolumeUp, - winit::event::VirtualKeyCode::Wake => KeyCode::Wake, - winit::event::VirtualKeyCode::WebBack => KeyCode::WebBack, - winit::event::VirtualKeyCode::WebFavorites => KeyCode::WebFavorites, - winit::event::VirtualKeyCode::WebForward => KeyCode::WebForward, - winit::event::VirtualKeyCode::WebHome => KeyCode::WebHome, - winit::event::VirtualKeyCode::WebRefresh => KeyCode::WebRefresh, - winit::event::VirtualKeyCode::WebSearch => KeyCode::WebSearch, - winit::event::VirtualKeyCode::WebStop => KeyCode::WebStop, - winit::event::VirtualKeyCode::Yen => KeyCode::Yen, - winit::event::VirtualKeyCode::Copy => KeyCode::Copy, - winit::event::VirtualKeyCode::Paste => KeyCode::Paste, - winit::event::VirtualKeyCode::Cut => KeyCode::Cut, - winit::event::VirtualKeyCode::Asterisk => KeyCode::Asterisk, + match key { + winit::keyboard::Key::Character(c) => match c.as_str() { + "1" => KeyCode::Key1, + "2" => KeyCode::Key2, + "3" => KeyCode::Key3, + "4" => KeyCode::Key4, + "5" => KeyCode::Key5, + "6" => KeyCode::Key6, + "7" => KeyCode::Key7, + "8" => KeyCode::Key8, + "9" => KeyCode::Key9, + "0" => KeyCode::Key0, + "A" => KeyCode::A, + "B" => KeyCode::B, + "C" => KeyCode::C, + "D" => KeyCode::D, + "E" => KeyCode::E, + "F" => KeyCode::F, + "G" => KeyCode::G, + "H" => KeyCode::H, + "I" => KeyCode::I, + "J" => KeyCode::J, + "K" => KeyCode::K, + "L" => KeyCode::L, + "M" => KeyCode::M, + "N" => KeyCode::N, + "O" => KeyCode::O, + "P" => KeyCode::P, + "Q" => KeyCode::Q, + "R" => KeyCode::R, + "S" => KeyCode::S, + "T" => KeyCode::T, + "U" => KeyCode::U, + "V" => KeyCode::V, + "W" => KeyCode::W, + "X" => KeyCode::X, + "Y" => KeyCode::Y, + "Z" => KeyCode::Z, + _ => KeyCode::Unlabeled, + }, + winit::keyboard::Key::Named(named_key) => match named_key { + NamedKey::Escape => KeyCode::Escape, + NamedKey::F1 => KeyCode::F1, + NamedKey::F2 => KeyCode::F2, + NamedKey::F3 => KeyCode::F3, + NamedKey::F4 => KeyCode::F4, + NamedKey::F5 => KeyCode::F5, + NamedKey::F6 => KeyCode::F6, + NamedKey::F7 => KeyCode::F7, + NamedKey::F8 => KeyCode::F8, + NamedKey::F9 => KeyCode::F9, + NamedKey::F10 => KeyCode::F10, + NamedKey::F11 => KeyCode::F11, + NamedKey::F12 => KeyCode::F12, + NamedKey::F13 => KeyCode::F13, + NamedKey::F14 => KeyCode::F14, + NamedKey::F15 => KeyCode::F15, + NamedKey::F16 => KeyCode::F16, + NamedKey::F17 => KeyCode::F17, + NamedKey::F18 => KeyCode::F18, + NamedKey::F19 => KeyCode::F19, + NamedKey::F20 => KeyCode::F20, + NamedKey::F21 => KeyCode::F21, + NamedKey::F22 => KeyCode::F22, + NamedKey::F23 => KeyCode::F23, + NamedKey::F24 => KeyCode::F24, + NamedKey::PrintScreen => KeyCode::Snapshot, + NamedKey::ScrollLock => KeyCode::Scroll, + NamedKey::Pause => KeyCode::Pause, + NamedKey::Insert => KeyCode::Insert, + NamedKey::Home => KeyCode::Home, + NamedKey::Delete => KeyCode::Delete, + NamedKey::End => KeyCode::End, + NamedKey::PageDown => KeyCode::PageDown, + NamedKey::PageUp => KeyCode::PageUp, + NamedKey::ArrowLeft => KeyCode::Left, + NamedKey::ArrowUp => KeyCode::Up, + NamedKey::ArrowRight => KeyCode::Right, + NamedKey::ArrowDown => KeyCode::Down, + NamedKey::Backspace => KeyCode::Backspace, + NamedKey::Enter => KeyCode::Enter, + NamedKey::Space => KeyCode::Space, + NamedKey::Compose => KeyCode::Compose, + NamedKey::NumLock => KeyCode::Numlock, + NamedKey::AppSwitch => KeyCode::Apps, + NamedKey::Convert => KeyCode::Convert, + NamedKey::LaunchMail => KeyCode::Mail, + NamedKey::MediaApps => KeyCode::MediaSelect, + NamedKey::MediaStop => KeyCode::MediaStop, + NamedKey::AudioVolumeMute => KeyCode::Mute, + NamedKey::MediaStepForward => KeyCode::NavigateForward, + NamedKey::MediaStepBackward => KeyCode::NavigateBackward, + NamedKey::MediaSkipForward => KeyCode::NextTrack, + NamedKey::NonConvert => KeyCode::NoConvert, + NamedKey::MediaPlayPause => KeyCode::PlayPause, + NamedKey::Power => KeyCode::Power, + NamedKey::MediaSkipBackward => KeyCode::PrevTrack, + NamedKey::PowerOff => KeyCode::Sleep, + NamedKey::Tab => KeyCode::Tab, + NamedKey::AudioVolumeDown => KeyCode::VolumeDown, + NamedKey::AudioVolumeUp => KeyCode::VolumeUp, + NamedKey::WakeUp => KeyCode::Wake, + NamedKey::BrowserBack => KeyCode::WebBack, + NamedKey::BrowserFavorites => KeyCode::WebFavorites, + NamedKey::BrowserForward => KeyCode::WebForward, + NamedKey::BrowserHome => KeyCode::WebHome, + NamedKey::BrowserRefresh => KeyCode::WebRefresh, + NamedKey::BrowserSearch => KeyCode::WebSearch, + NamedKey::BrowserStop => KeyCode::WebStop, + NamedKey::Copy => KeyCode::Copy, + NamedKey::Paste => KeyCode::Paste, + NamedKey::Cut => KeyCode::Cut, + _ => KeyCode::Unlabeled, + }, + _ => KeyCode::Unlabeled, } } @@ -655,13 +595,3 @@ pub fn icon(icon: window::Icon) -> Option<winit::window::Icon> { winit::window::Icon::from_rgba(pixels, size.width, size.height).ok() } - -// As defined in: http://www.unicode.org/faq/private_use.html -pub(crate) fn is_private_use_character(c: char) -> bool { - matches!( - c, - '\u{E000}'..='\u{F8FF}' - | '\u{F0000}'..='\u{FFFFD}' - | '\u{100000}'..='\u{10FFFD}' - ) -} diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 84651d40..16b41e7d 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -118,7 +118,10 @@ where let mut debug = Debug::new(); debug.startup_started(); - let event_loop = EventLoopBuilder::with_user_event().build(); + let event_loop = EventLoopBuilder::with_user_event() + .build() + .expect("Create event loop"); + let proxy = event_loop.create_proxy(); let runtime = { @@ -210,78 +213,64 @@ where let mut context = task::Context::from_waker(task::noop_waker_ref()); - platform::run(event_loop, move |event, window_target, control_flow| { - use winit::event_loop::ControlFlow; - - if let ControlFlow::ExitWithCode(_) = control_flow { + let _ = event_loop.run(move |event, event_loop| { + if event_loop.exiting() { return; } - let event = match event { - winit::event::Event::WindowEvent { - event: - winit::event::WindowEvent::ScaleFactorChanged { - new_inner_size, - .. - }, - window_id, - } => Some(winit::event::Event::WindowEvent { - event: winit::event::WindowEvent::Resized(*new_inner_size), - window_id, - }), - _ => event.to_static(), - }; + event_sender + .start_send(Event::EventLoopAwakened(event)) + .expect("Send event"); - if let Some(event) = event { - event_sender - .start_send(Event::EventLoopAwakened(event)) - .expect("Send event"); + loop { + let poll = instance.as_mut().poll(&mut context); - loop { - let poll = instance.as_mut().poll(&mut context); + match poll { + task::Poll::Pending => match control_receiver.try_next() { + Ok(Some(control)) => match control { + Control::ChangeFlow(flow) => { + event_loop.set_control_flow(flow); + } + Control::CreateWindow { + id, + settings, + title, + monitor, + } => { + let exit_on_close_request = + settings.exit_on_close_request; - match poll { - task::Poll::Pending => match control_receiver.try_next() { - Ok(Some(control)) => match control { - Control::ChangeFlow(flow) => { - *control_flow = flow; - } - Control::CreateWindow { - id, - settings, - title, - monitor, - } => { - let exit_on_close_request = - settings.exit_on_close_request; + let window = conversion::window_settings( + settings, &title, monitor, None, + ) + .build(event_loop) + .expect("Failed to build window"); - let window = conversion::window_settings( - settings, &title, monitor, None, - ) - .build(window_target) - .expect("Failed to build window"); - - event_sender - .start_send(Event::WindowCreated { - id, - window, - exit_on_close_request, - }) - .expect("Send event"); - } - }, - _ => { - break; + event_sender + .start_send(Event::WindowCreated { + id, + window, + exit_on_close_request, + }) + .expect("Send event"); + } + Control::Exit => { + event_loop.exit(); } }, - task::Poll::Ready(_) => { - *control_flow = ControlFlow::Exit; + _ => { break; } - }; - } + }, + task::Poll::Ready(_) => { + event_loop.exit(); + break; + } + }; } - }) + }); + + Ok(()) } enum Event<Message: 'static> { @@ -290,11 +279,12 @@ enum Event<Message: 'static> { window: winit::window::Window, exit_on_close_request: bool, }, - EventLoopAwakened(winit::event::Event<'static, Message>), + EventLoopAwakened(winit::event::Event<Message>), } enum Control { ChangeFlow(winit::event_loop::ControlFlow), + Exit, CreateWindow { id: window::Id, settings: window::Settings, @@ -427,184 +417,6 @@ async fn run_instance<A, E, C>( | event::StartCause::ResumeTimeReached { .. } ); } - event::Event::MainEventsCleared => { - debug.event_processing_started(); - let mut uis_stale = false; - - for (id, window) in window_manager.iter_mut() { - let mut window_events = vec![]; - - events.retain(|(window_id, event)| { - if *window_id == Some(id) || window_id.is_none() - { - window_events.push(event.clone()); - false - } else { - true - } - }); - - if !redraw_pending - && window_events.is_empty() - && messages.is_empty() - { - continue; - } - - let (ui_state, statuses) = user_interfaces - .get_mut(&id) - .expect("Get user interface") - .update( - &window_events, - window.state.cursor(), - &mut window.renderer, - &mut clipboard, - &mut messages, - ); - - if !uis_stale { - uis_stale = matches!( - ui_state, - user_interface::State::Outdated - ); - } - - for (event, status) in window_events - .into_iter() - .zip(statuses.into_iter()) - { - runtime.broadcast(event, status); - } - } - - debug.event_processing_finished(); - - // TODO mw application update returns which window IDs to update - if !messages.is_empty() || uis_stale { - let mut cached_interfaces: HashMap< - window::Id, - user_interface::Cache, - > = ManuallyDrop::into_inner(user_interfaces) - .drain() - .map(|(id, ui)| (id, ui.into_cache())) - .collect(); - - // Update application - update( - &mut application, - &mut compositor, - &mut runtime, - &mut clipboard, - &mut control_sender, - &mut proxy, - &mut debug, - &mut messages, - &mut window_manager, - &mut cached_interfaces, - ); - - // we must synchronize all window states with application state after an - // application update since we don't know what changed - for (id, window) in window_manager.iter_mut() { - window.state.synchronize( - &application, - id, - &window.raw, - ); - } - - // rebuild UIs with the synchronized states - user_interfaces = - ManuallyDrop::new(build_user_interfaces( - &application, - &mut debug, - &mut window_manager, - cached_interfaces, - )); - } - - debug.draw_started(); - - for (id, window) in window_manager.iter_mut() { - // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes - // - // Then, we can use the `interface_state` here to decide if a redraw - // is needed right away, or simply wait until a specific time. - let redraw_event = core::Event::Window( - id, - window::Event::RedrawRequested(Instant::now()), - ); - - let cursor = window.state.cursor(); - - let ui = user_interfaces - .get_mut(&id) - .expect("Get user interface"); - - let (ui_state, _) = ui.update( - &[redraw_event.clone()], - cursor, - &mut window.renderer, - &mut clipboard, - &mut messages, - ); - - let new_mouse_interaction = { - let state = &window.state; - - ui.draw( - &mut window.renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - cursor, - ) - }; - - if new_mouse_interaction != window.mouse_interaction - { - window.raw.set_cursor_icon( - conversion::mouse_interaction( - new_mouse_interaction, - ), - ); - - window.mouse_interaction = - new_mouse_interaction; - } - - // TODO once widgets can request to be redrawn, we can avoid always requesting a - // redraw - window.raw.request_redraw(); - - runtime.broadcast( - redraw_event.clone(), - core::event::Status::Ignored, - ); - - let _ = control_sender.start_send( - Control::ChangeFlow(match ui_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => { - ControlFlow::Poll - } - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }), - ); - } - - redraw_pending = false; - - debug.draw_finished(); - } event::Event::PlatformSpecific( event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), @@ -624,7 +436,11 @@ async fn run_instance<A, E, C>( event::Event::UserEvent(message) => { messages.push(message); } - event::Event::RedrawRequested(id) => { + event::Event::WindowEvent { + window_id: id, + event: event::WindowEvent::RedrawRequested, + .. + } => { let Some((id, window)) = window_manager.get_mut_alias(id) else { @@ -775,6 +591,163 @@ async fn run_instance<A, E, C>( } } } + + debug.event_processing_started(); + let mut uis_stale = false; + + for (id, window) in window_manager.iter_mut() { + let mut window_events = vec![]; + + events.retain(|(window_id, event)| { + if *window_id == Some(id) || window_id.is_none() { + window_events.push(event.clone()); + false + } else { + true + } + }); + + if !redraw_pending + && window_events.is_empty() + && messages.is_empty() + { + continue; + } + + let (ui_state, statuses) = user_interfaces + .get_mut(&id) + .expect("Get user interface") + .update( + &window_events, + window.state.cursor(), + &mut window.renderer, + &mut clipboard, + &mut messages, + ); + + if !uis_stale { + uis_stale = matches!(ui_state, user_interface::State::Outdated); + } + + for (event, status) in + window_events.into_iter().zip(statuses.into_iter()) + { + runtime.broadcast(event, status); + } + } + + debug.event_processing_finished(); + + // TODO mw application update returns which window IDs to update + if !messages.is_empty() || uis_stale { + let mut cached_interfaces: HashMap< + window::Id, + user_interface::Cache, + > = ManuallyDrop::into_inner(user_interfaces) + .drain() + .map(|(id, ui)| (id, ui.into_cache())) + .collect(); + + // Update application + update( + &mut application, + &mut compositor, + &mut runtime, + &mut clipboard, + &mut control_sender, + &mut proxy, + &mut debug, + &mut messages, + &mut window_manager, + &mut cached_interfaces, + ); + + // we must synchronize all window states with application state after an + // application update since we don't know what changed + for (id, window) in window_manager.iter_mut() { + window.state.synchronize(&application, id, &window.raw); + } + + // rebuild UIs with the synchronized states + user_interfaces = ManuallyDrop::new(build_user_interfaces( + &application, + &mut debug, + &mut window_manager, + cached_interfaces, + )); + } + + debug.draw_started(); + + for (id, window) in window_manager.iter_mut() { + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = core::Event::Window( + id, + window::Event::RedrawRequested(Instant::now()), + ); + + let cursor = window.state.cursor(); + + let ui = user_interfaces.get_mut(&id).expect("Get user interface"); + + let (ui_state, _) = ui.update( + &[redraw_event.clone()], + cursor, + &mut window.renderer, + &mut clipboard, + &mut messages, + ); + + let new_mouse_interaction = { + let state = &window.state; + + ui.draw( + &mut window.renderer, + state.theme(), + &renderer::Style { + text_color: state.text_color(), + }, + cursor, + ) + }; + + if new_mouse_interaction != window.mouse_interaction { + window.raw.set_cursor_icon(conversion::mouse_interaction( + new_mouse_interaction, + )); + + window.mouse_interaction = new_mouse_interaction; + } + + // TODO once widgets can request to be redrawn, we can avoid always requesting a + // redraw + window.raw.request_redraw(); + + runtime + .broadcast(redraw_event.clone(), core::event::Status::Ignored); + + let _ = control_sender.start_send(Control::ChangeFlow( + match ui_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => ControlFlow::Poll, + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }, + )); + } + + redraw_pending = false; + + debug.draw_finished(); } let _ = ManuallyDrop::into_inner(user_interfaces); @@ -901,16 +874,12 @@ fn run_command<A, C, E>( .expect("Send control action"); } window::Action::Close(id) => { - use winit::event_loop::ControlFlow; - let _ = window_manager.remove(id); let _ = ui_caches.remove(&id); if window_manager.is_empty() { control_sender - .start_send(Control::ChangeFlow( - ControlFlow::ExitWithCode(0), - )) + .start_send(Control::Exit) .expect("Send control action"); } } @@ -921,10 +890,12 @@ fn run_command<A, C, E>( } window::Action::Resize(id, size) => { if let Some(window) = window_manager.get_mut(id) { - window.raw.set_inner_size(winit::dpi::LogicalSize { - width: size.width, - height: size.height, - }); + let _ = window.raw.request_inner_size( + winit::dpi::LogicalSize { + width: size.width, + height: size.height, + }, + ); } } window::Action::FetchSize(id, callback) => { @@ -1153,60 +1124,20 @@ where /// Returns true if the provided event should cause an [`Application`] to /// exit. pub fn user_force_quit( - event: &winit::event::WindowEvent<'_>, - _modifiers: winit::event::ModifiersState, + event: &winit::event::WindowEvent, + _modifiers: winit::keyboard::ModifiersState, ) -> bool { match event { #[cfg(target_os = "macos")] winit::event::WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::Q), + event: + winit::event::KeyEvent { + logical_key: winit::keyboard::Key::Character(c), state: winit::event::ElementState::Pressed, .. }, .. - } if _modifiers.logo() => true, + } if c == "q" && _modifiers.super_key() => true, _ => false, } } - -#[cfg(not(target_arch = "wasm32"))] -mod platform { - pub fn run<T, F>( - mut event_loop: winit::event_loop::EventLoop<T>, - event_handler: F, - ) -> Result<(), super::Error> - where - F: 'static - + FnMut( - winit::event::Event<'_, T>, - &winit::event_loop::EventLoopWindowTarget<T>, - &mut winit::event_loop::ControlFlow, - ), - { - use winit::platform::run_return::EventLoopExtRunReturn; - - let _ = event_loop.run_return(event_handler); - - Ok(()) - } -} - -#[cfg(target_arch = "wasm32")] -mod platform { - pub fn run<T, F>( - event_loop: winit::event_loop::EventLoop<T>, - event_handler: F, - ) -> ! - where - F: 'static - + FnMut( - winit::event::Event<'_, T>, - &winit::event_loop::EventLoopWindowTarget<T>, - &mut winit::event_loop::ControlFlow, - ), - { - event_loop.run(event_handler) - } -} diff --git a/winit/src/multi_window/state.rs b/winit/src/multi_window/state.rs index 03da5ad7..235771f4 100644 --- a/winit/src/multi_window/state.rs +++ b/winit/src/multi_window/state.rs @@ -21,7 +21,7 @@ where viewport: Viewport, viewport_version: u64, cursor_position: Option<winit::dpi::PhysicalPosition<f64>>, - modifiers: winit::event::ModifiersState, + modifiers: winit::keyboard::ModifiersState, theme: <A::Renderer as core::Renderer>::Theme, appearance: application::Appearance, } @@ -72,7 +72,7 @@ where viewport, viewport_version: 0, cursor_position: None, - modifiers: winit::event::ModifiersState::default(), + modifiers: winit::keyboard::ModifiersState::default(), theme, appearance, } @@ -119,7 +119,7 @@ where } /// Returns the current keyboard modifiers of the [`State`]. - pub fn modifiers(&self) -> winit::event::ModifiersState { + pub fn modifiers(&self) -> winit::keyboard::ModifiersState { self.modifiers } @@ -142,7 +142,7 @@ where pub fn update( &mut self, window: &Window, - event: &WindowEvent<'_>, + event: &WindowEvent, _debug: &mut crate::runtime::Debug, ) { match event { @@ -158,10 +158,9 @@ where } WindowEvent::ScaleFactorChanged { scale_factor: new_scale_factor, - new_inner_size, + .. } => { - let size = - Size::new(new_inner_size.width, new_inner_size.height); + let size = self.viewport.physical_size(); self.viewport = Viewport::with_physical_size( size, @@ -180,13 +179,16 @@ where self.cursor_position = None; } WindowEvent::ModifiersChanged(new_modifiers) => { - self.modifiers = *new_modifiers; + self.modifiers = new_modifiers.state(); } #[cfg(feature = "debug")] WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::F12), + event: + winit::event::KeyEvent { + logical_key: + winit::keyboard::Key::Named( + winit::keyboard::NamedKey::F12, + ), state: winit::event::ElementState::Pressed, .. }, From 36073de24eecffc4644da9ab367aef15d162df86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 13:27:58 +0100 Subject: [PATCH 208/286] Fix `key_code` conversion for character keys --- winit/src/conversion.rs | 52 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index ecc34320..2e382c39 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -465,32 +465,32 @@ pub fn key_code(key: &winit::keyboard::Key) -> keyboard::KeyCode { "8" => KeyCode::Key8, "9" => KeyCode::Key9, "0" => KeyCode::Key0, - "A" => KeyCode::A, - "B" => KeyCode::B, - "C" => KeyCode::C, - "D" => KeyCode::D, - "E" => KeyCode::E, - "F" => KeyCode::F, - "G" => KeyCode::G, - "H" => KeyCode::H, - "I" => KeyCode::I, - "J" => KeyCode::J, - "K" => KeyCode::K, - "L" => KeyCode::L, - "M" => KeyCode::M, - "N" => KeyCode::N, - "O" => KeyCode::O, - "P" => KeyCode::P, - "Q" => KeyCode::Q, - "R" => KeyCode::R, - "S" => KeyCode::S, - "T" => KeyCode::T, - "U" => KeyCode::U, - "V" => KeyCode::V, - "W" => KeyCode::W, - "X" => KeyCode::X, - "Y" => KeyCode::Y, - "Z" => KeyCode::Z, + "a" => KeyCode::A, + "b" => KeyCode::B, + "c" => KeyCode::C, + "d" => KeyCode::D, + "e" => KeyCode::E, + "f" => KeyCode::F, + "g" => KeyCode::G, + "h" => KeyCode::H, + "i" => KeyCode::I, + "j" => KeyCode::J, + "k" => KeyCode::K, + "l" => KeyCode::L, + "m" => KeyCode::M, + "n" => KeyCode::N, + "o" => KeyCode::O, + "p" => KeyCode::P, + "q" => KeyCode::Q, + "r" => KeyCode::R, + "s" => KeyCode::S, + "t" => KeyCode::T, + "u" => KeyCode::U, + "v" => KeyCode::V, + "w" => KeyCode::W, + "x" => KeyCode::X, + "y" => KeyCode::Y, + "z" => KeyCode::Z, _ => KeyCode::Unlabeled, }, winit::keyboard::Key::Named(named_key) => match named_key { From 2f11102ecc30e6d4a96c4802d68f87c002a9a3f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 13:46:26 +0100 Subject: [PATCH 209/286] Enable `rwh_06` feature for `winit` dependency --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a78d0f8f..7e70e1e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,4 +160,4 @@ web-time = "0.2" wgpu = "0.18" winapi = "0.3" window_clipboard = "0.3" -winit = { git = "https://github.com/iced-rs/winit.git", rev = "3bcdb9abcd7459978ec689523bc21943d38da0f9", default-features = false, features = ["rwh_05", "x11", "wayland"] } +winit = { git = "https://github.com/iced-rs/winit.git", rev = "3bcdb9abcd7459978ec689523bc21943d38da0f9", features = ["rwh_05"] } From d7dd0338616d13d94689d153f6c0dedfba1ad4ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 13:49:53 +0100 Subject: [PATCH 210/286] Ignore `raw-window-handle` outdated artifact --- .github/workflows/audit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 80bbcacd..57169796 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -27,4 +27,4 @@ jobs: - name: Delete `web-sys` dependency from `integration` example run: sed -i '$d' examples/integration/Cargo.toml - name: Find outdated dependencies - run: cargo outdated --workspace --exit-code 1 + run: cargo outdated --workspace --exit-code 1 --ignore raw-window-handle From 1481f0c0a44a2f01c06740143a1e5e47612f77f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 14:03:38 +0100 Subject: [PATCH 211/286] Use latest `raw-window-handle` in `iced_core` --- core/Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index c95477c4..4baf80a9 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -22,7 +22,8 @@ palette.workspace = true palette.optional = true [target.'cfg(windows)'.dependencies] -raw-window-handle.workspace = true +# TODO: Use `workspace` dependency once `wgpu` upgrades `raw-window-handle` +raw-window-handle = "0.6" [dev-dependencies] approx = "0.5" From 5961030c05294b2218baf3d956eff39d94485daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 15 Dec 2023 14:10:33 +0100 Subject: [PATCH 212/286] Remove `webgl` feature in `pokedex` example --- examples/pokedex/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pokedex/Cargo.toml b/examples/pokedex/Cargo.toml index 4a55f943..bf7e1e35 100644 --- a/examples/pokedex/Cargo.toml +++ b/examples/pokedex/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["image", "debug", "tokio", "webgl"] +iced.features = ["image", "debug", "tokio"] serde_json = "1.0" From 48cebbb22cfd701984017f1f3336735bc70272d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Dec 2023 12:37:04 +0100 Subject: [PATCH 213/286] Fix redraw request handling in new event loop logic --- winit/src/application.rs | 61 +++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/winit/src/application.rs b/winit/src/application.rs index ed6ba9eb..aea828bc 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -338,6 +338,38 @@ async fn run_instance<A, E, C>( event: event::WindowEvent::RedrawRequested { .. }, .. } => { + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = Event::Window( + window::Id::MAIN, + window::Event::RedrawRequested(Instant::now()), + ); + + let (interface_state, _) = user_interface.update( + &[redraw_event.clone()], + state.cursor(), + &mut renderer, + &mut clipboard, + &mut messages, + ); + + let _ = control_sender.start_send(match interface_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => ControlFlow::Poll, + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }); + + runtime.broadcast(redraw_event, core::event::Status::Ignored); + debug.draw_started(); let new_mouse_interaction = user_interface.draw( &mut renderer, @@ -514,36 +546,7 @@ async fn run_instance<A, E, C>( } } - // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes - // - // Then, we can use the `interface_state` here to decide if a redraw - // is needed right away, or simply wait until a specific time. - let redraw_event = Event::Window( - window::Id::MAIN, - window::Event::RedrawRequested(Instant::now()), - ); - - let (interface_state, _) = user_interface.update( - &[redraw_event.clone()], - state.cursor(), - &mut renderer, - &mut clipboard, - &mut messages, - ); - window.request_redraw(); - runtime.broadcast(redraw_event, core::event::Status::Ignored); - - let _ = control_sender.start_send(match interface_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => ControlFlow::Poll, - window::RedrawRequest::At(at) => ControlFlow::WaitUntil(at), - }, - _ => ControlFlow::Wait, - }); redraw_pending = false; } From af917a08d8c60f1684439989f63f856d445d0383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Dec 2023 12:44:08 +0100 Subject: [PATCH 214/286] Fix request redraw event handling for multi-window apps --- winit/src/application.rs | 2 +- winit/src/multi_window.rs | 144 +++++++++++++++++++------------------- 2 files changed, 74 insertions(+), 72 deletions(-) diff --git a/winit/src/application.rs b/winit/src/application.rs index aea828bc..34bf7f55 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -417,6 +417,7 @@ async fn run_instance<A, E, C>( }, state.cursor(), ); + debug.draw_finished(); if new_mouse_interaction != mouse_interaction { window.set_cursor_icon(conversion::mouse_interaction( @@ -425,7 +426,6 @@ async fn run_instance<A, E, C>( mouse_interaction = new_mouse_interaction; } - debug.draw_finished(); compositor.configure_surface( &mut surface, diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 16b41e7d..0ba51387 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -447,6 +447,72 @@ async fn run_instance<A, E, C>( continue; }; + // TODO: Avoid redrawing all the time by forcing widgets to + // request redraws on state changes + // + // Then, we can use the `interface_state` here to decide if a redraw + // is needed right away, or simply wait until a specific time. + let redraw_event = core::Event::Window( + id, + window::Event::RedrawRequested(Instant::now()), + ); + + let cursor = window.state.cursor(); + + let ui = user_interfaces + .get_mut(&id) + .expect("Get user interface"); + + let (ui_state, _) = ui.update( + &[redraw_event.clone()], + cursor, + &mut window.renderer, + &mut clipboard, + &mut messages, + ); + + debug.draw_started(); + let new_mouse_interaction = ui.draw( + &mut window.renderer, + window.state.theme(), + &renderer::Style { + text_color: window.state.text_color(), + }, + cursor, + ); + debug.draw_finished(); + + if new_mouse_interaction != window.mouse_interaction { + window.raw.set_cursor_icon( + conversion::mouse_interaction( + new_mouse_interaction, + ), + ); + + window.mouse_interaction = new_mouse_interaction; + } + + runtime.broadcast( + redraw_event.clone(), + core::event::Status::Ignored, + ); + + let _ = control_sender.start_send(Control::ChangeFlow( + match ui_state { + user_interface::State::Updated { + redraw_request: Some(redraw_request), + } => match redraw_request { + window::RedrawRequest::NextFrame => { + ControlFlow::Poll + } + window::RedrawRequest::At(at) => { + ControlFlow::WaitUntil(at) + } + }, + _ => ControlFlow::Wait, + }, + )); + let physical_size = window.state.physical_size(); if physical_size.width == 0 || physical_size.height == 0 @@ -454,14 +520,12 @@ async fn run_instance<A, E, C>( continue; } - debug.render_started(); if window.viewport_version != window.state.viewport_version() { let logical_size = window.state.logical_size(); debug.layout_started(); - let ui = user_interfaces .remove(&id) .expect("Remove user interface"); @@ -470,7 +534,6 @@ async fn run_instance<A, E, C>( id, ui.relayout(logical_size, &mut window.renderer), ); - debug.layout_finished(); debug.draw_started(); @@ -485,6 +548,7 @@ async fn run_instance<A, E, C>( }, window.state.cursor(), ); + debug.draw_finished(); if new_mouse_interaction != window.mouse_interaction { @@ -497,7 +561,6 @@ async fn run_instance<A, E, C>( window.mouse_interaction = new_mouse_interaction; } - debug.draw_finished(); compositor.configure_surface( &mut window.surface, @@ -509,6 +572,7 @@ async fn run_instance<A, E, C>( window.state.viewport_version(); } + debug.render_started(); match compositor.present( &mut window.renderer, &mut window.surface, @@ -529,9 +593,11 @@ async fn run_instance<A, E, C>( } _ => { debug.render_finished(); + log::error!( - "Error {error:?} when presenting surface." - ); + "Error {error:?} when \ + presenting surface." + ); // Try rendering all windows again next frame. for (_id, window) in @@ -677,77 +743,13 @@ async fn run_instance<A, E, C>( )); } - debug.draw_started(); - - for (id, window) in window_manager.iter_mut() { - // TODO: Avoid redrawing all the time by forcing widgets to - // request redraws on state changes - // - // Then, we can use the `interface_state` here to decide if a redraw - // is needed right away, or simply wait until a specific time. - let redraw_event = core::Event::Window( - id, - window::Event::RedrawRequested(Instant::now()), - ); - - let cursor = window.state.cursor(); - - let ui = user_interfaces.get_mut(&id).expect("Get user interface"); - - let (ui_state, _) = ui.update( - &[redraw_event.clone()], - cursor, - &mut window.renderer, - &mut clipboard, - &mut messages, - ); - - let new_mouse_interaction = { - let state = &window.state; - - ui.draw( - &mut window.renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - cursor, - ) - }; - - if new_mouse_interaction != window.mouse_interaction { - window.raw.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); - - window.mouse_interaction = new_mouse_interaction; - } - + for (_id, window) in window_manager.iter_mut() { // TODO once widgets can request to be redrawn, we can avoid always requesting a // redraw window.raw.request_redraw(); - - runtime - .broadcast(redraw_event.clone(), core::event::Status::Ignored); - - let _ = control_sender.start_send(Control::ChangeFlow( - match ui_state { - user_interface::State::Updated { - redraw_request: Some(redraw_request), - } => match redraw_request { - window::RedrawRequest::NextFrame => ControlFlow::Poll, - window::RedrawRequest::At(at) => { - ControlFlow::WaitUntil(at) - } - }, - _ => ControlFlow::Wait, - }, - )); } redraw_pending = false; - - debug.draw_finished(); } let _ = ManuallyDrop::into_inner(user_interfaces); From 58494bd0331b01194fd704319828849d4ed4d270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Dec 2023 12:51:32 +0100 Subject: [PATCH 215/286] Pin `nightly` toolchain to a specific day in `document` workflow --- .github/workflows/document.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/document.yml b/.github/workflows/document.yml index 62e28ca3..35bf10f4 100644 --- a/.github/workflows/document.yml +++ b/.github/workflows/document.yml @@ -8,7 +8,7 @@ jobs: steps: - uses: hecrj/setup-rust-action@v1 with: - rust-version: nightly + rust-version: nightly-2023-12-11 - uses: actions/checkout@v2 - name: Generate documentation run: | From e772e5a9e90b5d8ae12a9891cb7b848d81e63239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 19 Dec 2023 14:54:27 +0100 Subject: [PATCH 216/286] Avoid duplicated `UserInterface::draw` calls in `RedrawRequested` --- winit/src/application.rs | 95 +++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/winit/src/application.rs b/winit/src/application.rs index 34bf7f55..75be08f1 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -312,13 +312,13 @@ async fn run_instance<A, E, C>( while let Some(event) = event_receiver.next().await { match event { - event::Event::NewEvents(start_cause) => { - redraw_pending = matches!( - start_cause, - event::StartCause::Init - | event::StartCause::Poll - | event::StartCause::ResumeTimeReached { .. } - ); + event::Event::NewEvents( + event::StartCause::Init + | event::StartCause::Poll + | event::StartCause::ResumeTimeReached { .. }, + ) if !redraw_pending => { + window.request_redraw(); + redraw_pending = true; } event::Event::PlatformSpecific(event::PlatformSpecific::MacOS( event::MacOS::ReceivedUrl(url), @@ -338,6 +338,33 @@ async fn run_instance<A, E, C>( event: event::WindowEvent::RedrawRequested { .. }, .. } => { + let physical_size = state.physical_size(); + + if physical_size.width == 0 || physical_size.height == 0 { + continue; + } + + let current_viewport_version = state.viewport_version(); + + if viewport_version != current_viewport_version { + let logical_size = state.logical_size(); + + debug.layout_started(); + user_interface = ManuallyDrop::new( + ManuallyDrop::into_inner(user_interface) + .relayout(logical_size, &mut renderer), + ); + debug.layout_finished(); + + compositor.configure_surface( + &mut surface, + physical_size.width, + physical_size.height, + ); + + viewport_version = current_viewport_version; + } + // TODO: Avoid redrawing all the time by forcing widgets to // request redraws on state changes // @@ -379,6 +406,7 @@ async fn run_instance<A, E, C>( }, state.cursor(), ); + redraw_pending = false; debug.draw_finished(); if new_mouse_interaction != mouse_interaction { @@ -389,53 +417,7 @@ async fn run_instance<A, E, C>( mouse_interaction = new_mouse_interaction; } - let physical_size = state.physical_size(); - - if physical_size.width == 0 || physical_size.height == 0 { - continue; - } - debug.render_started(); - let current_viewport_version = state.viewport_version(); - - if viewport_version != current_viewport_version { - let logical_size = state.logical_size(); - - debug.layout_started(); - user_interface = ManuallyDrop::new( - ManuallyDrop::into_inner(user_interface) - .relayout(logical_size, &mut renderer), - ); - debug.layout_finished(); - - debug.draw_started(); - let new_mouse_interaction = user_interface.draw( - &mut renderer, - state.theme(), - &renderer::Style { - text_color: state.text_color(), - }, - state.cursor(), - ); - debug.draw_finished(); - - if new_mouse_interaction != mouse_interaction { - window.set_cursor_icon(conversion::mouse_interaction( - new_mouse_interaction, - )); - - mouse_interaction = new_mouse_interaction; - } - - compositor.configure_surface( - &mut surface, - physical_size.width, - physical_size.height, - ); - - viewport_version = current_viewport_version; - } - match compositor.present( &mut renderer, &mut surface, @@ -546,9 +528,10 @@ async fn run_instance<A, E, C>( } } - window.request_redraw(); - - redraw_pending = false; + if !redraw_pending { + window.request_redraw(); + redraw_pending = true; + } } // Manually drop the user interface From 50a7852cb857cd110077ffce492bafe9ebe8786c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 20 Dec 2023 08:56:57 +0100 Subject: [PATCH 217/286] Stop polling in event loop on `RedrawRequest::NextFrame` --- examples/loading_spinners/src/circular.rs | 6 +----- examples/loading_spinners/src/linear.rs | 6 +----- winit/src/application.rs | 9 ++++++--- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index dca8046a..7996f970 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -275,8 +275,6 @@ where shell: &mut Shell<'_, Message>, _viewport: &Rectangle, ) -> event::Status { - const FRAME_RATE: u64 = 60; - let state = tree.state.downcast_mut::<State>(); if let Event::Window(_, window::Event::RedrawRequested(now)) = event { @@ -287,9 +285,7 @@ where ); state.cache.clear(); - shell.request_redraw(RedrawRequest::At( - now + Duration::from_millis(1000 / FRAME_RATE), - )); + shell.request_redraw(RedrawRequest::NextFrame); } event::Status::Ignored diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index db10bfba..becfd2c2 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -196,16 +196,12 @@ where shell: &mut Shell<'_, Message>, _viewport: &Rectangle, ) -> event::Status { - const FRAME_RATE: u64 = 60; - let state = tree.state.downcast_mut::<State>(); if let Event::Window(_, window::Event::RedrawRequested(now)) = event { *state = state.timed_transition(self.cycle_duration, now); - shell.request_redraw(RedrawRequest::At( - now + Duration::from_millis(1000 / FRAME_RATE), - )); + shell.request_redraw(RedrawRequest::NextFrame); } event::Status::Ignored diff --git a/winit/src/application.rs b/winit/src/application.rs index 75be08f1..5ff76060 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -314,7 +314,6 @@ async fn run_instance<A, E, C>( match event { event::Event::NewEvents( event::StartCause::Init - | event::StartCause::Poll | event::StartCause::ResumeTimeReached { .. }, ) if !redraw_pending => { window.request_redraw(); @@ -387,7 +386,11 @@ async fn run_instance<A, E, C>( user_interface::State::Updated { redraw_request: Some(redraw_request), } => match redraw_request { - window::RedrawRequest::NextFrame => ControlFlow::Poll, + window::RedrawRequest::NextFrame => { + window.request_redraw(); + + ControlFlow::Wait + } window::RedrawRequest::At(at) => { ControlFlow::WaitUntil(at) } @@ -469,7 +472,7 @@ async fn run_instance<A, E, C>( _ => {} } - if !redraw_pending && events.is_empty() && messages.is_empty() { + if events.is_empty() && messages.is_empty() { continue; } From 031784e274b0a65dc67004e503b89d29fe0e36ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 20 Dec 2023 10:00:27 +0100 Subject: [PATCH 218/286] Batch events for processing in `iced_winit` event loop --- winit/src/application.rs | 117 ++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 56 deletions(-) diff --git a/winit/src/application.rs b/winit/src/application.rs index 5ff76060..7f5a3620 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -469,71 +469,74 @@ async fn run_instance<A, E, C>( events.push(event); } } - _ => {} - } + event::Event::AboutToWait => { + if events.is_empty() && messages.is_empty() { + continue; + } - if events.is_empty() && messages.is_empty() { - continue; - } + debug.event_processing_started(); - debug.event_processing_started(); + let (interface_state, statuses) = user_interface.update( + &events, + state.cursor(), + &mut renderer, + &mut clipboard, + &mut messages, + ); - let (interface_state, statuses) = user_interface.update( - &events, - state.cursor(), - &mut renderer, - &mut clipboard, - &mut messages, - ); + debug.event_processing_finished(); - debug.event_processing_finished(); + for (event, status) in + events.drain(..).zip(statuses.into_iter()) + { + runtime.broadcast(event, status); + } - for (event, status) in events.drain(..).zip(statuses.into_iter()) { - runtime.broadcast(event, status); - } + if !messages.is_empty() + || matches!( + interface_state, + user_interface::State::Outdated + ) + { + let mut cache = + ManuallyDrop::into_inner(user_interface).into_cache(); - if !messages.is_empty() - || matches!(interface_state, user_interface::State::Outdated) - { - let mut cache = - ManuallyDrop::into_inner(user_interface).into_cache(); + // Update application + update( + &mut application, + &mut compositor, + &mut surface, + &mut cache, + &mut state, + &mut renderer, + &mut runtime, + &mut clipboard, + &mut should_exit, + &mut proxy, + &mut debug, + &mut messages, + &window, + ); - // Update application - update( - &mut application, - &mut compositor, - &mut surface, - &mut cache, - &state, - &mut renderer, - &mut runtime, - &mut clipboard, - &mut should_exit, - &mut proxy, - &mut debug, - &mut messages, - &window, - ); + user_interface = ManuallyDrop::new(build_user_interface( + &application, + cache, + &mut renderer, + state.logical_size(), + &mut debug, + )); - // Update window - state.synchronize(&application, &window); + if should_exit { + break; + } + } - user_interface = ManuallyDrop::new(build_user_interface( - &application, - cache, - &mut renderer, - state.logical_size(), - &mut debug, - )); - - if should_exit { - break; + if !redraw_pending { + window.request_redraw(); + redraw_pending = true; + } } - } - - if !redraw_pending { - window.request_redraw(); - redraw_pending = true; + _ => {} } } @@ -595,7 +598,7 @@ pub fn update<A: Application, C, E: Executor>( compositor: &mut C, surface: &mut C::Surface, cache: &mut user_interface::Cache, - state: &State<A>, + state: &mut State<A>, renderer: &mut A::Renderer, runtime: &mut Runtime<E, Proxy<A::Message>, A::Message>, clipboard: &mut Clipboard, @@ -632,6 +635,8 @@ pub fn update<A: Application, C, E: Executor>( ); } + state.synchronize(application, window); + let subscription = application.subscription(); runtime.track(subscription.into_recipes()); } From 9bbf7822e9eae4c7d0b41c2eea14e261119b1d23 Mon Sep 17 00:00:00 2001 From: Giuliano Bellini s294739 <s294739@studenti.polito.it> Date: Sat, 23 Dec 2023 00:17:10 +0100 Subject: [PATCH 219/286] added text::Shaping to Tooltip --- widget/src/tooltip.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs index 9e102c56..b888980a 100644 --- a/widget/src/tooltip.rs +++ b/widget/src/tooltip.rs @@ -64,6 +64,12 @@ where self } + /// Sets the [`text::Shaping`] strategy of the [`Tooltip`]. + pub fn text_shaping(mut self, shaping: text::Shaping) -> Self { + self.tooltip = self.tooltip.shaping(shaping); + self + } + /// Sets the font of the [`Tooltip`]. /// /// [`Font`]: Renderer::Font From 2776d4634802d9bd7ca92e4ee7d86296bd966496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 4 Jan 2024 05:12:38 +0100 Subject: [PATCH 220/286] Update `winit` fork to `0.29.8` --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7e70e1e8..45d69288 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,4 +160,4 @@ web-time = "0.2" wgpu = "0.18" winapi = "0.3" window_clipboard = "0.3" -winit = { git = "https://github.com/iced-rs/winit.git", rev = "3bcdb9abcd7459978ec689523bc21943d38da0f9", features = ["rwh_05"] } +winit = { git = "https://github.com/iced-rs/winit.git", rev = "25b5dc1758723699015c37b0a64f16ceb9c546ea", features = ["rwh_05"] } From 0655a20ad119e2e9790afcc45039fd4ac0e7d432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Thu, 16 Mar 2023 20:23:25 +0100 Subject: [PATCH 221/286] Make `Shrink` have priority over `Fill` in layout --- core/src/layout.rs | 12 ++-- core/src/layout/flex.rs | 29 +++++--- core/src/layout/limits.rs | 83 ++++++++++------------- core/src/layout/node.rs | 29 +++++++- core/src/padding.rs | 6 ++ core/src/size.rs | 24 ++++--- core/src/widget/text.rs | 2 +- examples/game_of_life/src/main.rs | 4 +- examples/geometry/src/main.rs | 2 +- examples/integration/src/controls.rs | 39 +++++------ examples/loading_spinners/src/circular.rs | 2 +- examples/loading_spinners/src/linear.rs | 2 +- examples/modal/src/main.rs | 13 ++-- examples/pane_grid/src/main.rs | 1 - examples/pick_list/src/main.rs | 1 - examples/scrollable/src/main.rs | 29 +++----- examples/sierpinski_triangle/src/main.rs | 2 - examples/styling/src/main.rs | 9 +-- examples/svg/src/main.rs | 1 - examples/toast/src/main.rs | 15 ++-- examples/tour/src/main.rs | 6 +- examples/websocket/src/main.rs | 2 - widget/src/button.rs | 13 ++-- widget/src/canvas.rs | 3 +- widget/src/column.rs | 9 ++- widget/src/container.rs | 31 +++++---- widget/src/image.rs | 2 +- widget/src/image/viewer.rs | 9 +-- widget/src/keyed/column.rs | 2 + widget/src/overlay/menu.rs | 12 ++-- widget/src/pane_grid.rs | 9 +-- widget/src/pane_grid/content.rs | 9 +-- widget/src/pane_grid/title_bar.rs | 18 ++--- widget/src/pick_list.rs | 7 +- widget/src/progress_bar.rs | 10 +-- widget/src/row.rs | 6 +- widget/src/rule.rs | 4 +- widget/src/scrollable.rs | 2 +- widget/src/shader.rs | 2 +- widget/src/slider.rs | 3 +- widget/src/space.rs | 4 +- widget/src/svg.rs | 5 +- widget/src/text_editor.rs | 2 +- widget/src/text_input.rs | 57 ++++++++-------- widget/src/tooltip.rs | 2 +- widget/src/vertical_slider.rs | 3 +- 46 files changed, 264 insertions(+), 273 deletions(-) diff --git a/core/src/layout.rs b/core/src/layout.rs index caf315b6..277473fe 100644 --- a/core/src/layout.rs +++ b/core/src/layout.rs @@ -71,12 +71,12 @@ pub fn next_to_each_other( left: impl FnOnce(&Limits) -> Node, right: impl FnOnce(&Limits) -> Node, ) -> Node { - let mut left_node = left(limits); + let left_node = left(limits); let left_size = left_node.size(); let right_limits = limits.shrink(Size::new(left_size.width + spacing, 0.0)); - let mut right_node = right(&right_limits); + let right_node = right(&right_limits); let right_size = right_node.size(); let (left_y, right_y) = if left_size.height > right_size.height { @@ -85,14 +85,14 @@ pub fn next_to_each_other( ((right_size.height - left_size.height) / 2.0, 0.0) }; - left_node.move_to(Point::new(0.0, left_y)); - right_node.move_to(Point::new(left_size.width + spacing, right_y)); - Node::with_children( Size::new( left_size.width + spacing + right_size.width, left_size.height.max(right_size.height), ), - vec![left_node, right_node], + vec![ + left_node.move_to(Point::new(0.0, left_y)), + right_node.move_to(Point::new(left_size.width + spacing, right_y)), + ], ) } diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index c02b63d8..738dc81d 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -20,7 +20,7 @@ use crate::Element; use crate::layout::{Limits, Node}; use crate::widget; -use crate::{Alignment, Padding, Point, Size}; +use crate::{Alignment, Length, Padding, Point, Size}; /// The main axis of a flex layout. #[derive(Debug)] @@ -63,6 +63,8 @@ pub fn resolve<Message, Renderer>( axis: Axis, renderer: &Renderer, limits: &Limits, + width: Length, + height: Length, padding: Padding, spacing: f32, align_items: Alignment, @@ -72,12 +74,12 @@ pub fn resolve<Message, Renderer>( where Renderer: crate::Renderer, { - let limits = limits.pad(padding); + let limits = limits.width(width).height(height).shrink(padding); let total_spacing = spacing * items.len().saturating_sub(1) as f32; let max_cross = axis.cross(limits.max()); let mut fill_sum = 0; - let mut cross = axis.cross(limits.min()).max(axis.cross(limits.fill())); + let mut cross = 0.0f32; let mut available = axis.main(limits.max()) - total_spacing; let mut nodes: Vec<Node> = Vec::with_capacity(items.len()); @@ -109,7 +111,16 @@ where } } - let remaining = available.max(0.0); + let remaining = match axis { + Axis::Horizontal => match width { + Length::Shrink => 0.0, + _ => available.max(0.0), + }, + Axis::Vertical => match height { + Length::Shrink => 0.0, + _ => available.max(0.0), + }, + }; for (i, (child, tree)) in items.iter().zip(trees).enumerate() { let fill_factor = match axis { @@ -154,18 +165,18 @@ where let (x, y) = axis.pack(main, pad.1); - node.move_to(Point::new(x, y)); + node.move_to_mut(Point::new(x, y)); match axis { Axis::Horizontal => { - node.align( + node.align_mut( Alignment::Start, align_items, Size::new(0.0, cross), ); } Axis::Vertical => { - node.align( + node.align_mut( align_items, Alignment::Start, Size::new(cross, 0.0), @@ -179,7 +190,7 @@ where } let (width, height) = axis.pack(main - pad.0, cross); - let size = limits.resolve(Size::new(width, height)); + let size = limits.resolve(Size::new(width, height), width, height); - Node::with_children(size.pad(padding), nodes) + Node::with_children(size.expand(padding), nodes) } diff --git a/core/src/layout/limits.rs b/core/src/layout/limits.rs index 39a3d98b..eef4c4c9 100644 --- a/core/src/layout/limits.rs +++ b/core/src/layout/limits.rs @@ -1,12 +1,11 @@ #![allow(clippy::manual_clamp)] -use crate::{Length, Padding, Size}; +use crate::{Length, Size}; /// A set of size constraints for layouting. #[derive(Debug, Clone, Copy, PartialEq)] pub struct Limits { min: Size, max: Size, - fill: Size, } impl Limits { @@ -14,16 +13,11 @@ impl Limits { pub const NONE: Limits = Limits { min: Size::ZERO, max: Size::INFINITY, - fill: Size::INFINITY, }; /// Creates new [`Limits`] with the given minimum and maximum [`Size`]. pub const fn new(min: Size, max: Size) -> Limits { - Limits { - min, - max, - fill: Size::INFINITY, - } + Limits { min, max } } /// Returns the minimum [`Size`] of the [`Limits`]. @@ -36,26 +30,15 @@ impl Limits { self.max } - /// Returns the fill [`Size`] of the [`Limits`]. - pub fn fill(&self) -> Size { - self.fill - } - /// Applies a width constraint to the current [`Limits`]. pub fn width(mut self, width: impl Into<Length>) -> Limits { match width.into() { - Length::Shrink => { - self.fill.width = self.min.width; - } - Length::Fill | Length::FillPortion(_) => { - self.fill.width = self.fill.width.min(self.max.width); - } + Length::Shrink | Length::Fill | Length::FillPortion(_) => {} Length::Fixed(amount) => { let new_width = amount.min(self.max.width).max(self.min.width); self.min.width = new_width; self.max.width = new_width; - self.fill.width = new_width; } } @@ -65,19 +48,13 @@ impl Limits { /// Applies a height constraint to the current [`Limits`]. pub fn height(mut self, height: impl Into<Length>) -> Limits { match height.into() { - Length::Shrink => { - self.fill.height = self.min.height; - } - Length::Fill | Length::FillPortion(_) => { - self.fill.height = self.fill.height.min(self.max.height); - } + Length::Shrink | Length::Fill | Length::FillPortion(_) => {} Length::Fixed(amount) => { let new_height = amount.min(self.max.height).max(self.min.height); self.min.height = new_height; self.max.height = new_height; - self.fill.height = new_height; } } @@ -112,13 +89,10 @@ impl Limits { self } - /// Shrinks the current [`Limits`] to account for the given padding. - pub fn pad(&self, padding: Padding) -> Limits { - self.shrink(Size::new(padding.horizontal(), padding.vertical())) - } - /// Shrinks the current [`Limits`] by the given [`Size`]. - pub fn shrink(&self, size: Size) -> Limits { + pub fn shrink(&self, size: impl Into<Size>) -> Limits { + let size = size.into(); + let min = Size::new( (self.min().width - size.width).max(0.0), (self.min().height - size.height).max(0.0), @@ -129,12 +103,7 @@ impl Limits { (self.max().height - size.height).max(0.0), ); - let fill = Size::new( - (self.fill.width - size.width).max(0.0), - (self.fill.height - size.height).max(0.0), - ); - - Limits { min, max, fill } + Limits { min, max } } /// Removes the minimum width constraint for the current [`Limits`]. @@ -142,22 +111,38 @@ impl Limits { Limits { min: Size::ZERO, max: self.max, - fill: self.fill, } } /// Computes the resulting [`Size`] that fits the [`Limits`] given the /// intrinsic size of some content. - pub fn resolve(&self, intrinsic_size: Size) -> Size { - Size::new( - intrinsic_size - .width - .min(self.max.width) - .max(self.fill.width), - intrinsic_size + pub fn resolve( + &self, + intrinsic_size: Size, + width: impl Into<Length>, + height: impl Into<Length>, + ) -> Size { + let width = match width.into() { + Length::Fill | Length::FillPortion(_) => self.max.width, + Length::Fixed(amount) => { + amount.min(self.max.width).max(self.min.width) + } + Length::Shrink => { + intrinsic_size.width.min(self.max.width).max(self.min.width) + } + }; + + let height = match height.into() { + Length::Fill | Length::FillPortion(_) => self.max.height, + Length::Fixed(amount) => { + amount.min(self.max.height).max(self.min.height) + } + Length::Shrink => intrinsic_size .height .min(self.max.height) - .max(self.fill.height), - ) + .max(self.min.height), + }; + + Size::new(width, height) } } diff --git a/core/src/layout/node.rs b/core/src/layout/node.rs index 2b44a7d5..00087431 100644 --- a/core/src/layout/node.rs +++ b/core/src/layout/node.rs @@ -1,4 +1,4 @@ -use crate::{Alignment, Point, Rectangle, Size, Vector}; +use crate::{Alignment, Padding, Point, Rectangle, Size, Vector}; /// The bounds of an element and its children. #[derive(Debug, Clone, Default)] @@ -26,6 +26,14 @@ impl Node { } } + /// Creates a new [`Node`] that wraps a single child with some [`Padding`]. + pub fn container(child: Self, padding: Padding) -> Self { + Self::with_children( + child.bounds.size().expand(padding), + vec![child.move_to(Point::new(padding.left, padding.top))], + ) + } + /// Returns the [`Size`] of the [`Node`]. pub fn size(&self) -> Size { Size::new(self.bounds.width, self.bounds.height) @@ -43,6 +51,17 @@ impl Node { /// Aligns the [`Node`] in the given space. pub fn align( + mut self, + horizontal_alignment: Alignment, + vertical_alignment: Alignment, + space: Size, + ) -> Self { + self.align_mut(horizontal_alignment, vertical_alignment, space); + self + } + + /// Mutable reference version of [`align`]. + pub fn align_mut( &mut self, horizontal_alignment: Alignment, vertical_alignment: Alignment, @@ -70,7 +89,13 @@ impl Node { } /// Moves the [`Node`] to the given position. - pub fn move_to(&mut self, position: Point) { + pub fn move_to(mut self, position: Point) -> Self { + self.move_to_mut(position); + self + } + + /// Mutable reference version of [`move_to`]. + pub fn move_to_mut(&mut self, position: Point) { self.bounds.x = position.x; self.bounds.y = position.y; } diff --git a/core/src/padding.rs b/core/src/padding.rs index 0b1bba13..a63f6e29 100644 --- a/core/src/padding.rs +++ b/core/src/padding.rs @@ -154,3 +154,9 @@ impl From<[f32; 4]> for Padding { } } } + +impl From<Padding> for Size { + fn from(padding: Padding) -> Self { + Self::new(padding.horizontal(), padding.vertical()) + } +} diff --git a/core/src/size.rs b/core/src/size.rs index 7ef2f602..90e50d13 100644 --- a/core/src/size.rs +++ b/core/src/size.rs @@ -1,4 +1,4 @@ -use crate::{Padding, Vector}; +use crate::Vector; /// An amount of space in 2 dimensions. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -26,15 +26,7 @@ impl Size { /// A [`Size`] with infinite width and height. pub const INFINITY: Size = Size::new(f32::INFINITY, f32::INFINITY); - /// Increments the [`Size`] to account for the given padding. - pub fn pad(&self, padding: Padding) -> Self { - Size { - width: self.width + padding.horizontal(), - height: self.height + padding.vertical(), - } - } - - /// Returns the minimum of each component of this size and another + /// Returns the minimum of each component of this size and another. pub fn min(self, other: Self) -> Self { Size { width: self.width.min(other.width), @@ -42,13 +34,23 @@ impl Size { } } - /// Returns the maximum of each component of this size and another + /// Returns the maximum of each component of this size and another. pub fn max(self, other: Self) -> Self { Size { width: self.width.max(other.width), height: self.height.max(other.height), } } + + /// Expands this [`Size`] by the given amount. + pub fn expand(self, other: impl Into<Size>) -> Self { + let other = other.into(); + + Size { + width: self.width + other.width, + height: self.height + other.height, + } + } } impl From<[f32; 2]> for Size { diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index e020b030..e47e4178 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -224,7 +224,7 @@ where shaping, }); - let size = limits.resolve(paragraph.min_bounds()); + let size = limits.resolve(paragraph.min_bounds(), width, height); layout::Node::new(size) } diff --git a/examples/game_of_life/src/main.rs b/examples/game_of_life/src/main.rs index 96840143..56f7afd5 100644 --- a/examples/game_of_life/src/main.rs +++ b/examples/game_of_life/src/main.rs @@ -146,7 +146,8 @@ impl Application for GameOfLife { .view() .map(move |message| Message::Grid(message, version)), controls, - ]; + ] + .height(Length::Fill); container(content) .width(Length::Fill) @@ -178,7 +179,6 @@ fn view_controls<'a>( slider(1.0..=1000.0, speed as f32, Message::SpeedChanged), text(format!("x{speed}")).size(16), ] - .width(Length::Fill) .align_items(Alignment::Center) .spacing(10); diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 8ab3b493..50227f1c 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -30,7 +30,7 @@ mod rainbow { _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.width(Length::Fill).resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, Length::Fill, Length::Shrink); layout::Node::new(Size::new(size.width, size.width)) } diff --git a/examples/integration/src/controls.rs b/examples/integration/src/controls.rs index 4714c397..89a595c1 100644 --- a/examples/integration/src/controls.rs +++ b/examples/integration/src/controls.rs @@ -81,32 +81,25 @@ impl Program for Controls { ); Row::new() - .width(Length::Fill) .height(Length::Fill) .align_items(Alignment::End) .push( - Column::new() - .width(Length::Fill) - .align_items(Alignment::End) - .push( - Column::new() - .padding(10) - .spacing(10) - .push( - Text::new("Background color") - .style(Color::WHITE), - ) - .push(sliders) - .push( - Text::new(format!("{background_color:?}")) - .size(14) - .style(Color::WHITE), - ) - .push( - text_input("Placeholder", text) - .on_input(Message::TextChanged), - ), - ), + Column::new().align_items(Alignment::End).push( + Column::new() + .padding(10) + .spacing(10) + .push(Text::new("Background color").style(Color::WHITE)) + .push(sliders) + .push( + Text::new(format!("{background_color:?}")) + .size(14) + .style(Color::WHITE), + ) + .push( + text_input("Placeholder", text) + .on_input(Message::TextChanged), + ), + ), ) .into() } diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index dca8046a..a92a5dd1 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -259,7 +259,7 @@ where limits: &layout::Limits, ) -> layout::Node { let limits = limits.width(self.size).height(self.size); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.size, self.size); layout::Node::new(size) } diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index db10bfba..da4f1ea1 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -180,7 +180,7 @@ where limits: &layout::Limits, ) -> layout::Node { let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.width, self.height); layout::Node::new(size) } diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index acb14372..85ccf8b4 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -420,17 +420,14 @@ mod modal { .width(Length::Fill) .height(Length::Fill); - let mut child = self + let child = self .content .as_widget() - .layout(self.tree, renderer, &limits); + .layout(self.tree, renderer, &limits) + .align(Alignment::Center, Alignment::Center, limits.max()); - child.align(Alignment::Center, Alignment::Center, limits.max()); - - let mut node = layout::Node::with_children(self.size, vec![child]); - node.move_to(position); - - node + layout::Node::with_children(self.size, vec![child]) + .move_to(position) } fn on_event( diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index aa3149bb..96bb8e4e 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -297,7 +297,6 @@ fn view_content<'a>( text(format!("{}x{}", size.width, size.height)).size(24), controls, ] - .width(Length::Fill) .spacing(10) .align_items(Alignment::Center); diff --git a/examples/pick_list/src/main.rs b/examples/pick_list/src/main.rs index 21200621..bfd642f5 100644 --- a/examples/pick_list/src/main.rs +++ b/examples/pick_list/src/main.rs @@ -48,7 +48,6 @@ impl Sandbox for Example { pick_list, vertical_space(600), ] - .width(Length::Fill) .align_items(Alignment::Center) .spacing(10); diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index d82ea841..1042e7a4 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -147,35 +147,30 @@ impl Application for ScrollableDemo { text("Scroller width:"), scroller_width_slider, ] - .spacing(10) - .width(Length::Fill); + .spacing(10); - let scroll_orientation_controls = column(vec![ - text("Scrollbar direction:").into(), + let scroll_orientation_controls = column![ + text("Scrollbar direction:"), radio( "Vertical", Direction::Vertical, Some(self.scrollable_direction), Message::SwitchDirection, - ) - .into(), + ), radio( "Horizontal", Direction::Horizontal, Some(self.scrollable_direction), Message::SwitchDirection, - ) - .into(), + ), radio( "Both!", Direction::Multi, Some(self.scrollable_direction), Message::SwitchDirection, - ) - .into(), - ]) - .spacing(10) - .width(Length::Fill); + ), + ] + .spacing(10); let scroll_alignment_controls = column(vec![ text("Scrollable alignment:").into(), @@ -194,16 +189,14 @@ impl Application for ScrollableDemo { ) .into(), ]) - .spacing(10) - .width(Length::Fill); + .spacing(10); let scroll_controls = row![ scroll_slider_controls, scroll_orientation_controls, scroll_alignment_controls ] - .spacing(20) - .width(Length::Fill); + .spacing(20); let scroll_to_end_button = || { button("Scroll to end") @@ -229,7 +222,6 @@ impl Application for ScrollableDemo { text("End!"), scroll_to_beginning_button(), ] - .width(Length::Fill) .align_items(Alignment::Center) .padding([40, 0, 40, 0]) .spacing(40), @@ -341,7 +333,6 @@ impl Application for ScrollableDemo { let content: Element<Message> = column![scroll_controls, scrollable_content, progress_bars] - .width(Length::Fill) .height(Length::Fill) .align_items(Alignment::Center) .spacing(10) diff --git a/examples/sierpinski_triangle/src/main.rs b/examples/sierpinski_triangle/src/main.rs index ef935c33..01a114bb 100644 --- a/examples/sierpinski_triangle/src/main.rs +++ b/examples/sierpinski_triangle/src/main.rs @@ -79,12 +79,10 @@ impl Application for SierpinskiEmulator { row![ text(format!("Iteration: {:?}", self.graph.iteration)), slider(0..=10000, self.graph.iteration, Message::IterationSet) - .width(Length::Fill) ] .padding(10) .spacing(20), ] - .width(Length::Fill) .align_items(iced::Alignment::Center) .into() } diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index 51538ec2..f14f6a8f 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -104,10 +104,11 @@ impl Sandbox for Styling { let progress_bar = progress_bar(0.0..=100.0, self.slider_value); - let scrollable = scrollable( - column!["Scroll me!", vertical_space(800), "You did it!"] - .width(Length::Fill), - ) + let scrollable = scrollable(column![ + "Scroll me!", + vertical_space(800), + "You did it!" + ]) .width(Length::Fill) .height(100); diff --git a/examples/svg/src/main.rs b/examples/svg/src/main.rs index 4dc92416..3bf4960f 100644 --- a/examples/svg/src/main.rs +++ b/examples/svg/src/main.rs @@ -63,7 +63,6 @@ impl Sandbox for Tiger { container(apply_color_filter).width(Length::Fill).center_x() ] .spacing(20) - .width(Length::Fill) .height(Length::Fill), ) .width(Length::Fill) diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 31b6f191..711d8223 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -106,9 +106,7 @@ impl Application for App { fn view<'a>(&'a self) -> Element<'a, Message> { let subtitle = |title, content: Element<'a, Message>| { - column![text(title).size(14), content] - .width(Length::Fill) - .spacing(5) + column![text(title).size(14), content].spacing(5) }; let mut add_toast = button("Add Toast"); @@ -153,14 +151,11 @@ impl Application for App { Message::Timeout ) .step(1.0) - .width(Length::Fill) ] .spacing(5) .into() ), - column![add_toast] - .width(Length::Fill) - .align_items(Alignment::End) + column![add_toast].align_items(Alignment::End) ] .spacing(10) .max_width(200), @@ -513,14 +508,14 @@ mod toast { position: Point, _translation: Vector, ) -> layout::Node { - let limits = layout::Limits::new(Size::ZERO, bounds) - .width(Length::Fill) - .height(Length::Fill); + let limits = layout::Limits::new(Size::ZERO, bounds); layout::flex::resolve( layout::flex::Axis::Vertical, renderer, &limits, + Length::Fill, + Length::Fill, 10.into(), 10.0, Alignment::End, diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index 7003d8ae..b9ee1e61 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -692,11 +692,7 @@ fn ferris<'a>( } fn button<'a, Message: Clone>(label: &str) -> Button<'a, Message> { - iced::widget::button( - text(label).horizontal_alignment(alignment::Horizontal::Center), - ) - .padding(12) - .width(100) + iced::widget::button(text(label)).padding([12, 24]) } fn color_slider<'a>( diff --git a/examples/websocket/src/main.rs b/examples/websocket/src/main.rs index 920189f5..5fdf6657 100644 --- a/examples/websocket/src/main.rs +++ b/examples/websocket/src/main.rs @@ -116,7 +116,6 @@ impl Application for WebSocket { .map(Element::from) .collect(), ) - .width(Length::Fill) .spacing(10), ) .id(MESSAGE_LOG.clone()) @@ -149,7 +148,6 @@ impl Application for WebSocket { }; column![message_log, new_message_input] - .width(Length::Fill) .height(Length::Fill) .padding(20) .spacing(10) diff --git a/widget/src/button.rs b/widget/src/button.rs index 384a3156..ba68caa5 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -433,13 +433,18 @@ pub fn layout( ) -> layout::Node { let limits = limits.width(width).height(height); - let mut content = layout_content(&limits.pad(padding)); + let content = layout_content(&limits.shrink(padding)); let padding = padding.fit(content.size(), limits.max()); - let size = limits.pad(padding).resolve(content.size()).pad(padding); - content.move_to(Point::new(padding.left, padding.top)); + let size = limits + .shrink(padding) + .resolve(content.size(), width, height) + .expand(padding); - layout::Node::with_children(size, vec![content]) + layout::Node::with_children( + size, + vec![content.move_to(Point::new(padding.left, padding.top))], + ) } /// Returns the [`mouse::Interaction`] of a [`Button`]. diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs index 390f4d92..9e33c113 100644 --- a/widget/src/canvas.rs +++ b/widget/src/canvas.rs @@ -133,8 +133,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.width, self.height); layout::Node::new(size) } diff --git a/widget/src/column.rs b/widget/src/column.rs index abb522be..526509bb 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -35,7 +35,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> { Column { spacing: 0.0, padding: Padding::ZERO, - width: Length::Shrink, + width: Length::Fill, height: Length::Shrink, max_width: f32::INFINITY, align_items: Alignment::Start, @@ -126,15 +126,14 @@ where renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits - .max_width(self.max_width) - .width(self.width) - .height(self.height); + let limits = limits.max_width(self.max_width); layout::flex::resolve( layout::flex::Axis::Vertical, renderer, &limits, + self.width, + self.height, self.padding, self.spacing, self.align_items, diff --git a/widget/src/container.rs b/widget/src/container.rs index 5dd7705b..b41a6023 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -312,24 +312,27 @@ pub fn layout( layout_content: impl FnOnce(&layout::Limits) -> layout::Node, ) -> layout::Node { let limits = limits - .loose() - .max_width(max_width) - .max_height(max_height) .width(width) - .height(height); + .height(height) + .max_width(max_width) + .max_height(max_height); - let mut content = layout_content(&limits.pad(padding).loose()); + let content = layout_content(&limits.shrink(padding).loose()); let padding = padding.fit(content.size(), limits.max()); - let size = limits.pad(padding).resolve(content.size()); + let size = limits + .shrink(padding) + .resolve(content.size(), width, height); - content.move_to(Point::new(padding.left, padding.top)); - content.align( - Alignment::from(horizontal_alignment), - Alignment::from(vertical_alignment), - size, - ); - - layout::Node::with_children(size.pad(padding), vec![content]) + layout::Node::with_children( + size.expand(padding), + vec![content + .move_to(Point::new(padding.left, padding.top)) + .align( + Alignment::from(horizontal_alignment), + Alignment::from(vertical_alignment), + size, + )], + ) } /// Draws the background of a [`Container`] given its [`Appearance`] and its `bounds`. diff --git a/widget/src/image.rs b/widget/src/image.rs index 67699102..b5f1e907 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -99,7 +99,7 @@ where }; // The size to be available to the widget prior to `Shrink`ing - let raw_size = limits.width(width).height(height).resolve(image_size); + let raw_size = limits.resolve(image_size, width, height); // The uncropped size of the image when fit to the bounds above let full_size = content_fit.fit(image_size, raw_size); diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs index 68015ba8..23c4fe86 100644 --- a/widget/src/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -113,10 +113,11 @@ where ) -> layout::Node { let Size { width, height } = renderer.dimensions(&self.handle); - let mut size = limits - .width(self.width) - .height(self.height) - .resolve(Size::new(width as f32, height as f32)); + let mut size = limits.resolve( + Size::new(width as f32, height as f32), + self.width, + self.height, + ); let expansion_size = if height > width { self.width diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index 0ef82407..1b53b43a 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -196,6 +196,8 @@ where layout::flex::Axis::Vertical, renderer, &limits, + self.width, + self.height, self.padding, self.spacing, self.align_items, diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index e45b44ae..ef39a952 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -254,15 +254,14 @@ where ) .width(self.width); - let mut node = self.container.layout(self.state, renderer, &limits); + let node = self.container.layout(self.state, renderer, &limits); + let size = node.size(); node.move_to(if space_below > space_above { position + Vector::new(0.0, self.target_height) } else { - position - Vector::new(0.0, node.size().height) - }); - - node + position - Vector::new(0.0, size.height) + }) } fn on_event( @@ -359,7 +358,6 @@ where ) -> layout::Node { use std::f32; - let limits = limits.width(Length::Fill).height(Length::Shrink); let text_size = self.text_size.unwrap_or_else(|| renderer.default_size()); @@ -372,7 +370,7 @@ where * self.options.len() as f32, ); - limits.resolve(intrinsic) + limits.resolve(intrinsic, Length::Fill, Length::Shrink) }; layout::Node::new(size) diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 7057fe59..3d799fd3 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -490,8 +490,7 @@ pub fn layout<Renderer, T>( &layout::Limits, ) -> layout::Node, ) -> layout::Node { - let limits = limits.width(width).height(height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, width, height); let regions = node.pane_regions(spacing, size); let children = contents @@ -500,16 +499,14 @@ pub fn layout<Renderer, T>( let region = regions.get(&pane)?; let size = Size::new(region.width, region.height); - let mut node = layout_content( + let node = layout_content( content, tree, renderer, &layout::Limits::new(size, size), ); - node.move_to(Point::new(region.x, region.y)); - - Some(node) + Some(node.move_to(Point::new(region.x, region.y))) }) .collect(); diff --git a/widget/src/pane_grid/content.rs b/widget/src/pane_grid/content.rs index 826ea663..ee00f186 100644 --- a/widget/src/pane_grid/content.rs +++ b/widget/src/pane_grid/content.rs @@ -165,7 +165,7 @@ where let title_bar_size = title_bar_layout.size(); - let mut body_layout = self.body.as_widget().layout( + let body_layout = self.body.as_widget().layout( &mut tree.children[0], renderer, &layout::Limits::new( @@ -177,11 +177,12 @@ where ), ); - body_layout.move_to(Point::new(0.0, title_bar_size.height)); - layout::Node::with_children( max_size, - vec![title_bar_layout, body_layout], + vec![ + title_bar_layout, + body_layout.move_to(Point::new(0.0, title_bar_size.height)), + ], ) } else { self.body.as_widget().layout( diff --git a/widget/src/pane_grid/title_bar.rs b/widget/src/pane_grid/title_bar.rs index f4dbb6b1..eb21b743 100644 --- a/widget/src/pane_grid/title_bar.rs +++ b/widget/src/pane_grid/title_bar.rs @@ -217,7 +217,7 @@ where renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.pad(self.padding); + let limits = limits.shrink(self.padding); let max_size = limits.max(); let title_layout = self.content.as_widget().layout( @@ -228,8 +228,8 @@ where let title_size = title_layout.size(); - let mut node = if let Some(controls) = &self.controls { - let mut controls_layout = controls.as_widget().layout( + let node = if let Some(controls) = &self.controls { + let controls_layout = controls.as_widget().layout( &mut tree.children[1], renderer, &layout::Limits::new(Size::ZERO, max_size), @@ -240,11 +240,13 @@ where let height = title_size.height.max(controls_size.height); - controls_layout.move_to(Point::new(space_before_controls, 0.0)); - layout::Node::with_children( Size::new(max_size.width, height), - vec![title_layout, controls_layout], + vec![ + title_layout, + controls_layout + .move_to(Point::new(space_before_controls, 0.0)), + ], ) } else { layout::Node::with_children( @@ -253,9 +255,7 @@ where ) }; - node.move_to(Point::new(self.padding.left, self.padding.top)); - - layout::Node::with_children(node.size().pad(self.padding), vec![node]) + layout::Node::container(node, self.padding) } pub(crate) fn operate( diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 022ca8d9..13110725 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -393,7 +393,7 @@ where { use std::f32; - let limits = limits.width(width).height(Length::Shrink).pad(padding); + let limits = limits.width(width).height(Length::Shrink); let font = font.unwrap_or_else(|| renderer.default_font()); let text_size = text_size.unwrap_or_else(|| renderer.default_size()); @@ -451,7 +451,10 @@ where f32::from(text_line_height.to_absolute(text_size)), ); - limits.resolve(intrinsic).pad(padding) + limits + .shrink(padding) + .resolve(intrinsic, width, Length::Shrink) + .expand(padding) }; layout::Node::new(size) diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index 07de72d5..b84ab2dd 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -99,11 +99,11 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits - .width(self.width) - .height(self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT))); - - let size = limits.resolve(Size::ZERO); + let size = limits.resolve( + Size::ZERO, + self.width, + self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT)), + ); layout::Node::new(size) } diff --git a/widget/src/row.rs b/widget/src/row.rs index d52b8c43..650c2c7d 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -34,7 +34,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> { Row { spacing: 0.0, padding: Padding::ZERO, - width: Length::Shrink, + width: Length::Fill, height: Length::Shrink, align_items: Alignment::Start, children, @@ -118,12 +118,12 @@ where renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - layout::flex::resolve( layout::flex::Axis::Horizontal, renderer, &limits, + self.width, + self.height, self.padding, self.spacing, self.align_items, diff --git a/widget/src/rule.rs b/widget/src/rule.rs index b5c5fa55..ecaedf60 100644 --- a/widget/src/rule.rs +++ b/widget/src/rule.rs @@ -76,9 +76,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - - layout::Node::new(limits.resolve(Size::ZERO)) + layout::Node::new(limits.resolve(Size::ZERO, self.width, self.height)) } fn draw( diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index 49aed2f0..525463c4 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -489,7 +489,7 @@ pub fn layout<Renderer>( ); let content = layout_content(renderer, &child_limits); - let size = limits.resolve(content.size()); + let size = limits.resolve(content.size(), width, height); layout::Node::with_children(size, vec![content]) } diff --git a/widget/src/shader.rs b/widget/src/shader.rs index 8e334693..5b18ec7d 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -85,7 +85,7 @@ where limits: &layout::Limits, ) -> layout::Node { let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.width, self.height); layout::Node::new(size) } diff --git a/widget/src/slider.rs b/widget/src/slider.rs index ac0982c8..2b600d9d 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -173,8 +173,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.width, self.height); layout::Node::new(size) } diff --git a/widget/src/space.rs b/widget/src/space.rs index e5a8f169..afa9a7c8 100644 --- a/widget/src/space.rs +++ b/widget/src/space.rs @@ -59,9 +59,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - - layout::Node::new(limits.resolve(Size::ZERO)) + layout::Node::new(limits.resolve(Size::ZERO, self.width, self.height)) } fn draw( diff --git a/widget/src/svg.rs b/widget/src/svg.rs index 2d01d1ab..8367ad18 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -115,10 +115,7 @@ where let image_size = Size::new(width as f32, height as f32); // The size to be available to the widget prior to `Shrink`ing - let raw_size = limits - .width(self.width) - .height(self.height) - .resolve(image_size); + let raw_size = limits.resolve(image_size, self.width, self.height); // The uncropped size of the image when fit to the bounds above let full_size = self.content_fit.fit(image_size, raw_size); diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index a2a186f0..214bce17 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -350,7 +350,7 @@ where } internal.editor.update( - limits.pad(self.padding).max(), + limits.shrink(self.padding).max(), self.font.unwrap_or_else(|| renderer.default_font()), self.text_size.unwrap_or_else(|| renderer.default_size()), self.line_height, diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 65d3e1eb..03eb2fd0 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -506,14 +506,11 @@ where { let font = font.unwrap_or_else(|| renderer.default_font()); let text_size = size.unwrap_or_else(|| renderer.default_size()); - let padding = padding.fit(Size::ZERO, limits.max()); - let limits = limits - .width(width) - .pad(padding) - .height(line_height.to_absolute(text_size)); + let height = line_height.to_absolute(text_size); - let text_bounds = limits.resolve(Size::ZERO); + let limits = limits.width(width).shrink(padding).height(height); + let text_bounds = limits.resolve(Size::ZERO, width, height); let placeholder_text = Text { font, @@ -552,41 +549,41 @@ where let icon_width = state.icon.min_width(); - let mut text_node = layout::Node::new( - text_bounds - Size::new(icon_width + icon.spacing, 0.0), - ); - - let mut icon_node = - layout::Node::new(Size::new(icon_width, text_bounds.height)); - - match icon.side { - Side::Left => { - text_node.move_to(Point::new( + let (text_position, icon_position) = match icon.side { + Side::Left => ( + Point::new( padding.left + icon_width + icon.spacing, padding.top, - )); - - icon_node.move_to(Point::new(padding.left, padding.top)); - } - Side::Right => { - text_node.move_to(Point::new(padding.left, padding.top)); - - icon_node.move_to(Point::new( + ), + Point::new(padding.left, padding.top), + ), + Side::Right => ( + Point::new(padding.left, padding.top), + Point::new( padding.left + text_bounds.width - icon_width, padding.top, - )); - } + ), + ), }; + let text_node = layout::Node::new( + text_bounds - Size::new(icon_width + icon.spacing, 0.0), + ) + .move_to(text_position); + + let icon_node = + layout::Node::new(Size::new(icon_width, text_bounds.height)) + .move_to(icon_position); + layout::Node::with_children( - text_bounds.pad(padding), + text_bounds.expand(padding), vec![text_node, icon_node], ) } else { - let mut text = layout::Node::new(text_bounds); - text.move_to(Point::new(padding.left, padding.top)); + let text = layout::Node::new(text_bounds) + .move_to(Point::new(padding.left, padding.top)); - layout::Node::with_children(text_bounds.pad(padding), vec![text]) + layout::Node::with_children(text_bounds.expand(padding), vec![text]) } } diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs index b888980a..adef13e4 100644 --- a/widget/src/tooltip.rs +++ b/widget/src/tooltip.rs @@ -353,7 +353,7 @@ where .then(|| viewport.size()) .unwrap_or(Size::INFINITY), ) - .pad(Padding::new(self.padding)), + .shrink(Padding::new(self.padding)), ); let text_bounds = text_layout.bounds(); diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs index 01d3359c..e489104c 100644 --- a/widget/src/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -170,8 +170,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO); + let size = limits.resolve(Size::ZERO, self.width, self.height); layout::Node::new(size) } From ed3b3930180f1971da25fdcc66a4130da32400ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Thu, 16 Mar 2023 20:37:24 +0100 Subject: [PATCH 222/286] Fix needless borrow in `row::layout` --- widget/src/row.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/row.rs b/widget/src/row.rs index 650c2c7d..c4a1db56 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -121,7 +121,7 @@ where layout::flex::resolve( layout::flex::Axis::Horizontal, renderer, - &limits, + limits, self.width, self.height, self.padding, From 89418c1244d14ac6020b31f3f1e19d15b4c0a272 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Thu, 23 Mar 2023 16:07:23 +0100 Subject: [PATCH 223/286] Determine cross-axis max length based on contents if `Shrink` --- core/src/layout/flex.rs | 48 +++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 738dc81d..823fb9e6 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -47,7 +47,7 @@ impl Axis { } } - fn pack(&self, main: f32, cross: f32) -> (f32, f32) { + fn pack<T>(&self, main: T, cross: T) -> (T, T) { match self { Axis::Horizontal => (main, cross), Axis::Vertical => (cross, main), @@ -78,7 +78,7 @@ where let total_spacing = spacing * items.len().saturating_sub(1) as f32; let max_cross = axis.cross(limits.max()); - let mut fill_sum = 0; + let mut fill_main_sum = 0; let mut cross = 0.0f32; let mut available = axis.main(limits.max()) - total_spacing; @@ -86,13 +86,12 @@ where nodes.resize(items.len(), Node::default()); for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { - let fill_factor = match axis { - Axis::Horizontal => child.as_widget().width(), - Axis::Vertical => child.as_widget().height(), - } - .fill_factor(); + let (fill_main_factor, fill_cross_factor) = axis.pack( + child.as_widget().width().fill_factor(), + child.as_widget().height().fill_factor(), + ); - if fill_factor == 0 { + if fill_main_factor == 0 && fill_cross_factor == 0 { let (max_width, max_height) = axis.pack(available, max_cross); let child_limits = @@ -107,7 +106,7 @@ where nodes[i] = layout; } else { - fill_sum += fill_factor; + fill_main_sum += fill_main_factor; } } @@ -122,15 +121,27 @@ where }, }; - for (i, (child, tree)) in items.iter().zip(trees).enumerate() { - let fill_factor = match axis { - Axis::Horizontal => child.as_widget().width(), - Axis::Vertical => child.as_widget().height(), - } - .fill_factor(); + let max_cross = match axis { + Axis::Horizontal => match height { + Length::Shrink => cross, + _ => max_cross, + }, + Axis::Vertical => match width { + Length::Shrink => cross, + _ => max_cross, + }, + }; + + for (i, (child, tree)) in items.iter().zip(trees).enumerate() { + let (fill_main_factor, fill_cross_factor) = axis.pack( + child.as_widget().width().fill_factor(), + child.as_widget().height().fill_factor(), + ); + + if fill_main_factor != 0 || fill_cross_factor != 0 { + let max_main = + remaining * fill_main_factor as f32 / fill_main_sum as f32; - if fill_factor != 0 { - let max_main = remaining * fill_factor as f32 / fill_sum as f32; let min_main = if max_main.is_infinite() { 0.0 } else { @@ -140,7 +151,8 @@ where let (min_width, min_height) = axis.pack(min_main, axis.cross(limits.min())); - let (max_width, max_height) = axis.pack(max_main, max_cross); + let (max_width, max_height) = axis + .pack(max_main, max_cross * fill_cross_factor.max(1) as f32); let child_limits = Limits::new( Size::new(min_width, min_height), From aa3c956516a23af86dfb9d96b769e5f26addbe60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Fri, 24 Mar 2023 03:02:26 +0100 Subject: [PATCH 224/286] Fix available space provided to children with non-fill main axis but fill cross axis --- core/src/layout/flex.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 823fb9e6..5ae98b8c 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -139,10 +139,13 @@ where ); if fill_main_factor != 0 || fill_cross_factor != 0 { - let max_main = - remaining * fill_main_factor as f32 / fill_main_sum as f32; + let max_main = if fill_main_factor == 0 { + available.max(0.0) + } else { + remaining * fill_main_factor as f32 / fill_main_sum as f32 + }; - let min_main = if max_main.is_infinite() { + let min_main = if fill_main_factor == 0 || max_main.is_infinite() { 0.0 } else { max_main From fd8f980b88df260ce49d46ed6c514f6e382c6494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Mon, 27 Mar 2023 14:40:03 +0200 Subject: [PATCH 225/286] Use `max_cross` if all elements are fluid in `layout::flex` --- core/src/layout/flex.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 5ae98b8c..9a4b2cbf 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -123,11 +123,11 @@ where let max_cross = match axis { Axis::Horizontal => match height { - Length::Shrink => cross, + Length::Shrink if cross > 0.0 => cross, _ => max_cross, }, Axis::Vertical => match width { - Length::Shrink => cross, + Length::Shrink if cross > 0.0 => cross, _ => max_cross, }, }; @@ -154,8 +154,7 @@ where let (min_width, min_height) = axis.pack(min_main, axis.cross(limits.min())); - let (max_width, max_height) = axis - .pack(max_main, max_cross * fill_cross_factor.max(1) as f32); + let (max_width, max_height) = axis.pack(max_main, max_cross); let child_limits = Limits::new( Size::new(min_width, min_height), From b37f8f3e85962d19f18b72044efca95709aa8ee2 Mon Sep 17 00:00:00 2001 From: Imbris <imbrisf@gmail.com> Date: Thu, 4 Jan 2024 21:36:45 -0500 Subject: [PATCH 226/286] Remove backend module in renderer crate that has been unused since https://github.com/iced-rs/iced/pull/1932 --- renderer/src/backend.rs | 100 ---------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 renderer/src/backend.rs diff --git a/renderer/src/backend.rs b/renderer/src/backend.rs deleted file mode 100644 index 3f229b52..00000000 --- a/renderer/src/backend.rs +++ /dev/null @@ -1,100 +0,0 @@ -use crate::core::text; -use crate::core::{Font, Point, Size}; -use crate::graphics::backend; - -use std::borrow::Cow; - -#[allow(clippy::large_enum_variant)] -pub enum Backend { - TinySkia(iced_tiny_skia::Backend), - #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::Backend), -} - -macro_rules! delegate { - ($backend:expr, $name:ident, $body:expr) => { - match $backend { - Self::TinySkia($name) => $body, - #[cfg(feature = "wgpu")] - Self::Wgpu($name) => $body, - } - }; -} - -impl backend::Text for Backend { - const ICON_FONT: Font = Font::with_name("Iced-Icons"); - const CHECKMARK_ICON: char = '\u{f00c}'; - const ARROW_DOWN_ICON: char = '\u{e800}'; - - fn default_font(&self) -> Font { - delegate!(self, backend, backend.default_font()) - } - - fn default_size(&self) -> f32 { - delegate!(self, backend, backend.default_size()) - } - - fn measure( - &self, - contents: &str, - size: f32, - line_height: text::LineHeight, - font: Font, - bounds: Size, - shaping: text::Shaping, - ) -> Size { - delegate!( - self, - backend, - backend.measure(contents, size, line_height, font, bounds, shaping) - ) - } - - fn hit_test( - &self, - contents: &str, - size: f32, - line_height: text::LineHeight, - font: Font, - bounds: Size, - shaping: text::Shaping, - position: Point, - nearest_only: bool, - ) -> Option<text::Hit> { - delegate!( - self, - backend, - backend.hit_test( - contents, - size, - line_height, - font, - bounds, - shaping, - position, - nearest_only, - ) - ) - } - - fn load_font(&mut self, font: Cow<'static, [u8]>) { - delegate!(self, backend, backend.load_font(font)); - } -} - -#[cfg(feature = "image")] -impl backend::Image for Backend { - fn dimensions(&self, handle: &crate::core::image::Handle) -> Size<u32> { - delegate!(self, backend, backend.dimensions(handle)) - } -} - -#[cfg(feature = "svg")] -impl backend::Svg for Backend { - fn viewport_dimensions( - &self, - handle: &crate::core::svg::Handle, - ) -> Size<u32> { - delegate!(self, backend, backend.viewport_dimensions(handle)) - } -} From 6c9dfbf01ec865f2ccf3b33cc8902d4e7141cd4f Mon Sep 17 00:00:00 2001 From: William Shere <7796394+william-shere@users.noreply.github.com> Date: Fri, 5 Jan 2024 13:50:38 +0000 Subject: [PATCH 227/286] Fix doc to include missing feature tags Helper functions behind `lazy` feature were missing the tag in the documentation. --- widget/src/lazy/helpers.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/widget/src/lazy/helpers.rs b/widget/src/lazy/helpers.rs index 8ca9cb86..5dc60d52 100644 --- a/widget/src/lazy/helpers.rs +++ b/widget/src/lazy/helpers.rs @@ -6,6 +6,7 @@ use std::hash::Hash; /// Creates a new [`Lazy`] widget with the given data `Dependency` and a /// closure that can turn this data into a widget tree. +#[cfg(feature = "lazy")] pub fn lazy<'a, Message, Renderer, Dependency, View>( dependency: Dependency, view: impl Fn(&Dependency) -> View + 'a, @@ -19,6 +20,7 @@ where /// Turns an implementor of [`Component`] into an [`Element`] that can be /// embedded in any application. +#[cfg(feature = "lazy")] pub fn component<'a, C, Message, Renderer>( component: C, ) -> Element<'a, Message, Renderer> @@ -37,6 +39,7 @@ where /// The `view` closure will be provided with the current [`Size`] of /// the [`Responsive`] widget and, therefore, can be used to build the /// contents of the widget in a responsive way. +#[cfg(feature = "lazy")] pub fn responsive<'a, Message, Renderer>( f: impl Fn(Size) -> Element<'a, Message, Renderer> + 'a, ) -> Responsive<'a, Message, Renderer> From b083eda663b8939e1c3e86b5ce2cb5fa8fc80ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n?= <hector0193@gmail.com> Date: Tue, 9 Jan 2024 02:03:13 +0100 Subject: [PATCH 228/286] Fix `Svg` styling --- widget/src/svg.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/widget/src/svg.rs b/widget/src/svg.rs index f9b16e1a..05c9265b 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -168,9 +168,9 @@ where }; let appearance = if is_mouse_over { - theme.appearance(&self.style) - } else { theme.hovered(&self.style) + } else { + theme.appearance(&self.style) }; renderer.draw( From 2aa2b1712dfdc93762ebe0958614154920068731 Mon Sep 17 00:00:00 2001 From: Calastrophe <zediant@gmail.com> Date: Tue, 9 Jan 2024 02:37:45 -0600 Subject: [PATCH 229/286] Implemented fetch_maximized and fetch_minimized --- runtime/src/window.rs | 22 ++++++++++++++++++++++ runtime/src/window/action.rs | 23 +++++++++++++++++++++++ winit/src/application.rs | 10 ++++++++++ winit/src/multi_window.rs | 14 ++++++++++++++ 4 files changed, 69 insertions(+) diff --git a/runtime/src/window.rs b/runtime/src/window.rs index f9d943f6..2136d64d 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -65,11 +65,33 @@ pub fn fetch_size<Message>( Command::single(command::Action::Window(Action::FetchSize(id, Box::new(f)))) } +/// Fetches if the window is maximized. +pub fn fetch_maximized<Message>( + id: Id, + f: impl FnOnce(bool) -> Message + 'static, +) -> Command<Message> { + Command::single(command::Action::Window(Action::FetchMaximized( + id, + Box::new(f), + ))) +} + /// Maximizes the window. pub fn maximize<Message>(id: Id, maximized: bool) -> Command<Message> { Command::single(command::Action::Window(Action::Maximize(id, maximized))) } +/// Fetches if the window is minimized. +pub fn fetch_minimized<Message>( + id: Id, + f: impl FnOnce(Option<bool>) -> Message + 'static, +) -> Command<Message> { + Command::single(command::Action::Window(Action::FetchMinimized( + id, + Box::new(f), + ))) +} + /// Minimizes the window. pub fn minimize<Message>(id: Id, minimized: bool) -> Command<Message> { Command::single(command::Action::Window(Action::Minimize(id, minimized))) diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index 2d98b607..8b532569 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -21,8 +21,19 @@ pub enum Action<T> { Resize(Id, Size), /// Fetch the current logical dimensions of the window. FetchSize(Id, Box<dyn FnOnce(Size) -> T + 'static>), + /// Fetch if the current window is maximized or not. + /// + /// ## Platform-specific + /// - **iOS / Android / Web:** Unsupported. + FetchMaximized(Id, Box<dyn FnOnce(bool) -> T + 'static>), /// Set the window to maximized or back Maximize(Id, bool), + /// Fetch if the current window is minimized or not. + /// + /// ## Platform-specific + /// - **Wayland:** Always `None`. + /// - **iOS / Android / Web:** Unsupported. + FetchMinimized(Id, Box<dyn FnOnce(Option<bool>) -> T + 'static>), /// Set the window to minimized or back Minimize(Id, bool), /// Move the window to the given logical coordinates. @@ -106,7 +117,13 @@ impl<T> Action<T> { Self::FetchSize(id, o) => { Action::FetchSize(id, Box::new(move |s| f(o(s)))) } + Self::FetchMaximized(id, o) => { + Action::FetchMaximized(id, Box::new(move |s| f(o(s)))) + } Self::Maximize(id, maximized) => Action::Maximize(id, maximized), + Self::FetchMinimized(id, o) => { + Action::FetchMinimized(id, Box::new(move |s| f(o(s)))) + } Self::Minimize(id, minimized) => Action::Minimize(id, minimized), Self::Move(id, position) => Action::Move(id, position), Self::ChangeMode(id, mode) => Action::ChangeMode(id, mode), @@ -144,9 +161,15 @@ impl<T> fmt::Debug for Action<T> { write!(f, "Action::Resize({id:?}, {size:?})") } Self::FetchSize(id, _) => write!(f, "Action::FetchSize({id:?})"), + Self::FetchMaximized(id, _) => { + write!(f, "Action::FetchMaximized({id:?})") + } Self::Maximize(id, maximized) => { write!(f, "Action::Maximize({id:?}, {maximized})") } + Self::FetchMinimized(id, _) => { + write!(f, "Action::FetchMinimized({id:?})") + } Self::Minimize(id, minimized) => { write!(f, "Action::Minimize({id:?}, {minimized}") } diff --git a/winit/src/application.rs b/winit/src/application.rs index d9700075..35a35872 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -742,9 +742,19 @@ pub fn run_command<A, C, E>( ))) .expect("Send message to event loop"); } + window::Action::FetchMaximized(_id, callback) => { + proxy + .send_event(callback(window.is_maximized())) + .expect("Send message to event loop"); + } window::Action::Maximize(_id, maximized) => { window.set_maximized(maximized); } + window::Action::FetchMinimized(_id, callback) => { + proxy + .send_event(callback(window.is_minimized())) + .expect("Send message to event loop"); + } window::Action::Minimize(_id, minimized) => { window.set_minimized(minimized); } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 84651d40..1550b94b 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -942,11 +942,25 @@ fn run_command<A, C, E>( .expect("Send message to event loop"); } } + window::Action::FetchMaximized(id, callback) => { + if let Some(window) = window_manager.get_mut(id) { + proxy + .send_event(callback(window.raw.is_maximized())) + .expect("Send message to event loop"); + } + } window::Action::Maximize(id, maximized) => { if let Some(window) = window_manager.get_mut(id) { window.raw.set_maximized(maximized); } } + window::Action::FetchMinimized(id, callback) => { + if let Some(window) = window_manager.get_mut(id) { + proxy + .send_event(callback(window.raw.is_minimized())) + .expect("Send message to event loop"); + } + } window::Action::Minimize(id, minimized) => { if let Some(window) = window_manager.get_mut(id) { window.raw.set_minimized(minimized); From 082985ade8a108aa3ec1fe573411120b82da0cad Mon Sep 17 00:00:00 2001 From: Calastrophe <zediant@gmail.com> Date: Tue, 9 Jan 2024 02:39:23 -0600 Subject: [PATCH 230/286] Small documentation typo fixed --- core/src/window/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/window/event.rs b/core/src/window/event.rs index b9ee7aca..a14d127f 100644 --- a/core/src/window/event.rs +++ b/core/src/window/event.rs @@ -58,7 +58,7 @@ pub enum Event { /// for each file separately. FileHovered(PathBuf), - /// A file has beend dropped into the window. + /// A file has been dropped into the window. /// /// When the user drops multiple files at once, this event will be emitted /// for each file separately. From 0322e820eb40d36a7425246278b7bcb22b7010aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Mon, 27 Mar 2023 15:43:52 +0200 Subject: [PATCH 231/286] Create `layout` example --- examples/layout/Cargo.toml | 9 +++ examples/layout/src/main.rs | 123 ++++++++++++++++++++++++++++++++++++ src/time.rs | 1 + widget/src/column.rs | 2 +- widget/src/row.rs | 2 +- 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 examples/layout/Cargo.toml create mode 100644 examples/layout/src/main.rs diff --git a/examples/layout/Cargo.toml b/examples/layout/Cargo.toml new file mode 100644 index 00000000..c2c3f49b --- /dev/null +++ b/examples/layout/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "layout" +version = "0.1.0" +authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced = { path = "../.." } diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs new file mode 100644 index 00000000..1b0c0c94 --- /dev/null +++ b/examples/layout/src/main.rs @@ -0,0 +1,123 @@ +use iced::executor; +use iced::widget::{column, container, row, text, vertical_rule}; +use iced::{ + Application, Command, Element, Length, Settings, Subscription, Theme, +}; + +pub fn main() -> iced::Result { + Layout::run(Settings::default()) +} + +#[derive(Debug)] +struct Layout { + previous: Vec<Example>, + current: Example, + next: Vec<Example>, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + Next, + Previous, +} + +impl Application for Layout { + type Message = Message; + type Theme = Theme; + type Executor = executor::Default; + type Flags = (); + + fn new(_flags: Self::Flags) -> (Self, Command<Message>) { + ( + Self { + previous: vec![], + current: Example::Centered, + next: vec![Example::NestedQuotes], + }, + Command::none(), + ) + } + + fn title(&self) -> String { + String::from("Counter - Iced") + } + + fn update(&mut self, message: Self::Message) -> Command<Message> { + match message { + Message::Next => { + if !self.next.is_empty() { + let previous = std::mem::replace( + &mut self.current, + self.next.remove(0), + ); + + self.previous.push(previous); + } + } + Message::Previous => { + if let Some(previous) = self.previous.pop() { + let next = std::mem::replace(&mut self.current, previous); + + self.next.insert(0, next); + } + } + } + + Command::none() + } + + fn subscription(&self) -> Subscription<Message> { + use iced::event::{self, Event}; + use iced::keyboard; + + event::listen_with(|event, status| match event { + Event::Keyboard(keyboard::Event::KeyReleased { + key_code, .. + }) if status == event::Status::Ignored => match key_code { + keyboard::KeyCode::Left => Some(Message::Previous), + keyboard::KeyCode::Right => Some(Message::Next), + _ => None, + }, + _ => None, + }) + } + + fn view(&self) -> Element<Message> { + self.current.view() + } +} + +#[derive(Debug)] +enum Example { + Centered, + NestedQuotes, +} + +impl Example { + fn view(&self) -> Element<Message> { + match self { + Self::Centered => container(text("I am centered!").size(50)) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into(), + Self::NestedQuotes => container((1..5).fold( + column![text("Original text")].padding(10), + |quotes, i| { + column![ + row![vertical_rule(2), quotes], + text(format!("Reply {i}")) + ] + .spacing(10) + .padding(10) + }, + )) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into(), + } + } +} diff --git a/src/time.rs b/src/time.rs index 37d454ed..f10f7a5e 100644 --- a/src/time.rs +++ b/src/time.rs @@ -1,4 +1,5 @@ //! Listen and react to time. pub use iced_core::time::{Duration, Instant}; +#[allow(unused_imports)] pub use iced_futures::backend::default::time::*; diff --git a/widget/src/column.rs b/widget/src/column.rs index 526509bb..80327458 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -35,7 +35,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> { Column { spacing: 0.0, padding: Padding::ZERO, - width: Length::Fill, + width: Length::Shrink, height: Length::Shrink, max_width: f32::INFINITY, align_items: Alignment::Start, diff --git a/widget/src/row.rs b/widget/src/row.rs index c4a1db56..50fc4de0 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -34,7 +34,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> { Row { spacing: 0.0, padding: Padding::ZERO, - width: Length::Fill, + width: Length::Shrink, height: Length::Shrink, align_items: Alignment::Start, children, From 22226394f7b1a0e0205b9bb5b3ef9b85a3b406f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 5 Jan 2024 17:24:43 +0100 Subject: [PATCH 232/286] Introduce `Widget::size_hint` and fix further layout inconsistencies --- core/src/layout/flex.rs | 72 +++++++++++++++++++------- core/src/length.rs | 6 +++ core/src/widget.rs | 10 +++- examples/download_progress/src/main.rs | 19 ++++--- examples/events/src/main.rs | 3 +- examples/layout/src/main.rs | 2 +- examples/lazy/src/main.rs | 44 ++++++---------- examples/loading_spinners/src/main.rs | 11 ++-- examples/scrollable/src/main.rs | 23 +++----- examples/tour/src/main.rs | 1 - examples/websocket/src/main.rs | 11 ++-- widget/src/column.rs | 39 ++++++++++---- widget/src/container.rs | 15 +++++- widget/src/helpers.rs | 22 +++++--- widget/src/lazy.rs | 7 +++ widget/src/lazy/component.rs | 7 +++ widget/src/row.rs | 41 +++++++++++---- 17 files changed, 210 insertions(+), 123 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 9a4b2cbf..67cc7f2a 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -91,8 +91,46 @@ where child.as_widget().height().fill_factor(), ); - if fill_main_factor == 0 && fill_cross_factor == 0 { - let (max_width, max_height) = axis.pack(available, max_cross); + if fill_main_factor == 0 { + if fill_cross_factor == 0 { + let (max_width, max_height) = axis.pack(available, max_cross); + + let child_limits = + Limits::new(Size::ZERO, Size::new(max_width, max_height)); + + let layout = + child.as_widget().layout(tree, renderer, &child_limits); + let size = layout.size(); + + available -= axis.main(size); + cross = cross.max(axis.cross(size)); + + nodes[i] = layout; + } + } else { + fill_main_sum += fill_main_factor; + } + } + + let intrinsic_cross = match axis { + Axis::Horizontal => match height { + Length::Shrink => cross, + _ => max_cross, + }, + Axis::Vertical => match width { + Length::Shrink => cross, + _ => max_cross, + }, + }; + + for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { + let (fill_main_factor, fill_cross_factor) = axis.pack( + child.as_widget().width().fill_factor(), + child.as_widget().height().fill_factor(), + ); + + if fill_main_factor == 0 && fill_cross_factor != 0 { + let (max_width, max_height) = axis.pack(available, intrinsic_cross); let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height)); @@ -102,11 +140,8 @@ where let size = layout.size(); available -= axis.main(size); - cross = cross.max(axis.cross(size)); nodes[i] = layout; - } else { - fill_main_sum += fill_main_factor; } } @@ -121,24 +156,13 @@ where }, }; - let max_cross = match axis { - Axis::Horizontal => match height { - Length::Shrink if cross > 0.0 => cross, - _ => max_cross, - }, - Axis::Vertical => match width { - Length::Shrink if cross > 0.0 => cross, - _ => max_cross, - }, - }; - for (i, (child, tree)) in items.iter().zip(trees).enumerate() { let (fill_main_factor, fill_cross_factor) = axis.pack( child.as_widget().width().fill_factor(), child.as_widget().height().fill_factor(), ); - if fill_main_factor != 0 || fill_cross_factor != 0 { + if fill_main_factor != 0 { let max_main = if fill_main_factor == 0 { available.max(0.0) } else { @@ -151,6 +175,12 @@ where max_main }; + let max_cross = if fill_cross_factor == 0 { + max_cross + } else { + intrinsic_cross + }; + let (min_width, min_height) = axis.pack(min_main, axis.cross(limits.min())); @@ -203,8 +233,12 @@ where main += axis.main(size); } - let (width, height) = axis.pack(main - pad.0, cross); - let size = limits.resolve(Size::new(width, height), width, height); + let (intrinsic_width, intrinsic_height) = axis.pack(main - pad.0, cross); + let size = limits.resolve( + Size::new(intrinsic_width, intrinsic_height), + width, + height, + ); Node::with_children(size.expand(padding), nodes) } diff --git a/core/src/length.rs b/core/src/length.rs index 3adb996e..6dc15049 100644 --- a/core/src/length.rs +++ b/core/src/length.rs @@ -36,6 +36,12 @@ impl Length { Length::Fixed(_) => 0, } } + + /// Returns `true` iff the [`Length`] is either [`Length::Fill`] or + // [`Length::FillPortion`]. + pub fn is_fill(&self) -> bool { + self.fill_factor() != 0 + } } impl From<Pixels> for Length { diff --git a/core/src/widget.rs b/core/src/widget.rs index 294d5984..890b3773 100644 --- a/core/src/widget.rs +++ b/core/src/widget.rs @@ -15,7 +15,7 @@ use crate::layout::{self, Layout}; use crate::mouse; use crate::overlay; use crate::renderer; -use crate::{Clipboard, Length, Rectangle, Shell}; +use crate::{Clipboard, Length, Rectangle, Shell, Size}; /// A component that displays information and allows interaction. /// @@ -49,6 +49,14 @@ where /// Returns the height of the [`Widget`]. fn height(&self) -> Length; + /// Returns a [`Size`] hint for laying out the [`Widget`]. + /// + /// This hint may be used by some widget containers to adjust their sizing strategy + /// during construction. + fn size_hint(&self) -> Size<Length> { + Size::new(self.width(), self.height()) + } + /// Returns the [`layout::Node`] of the [`Widget`]. /// /// This [`layout::Node`] is used by the runtime to compute the [`Layout`] of the diff --git a/examples/download_progress/src/main.rs b/examples/download_progress/src/main.rs index a2fcb275..675e9e26 100644 --- a/examples/download_progress/src/main.rs +++ b/examples/download_progress/src/main.rs @@ -73,16 +73,15 @@ impl Application for Example { } fn view(&self) -> Element<Message> { - let downloads = Column::with_children( - self.downloads.iter().map(Download::view).collect(), - ) - .push( - button("Add another download") - .on_press(Message::Add) - .padding(10), - ) - .spacing(20) - .align_items(Alignment::End); + let downloads = + Column::with_children(self.downloads.iter().map(Download::view)) + .push( + button("Add another download") + .on_press(Message::Add) + .padding(10), + ) + .spacing(20) + .align_items(Alignment::End); container(downloads) .width(Length::Fill) diff --git a/examples/events/src/main.rs b/examples/events/src/main.rs index 334b012d..fc51ac4a 100644 --- a/examples/events/src/main.rs +++ b/examples/events/src/main.rs @@ -82,8 +82,7 @@ impl Application for Events { self.last .iter() .map(|event| text(format!("{event:?}")).size(40)) - .map(Element::from) - .collect(), + .map(Element::from), ); let toggle = checkbox( diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 1b0c0c94..eeaa76b6 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -106,7 +106,7 @@ impl Example { column![text("Original text")].padding(10), |quotes, i| { column![ - row![vertical_rule(2), quotes], + row![vertical_rule(2), quotes].height(Length::Shrink), text(format!("Reply {i}")) ] .spacing(10) diff --git a/examples/lazy/src/main.rs b/examples/lazy/src/main.rs index 01560598..04df0744 100644 --- a/examples/lazy/src/main.rs +++ b/examples/lazy/src/main.rs @@ -178,35 +178,23 @@ impl Sandbox for App { } }); - column( - items - .into_iter() - .map(|item| { - let button = button("Delete") - .on_press(Message::DeleteItem(item.clone())) - .style(theme::Button::Destructive); + column(items.into_iter().map(|item| { + let button = button("Delete") + .on_press(Message::DeleteItem(item.clone())) + .style(theme::Button::Destructive); - row![ - text(&item.name) - .style(theme::Text::Color(item.color.into())), - horizontal_space(Length::Fill), - pick_list( - Color::ALL, - Some(item.color), - move |color| { - Message::ItemColorChanged( - item.clone(), - color, - ) - } - ), - button - ] - .spacing(20) - .into() - }) - .collect(), - ) + row![ + text(&item.name) + .style(theme::Text::Color(item.color.into())), + horizontal_space(Length::Fill), + pick_list(Color::ALL, Some(item.color), move |color| { + Message::ItemColorChanged(item.clone(), color) + }), + button + ] + .spacing(20) + .into() + })) .spacing(10) }); diff --git a/examples/loading_spinners/src/main.rs b/examples/loading_spinners/src/main.rs index a78e9590..93a4605e 100644 --- a/examples/loading_spinners/src/main.rs +++ b/examples/loading_spinners/src/main.rs @@ -96,15 +96,14 @@ impl Application for LoadingSpinners { container( column.push( - row(vec![ - text("Cycle duration:").into(), + row![ + text("Cycle duration:"), slider(1.0..=1000.0, self.cycle_duration * 100.0, |x| { Message::CycleDurationChanged(x / 100.0) }) - .width(200.0) - .into(), - text(format!("{:.2}s", self.cycle_duration)).into(), - ]) + .width(200.0), + text(format!("{:.2}s", self.cycle_duration)), + ] .align_items(iced::Alignment::Center) .spacing(20.0), ), diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 1042e7a4..249bc2a5 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -172,23 +172,21 @@ impl Application for ScrollableDemo { ] .spacing(10); - let scroll_alignment_controls = column(vec![ - text("Scrollable alignment:").into(), + let scroll_alignment_controls = column![ + text("Scrollable alignment:"), radio( "Start", scrollable::Alignment::Start, Some(self.alignment), Message::AlignmentChanged, - ) - .into(), + ), radio( "End", scrollable::Alignment::End, Some(self.alignment), Message::AlignmentChanged, ) - .into(), - ]) + ] .spacing(10); let scroll_controls = row![ @@ -226,6 +224,7 @@ impl Application for ScrollableDemo { .padding([40, 0, 40, 0]) .spacing(40), ) + .width(Length::Fill) .height(Length::Fill) .direction(scrollable::Direction::Vertical( Properties::new() @@ -251,6 +250,7 @@ impl Application for ScrollableDemo { .padding([0, 40, 0, 40]) .spacing(40), ) + .width(Length::Fill) .height(Length::Fill) .direction(scrollable::Direction::Horizontal( Properties::new() @@ -293,6 +293,7 @@ impl Application for ScrollableDemo { .padding([0, 40, 0, 40]) .spacing(40), ) + .width(Length::Fill) .height(Length::Fill) .direction({ let properties = Properties::new() @@ -333,19 +334,11 @@ impl Application for ScrollableDemo { let content: Element<Message> = column![scroll_controls, scrollable_content, progress_bars] - .height(Length::Fill) .align_items(Alignment::Center) .spacing(10) .into(); - Element::from( - container(content) - .width(Length::Fill) - .height(Length::Fill) - .padding(40) - .center_x() - .center_y(), - ) + Element::from(container(content).padding(40).center_x().center_y()) } fn theme(&self) -> Self::Theme { diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index b9ee1e61..8633bc0a 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -509,7 +509,6 @@ impl<'a> Step { ) }) .map(Element::from) - .collect() ) .spacing(10) ] diff --git a/examples/websocket/src/main.rs b/examples/websocket/src/main.rs index 5fdf6657..59488e69 100644 --- a/examples/websocket/src/main.rs +++ b/examples/websocket/src/main.rs @@ -3,7 +3,7 @@ mod echo; use iced::alignment::{self, Alignment}; use iced::executor; use iced::widget::{ - button, column, container, row, scrollable, text, text_input, Column, + button, column, container, row, scrollable, text, text_input, }; use iced::{ Application, Color, Command, Element, Length, Settings, Subscription, Theme, @@ -108,13 +108,8 @@ impl Application for WebSocket { .into() } else { scrollable( - Column::with_children( - self.messages - .iter() - .cloned() - .map(text) - .map(Element::from) - .collect(), + column( + self.messages.iter().cloned().map(text).map(Element::from), ) .spacing(10), ) diff --git a/widget/src/column.rs b/widget/src/column.rs index 80327458..52cf35ce 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -22,16 +22,12 @@ pub struct Column<'a, Message, Renderer = crate::Renderer> { children: Vec<Element<'a, Message, Renderer>>, } -impl<'a, Message, Renderer> Column<'a, Message, Renderer> { +impl<'a, Message, Renderer> Column<'a, Message, Renderer> +where + Renderer: crate::core::Renderer, +{ /// Creates an empty [`Column`]. pub fn new() -> Self { - Self::with_children(Vec::new()) - } - - /// Creates a [`Column`] with the given elements. - pub fn with_children( - children: Vec<Element<'a, Message, Renderer>>, - ) -> Self { Column { spacing: 0.0, padding: Padding::ZERO, @@ -39,10 +35,17 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> { height: Length::Shrink, max_width: f32::INFINITY, align_items: Alignment::Start, - children, + children: Vec::new(), } } + /// Creates a [`Column`] with the given elements. + pub fn with_children( + children: impl Iterator<Item = Element<'a, Message, Renderer>>, + ) -> Self { + children.fold(Self::new(), |column, element| column.push(element)) + } + /// Sets the vertical spacing _between_ elements. /// /// Custom margins per element do not exist in iced. You should use this @@ -88,12 +91,26 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> { mut self, child: impl Into<Element<'a, Message, Renderer>>, ) -> Self { - self.children.push(child.into()); + let child = child.into(); + let size = child.as_widget().size_hint(); + + if size.width.is_fill() { + self.width = Length::Fill; + } + + if size.height.is_fill() { + self.height = Length::Fill; + } + + self.children.push(child); self } } -impl<'a, Message, Renderer> Default for Column<'a, Message, Renderer> { +impl<'a, Message, Renderer> Default for Column<'a, Message, Renderer> +where + Renderer: crate::core::Renderer, +{ fn default() -> Self { Self::new() } diff --git a/widget/src/container.rs b/widget/src/container.rs index b41a6023..fbc68db7 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -46,11 +46,22 @@ where where T: Into<Element<'a, Message, Renderer>>, { + let content = content.into(); + let size = content.as_widget().size_hint(); + Container { id: None, padding: Padding::ZERO, - width: Length::Shrink, - height: Length::Shrink, + width: if size.width.is_fill() { + Length::Fill + } else { + Length::Shrink + }, + height: if size.height.is_fill() { + Length::Fill + } else { + Length::Shrink + }, max_width: f32::INFINITY, max_height: f32::INFINITY, horizontal_alignment: alignment::Horizontal::Left, diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 115198fb..6eaf3392 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -34,7 +34,7 @@ macro_rules! column { $crate::Column::new() ); ($($x:expr),+ $(,)?) => ( - $crate::Column::with_children(vec![$($crate::core::Element::from($x)),+]) + $crate::Column::with_children([$($crate::core::Element::from($x)),+].into_iter()) ); } @@ -47,7 +47,7 @@ macro_rules! row { $crate::Row::new() ); ($($x:expr),+ $(,)?) => ( - $crate::Row::with_children(vec![$($crate::core::Element::from($x)),+]) + $crate::Row::with_children([$($crate::core::Element::from($x)),+].into_iter()) ); } @@ -65,9 +65,12 @@ where } /// Creates a new [`Column`] with the given children. -pub fn column<Message, Renderer>( - children: Vec<Element<'_, Message, Renderer>>, -) -> Column<'_, Message, Renderer> { +pub fn column<'a, Message, Renderer>( + children: impl Iterator<Item = Element<'a, Message, Renderer>>, +) -> Column<'a, Message, Renderer> +where + Renderer: core::Renderer, +{ Column::with_children(children) } @@ -84,9 +87,12 @@ where /// Creates a new [`Row`] with the given children. /// /// [`Row`]: crate::Row -pub fn row<Message, Renderer>( - children: Vec<Element<'_, Message, Renderer>>, -) -> Row<'_, Message, Renderer> { +pub fn row<'a, Message, Renderer>( + children: impl Iterator<Item = Element<'a, Message, Renderer>>, +) -> Row<'a, Message, Renderer> +where + Renderer: core::Renderer, +{ Row::with_children(children) } diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs index 167a055d..4f6513db 100644 --- a/widget/src/lazy.rs +++ b/widget/src/lazy.rs @@ -150,6 +150,13 @@ where self.with_element(|element| element.as_widget().height()) } + fn size_hint(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: Length::Shrink, + } + } + fn layout( &self, tree: &mut Tree, diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index ad0c3823..0aff7485 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -252,6 +252,13 @@ where self.with_element(|element| element.as_widget().height()) } + fn size_hint(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: Length::Shrink, + } + } + fn layout( &self, tree: &mut Tree, diff --git a/widget/src/row.rs b/widget/src/row.rs index 50fc4de0..ef371ddb 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -21,26 +21,31 @@ pub struct Row<'a, Message, Renderer = crate::Renderer> { children: Vec<Element<'a, Message, Renderer>>, } -impl<'a, Message, Renderer> Row<'a, Message, Renderer> { +impl<'a, Message, Renderer> Row<'a, Message, Renderer> +where + Renderer: crate::core::Renderer, +{ /// Creates an empty [`Row`]. pub fn new() -> Self { - Self::with_children(Vec::new()) - } - - /// Creates a [`Row`] with the given elements. - pub fn with_children( - children: Vec<Element<'a, Message, Renderer>>, - ) -> Self { Row { spacing: 0.0, padding: Padding::ZERO, width: Length::Shrink, height: Length::Shrink, align_items: Alignment::Start, - children, + children: Vec::new(), } } + /// Creates a [`Row`] with the given elements. + pub fn with_children( + children: impl Iterator<Item = Element<'a, Message, Renderer>>, + ) -> Self { + children + .into_iter() + .fold(Self::new(), |column, element| column.push(element)) + } + /// Sets the horizontal spacing _between_ elements. /// /// Custom margins per element do not exist in iced. You should use this @@ -80,12 +85,26 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> { mut self, child: impl Into<Element<'a, Message, Renderer>>, ) -> Self { - self.children.push(child.into()); + let child = child.into(); + let size = child.as_widget().size_hint(); + + if size.width.is_fill() { + self.width = Length::Fill; + } + + if size.height.is_fill() { + self.height = Length::Fill; + } + + self.children.push(child); self } } -impl<'a, Message, Renderer> Default for Row<'a, Message, Renderer> { +impl<'a, Message, Renderer> Default for Row<'a, Message, Renderer> +where + Renderer: crate::core::Renderer, +{ fn default() -> Self { Self::new() } From d278bfd21d0399009e652560afb9a4d185e92637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 5 Jan 2024 17:46:33 +0100 Subject: [PATCH 233/286] Replace `width` and `height` with `Widget::size` --- core/src/element.rs | 18 +++++---------- core/src/layout/flex.rs | 27 +++++++++++++---------- core/src/widget.rs | 9 +++----- core/src/widget/text.rs | 15 +++++++------ examples/custom_quad/src/main.rs | 11 +++++---- examples/custom_widget/src/main.rs | 11 +++++---- examples/geometry/src/main.rs | 11 +++++---- examples/loading_spinners/src/circular.rs | 11 +++++---- examples/loading_spinners/src/linear.rs | 11 +++++---- examples/modal/src/main.rs | 8 ++----- examples/toast/src/main.rs | 8 ++----- widget/src/button.rs | 13 +++++------ widget/src/canvas.rs | 16 +++++++------- widget/src/checkbox.rs | 11 +++++---- widget/src/column.rs | 13 +++++------ widget/src/combo_box.rs | 12 +++++----- widget/src/container.rs | 11 +++++---- widget/src/image.rs | 11 +++++---- widget/src/image/viewer.rs | 11 +++++---- widget/src/keyed/column.rs | 13 +++++------ widget/src/lazy.rs | 8 ++----- widget/src/lazy/component.rs | 8 ++----- widget/src/lazy/responsive.rs | 11 +++++---- widget/src/mouse_area.rs | 10 +++------ widget/src/overlay/menu.rs | 11 +++++---- widget/src/pane_grid.rs | 11 +++++---- widget/src/pick_list.rs | 11 +++++---- widget/src/progress_bar.rs | 11 +++++---- widget/src/qr_code.rs | 11 +++++---- widget/src/radio.rs | 11 +++++---- widget/src/row.rs | 13 +++++------ widget/src/rule.rs | 11 +++++---- widget/src/scrollable.rs | 11 +++++---- widget/src/shader.rs | 11 +++++---- widget/src/slider.rs | 11 +++++---- widget/src/space.rs | 11 +++++---- widget/src/svg.rs | 11 +++++---- widget/src/text_editor.rs | 13 +++++------ widget/src/text_input.rs | 11 +++++---- widget/src/toggler.rs | 11 +++++---- widget/src/tooltip.rs | 8 ++----- widget/src/vertical_slider.rs | 11 +++++---- 42 files changed, 212 insertions(+), 275 deletions(-) diff --git a/core/src/element.rs b/core/src/element.rs index dea111af..8b510218 100644 --- a/core/src/element.rs +++ b/core/src/element.rs @@ -6,7 +6,7 @@ use crate::renderer; use crate::widget; use crate::widget::tree::{self, Tree}; use crate::{ - Clipboard, Color, Layout, Length, Rectangle, Shell, Vector, Widget, + Clipboard, Color, Layout, Length, Rectangle, Shell, Size, Vector, Widget, }; use std::any::Any; @@ -296,12 +296,8 @@ where self.widget.diff(tree); } - fn width(&self) -> Length { - self.widget.width() - } - - fn height(&self) -> Length { - self.widget.height() + fn size(&self) -> Size<Length> { + self.widget.size() } fn layout( @@ -466,12 +462,8 @@ impl<'a, Message, Renderer> Widget<Message, Renderer> where Renderer: crate::Renderer, { - fn width(&self) -> Length { - self.element.widget.width() - } - - fn height(&self) -> Length { - self.element.widget.height() + fn size(&self) -> Size<Length> { + self.element.widget.size() } fn tag(&self) -> tree::Tag { diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 67cc7f2a..036b31fd 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -86,10 +86,11 @@ where nodes.resize(items.len(), Node::default()); for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { - let (fill_main_factor, fill_cross_factor) = axis.pack( - child.as_widget().width().fill_factor(), - child.as_widget().height().fill_factor(), - ); + let (fill_main_factor, fill_cross_factor) = { + let size = child.as_widget().size(); + + axis.pack(size.width.fill_factor(), size.height.fill_factor()) + }; if fill_main_factor == 0 { if fill_cross_factor == 0 { @@ -124,10 +125,11 @@ where }; for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { - let (fill_main_factor, fill_cross_factor) = axis.pack( - child.as_widget().width().fill_factor(), - child.as_widget().height().fill_factor(), - ); + let (fill_main_factor, fill_cross_factor) = { + let size = child.as_widget().size(); + + axis.pack(size.width.fill_factor(), size.height.fill_factor()) + }; if fill_main_factor == 0 && fill_cross_factor != 0 { let (max_width, max_height) = axis.pack(available, intrinsic_cross); @@ -157,10 +159,11 @@ where }; for (i, (child, tree)) in items.iter().zip(trees).enumerate() { - let (fill_main_factor, fill_cross_factor) = axis.pack( - child.as_widget().width().fill_factor(), - child.as_widget().height().fill_factor(), - ); + let (fill_main_factor, fill_cross_factor) = { + let size = child.as_widget().size(); + + axis.pack(size.width.fill_factor(), size.height.fill_factor()) + }; if fill_main_factor != 0 { let max_main = if fill_main_factor == 0 { diff --git a/core/src/widget.rs b/core/src/widget.rs index 890b3773..7f5632ae 100644 --- a/core/src/widget.rs +++ b/core/src/widget.rs @@ -43,18 +43,15 @@ pub trait Widget<Message, Renderer> where Renderer: crate::Renderer, { - /// Returns the width of the [`Widget`]. - fn width(&self) -> Length; - - /// Returns the height of the [`Widget`]. - fn height(&self) -> Length; + /// Returns the [`Size`] of the [`Widget`] in lengths. + fn size(&self) -> Size<Length>; /// Returns a [`Size`] hint for laying out the [`Widget`]. /// /// This hint may be used by some widget containers to adjust their sizing strategy /// during construction. fn size_hint(&self) -> Size<Length> { - Size::new(self.width(), self.height()) + self.size() } /// Returns the [`layout::Node`] of the [`Widget`]. diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index e47e4178..fe3b77d3 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -5,7 +5,9 @@ use crate::mouse; use crate::renderer; use crate::text::{self, Paragraph}; use crate::widget::tree::{self, Tree}; -use crate::{Color, Element, Layout, Length, Pixels, Point, Rectangle, Widget}; +use crate::{ + Color, Element, Layout, Length, Pixels, Point, Rectangle, Size, Widget, +}; use std::borrow::Cow; @@ -134,12 +136,11 @@ where tree::State::new(State(Renderer::Paragraph::default())) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/examples/custom_quad/src/main.rs b/examples/custom_quad/src/main.rs index 13b08250..cc9ad528 100644 --- a/examples/custom_quad/src/main.rs +++ b/examples/custom_quad/src/main.rs @@ -26,12 +26,11 @@ mod quad { where Renderer: renderer::Renderer, { - fn width(&self) -> Length { - Length::Shrink - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: Length::Shrink, + } } fn layout( diff --git a/examples/custom_widget/src/main.rs b/examples/custom_widget/src/main.rs index 32a14cbe..7ffb4cd0 100644 --- a/examples/custom_widget/src/main.rs +++ b/examples/custom_widget/src/main.rs @@ -33,12 +33,11 @@ mod circle { where Renderer: renderer::Renderer, { - fn width(&self) -> Length { - Length::Shrink - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: Length::Shrink, + } } fn layout( diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 50227f1c..d6a4c702 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -16,12 +16,11 @@ mod rainbow { } impl<Message> Widget<Message, Renderer> for Rainbow { - fn width(&self) -> Length { - Length::Fill - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: Length::Fill, + height: Length::Shrink, + } } fn layout( diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index a92a5dd1..e80617d0 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -244,12 +244,11 @@ where tree::State::new(State::default()) } - fn width(&self) -> Length { - Length::Fixed(self.size) - } - - fn height(&self) -> Length { - Length::Fixed(self.size) + fn size(&self) -> Size<Length> { + Size { + width: Length::Fixed(self.size), + height: Length::Fixed(self.size), + } } fn layout( diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index da4f1ea1..d205d3f1 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -165,12 +165,11 @@ where tree::State::new(State::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index 85ccf8b4..631efe6e 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -281,12 +281,8 @@ mod modal { tree.diff_children(&[&self.base, &self.modal]); } - fn width(&self) -> Length { - self.base.as_widget().width() - } - - fn height(&self) -> Length { - self.base.as_widget().height() + fn size(&self) -> Size<Length> { + self.base.as_widget().size() } fn layout( diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 711d8223..300343b9 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -313,12 +313,8 @@ mod toast { } impl<'a, Message> Widget<Message, Renderer> for Manager<'a, Message> { - fn width(&self) -> Length { - self.content.as_widget().width() - } - - fn height(&self) -> Length { - self.content.as_widget().height() + fn size(&self) -> Size<Length> { + self.content.as_widget().size() } fn layout( diff --git a/widget/src/button.rs b/widget/src/button.rs index ba68caa5..1ce4f662 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -11,7 +11,7 @@ use crate::core::widget::tree::{self, Tree}; use crate::core::widget::Operation; use crate::core::{ Background, Clipboard, Color, Element, Layout, Length, Padding, Point, - Rectangle, Shell, Vector, Widget, + Rectangle, Shell, Size, Vector, Widget, }; pub use iced_style::button::{Appearance, StyleSheet}; @@ -149,12 +149,11 @@ where tree.diff_children(std::slice::from_ref(&self.content)); } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs index 9e33c113..2bf09eec 100644 --- a/widget/src/canvas.rs +++ b/widget/src/canvas.rs @@ -14,8 +14,9 @@ use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::renderer; use crate::core::widget::tree::{self, Tree}; -use crate::core::{Clipboard, Element, Shell, Widget}; -use crate::core::{Length, Rectangle, Size, Vector}; +use crate::core::{ + Clipboard, Element, Length, Rectangle, Shell, Size, Vector, Widget, +}; use crate::graphics::geometry; use std::marker::PhantomData; @@ -119,12 +120,11 @@ where tree::State::new(P::State::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index a0d9559b..0353b3ad 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -174,12 +174,11 @@ where tree::State::new(widget::text::State::<Renderer::Paragraph>::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/column.rs b/widget/src/column.rs index 52cf35ce..9867d97e 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -7,7 +7,7 @@ use crate::core::renderer; use crate::core::widget::{Operation, Tree}; use crate::core::{ Alignment, Clipboard, Element, Layout, Length, Padding, Pixels, Rectangle, - Shell, Widget, + Shell, Size, Widget, }; /// A container that distributes its contents vertically. @@ -129,12 +129,11 @@ where tree.diff_children(&self.children); } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 31ec27fc..1b2fa947 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -8,7 +8,9 @@ use crate::core::renderer; use crate::core::text; use crate::core::time::Instant; use crate::core::widget::{self, Widget}; -use crate::core::{Clipboard, Element, Length, Padding, Rectangle, Shell}; +use crate::core::{ + Clipboard, Element, Length, Padding, Rectangle, Shell, Size, +}; use crate::overlay::menu; use crate::text::LineHeight; use crate::{container, scrollable, text_input, TextInput}; @@ -297,12 +299,8 @@ where + scrollable::StyleSheet + menu::StyleSheet, { - fn width(&self) -> Length { - Widget::<TextInputEvent, Renderer>::width(&self.text_input) - } - - fn height(&self) -> Length { - Widget::<TextInputEvent, Renderer>::height(&self.text_input) + fn size(&self) -> Size<Length> { + Widget::<TextInputEvent, Renderer>::size(&self.text_input) } fn layout( diff --git a/widget/src/container.rs b/widget/src/container.rs index fbc68db7..93d8daba 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -163,12 +163,11 @@ where self.content.as_widget().diff(tree); } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/image.rs b/widget/src/image.rs index b5f1e907..6750c1b3 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -164,12 +164,11 @@ where Renderer: image::Renderer<Handle = Handle>, Handle: Clone + Hash, { - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs index 23c4fe86..dc910f1f 100644 --- a/widget/src/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -97,12 +97,11 @@ where tree::State::new(State::new()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index 1b53b43a..32320300 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -8,7 +8,7 @@ use crate::core::widget::tree::{self, Tree}; use crate::core::widget::Operation; use crate::core::{ Alignment, Clipboard, Element, Layout, Length, Padding, Pixels, Rectangle, - Shell, Widget, + Shell, Size, Widget, }; /// A container that distributes its contents vertically. @@ -173,12 +173,11 @@ where } } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/lazy.rs b/widget/src/lazy.rs index 4f6513db..e9edbb4c 100644 --- a/widget/src/lazy.rs +++ b/widget/src/lazy.rs @@ -142,12 +142,8 @@ where } } - fn width(&self) -> Length { - self.with_element(|element| element.as_widget().width()) - } - - fn height(&self) -> Length { - self.with_element(|element| element.as_widget().height()) + fn size(&self) -> Size<Length> { + self.with_element(|element| element.as_widget().size()) } fn size_hint(&self) -> Size<Length> { diff --git a/widget/src/lazy/component.rs b/widget/src/lazy/component.rs index 0aff7485..3684e0c9 100644 --- a/widget/src/lazy/component.rs +++ b/widget/src/lazy/component.rs @@ -244,12 +244,8 @@ where self.rebuild_element_if_necessary(); } - fn width(&self) -> Length { - self.with_element(|element| element.as_widget().width()) - } - - fn height(&self) -> Length { - self.with_element(|element| element.as_widget().height()) + fn size(&self) -> Size<Length> { + self.with_element(|element| element.as_widget().size()) } fn size_hint(&self) -> Size<Length> { diff --git a/widget/src/lazy/responsive.rs b/widget/src/lazy/responsive.rs index 86d37b6c..1df0866f 100644 --- a/widget/src/lazy/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -135,12 +135,11 @@ where }) } - fn width(&self) -> Length { - Length::Fill - } - - fn height(&self) -> Length { - Length::Fill + fn size(&self) -> Size<Length> { + Size { + width: Length::Fill, + height: Length::Fill, + } } fn layout( diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 3a5b01a3..87cac3a7 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -8,7 +8,7 @@ use crate::core::renderer; use crate::core::touch; use crate::core::widget::{tree, Operation, Tree}; use crate::core::{ - Clipboard, Element, Layout, Length, Rectangle, Shell, Widget, + Clipboard, Element, Layout, Length, Rectangle, Shell, Size, Widget, }; /// Emit messages on mouse events. @@ -110,12 +110,8 @@ where tree.diff_children(std::slice::from_ref(&self.content)); } - fn width(&self) -> Length { - self.content.as_widget().width() - } - - fn height(&self) -> Length { - self.content.as_widget().height() + fn size(&self) -> Size<Length> { + self.content.as_widget().size() } fn layout( diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index ef39a952..b9e06de8 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -342,12 +342,11 @@ where Renderer: text::Renderer, Renderer::Theme: StyleSheet, { - fn width(&self) -> Length { - Length::Fill - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: Length::Fill, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 3d799fd3..36c785b7 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -265,12 +265,11 @@ where } } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 13110725..d83b0624 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -164,12 +164,11 @@ where tree::State::new(State::<Renderer::Paragraph>::new()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index b84ab2dd..a05923a2 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -85,12 +85,11 @@ where Renderer: crate::core::Renderer, Renderer::Theme: StyleSheet, { - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT)) + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT)), + } } fn layout( diff --git a/widget/src/qr_code.rs b/widget/src/qr_code.rs index 1dc4da7f..a229eb59 100644 --- a/widget/src/qr_code.rs +++ b/widget/src/qr_code.rs @@ -50,12 +50,11 @@ impl<'a> QRCode<'a> { } impl<'a, Message, Theme> Widget<Message, Renderer<Theme>> for QRCode<'a> { - fn width(&self) -> Length { - Length::Shrink - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/radio.rs b/widget/src/radio.rs index ae2365dd..f91b20b1 100644 --- a/widget/src/radio.rs +++ b/widget/src/radio.rs @@ -201,12 +201,11 @@ where tree::State::new(widget::text::State::<Renderer::Paragraph>::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/row.rs b/widget/src/row.rs index ef371ddb..bcbe9267 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -7,7 +7,7 @@ use crate::core::renderer; use crate::core::widget::{Operation, Tree}; use crate::core::{ Alignment, Clipboard, Element, Length, Padding, Pixels, Rectangle, Shell, - Widget, + Size, Widget, }; /// A container that distributes its contents horizontally. @@ -123,12 +123,11 @@ where tree.diff_children(&self.children); } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/rule.rs b/widget/src/rule.rs index ecaedf60..4ab16c40 100644 --- a/widget/src/rule.rs +++ b/widget/src/rule.rs @@ -62,12 +62,11 @@ where Renderer: crate::core::Renderer, Renderer::Theme: StyleSheet, { - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index 525463c4..5197afde 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -220,12 +220,11 @@ where tree.diff_children(std::slice::from_ref(&self.content)); } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/shader.rs b/widget/src/shader.rs index 5b18ec7d..82432c6c 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -70,12 +70,11 @@ where tree::State::new(P::State::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 2b600d9d..27588852 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -159,12 +159,11 @@ where tree::State::new(State::new()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/space.rs b/widget/src/space.rs index afa9a7c8..9fd4dcb9 100644 --- a/widget/src/space.rs +++ b/widget/src/space.rs @@ -45,12 +45,11 @@ impl<Message, Renderer> Widget<Message, Renderer> for Space where Renderer: core::Renderer, { - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/svg.rs b/widget/src/svg.rs index 8367ad18..75ab238a 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -96,12 +96,11 @@ where Renderer: svg::Renderer, Renderer::Theme: iced_style::svg::StyleSheet, { - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 214bce17..9118d124 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -9,7 +9,7 @@ use crate::core::text::highlighter::{self, Highlighter}; use crate::core::text::{self, LineHeight}; use crate::core::widget::{self, Widget}; use crate::core::{ - Clipboard, Color, Element, Length, Padding, Pixels, Rectangle, Shell, + Clipboard, Color, Element, Length, Padding, Pixels, Rectangle, Shell, Size, Vector, }; @@ -316,12 +316,11 @@ where }) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: self.height, + } } fn layout( diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 03eb2fd0..7e91105c 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -283,12 +283,11 @@ where } } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs index d8723080..941159ea 100644 --- a/widget/src/toggler.rs +++ b/widget/src/toggler.rs @@ -168,12 +168,11 @@ where tree::State::new(widget::text::State::<Renderer::Paragraph>::default()) } - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink + fn size(&self) -> Size<Length> { + Size { + width: self.width, + height: Length::Shrink, + } } fn layout( diff --git a/widget/src/tooltip.rs b/widget/src/tooltip.rs index adef13e4..d09a9255 100644 --- a/widget/src/tooltip.rs +++ b/widget/src/tooltip.rs @@ -131,12 +131,8 @@ where widget::tree::Tag::of::<State>() } - fn width(&self) -> Length { - self.content.as_widget().width() - } - - fn height(&self) -> Length { - self.content.as_widget().height() + fn size(&self) -> Size<Length> { + self.content.as_widget().size() } fn layout( diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs index e489104c..35bc2fe2 100644 --- a/widget/src/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -156,12 +156,11 @@ where tree::State::new(State::new()) } - fn width(&self) -> Length { - Length::Shrink - } - - fn height(&self) -> Length { - self.height + fn size(&self) -> Size<Length> { + Size { + width: Length::Shrink, + height: self.height, + } } fn layout( From 4bdd8a62791cfa4864d3d4cf1d5b19c6f227d537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 5 Jan 2024 17:54:10 +0100 Subject: [PATCH 234/286] Fix `cross` axis calculation in `flex` layout --- core/src/layout/flex.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 036b31fd..2a12d57f 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -142,6 +142,7 @@ where let size = layout.size(); available -= axis.main(size); + cross = cross.max(axis.cross(layout.size())); nodes[i] = layout; } From d24e50c1a61eee7bca887224ad583eca60e14d32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 02:12:29 +0100 Subject: [PATCH 235/286] Reduce `padding` of `scrollable` example --- examples/scrollable/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 249bc2a5..4b57a5a4 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -338,7 +338,7 @@ impl Application for ScrollableDemo { .spacing(10) .into(); - Element::from(container(content).padding(40).center_x().center_y()) + container(content).padding(20).center_x().center_y().into() } fn theme(&self) -> Self::Theme { From d62bb8193c1c43f565fcc5c52293d564c91e215d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 06:35:33 +0100 Subject: [PATCH 236/286] Introduce useful helpers in `layout` module --- core/src/layout.rs | 94 ++++++++++++++++++++++- core/src/layout/flex.rs | 2 +- core/src/layout/limits.rs | 7 +- core/src/layout/node.rs | 10 ++- core/src/point.rs | 20 +++-- core/src/widget/text.rs | 35 ++++----- examples/geometry/src/main.rs | 4 +- examples/loading_spinners/src/circular.rs | 5 +- examples/loading_spinners/src/linear.rs | 5 +- widget/src/button.rs | 19 +---- widget/src/canvas.rs | 4 +- widget/src/container.rs | 28 +++---- widget/src/image.rs | 2 +- widget/src/image/viewer.rs | 2 +- widget/src/overlay/menu.rs | 2 +- widget/src/pane_grid.rs | 2 +- widget/src/pick_list.rs | 5 +- widget/src/progress_bar.rs | 8 +- widget/src/rule.rs | 2 +- widget/src/scrollable.rs | 39 +++++----- widget/src/shader.rs | 5 +- widget/src/slider.rs | 4 +- widget/src/space.rs | 2 +- widget/src/svg.rs | 2 +- widget/src/text_input.rs | 4 +- widget/src/vertical_slider.rs | 4 +- 26 files changed, 189 insertions(+), 127 deletions(-) diff --git a/core/src/layout.rs b/core/src/layout.rs index 277473fe..95720aba 100644 --- a/core/src/layout.rs +++ b/core/src/layout.rs @@ -7,7 +7,7 @@ pub mod flex; pub use limits::Limits; pub use node::Node; -use crate::{Point, Rectangle, Size, Vector}; +use crate::{Length, Padding, Point, Rectangle, Size, Vector}; /// The bounds of a [`Node`] and its children, using absolute coordinates. #[derive(Debug, Clone, Copy)] @@ -96,3 +96,95 @@ pub fn next_to_each_other( ], ) } + +/// Computes the resulting [`Node`] that fits the [`Limits`] given +/// some width and height requirements and no intrinsic size. +pub fn atomic( + limits: &Limits, + width: impl Into<Length>, + height: impl Into<Length>, +) -> Node { + let width = width.into(); + let height = height.into(); + + Node::new(limits.resolve(width, height, Size::ZERO)) +} + +/// Computes the resulting [`Node`] that fits the [`Limits`] given +/// some width and height requirements and a closure that produces +/// the intrinsic [`Size`] inside the given [`Limits`]. +pub fn sized( + limits: &Limits, + width: impl Into<Length>, + height: impl Into<Length>, + f: impl FnOnce(&Limits) -> Size, +) -> Node { + let width = width.into(); + let height = height.into(); + + let limits = limits.width(width).height(height); + let intrinsic_size = f(&limits); + + Node::new(limits.resolve(width, height, intrinsic_size)) +} + +/// Computes the resulting [`Node`] that fits the [`Limits`] given +/// some width and height requirements and a closure that produces +/// the content [`Node`] inside the given [`Limits`]. +pub fn contained( + limits: &Limits, + width: impl Into<Length>, + height: impl Into<Length>, + f: impl FnOnce(&Limits) -> Node, +) -> Node { + let width = width.into(); + let height = height.into(); + + let limits = limits.width(width).height(height); + let content = f(&limits); + + Node::with_children( + limits.resolve(width, height, content.size()), + vec![content], + ) +} + +/// Computes the [`Node`] that fits the [`Limits`] given some width, height, and +/// [`Padding`] requirements and a closure that produces the content [`Node`] +/// inside the given [`Limits`]. +pub fn padded( + limits: &Limits, + width: impl Into<Length>, + height: impl Into<Length>, + padding: impl Into<Padding>, + layout: impl FnOnce(&Limits) -> Node, +) -> Node { + positioned(limits, width, height, padding, layout, |content, _| content) +} + +/// Computes a [`padded`] [`Node`] with a positioning step. +pub fn positioned( + limits: &Limits, + width: impl Into<Length>, + height: impl Into<Length>, + padding: impl Into<Padding>, + layout: impl FnOnce(&Limits) -> Node, + position: impl FnOnce(Node, Size) -> Node, +) -> Node { + let width = width.into(); + let height = height.into(); + let padding = padding.into(); + + let limits = limits.width(width).height(height); + let content = layout(&limits.shrink(padding)); + let padding = padding.fit(content.size(), limits.max()); + + let size = limits + .shrink(padding) + .resolve(width, height, content.size()); + + Node::with_children( + size.expand(padding), + vec![position(content.move_to((padding.left, padding.top)), size)], + ) +} diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 2a12d57f..cf3e1340 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -239,9 +239,9 @@ where let (intrinsic_width, intrinsic_height) = axis.pack(main - pad.0, cross); let size = limits.resolve( - Size::new(intrinsic_width, intrinsic_height), width, height, + Size::new(intrinsic_width, intrinsic_height), ); Node::with_children(size.expand(padding), nodes) diff --git a/core/src/layout/limits.rs b/core/src/layout/limits.rs index eef4c4c9..7fbc7b9d 100644 --- a/core/src/layout/limits.rs +++ b/core/src/layout/limits.rs @@ -114,13 +114,14 @@ impl Limits { } } - /// Computes the resulting [`Size`] that fits the [`Limits`] given the - /// intrinsic size of some content. + /// Computes the resulting [`Size`] that fits the [`Limits`] given + /// some width and height requirements and the intrinsic size of + /// some content. pub fn resolve( &self, - intrinsic_size: Size, width: impl Into<Length>, height: impl Into<Length>, + intrinsic_size: Size, ) -> Size { let width = match width.into() { Length::Fill | Length::FillPortion(_) => self.max.width, diff --git a/core/src/layout/node.rs b/core/src/layout/node.rs index 00087431..40c71436 100644 --- a/core/src/layout/node.rs +++ b/core/src/layout/node.rs @@ -89,19 +89,23 @@ impl Node { } /// Moves the [`Node`] to the given position. - pub fn move_to(mut self, position: Point) -> Self { + pub fn move_to(mut self, position: impl Into<Point>) -> Self { self.move_to_mut(position); self } /// Mutable reference version of [`move_to`]. - pub fn move_to_mut(&mut self, position: Point) { + pub fn move_to_mut(&mut self, position: impl Into<Point>) { + let position = position.into(); + self.bounds.x = position.x; self.bounds.y = position.y; } /// Translates the [`Node`] by the given translation. - pub fn translate(self, translation: Vector) -> Self { + pub fn translate(self, translation: impl Into<Vector>) -> Self { + let translation = translation.into(); + Self { bounds: self.bounds + translation, ..self diff --git a/core/src/point.rs b/core/src/point.rs index ef42852f..cea57518 100644 --- a/core/src/point.rs +++ b/core/src/point.rs @@ -36,20 +36,26 @@ impl<T: Num> Point<T> { } } -impl From<[f32; 2]> for Point { - fn from([x, y]: [f32; 2]) -> Self { +impl<T> From<[T; 2]> for Point<T> +where + T: Num, +{ + fn from([x, y]: [T; 2]) -> Self { Point { x, y } } } -impl From<[u16; 2]> for Point<u16> { - fn from([x, y]: [u16; 2]) -> Self { - Point::new(x, y) +impl<T> From<(T, T)> for Point<T> +where + T: Num, +{ + fn from((x, y): (T, T)) -> Self { + Self { x, y } } } -impl From<Point> for [f32; 2] { - fn from(point: Point) -> [f32; 2] { +impl<T> From<Point<T>> for [T; 2] { + fn from(point: Point<T>) -> [T; 2] { [point.x, point.y] } } diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index fe3b77d3..4cabc7ce 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -206,28 +206,27 @@ pub fn layout<Renderer>( where Renderer: text::Renderer, { - let limits = limits.width(width).height(height); - let bounds = limits.max(); + layout::sized(limits, width, height, |limits| { + let bounds = limits.max(); - let size = size.unwrap_or_else(|| renderer.default_size()); - let font = font.unwrap_or_else(|| renderer.default_font()); + let size = size.unwrap_or_else(|| renderer.default_size()); + let font = font.unwrap_or_else(|| renderer.default_font()); - let State(ref mut paragraph) = state; + let State(ref mut paragraph) = state; - paragraph.update(text::Text { - content, - bounds, - size, - line_height, - font, - horizontal_alignment, - vertical_alignment, - shaping, - }); + paragraph.update(text::Text { + content, + bounds, + size, + line_height, + font, + horizontal_alignment, + vertical_alignment, + shaping, + }); - let size = limits.resolve(paragraph.min_bounds(), width, height); - - layout::Node::new(size) + paragraph.min_bounds() + }) } /// Draws text using the same logic as the [`Text`] widget. diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index d6a4c702..5cf9963d 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -29,9 +29,9 @@ mod rainbow { _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.resolve(Size::ZERO, Length::Fill, Length::Shrink); + let width = limits.max().width; - layout::Node::new(Size::new(size.width, size.width)) + layout::Node::new(Size::new(width, width)) } fn draw( diff --git a/examples/loading_spinners/src/circular.rs b/examples/loading_spinners/src/circular.rs index e80617d0..1b163585 100644 --- a/examples/loading_spinners/src/circular.rs +++ b/examples/loading_spinners/src/circular.rs @@ -257,10 +257,7 @@ where _renderer: &iced::Renderer<Theme>, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.size).height(self.size); - let size = limits.resolve(Size::ZERO, self.size, self.size); - - layout::Node::new(size) + layout::atomic(limits, self.size, self.size) } fn on_event( diff --git a/examples/loading_spinners/src/linear.rs b/examples/loading_spinners/src/linear.rs index d205d3f1..d245575c 100644 --- a/examples/loading_spinners/src/linear.rs +++ b/examples/loading_spinners/src/linear.rs @@ -178,10 +178,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO, self.width, self.height); - - layout::Node::new(size) + layout::atomic(limits, self.width, self.height) } fn on_event( diff --git a/widget/src/button.rs b/widget/src/button.rs index 1ce4f662..86abee77 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -10,8 +10,8 @@ use crate::core::touch; use crate::core::widget::tree::{self, Tree}; use crate::core::widget::Operation; use crate::core::{ - Background, Clipboard, Color, Element, Layout, Length, Padding, Point, - Rectangle, Shell, Size, Vector, Widget, + Background, Clipboard, Color, Element, Layout, Length, Padding, Rectangle, + Shell, Size, Vector, Widget, }; pub use iced_style::button::{Appearance, StyleSheet}; @@ -430,20 +430,7 @@ pub fn layout( padding: Padding, layout_content: impl FnOnce(&layout::Limits) -> layout::Node, ) -> layout::Node { - let limits = limits.width(width).height(height); - - let content = layout_content(&limits.shrink(padding)); - let padding = padding.fit(content.size(), limits.max()); - - let size = limits - .shrink(padding) - .resolve(content.size(), width, height) - .expand(padding); - - layout::Node::with_children( - size, - vec![content.move_to(Point::new(padding.left, padding.top))], - ) + layout::padded(limits, width, height, padding, layout_content) } /// Returns the [`mouse::Interaction`] of a [`Button`]. diff --git a/widget/src/canvas.rs b/widget/src/canvas.rs index 2bf09eec..4e42a671 100644 --- a/widget/src/canvas.rs +++ b/widget/src/canvas.rs @@ -133,9 +133,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.resolve(Size::ZERO, self.width, self.height); - - layout::Node::new(size) + layout::atomic(limits, self.width, self.height) } fn on_event( diff --git a/widget/src/container.rs b/widget/src/container.rs index 93d8daba..c98de41c 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -321,27 +321,19 @@ pub fn layout( vertical_alignment: alignment::Vertical, layout_content: impl FnOnce(&layout::Limits) -> layout::Node, ) -> layout::Node { - let limits = limits - .width(width) - .height(height) - .max_width(max_width) - .max_height(max_height); - - let content = layout_content(&limits.shrink(padding).loose()); - let padding = padding.fit(content.size(), limits.max()); - let size = limits - .shrink(padding) - .resolve(content.size(), width, height); - - layout::Node::with_children( - size.expand(padding), - vec![content - .move_to(Point::new(padding.left, padding.top)) - .align( + layout::positioned( + &limits.max_width(max_width).max_height(max_height), + width, + height, + padding, + |limits| layout_content(&limits.loose()), + |content, size| { + content.align( Alignment::from(horizontal_alignment), Alignment::from(vertical_alignment), size, - )], + ) + }, ) } diff --git a/widget/src/image.rs b/widget/src/image.rs index 6750c1b3..e906ac13 100644 --- a/widget/src/image.rs +++ b/widget/src/image.rs @@ -99,7 +99,7 @@ where }; // The size to be available to the widget prior to `Shrink`ing - let raw_size = limits.resolve(image_size, width, height); + let raw_size = limits.resolve(width, height, image_size); // The uncropped size of the image when fit to the bounds above let full_size = content_fit.fit(image_size, raw_size); diff --git a/widget/src/image/viewer.rs b/widget/src/image/viewer.rs index dc910f1f..98080577 100644 --- a/widget/src/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -113,9 +113,9 @@ where let Size { width, height } = renderer.dimensions(&self.handle); let mut size = limits.resolve( - Size::new(width as f32, height as f32), self.width, self.height, + Size::new(width as f32, height as f32), ); let expansion_size = if height > width { diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index b9e06de8..f83eebea 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -369,7 +369,7 @@ where * self.options.len() as f32, ); - limits.resolve(intrinsic, Length::Fill, Length::Shrink) + limits.resolve(Length::Fill, Length::Shrink, intrinsic) }; layout::Node::new(size) diff --git a/widget/src/pane_grid.rs b/widget/src/pane_grid.rs index 36c785b7..cf1f0455 100644 --- a/widget/src/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -489,7 +489,7 @@ pub fn layout<Renderer, T>( &layout::Limits, ) -> layout::Node, ) -> layout::Node { - let size = limits.resolve(Size::ZERO, width, height); + let size = limits.resolve(width, height, Size::ZERO); let regions = node.pane_regions(spacing, size); let children = contents diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index d83b0624..2576a1e8 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -392,7 +392,6 @@ where { use std::f32; - let limits = limits.width(width).height(Length::Shrink); let font = font.unwrap_or_else(|| renderer.default_font()); let text_size = text_size.unwrap_or_else(|| renderer.default_size()); @@ -451,8 +450,10 @@ where ); limits + .width(width) + .height(Length::Shrink) .shrink(padding) - .resolve(intrinsic, width, Length::Shrink) + .resolve(width, Length::Shrink, intrinsic) .expand(padding) }; diff --git a/widget/src/progress_bar.rs b/widget/src/progress_bar.rs index a05923a2..15f1277b 100644 --- a/widget/src/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -98,13 +98,11 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.resolve( - Size::ZERO, + layout::atomic( + limits, self.width, self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT)), - ); - - layout::Node::new(size) + ) } fn draw( diff --git a/widget/src/rule.rs b/widget/src/rule.rs index 4ab16c40..cded9cb1 100644 --- a/widget/src/rule.rs +++ b/widget/src/rule.rs @@ -75,7 +75,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - layout::Node::new(limits.resolve(Size::ZERO, self.width, self.height)) + layout::atomic(limits, self.width, self.height) } fn draw( diff --git a/widget/src/scrollable.rs b/widget/src/scrollable.rs index 5197afde..70db490a 100644 --- a/widget/src/scrollable.rs +++ b/widget/src/scrollable.rs @@ -469,28 +469,25 @@ pub fn layout<Renderer>( direction: &Direction, layout_content: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node, ) -> layout::Node { - let limits = limits.width(width).height(height); + layout::contained(limits, width, height, |limits| { + let child_limits = layout::Limits::new( + Size::new(limits.min().width, limits.min().height), + Size::new( + if direction.horizontal().is_some() { + f32::INFINITY + } else { + limits.max().width + }, + if direction.vertical().is_some() { + f32::MAX + } else { + limits.max().height + }, + ), + ); - let child_limits = layout::Limits::new( - Size::new(limits.min().width, limits.min().height), - Size::new( - if direction.horizontal().is_some() { - f32::INFINITY - } else { - limits.max().width - }, - if direction.vertical().is_some() { - f32::MAX - } else { - limits.max().height - }, - ), - ); - - let content = layout_content(renderer, &child_limits); - let size = limits.resolve(content.size(), width, height); - - layout::Node::with_children(size, vec![content]) + layout_content(renderer, &child_limits) + }) } /// Processes an [`Event`] and updates the [`State`] of a [`Scrollable`] diff --git a/widget/src/shader.rs b/widget/src/shader.rs index 82432c6c..16b68c55 100644 --- a/widget/src/shader.rs +++ b/widget/src/shader.rs @@ -83,10 +83,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - let size = limits.resolve(Size::ZERO, self.width, self.height); - - layout::Node::new(size) + layout::atomic(limits, self.width, self.height) } fn on_event( diff --git a/widget/src/slider.rs b/widget/src/slider.rs index 27588852..1bc94661 100644 --- a/widget/src/slider.rs +++ b/widget/src/slider.rs @@ -172,9 +172,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.resolve(Size::ZERO, self.width, self.height); - - layout::Node::new(size) + layout::atomic(limits, self.width, self.height) } fn on_event( diff --git a/widget/src/space.rs b/widget/src/space.rs index 9fd4dcb9..eef990d1 100644 --- a/widget/src/space.rs +++ b/widget/src/space.rs @@ -58,7 +58,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - layout::Node::new(limits.resolve(Size::ZERO, self.width, self.height)) + layout::atomic(limits, self.width, self.height) } fn draw( diff --git a/widget/src/svg.rs b/widget/src/svg.rs index 75ab238a..830abb0f 100644 --- a/widget/src/svg.rs +++ b/widget/src/svg.rs @@ -114,7 +114,7 @@ where let image_size = Size::new(width as f32, height as f32); // The size to be available to the widget prior to `Shrink`ing - let raw_size = limits.resolve(image_size, self.width, self.height); + let raw_size = limits.resolve(self.width, self.height, image_size); // The uncropped size of the image when fit to the bounds above let full_size = self.content_fit.fit(image_size, raw_size); diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 7e91105c..d8540658 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -508,8 +508,8 @@ where let padding = padding.fit(Size::ZERO, limits.max()); let height = line_height.to_absolute(text_size); - let limits = limits.width(width).shrink(padding).height(height); - let text_bounds = limits.resolve(Size::ZERO, width, height); + let limits = limits.width(width).shrink(padding); + let text_bounds = limits.resolve(width, height, Size::ZERO); let placeholder_text = Text { font, diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs index 35bc2fe2..a3029d76 100644 --- a/widget/src/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -169,9 +169,7 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let size = limits.resolve(Size::ZERO, self.width, self.height); - - layout::Node::new(size) + layout::atomic(limits, self.width, self.height) } fn on_event( From e710e7694907fe320e0a849e880c51952e6e748f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 06:44:15 +0100 Subject: [PATCH 237/286] Fix `size_hint` for `keyed_column` --- examples/todos/src/main.rs | 9 +------- widget/src/helpers.rs | 1 + widget/src/keyed/column.rs | 45 +++++++++++++++++++++----------------- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index 4dac032c..aad47c20 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -254,13 +254,7 @@ impl Application for Todos { .spacing(20) .max_width(800); - scrollable( - container(content) - .width(Length::Fill) - .padding(40) - .center_x(), - ) - .into() + scrollable(container(content).padding(40).center_x()).into() } } } @@ -472,7 +466,6 @@ fn empty_message(message: &str) -> Element<'_, Message> { .horizontal_alignment(alignment::Horizontal::Center) .style(Color::from([0.7, 0.7, 0.7])), ) - .width(Length::Fill) .height(200) .center_y() .into() diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 6eaf3392..75528a0c 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -80,6 +80,7 @@ pub fn keyed_column<'a, Key, Message, Renderer>( ) -> keyed::Column<'a, Key, Message, Renderer> where Key: Copy + PartialEq, + Renderer: core::Renderer, { keyed::Column::with_children(children) } diff --git a/widget/src/keyed/column.rs b/widget/src/keyed/column.rs index 32320300..7f05a81e 100644 --- a/widget/src/keyed/column.rs +++ b/widget/src/keyed/column.rs @@ -30,26 +30,10 @@ where impl<'a, Key, Message, Renderer> Column<'a, Key, Message, Renderer> where Key: Copy + PartialEq, + Renderer: crate::core::Renderer, { /// Creates an empty [`Column`]. pub fn new() -> Self { - Self::with_children(Vec::new()) - } - - /// Creates a [`Column`] with the given elements. - pub fn with_children( - children: impl IntoIterator<Item = (Key, Element<'a, Message, Renderer>)>, - ) -> Self { - let (keys, children) = children.into_iter().fold( - (Vec::new(), Vec::new()), - |(mut keys, mut children), (key, child)| { - keys.push(key); - children.push(child); - - (keys, children) - }, - ); - Column { spacing: 0.0, padding: Padding::ZERO, @@ -57,11 +41,20 @@ where height: Length::Shrink, max_width: f32::INFINITY, align_items: Alignment::Start, - keys, - children, + keys: Vec::new(), + children: Vec::new(), } } + /// Creates a [`Column`] with the given elements. + pub fn with_children( + children: impl IntoIterator<Item = (Key, Element<'a, Message, Renderer>)>, + ) -> Self { + children + .into_iter() + .fold(Self::new(), |column, (key, child)| column.push(key, child)) + } + /// Sets the vertical spacing _between_ elements. /// /// Custom margins per element do not exist in iced. You should use this @@ -108,8 +101,19 @@ where key: Key, child: impl Into<Element<'a, Message, Renderer>>, ) -> Self { + let child = child.into(); + let size = child.as_widget().size_hint(); + + if size.width.is_fill() { + self.width = Length::Fill; + } + + if size.height.is_fill() { + self.height = Length::Fill; + } + self.keys.push(key); - self.children.push(child.into()); + self.children.push(child); self } } @@ -117,6 +121,7 @@ where impl<'a, Key, Message, Renderer> Default for Column<'a, Key, Message, Renderer> where Key: Copy + PartialEq, + Renderer: crate::core::Renderer, { fn default() -> Self { Self::new() From 67277fbf93f4c180eff67bdc4c9dcf84a54d3425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 06:46:49 +0100 Subject: [PATCH 238/286] Make `column` and `row` take an `IntoIterator` --- widget/src/column.rs | 4 ++-- widget/src/helpers.rs | 8 ++++---- widget/src/row.rs | 6 ++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/widget/src/column.rs b/widget/src/column.rs index 9867d97e..d6eea84b 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -41,9 +41,9 @@ where /// Creates a [`Column`] with the given elements. pub fn with_children( - children: impl Iterator<Item = Element<'a, Message, Renderer>>, + children: impl IntoIterator<Item = Element<'a, Message, Renderer>>, ) -> Self { - children.fold(Self::new(), |column, element| column.push(element)) + children.into_iter().fold(Self::new(), Self::push) } /// Sets the vertical spacing _between_ elements. diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 75528a0c..4b988ae3 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -34,7 +34,7 @@ macro_rules! column { $crate::Column::new() ); ($($x:expr),+ $(,)?) => ( - $crate::Column::with_children([$($crate::core::Element::from($x)),+].into_iter()) + $crate::Column::with_children([$($crate::core::Element::from($x)),+]) ); } @@ -47,7 +47,7 @@ macro_rules! row { $crate::Row::new() ); ($($x:expr),+ $(,)?) => ( - $crate::Row::with_children([$($crate::core::Element::from($x)),+].into_iter()) + $crate::Row::with_children([$($crate::core::Element::from($x)),+]) ); } @@ -66,7 +66,7 @@ where /// Creates a new [`Column`] with the given children. pub fn column<'a, Message, Renderer>( - children: impl Iterator<Item = Element<'a, Message, Renderer>>, + children: impl IntoIterator<Item = Element<'a, Message, Renderer>>, ) -> Column<'a, Message, Renderer> where Renderer: core::Renderer, @@ -89,7 +89,7 @@ where /// /// [`Row`]: crate::Row pub fn row<'a, Message, Renderer>( - children: impl Iterator<Item = Element<'a, Message, Renderer>>, + children: impl IntoIterator<Item = Element<'a, Message, Renderer>>, ) -> Row<'a, Message, Renderer> where Renderer: core::Renderer, diff --git a/widget/src/row.rs b/widget/src/row.rs index bcbe9267..90fd2926 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -39,11 +39,9 @@ where /// Creates a [`Row`] with the given elements. pub fn with_children( - children: impl Iterator<Item = Element<'a, Message, Renderer>>, + children: impl IntoIterator<Item = Element<'a, Message, Renderer>>, ) -> Self { - children - .into_iter() - .fold(Self::new(), |column, element| column.push(element)) + children.into_iter().fold(Self::new(), Self::push) } /// Sets the horizontal spacing _between_ elements. From ecf571dfeb033f3768fccfb06bc9380e59281df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 06:47:52 +0100 Subject: [PATCH 239/286] Fix unnecessary `into` call in `Container::new` --- widget/src/container.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widget/src/container.rs b/widget/src/container.rs index c98de41c..ecc5c651 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -67,7 +67,7 @@ where horizontal_alignment: alignment::Horizontal::Left, vertical_alignment: alignment::Vertical::Top, style: Default::default(), - content: content.into(), + content, } } From 025064c9e028ea65cc0c6ff236d42e9861efdda9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 07:01:11 +0100 Subject: [PATCH 240/286] Fix broken doc links in `layout::Node` API --- core/src/layout/node.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/layout/node.rs b/core/src/layout/node.rs index 40c71436..5743a9bd 100644 --- a/core/src/layout/node.rs +++ b/core/src/layout/node.rs @@ -60,7 +60,7 @@ impl Node { self } - /// Mutable reference version of [`align`]. + /// Mutable reference version of [`Self::align`]. pub fn align_mut( &mut self, horizontal_alignment: Alignment, @@ -94,7 +94,7 @@ impl Node { self } - /// Mutable reference version of [`move_to`]. + /// Mutable reference version of [`Self::move_to`]. pub fn move_to_mut(&mut self, position: impl Into<Point>) { let position = position.into(); From 88f8c343fa7d69203ab98bb7abc85fe002014422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 9 Jan 2024 07:15:57 +0100 Subject: [PATCH 241/286] Fix `cross` calculation in `layout::flex` --- core/src/layout/flex.rs | 27 +++++++++++++-------------- examples/pick_list/src/main.rs | 10 +++------- widget/src/pick_list.rs | 1 - 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index cf3e1340..47cd7112 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -79,7 +79,17 @@ where let max_cross = axis.cross(limits.max()); let mut fill_main_sum = 0; - let mut cross = 0.0f32; + let mut cross = match axis { + Axis::Horizontal => match height { + Length::Shrink => 0.0, + _ => max_cross, + }, + Axis::Vertical => match width { + Length::Shrink => 0.0, + _ => max_cross, + }, + }; + let mut available = axis.main(limits.max()) - total_spacing; let mut nodes: Vec<Node> = Vec::with_capacity(items.len()); @@ -113,17 +123,6 @@ where } } - let intrinsic_cross = match axis { - Axis::Horizontal => match height { - Length::Shrink => cross, - _ => max_cross, - }, - Axis::Vertical => match width { - Length::Shrink => cross, - _ => max_cross, - }, - }; - for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() { let (fill_main_factor, fill_cross_factor) = { let size = child.as_widget().size(); @@ -132,7 +131,7 @@ where }; if fill_main_factor == 0 && fill_cross_factor != 0 { - let (max_width, max_height) = axis.pack(available, intrinsic_cross); + let (max_width, max_height) = axis.pack(available, cross); let child_limits = Limits::new(Size::ZERO, Size::new(max_width, max_height)); @@ -182,7 +181,7 @@ where let max_cross = if fill_cross_factor == 0 { max_cross } else { - intrinsic_cross + cross }; let (min_width, min_height) = diff --git a/examples/pick_list/src/main.rs b/examples/pick_list/src/main.rs index bfd642f5..e4d96dc8 100644 --- a/examples/pick_list/src/main.rs +++ b/examples/pick_list/src/main.rs @@ -1,4 +1,4 @@ -use iced::widget::{column, container, pick_list, scrollable, vertical_space}; +use iced::widget::{column, pick_list, scrollable, vertical_space}; use iced::{Alignment, Element, Length, Sandbox, Settings}; pub fn main() -> iced::Result { @@ -48,15 +48,11 @@ impl Sandbox for Example { pick_list, vertical_space(600), ] + .width(Length::Fill) .align_items(Alignment::Center) .spacing(10); - container(scrollable(content)) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into() + scrollable(content).into() } } diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 2576a1e8..9f6a371a 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -451,7 +451,6 @@ where limits .width(width) - .height(Length::Shrink) .shrink(padding) .resolve(width, Length::Shrink, intrinsic) .expand(padding) From a79b2adf5c3e345667341451a4aaaa14fc9bfe80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 02:16:29 +0100 Subject: [PATCH 242/286] Use first-class functions in `layout` example --- examples/layout/src/main.rs | 143 +++++++++++++++++++++--------------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index eeaa76b6..d4d81617 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -1,4 +1,5 @@ use iced::executor; +use iced::keyboard; use iced::widget::{column, container, row, text, vertical_rule}; use iced::{ Application, Command, Element, Length, Settings, Subscription, Theme, @@ -10,9 +11,7 @@ pub fn main() -> iced::Result { #[derive(Debug)] struct Layout { - previous: Vec<Example>, - current: Example, - next: Vec<Example>, + example: Example, } #[derive(Debug, Clone, Copy)] @@ -30,36 +29,23 @@ impl Application for Layout { fn new(_flags: Self::Flags) -> (Self, Command<Message>) { ( Self { - previous: vec![], - current: Example::Centered, - next: vec![Example::NestedQuotes], + example: Example::default(), }, Command::none(), ) } fn title(&self) -> String { - String::from("Counter - Iced") + format!("{} - Layout - Iced", self.example.title) } fn update(&mut self, message: Self::Message) -> Command<Message> { match message { Message::Next => { - if !self.next.is_empty() { - let previous = std::mem::replace( - &mut self.current, - self.next.remove(0), - ); - - self.previous.push(previous); - } + self.example = self.example.next(); } Message::Previous => { - if let Some(previous) = self.previous.pop() { - let next = std::mem::replace(&mut self.current, previous); - - self.next.insert(0, next); - } + self.example = self.example.previous(); } } @@ -67,57 +53,94 @@ impl Application for Layout { } fn subscription(&self) -> Subscription<Message> { - use iced::event::{self, Event}; - use iced::keyboard; - - event::listen_with(|event, status| match event { - Event::Keyboard(keyboard::Event::KeyReleased { - key_code, .. - }) if status == event::Status::Ignored => match key_code { - keyboard::KeyCode::Left => Some(Message::Previous), - keyboard::KeyCode::Right => Some(Message::Next), - _ => None, - }, + keyboard::on_key_release(|key_code, _modifiers| match key_code { + keyboard::KeyCode::Left => Some(Message::Previous), + keyboard::KeyCode::Right => Some(Message::Next), _ => None, }) } fn view(&self) -> Element<Message> { - self.current.view() + self.example.view() } } -#[derive(Debug)] -enum Example { - Centered, - NestedQuotes, +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct Example { + title: &'static str, + view: fn() -> Element<'static, Message>, } impl Example { + const LIST: &'static [Self] = &[ + Self { + title: "Centered", + view: centered, + }, + Self { + title: "Nested Quotes", + view: nested_quotes, + }, + ]; + + fn previous(self) -> Self { + let Some(index) = + Self::LIST.iter().position(|&example| example == self) + else { + return self; + }; + + Self::LIST + .get(index.saturating_sub(1)) + .copied() + .unwrap_or(self) + } + + fn next(self) -> Self { + let Some(index) = + Self::LIST.iter().position(|&example| example == self) + else { + return self; + }; + + Self::LIST.get(index + 1).copied().unwrap_or(self) + } + fn view(&self) -> Element<Message> { - match self { - Self::Centered => container(text("I am centered!").size(50)) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into(), - Self::NestedQuotes => container((1..5).fold( - column![text("Original text")].padding(10), - |quotes, i| { - column![ - row![vertical_rule(2), quotes].height(Length::Shrink), - text(format!("Reply {i}")) - ] - .spacing(10) - .padding(10) - }, - )) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into(), - } + (self.view)() } } + +impl Default for Example { + fn default() -> Self { + Self::LIST[0] + } +} + +fn centered<'a>() -> Element<'a, Message> { + container(text("I am centered!").size(50)) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() +} + +fn nested_quotes<'a>() -> Element<'a, Message> { + container((1..5).fold( + column![text("Original text")].padding(10), + |quotes, i| { + column![ + row![vertical_rule(2), quotes].height(Length::Shrink), + text(format!("Reply {i}")) + ] + .spacing(10) + .padding(10) + }, + )) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() +} From 81ecc4a67f7982c6300a4d5e8ec4e8aac8cbd881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 02:58:40 +0100 Subject: [PATCH 243/286] Add basic controls to `layout` example --- examples/layout/src/main.rs | 67 +++++++++++++++++++++++++++++-------- style/src/container.rs | 26 +++++++++++++- style/src/theme.rs | 6 ++++ 3 files changed, 84 insertions(+), 15 deletions(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index d4d81617..6d02434d 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -1,8 +1,11 @@ use iced::executor; use iced::keyboard; -use iced::widget::{column, container, row, text, vertical_rule}; +use iced::widget::{ + button, column, container, horizontal_space, row, text, vertical_rule, +}; use iced::{ - Application, Command, Element, Length, Settings, Subscription, Theme, + color, Application, Color, Command, Element, Length, Settings, + Subscription, Theme, }; pub fn main() -> iced::Result { @@ -61,7 +64,29 @@ impl Application for Layout { } fn view(&self) -> Element<Message> { - self.example.view() + let example = container(self.example.view()).style( + container::Appearance::default().with_border(Color::BLACK, 2.0), + ); + + let controls = row([ + (!self.example.is_first()).then_some( + button("← Previous") + .padding([5, 10]) + .on_press(Message::Previous) + .into(), + ), + Some(horizontal_space(Length::Fill).into()), + (!self.example.is_last()).then_some( + button("Next →") + .padding([5, 10]) + .on_press(Message::Next) + .into(), + ), + ] + .into_iter() + .filter_map(std::convert::identity)); + + column![example, controls].spacing(10).padding(20).into() } } @@ -83,6 +108,14 @@ impl Example { }, ]; + fn is_first(self) -> bool { + Self::LIST.first() == Some(&self) + } + + fn is_last(self) -> bool { + Self::LIST.last() == Some(&self) + } + fn previous(self) -> Self { let Some(index) = Self::LIST.iter().position(|&example| example == self) @@ -127,20 +160,26 @@ fn centered<'a>() -> Element<'a, Message> { } fn nested_quotes<'a>() -> Element<'a, Message> { - container((1..5).fold( - column![text("Original text")].padding(10), - |quotes, i| { + let quotes = + (1..5).fold(column![text("Original text")].padding(10), |quotes, i| { column![ - row![vertical_rule(2), quotes].height(Length::Shrink), + container( + row![vertical_rule(2), quotes].height(Length::Shrink) + ) + .style( + container::Appearance::default() + .with_background(color!(0x000000, 0.05)) + ), text(format!("Reply {i}")) ] .spacing(10) .padding(10) - }, - )) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() - .into() + }); + + container(quotes) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y() + .into() } diff --git a/style/src/container.rs b/style/src/container.rs index ec543ae4..490a9dab 100644 --- a/style/src/container.rs +++ b/style/src/container.rs @@ -1,5 +1,5 @@ //! Change the appearance of a container. -use iced_core::{Background, BorderRadius, Color}; +use crate::core::{Background, BorderRadius, Color, Pixels}; /// The appearance of a container. #[derive(Debug, Clone, Copy)] @@ -16,6 +16,30 @@ pub struct Appearance { pub border_color: Color, } +impl Appearance { + /// Derives a new [`Appearance`] with a border of the given [`Color`] and + /// `width`. + pub fn with_border( + self, + color: impl Into<Color>, + width: impl Into<Pixels>, + ) -> Self { + Self { + border_color: color.into(), + border_width: width.into().0, + ..self + } + } + + /// Derives a new [`Appearance`] with the given [`Background`]. + pub fn with_background(self, background: impl Into<Background>) -> Self { + Self { + background: Some(background.into()), + ..self + } + } +} + impl std::default::Default for Appearance { fn default() -> Self { Self { diff --git a/style/src/theme.rs b/style/src/theme.rs index 47010728..eafb0b47 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -383,6 +383,12 @@ pub enum Container { Custom(Box<dyn container::StyleSheet<Style = Theme>>), } +impl From<container::Appearance> for Container { + fn from(appearance: container::Appearance) -> Self { + Self::Custom(Box::new(move |_: &_| appearance)) + } +} + impl<T: Fn(&Theme) -> container::Appearance + 'static> From<T> for Container { fn from(f: T) -> Self { Self::Custom(Box::new(f)) From 5dbded61dea19f77eb370e08e72acfa20ffd1a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 03:07:10 +0100 Subject: [PATCH 244/286] Use `flatten` instead of `filter_map` in `layout` example --- examples/layout/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 6d02434d..448d2995 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -84,7 +84,7 @@ impl Application for Layout { ), ] .into_iter() - .filter_map(std::convert::identity)); + .flatten()); column![example, controls].spacing(10).padding(20).into() } From d76705df29f1960124bd06277683448e18f788b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 03:56:39 +0100 Subject: [PATCH 245/286] Add `explain` toggle to `layout` example --- examples/layout/src/main.rs | 64 ++++++++++++++++++++++++++++++------- style/src/theme/palette.rs | 3 ++ 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 448d2995..e23b2218 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -1,11 +1,12 @@ use iced::executor; use iced::keyboard; use iced::widget::{ - button, column, container, horizontal_space, row, text, vertical_rule, + button, checkbox, column, container, horizontal_space, row, text, + vertical_rule, }; use iced::{ - color, Application, Color, Command, Element, Length, Settings, - Subscription, Theme, + color, Alignment, Application, Color, Command, Element, Font, Length, + Settings, Subscription, Theme, }; pub fn main() -> iced::Result { @@ -15,12 +16,14 @@ pub fn main() -> iced::Result { #[derive(Debug)] struct Layout { example: Example, + explain: bool, } #[derive(Debug, Clone, Copy)] enum Message { Next, Previous, + ExplainToggled(bool), } impl Application for Layout { @@ -33,6 +36,7 @@ impl Application for Layout { ( Self { example: Example::default(), + explain: false, }, Command::none(), ) @@ -50,6 +54,9 @@ impl Application for Layout { Message::Previous => { self.example = self.example.previous(); } + Message::ExplainToggled(explain) => { + self.explain = explain; + } } Command::none() @@ -64,9 +71,24 @@ impl Application for Layout { } fn view(&self) -> Element<Message> { - let example = container(self.example.view()).style( - container::Appearance::default().with_border(Color::BLACK, 2.0), - ); + let header = row![ + text(self.example.title).size(20).font(Font::MONOSPACE), + horizontal_space(Length::Fill), + checkbox("Explain", self.explain, Message::ExplainToggled), + ] + .align_items(Alignment::Center); + + let example = container(if self.explain { + self.example.view().explain(color!(0x0000ff)) + } else { + self.example.view() + }) + .style(|theme: &Theme| { + let palette = theme.extended_palette(); + + container::Appearance::default() + .with_border(palette.background.strong.color, 4.0) + }); let controls = row([ (!self.example.is_first()).then_some( @@ -86,7 +108,14 @@ impl Application for Layout { .into_iter() .flatten()); - column![example, controls].spacing(10).padding(20).into() + column![header, example, controls] + .spacing(10) + .padding(20) + .into() + } + + fn theme(&self) -> Theme { + Theme::Dark } } @@ -166,10 +195,23 @@ fn nested_quotes<'a>() -> Element<'a, Message> { container( row![vertical_rule(2), quotes].height(Length::Shrink) ) - .style( - container::Appearance::default() - .with_background(color!(0x000000, 0.05)) - ), + .style(|theme: &Theme| { + let palette = theme.extended_palette(); + + container::Appearance::default().with_background( + if palette.is_dark { + Color { + a: 0.01, + ..Color::WHITE + } + } else { + Color { + a: 0.08, + ..Color::BLACK + } + }, + ) + }), text(format!("Reply {i}")) ] .spacing(10) diff --git a/style/src/theme/palette.rs b/style/src/theme/palette.rs index aaeb799d..76977a29 100644 --- a/style/src/theme/palette.rs +++ b/style/src/theme/palette.rs @@ -82,6 +82,8 @@ pub struct Extended { pub success: Success, /// The set of danger colors. pub danger: Danger, + /// Whether the palette is dark or not. + pub is_dark: bool, } /// The built-in light variant of an [`Extended`] palette. @@ -113,6 +115,7 @@ impl Extended { palette.background, palette.text, ), + is_dark: is_dark(palette.background), } } } From 3850a46db6e13f2948f5731f4ceec42764391f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 08:15:05 +0100 Subject: [PATCH 246/286] Add `Theme` selector to `layout` example --- examples/layout/src/main.rs | 20 ++++++++++++++++---- examples/styling/src/main.rs | 17 ++++++++++------- style/src/theme.rs | 36 ++++++++++++++++++++++++++++++------ widget/src/helpers.rs | 2 +- widget/src/pick_list.rs | 6 +++--- 5 files changed, 60 insertions(+), 21 deletions(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index e23b2218..c1ff3951 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -1,8 +1,8 @@ use iced::executor; use iced::keyboard; use iced::widget::{ - button, checkbox, column, container, horizontal_space, row, text, - vertical_rule, + button, checkbox, column, container, horizontal_space, pick_list, row, + text, vertical_rule, }; use iced::{ color, Alignment, Application, Color, Command, Element, Font, Length, @@ -17,13 +17,15 @@ pub fn main() -> iced::Result { struct Layout { example: Example, explain: bool, + theme: Theme, } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] enum Message { Next, Previous, ExplainToggled(bool), + ThemeSelected(Theme), } impl Application for Layout { @@ -37,6 +39,7 @@ impl Application for Layout { Self { example: Example::default(), explain: false, + theme: Theme::Light, }, Command::none(), ) @@ -57,6 +60,9 @@ impl Application for Layout { Message::ExplainToggled(explain) => { self.explain = explain; } + Message::ThemeSelected(theme) => { + self.theme = theme; + } } Command::none() @@ -75,7 +81,13 @@ impl Application for Layout { text(self.example.title).size(20).font(Font::MONOSPACE), horizontal_space(Length::Fill), checkbox("Explain", self.explain, Message::ExplainToggled), + pick_list( + Theme::ALL, + Some(self.theme.clone()), + Message::ThemeSelected + ), ] + .spacing(20) .align_items(Alignment::Center); let example = container(if self.explain { @@ -115,7 +127,7 @@ impl Application for Layout { } fn theme(&self) -> Theme { - Theme::Dark + self.theme.clone() } } diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs index f14f6a8f..10f3c79d 100644 --- a/examples/styling/src/main.rs +++ b/examples/styling/src/main.rs @@ -53,13 +53,16 @@ impl Sandbox for Styling { self.theme = match theme { ThemeType::Light => Theme::Light, ThemeType::Dark => Theme::Dark, - ThemeType::Custom => Theme::custom(theme::Palette { - background: Color::from_rgb(1.0, 0.9, 1.0), - text: Color::BLACK, - primary: Color::from_rgb(0.5, 0.5, 0.0), - success: Color::from_rgb(0.0, 1.0, 0.0), - danger: Color::from_rgb(1.0, 0.0, 0.0), - }), + ThemeType::Custom => Theme::custom( + String::from("Custom"), + theme::Palette { + background: Color::from_rgb(1.0, 0.9, 1.0), + text: Color::BLACK, + primary: Color::from_rgb(0.5, 0.5, 0.0), + success: Color::from_rgb(0.0, 1.0, 0.0), + danger: Color::from_rgb(1.0, 0.0, 0.0), + }, + ), } } Message::InputChanged(value) => self.input_value = value, diff --git a/style/src/theme.rs b/style/src/theme.rs index eafb0b47..deccf455 100644 --- a/style/src/theme.rs +++ b/style/src/theme.rs @@ -23,6 +23,7 @@ use crate::toggler; use iced_core::{Background, Color, Vector}; +use std::fmt; use std::rc::Rc; /// A built-in theme. @@ -38,18 +39,22 @@ pub enum Theme { } impl Theme { + /// A list with all the defined themes. + pub const ALL: &'static [Self] = &[Self::Light, Self::Dark]; + /// Creates a new custom [`Theme`] from the given [`Palette`]. - pub fn custom(palette: Palette) -> Self { - Self::custom_with_fn(palette, palette::Extended::generate) + pub fn custom(name: String, palette: Palette) -> Self { + Self::custom_with_fn(name, palette, palette::Extended::generate) } /// Creates a new custom [`Theme`] from the given [`Palette`], with /// a custom generator of a [`palette::Extended`]. pub fn custom_with_fn( + name: String, palette: Palette, generate: impl FnOnce(Palette) -> palette::Extended, ) -> Self { - Self::Custom(Box::new(Custom::with_fn(palette, generate))) + Self::Custom(Box::new(Custom::with_fn(name, palette, generate))) } /// Returns the [`Palette`] of the [`Theme`]. @@ -71,32 +76,51 @@ impl Theme { } } +impl fmt::Display for Theme { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Light => write!(f, "Light"), + Self::Dark => write!(f, "Dark"), + Self::Custom(custom) => custom.fmt(f), + } + } +} + /// A [`Theme`] with a customized [`Palette`]. -#[derive(Debug, Clone, Copy, PartialEq)] +#[derive(Debug, Clone, PartialEq)] pub struct Custom { + name: String, palette: Palette, extended: palette::Extended, } impl Custom { /// Creates a [`Custom`] theme from the given [`Palette`]. - pub fn new(palette: Palette) -> Self { - Self::with_fn(palette, palette::Extended::generate) + pub fn new(name: String, palette: Palette) -> Self { + Self::with_fn(name, palette, palette::Extended::generate) } /// Creates a [`Custom`] theme from the given [`Palette`] with /// a custom generator of a [`palette::Extended`]. pub fn with_fn( + name: String, palette: Palette, generate: impl FnOnce(Palette) -> palette::Extended, ) -> Self { Self { + name, palette, extended: generate(palette), } } } +impl fmt::Display for Custom { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.name) + } +} + /// The style of an application. #[derive(Default)] pub enum Application { diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 4b988ae3..498dd76c 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -271,7 +271,7 @@ pub fn pick_list<'a, Message, Renderer, T>( on_selected: impl Fn(T) -> Message + 'a, ) -> PickList<'a, T, Message, Renderer> where - T: ToString + Eq + 'static, + T: ToString + PartialEq + 'static, [T]: ToOwned<Owned = Vec<T>>, Renderer: core::text::Renderer, Renderer::Theme: pick_list::StyleSheet diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 9f6a371a..2e3aab6f 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -45,7 +45,7 @@ where impl<'a, T: 'a, Message, Renderer> PickList<'a, T, Message, Renderer> where - T: ToString + Eq, + T: ToString + PartialEq, [T]: ToOwned<Owned = Vec<T>>, Renderer: text::Renderer, Renderer::Theme: StyleSheet @@ -145,7 +145,7 @@ where impl<'a, T: 'a, Message, Renderer> Widget<Message, Renderer> for PickList<'a, T, Message, Renderer> where - T: Clone + ToString + Eq + 'static, + T: Clone + ToString + PartialEq + 'static, [T]: ToOwned<Owned = Vec<T>>, Message: 'a, Renderer: text::Renderer + 'a, @@ -281,7 +281,7 @@ where impl<'a, T: 'a, Message, Renderer> From<PickList<'a, T, Message, Renderer>> for Element<'a, Message, Renderer> where - T: Clone + ToString + Eq + 'static, + T: Clone + ToString + PartialEq + 'static, [T]: ToOwned<Owned = Vec<T>>, Message: 'a, Renderer: text::Renderer + 'a, From a6cbc365037d740ee9bb8d21fffe361cd198477e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 09:01:01 +0100 Subject: [PATCH 247/286] Showcase more layouts in `layout` example --- examples/layout/Cargo.toml | 2 +- examples/layout/src/main.rs | 144 ++++++++++++++++++++++++++++++++---- 2 files changed, 132 insertions(+), 14 deletions(-) diff --git a/examples/layout/Cargo.toml b/examples/layout/Cargo.toml index c2c3f49b..855f98d0 100644 --- a/examples/layout/Cargo.toml +++ b/examples/layout/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" publish = false [dependencies] -iced = { path = "../.." } +iced = { path = "../..", features = ["canvas"] } diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index c1ff3951..3e69e1a8 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -1,12 +1,14 @@ use iced::executor; use iced::keyboard; +use iced::mouse; +use iced::theme; use iced::widget::{ - button, checkbox, column, container, horizontal_space, pick_list, row, - text, vertical_rule, + button, canvas, checkbox, column, container, horizontal_space, pick_list, + row, scrollable, text, vertical_rule, vertical_space, }; use iced::{ color, Alignment, Application, Color, Command, Element, Font, Length, - Settings, Subscription, Theme, + Point, Rectangle, Renderer, Settings, Subscription, Theme, }; pub fn main() -> iced::Result { @@ -100,7 +102,12 @@ impl Application for Layout { container::Appearance::default() .with_border(palette.background.strong.color, 4.0) - }); + }) + .padding(4) + .width(Length::Fill) + .height(Length::Fill) + .center_x() + .center_y(); let controls = row([ (!self.example.is_first()).then_some( @@ -143,6 +150,22 @@ impl Example { title: "Centered", view: centered, }, + Self { + title: "Column", + view: column_, + }, + Self { + title: "Row", + view: row_, + }, + Self { + title: "Space", + view: space, + }, + Self { + title: "Application", + view: application, + }, Self { title: "Nested Quotes", view: nested_quotes, @@ -200,9 +223,79 @@ fn centered<'a>() -> Element<'a, Message> { .into() } +fn column_<'a>() -> Element<'a, Message> { + column![ + "A column can be used to", + "lay out widgets vertically.", + square(50), + square(50), + square(50), + "The amount of space between", + "elements can be configured!", + ] + .spacing(40) + .into() +} + +fn row_<'a>() -> Element<'a, Message> { + row![ + "A row works like a column...", + square(50), + square(50), + square(50), + "but lays out widgets horizontally!", + ] + .spacing(40) + .into() +} + +fn space<'a>() -> Element<'a, Message> { + row!["Left!", horizontal_space(Length::Fill), "Right!"].into() +} + +fn application<'a>() -> Element<'a, Message> { + let header = container( + row![ + square(40), + horizontal_space(Length::Fill), + "Header!", + horizontal_space(Length::Fill), + square(40), + ] + .padding(10) + .align_items(Alignment::Center), + ) + .style(|theme: &Theme| { + let palette = theme.extended_palette(); + + container::Appearance::default() + .with_border(palette.background.strong.color, 1) + }); + + let sidebar = container( + column!["Sidebar!", square(50), square(50)] + .spacing(40) + .padding(10) + .width(200) + .align_items(Alignment::Center), + ) + .style(theme::Container::Box) + .height(Length::Fill) + .center_y(); + + let content = container( + scrollable(column!["Content!", vertical_space(2000), "The end"]) + .width(Length::Fill) + .height(Length::Fill), + ) + .padding(10); + + column![header, row![sidebar, content]].into() +} + fn nested_quotes<'a>() -> Element<'a, Message> { - let quotes = - (1..5).fold(column![text("Original text")].padding(10), |quotes, i| { + (1..5) + .fold(column![text("Original text")].padding(10), |quotes, i| { column![ container( row![vertical_rule(2), quotes].height(Length::Shrink) @@ -228,12 +321,37 @@ fn nested_quotes<'a>() -> Element<'a, Message> { ] .spacing(10) .padding(10) - }); - - container(quotes) - .width(Length::Fill) - .height(Length::Fill) - .center_x() - .center_y() + }) .into() } + +fn square<'a>(size: impl Into<Length> + Copy) -> Element<'a, Message> { + struct Square; + + impl canvas::Program<Message> for Square { + type State = (); + + fn draw( + &self, + _state: &Self::State, + renderer: &Renderer, + theme: &Theme, + bounds: Rectangle, + _cursor: mouse::Cursor, + ) -> Vec<canvas::Geometry> { + let mut frame = canvas::Frame::new(renderer, bounds.size()); + + let palette = theme.extended_palette(); + + frame.fill_rectangle( + Point::ORIGIN, + bounds.size(), + palette.background.strong.color, + ); + + vec![frame.into_geometry()] + } + } + + canvas(Square).width(size).height(size).into() +} From 226271148e77a4f8966ce84b0c948c268176d92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 10 Jan 2024 10:08:11 +0100 Subject: [PATCH 248/286] Use multiple squares instead of `vertical_space` in `layout` example --- examples/layout/src/main.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 3e69e1a8..60dabe54 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -4,7 +4,7 @@ use iced::mouse; use iced::theme; use iced::widget::{ button, canvas, checkbox, column, container, horizontal_space, pick_list, - row, scrollable, text, vertical_rule, vertical_space, + row, scrollable, text, vertical_rule, }; use iced::{ color, Alignment, Application, Color, Command, Element, Font, Length, @@ -284,9 +284,19 @@ fn application<'a>() -> Element<'a, Message> { .center_y(); let content = container( - scrollable(column!["Content!", vertical_space(2000), "The end"]) - .width(Length::Fill) - .height(Length::Fill), + scrollable( + column![ + "Content!", + square(400), + square(200), + square(400), + "The end" + ] + .spacing(40) + .align_items(Alignment::Center) + .width(Length::Fill), + ) + .height(Length::Fill), ) .padding(10); From fa53d9adbb0efbbe806a749476f83c04f756be75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 11 Jan 2024 06:11:36 +0100 Subject: [PATCH 249/286] Loosen cross axis constraint for main axis fills in `flex` layout --- core/src/layout/flex.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/core/src/layout/flex.rs b/core/src/layout/flex.rs index 47cd7112..3358ef3d 100644 --- a/core/src/layout/flex.rs +++ b/core/src/layout/flex.rs @@ -166,13 +166,10 @@ where }; if fill_main_factor != 0 { - let max_main = if fill_main_factor == 0 { - available.max(0.0) - } else { - remaining * fill_main_factor as f32 / fill_main_sum as f32 - }; + let max_main = + remaining * fill_main_factor as f32 / fill_main_sum as f32; - let min_main = if fill_main_factor == 0 || max_main.is_infinite() { + let min_main = if max_main.is_infinite() { 0.0 } else { max_main @@ -184,9 +181,7 @@ where cross }; - let (min_width, min_height) = - axis.pack(min_main, axis.cross(limits.min())); - + let (min_width, min_height) = axis.pack(min_main, 0.0); let (max_width, max_height) = axis.pack(max_main, max_cross); let child_limits = Limits::new( From 03c901d49b7cce901cfd76100f08dcff31420af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 11 Jan 2024 06:12:19 +0100 Subject: [PATCH 250/286] Make `Button` sizing strategy adaptive --- core/src/length.rs | 12 ++++++++++++ widget/src/button.rs | 9 ++++++--- widget/src/container.rs | 12 ++---------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/core/src/length.rs b/core/src/length.rs index 6dc15049..4c139895 100644 --- a/core/src/length.rs +++ b/core/src/length.rs @@ -42,6 +42,18 @@ impl Length { pub fn is_fill(&self) -> bool { self.fill_factor() != 0 } + + /// Returns the "fluid" variant of the [`Length`]. + /// + /// Specifically: + /// - [`Length::Shrink`] if [`Length::Shrink`] or [`Length::Fixed`]. + /// - [`Length::Fill`] otherwise. + pub fn fluid(&self) -> Length { + match self { + Length::Fill | Length::FillPortion(_) => Length::Fill, + Length::Shrink | Length::Fixed(_) => Length::Shrink, + } + } } impl From<Pixels> for Length { diff --git a/widget/src/button.rs b/widget/src/button.rs index 86abee77..0ebb8dcc 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -71,11 +71,14 @@ where { /// Creates a new [`Button`] with the given content. pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self { + let content = content.into(); + let size = content.as_widget().size_hint(); + Button { - content: content.into(), + content, on_press: None, - width: Length::Shrink, - height: Length::Shrink, + width: size.width.fluid(), + height: size.height.fluid(), padding: Padding::new(5.0), style: <Renderer::Theme as StyleSheet>::Style::default(), } diff --git a/widget/src/container.rs b/widget/src/container.rs index ecc5c651..cffb0458 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -52,16 +52,8 @@ where Container { id: None, padding: Padding::ZERO, - width: if size.width.is_fill() { - Length::Fill - } else { - Length::Shrink - }, - height: if size.height.is_fill() { - Length::Fill - } else { - Length::Shrink - }, + width: size.width.fluid(), + height: size.height.fluid(), max_width: f32::INFINITY, max_height: f32::INFINITY, horizontal_alignment: alignment::Horizontal::Left, From 11474bdc3e1a43e6c167d7b98f22d87933dbd2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 11 Jan 2024 06:12:37 +0100 Subject: [PATCH 251/286] Fix `websocket` example --- examples/websocket/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/websocket/src/main.rs b/examples/websocket/src/main.rs index 59488e69..38a6db1e 100644 --- a/examples/websocket/src/main.rs +++ b/examples/websocket/src/main.rs @@ -125,7 +125,7 @@ impl Application for WebSocket { let mut button = button( text("Send") - .height(Length::Fill) + .height(40) .vertical_alignment(alignment::Vertical::Center), ) .padding([0, 20]); From 9c50a7ed7ee439b658f406da9018c9249ffa0b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 11 Jan 2024 08:29:44 +0100 Subject: [PATCH 252/286] Fix `grapheme_position` when ligatures are present --- graphics/src/text/paragraph.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index 4a08a8f4..56cd8868 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -187,38 +187,43 @@ impl core::text::Paragraph for Paragraph { } fn grapheme_position(&self, line: usize, index: usize) -> Option<Point> { + use unicode_segmentation::UnicodeSegmentation; + let run = self.internal().buffer.layout_runs().nth(line)?; // index represents a grapheme, not a glyph // Let's find the first glyph for the given grapheme cluster let mut last_start = None; + let mut last_grapheme_count = 0; let mut graphemes_seen = 0; let glyph = run .glyphs .iter() .find(|glyph| { - if graphemes_seen == index { - return true; - } - if Some(glyph.start) != last_start { + last_grapheme_count = run.text[glyph.start..glyph.end] + .graphemes(false) + .count(); last_start = Some(glyph.start); - graphemes_seen += 1; + graphemes_seen += last_grapheme_count; } - false + graphemes_seen >= index }) .or_else(|| run.glyphs.last())?; - let advance_last = if index == run.glyphs.len() { - glyph.w - } else { + let advance = if index == 0 { 0.0 + } else { + glyph.w + * (1.0 + - graphemes_seen.saturating_sub(index) as f32 + / last_grapheme_count as f32) }; Some(Point::new( - glyph.x + glyph.x_offset * glyph.font_size + advance_last, + glyph.x + glyph.x_offset * glyph.font_size + advance, glyph.y - glyph.y_offset * glyph.font_size, )) } From 3d88ceb482855549271fe73165eeea4871222048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 11 Jan 2024 08:32:30 +0100 Subject: [PATCH 253/286] Avoid division by zero in `grapheme_position` --- graphics/src/text/paragraph.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphics/src/text/paragraph.rs b/graphics/src/text/paragraph.rs index 56cd8868..5d027542 100644 --- a/graphics/src/text/paragraph.rs +++ b/graphics/src/text/paragraph.rs @@ -219,7 +219,7 @@ impl core::text::Paragraph for Paragraph { glyph.w * (1.0 - graphemes_seen.saturating_sub(index) as f32 - / last_grapheme_count as f32) + / last_grapheme_count.max(1) as f32) }; Some(Point::new( From 3c6bb0a076c4433abe2a381856250c9d9693404e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Zemanovi=C4=8D?= <tzemanovic@gmail.com> Date: Thu, 11 Jan 2024 14:45:40 +0000 Subject: [PATCH 254/286] wgpu: require `Send` on stored pipelines --- wgpu/src/primitive/pipeline.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wgpu/src/primitive/pipeline.rs b/wgpu/src/primitive/pipeline.rs index 302e38f6..c8e45458 100644 --- a/wgpu/src/primitive/pipeline.rs +++ b/wgpu/src/primitive/pipeline.rs @@ -82,7 +82,7 @@ impl<Theme> Renderer for crate::Renderer<Theme> { /// Stores custom, user-provided pipelines. #[derive(Default, Debug)] pub struct Storage { - pipelines: HashMap<TypeId, Box<dyn Any>>, + pipelines: HashMap<TypeId, Box<dyn Any + Send>>, } impl Storage { @@ -92,7 +92,7 @@ impl Storage { } /// Inserts the pipeline `T` in to [`Storage`]. - pub fn store<T: 'static>(&mut self, pipeline: T) { + pub fn store<T: 'static + Send>(&mut self, pipeline: T) { let _ = self.pipelines.insert(TypeId::of::<T>(), Box::new(pipeline)); } From 5315e04a265190e943f42710f0b949e8af7dd37d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Fri, 12 Jan 2024 13:34:14 +0100 Subject: [PATCH 255/286] Fix clipping of `TextInput` selection --- widget/src/text_input.rs | 56 +++++++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 65d3e1eb..c4c74a67 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1194,31 +1194,39 @@ pub fn draw<Renderer>( (None, 0.0) }; - if let Some((cursor, color)) = cursor { - renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { - renderer.fill_quad(cursor, color); - }); - } else { - renderer.with_translation(Vector::ZERO, |_| {}); - } + let draw = |renderer: &mut Renderer, viewport| { + if let Some((cursor, color)) = cursor { + renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { + renderer.fill_quad(cursor, color); + }); + } else { + renderer.with_translation(Vector::ZERO, |_| {}); + } - renderer.fill_paragraph( - if text.is_empty() { - &state.placeholder - } else { - &state.value - }, - Point::new(text_bounds.x, text_bounds.center_y()) - - Vector::new(offset, 0.0), - if text.is_empty() { - theme.placeholder_color(style) - } else if is_disabled { - theme.disabled_color(style) - } else { - theme.value_color(style) - }, - text_bounds, - ); + renderer.fill_paragraph( + if text.is_empty() { + &state.placeholder + } else { + &state.value + }, + Point::new(text_bounds.x, text_bounds.center_y()) + - Vector::new(offset, 0.0), + if text.is_empty() { + theme.placeholder_color(style) + } else if is_disabled { + theme.disabled_color(style) + } else { + theme.value_color(style) + }, + viewport, + ); + }; + + if cursor.is_some() { + renderer.with_layer(text_bounds, |renderer| draw(renderer, *viewport)); + } else { + draw(renderer, text_bounds); + } } /// Computes the current [`mouse::Interaction`] of the [`TextInput`]. From d948ca6f0979bc8120dcf3ce7ba78eac54755ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 15 Jan 2024 23:45:24 +0100 Subject: [PATCH 256/286] Update `glyphon` to `0.4` `Color` is now always in the sRGB color space. --- Cargo.toml | 2 +- graphics/src/text.rs | 10 ++-------- tiny_skia/src/text.rs | 14 +------------- 3 files changed, 4 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0afbcd51..bdb6022a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -126,7 +126,7 @@ bytemuck = { version = "1.0", features = ["derive"] } cosmic-text = "0.10" futures = "0.3" glam = "0.24" -glyphon = { git = "https://github.com/grovesNL/glyphon.git", rev = "2caa9fc5e5923c1d827d177c3619cab7e9885b85" } +glyphon = "0.4" guillotiere = "0.6" half = "2.2" image = "0.24" diff --git a/graphics/src/text.rs b/graphics/src/text.rs index 8fd037fe..7c4b5e31 100644 --- a/graphics/src/text.rs +++ b/graphics/src/text.rs @@ -9,7 +9,6 @@ pub use paragraph::Paragraph; pub use cosmic_text; -use crate::color; use crate::core::font::{self, Font}; use crate::core::text::Shaping; use crate::core::{Color, Point, Rectangle, Size}; @@ -173,12 +172,7 @@ pub fn to_shaping(shaping: Shaping) -> cosmic_text::Shaping { /// Converts some [`Color`] to a [`cosmic_text::Color`]. pub fn to_color(color: Color) -> cosmic_text::Color { - let [r, g, b, a] = color::pack(color).components(); + let [r, g, b, a] = color.into_rgba8(); - cosmic_text::Color::rgba( - (r * 255.0) as u8, - (g * 255.0) as u8, - (b * 255.0) as u8, - (a * 255.0) as u8, - ) + cosmic_text::Color::rgba(r, g, b, a) } diff --git a/tiny_skia/src/text.rs b/tiny_skia/src/text.rs index a5a0a1b6..9413e311 100644 --- a/tiny_skia/src/text.rs +++ b/tiny_skia/src/text.rs @@ -1,7 +1,6 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; use crate::core::{Color, Font, Pixels, Point, Rectangle, Size}; -use crate::graphics::color; use crate::graphics::text::cache::{self, Cache}; use crate::graphics::text::editor; use crate::graphics::text::font_system; @@ -244,18 +243,7 @@ fn draw( fn from_color(color: cosmic_text::Color) -> Color { let [r, g, b, a] = color.as_rgba(); - if color::GAMMA_CORRECTION { - // `cosmic_text::Color` is linear RGB in this case, so we - // need to convert back to sRGB - Color::from_linear_rgba( - r as f32 / 255.0, - g as f32 / 255.0, - b as f32 / 255.0, - a as f32 / 255.0, - ) - } else { - Color::from_rgba8(r, g, b, a as f32 / 255.0) - } + Color::from_rgba8(r, g, b, a as f32 / 255.0) } #[derive(Debug, Clone, Default)] From 73e7cf16e315cd179bf416e9051a562f7a8b648a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Mon, 15 Jan 2024 23:51:46 +0100 Subject: [PATCH 257/286] Update `rfd` to `0.13` --- examples/editor/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/editor/Cargo.toml b/examples/editor/Cargo.toml index a3f6ea3b..dc885728 100644 --- a/examples/editor/Cargo.toml +++ b/examples/editor/Cargo.toml @@ -12,4 +12,4 @@ iced.features = ["highlighter", "tokio", "debug"] tokio.workspace = true tokio.features = ["fs"] -rfd = "0.12" +rfd = "0.13" From 17135cbd56316f31167eb62e026839450506573f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 16 Jan 2024 12:01:33 +0100 Subject: [PATCH 258/286] Update `winit` fork to `0.29.10` --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 45d69288..9732579c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -160,4 +160,4 @@ web-time = "0.2" wgpu = "0.18" winapi = "0.3" window_clipboard = "0.3" -winit = { git = "https://github.com/iced-rs/winit.git", rev = "25b5dc1758723699015c37b0a64f16ceb9c546ea", features = ["rwh_05"] } +winit = { git = "https://github.com/iced-rs/winit.git", rev = "b91e39ece2c0d378c3b80da7f3ab50e17bb798a5", features = ["rwh_05"] } From 64d1ce5532f55d152fa5819532a138da2dca1a39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 16 Jan 2024 13:28:00 +0100 Subject: [PATCH 259/286] Refactor `KeyCode` into `Key` and `Location` --- Cargo.toml | 1 + core/Cargo.toml | 5 +- core/src/keyboard.rs | 7 +- core/src/keyboard/event.rs | 20 +- core/src/keyboard/key.rs | 744 +++++++++++++++++++++++++++++++ core/src/keyboard/key_code.rs | 203 --------- core/src/keyboard/location.rs | 12 + examples/editor/src/main.rs | 4 +- examples/integration/src/main.rs | 2 +- examples/layout/src/main.rs | 10 +- examples/modal/src/main.rs | 5 +- examples/pane_grid/src/main.rs | 31 +- examples/screenshot/src/main.rs | 33 +- examples/stopwatch/src/main.rs | 12 +- examples/toast/src/main.rs | 5 +- examples/todos/src/main.rs | 16 +- futures/src/keyboard.rs | 17 +- src/lib.rs | 3 +- widget/src/combo_box.rs | 14 +- widget/src/text_editor.rs | 67 +-- widget/src/text_input.rs | 54 +-- winit/src/application.rs | 2 +- winit/src/conversion.rs | 469 +++++++++++++------ winit/src/multi_window.rs | 2 +- 24 files changed, 1277 insertions(+), 461 deletions(-) create mode 100644 core/src/keyboard/key.rs delete mode 100644 core/src/keyboard/key_code.rs create mode 100644 core/src/keyboard/location.rs diff --git a/Cargo.toml b/Cargo.toml index d9daa3fd..ac72f212 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -144,6 +144,7 @@ raw-window-handle = "0.5" resvg = "0.36" rustc-hash = "1.0" smol = "1.0" +smol_str = "0.2" softbuffer = "0.2" syntect = "5.1" sysinfo = "0.28" diff --git a/core/Cargo.toml b/core/Cargo.toml index 4baf80a9..be92a572 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -13,10 +13,11 @@ keywords.workspace = true [dependencies] bitflags.workspace = true log.workspace = true -thiserror.workspace = true -xxhash-rust.workspace = true num-traits.workspace = true +smol_str.workspace = true +thiserror.workspace = true web-time.workspace = true +xxhash-rust.workspace = true palette.workspace = true palette.optional = true diff --git a/core/src/keyboard.rs b/core/src/keyboard.rs index 4c6ca08d..b810ccb0 100644 --- a/core/src/keyboard.rs +++ b/core/src/keyboard.rs @@ -1,8 +1,11 @@ //! Listen to keyboard events. +pub mod key; + mod event; -mod key_code; +mod location; mod modifiers; pub use event::Event; -pub use key_code::KeyCode; +pub use key::Key; +pub use location::Location; pub use modifiers::Modifiers; diff --git a/core/src/keyboard/event.rs b/core/src/keyboard/event.rs index 884fc502..b1792415 100644 --- a/core/src/keyboard/event.rs +++ b/core/src/keyboard/event.rs @@ -1,4 +1,4 @@ -use super::{KeyCode, Modifiers}; +use crate::keyboard::{Key, Location, Modifiers}; /// A keyboard event. /// @@ -10,10 +10,13 @@ use super::{KeyCode, Modifiers}; pub enum Event { /// A keyboard key was pressed. KeyPressed { - /// The key identifier - key_code: KeyCode, + /// The key pressed. + key: Key, - /// The state of the modifier keys + /// The location of the key. + location: Location, + + /// The state of the modifier keys. modifiers: Modifiers, /// The text produced by the key press, if any. @@ -22,10 +25,13 @@ pub enum Event { /// A keyboard key was released. KeyReleased { - /// The key identifier - key_code: KeyCode, + /// The key released. + key: Key, - /// The state of the modifier keys + /// The location of the key. + location: Location, + + /// The state of the modifier keys. modifiers: Modifiers, }, diff --git a/core/src/keyboard/key.rs b/core/src/keyboard/key.rs new file mode 100644 index 00000000..ef48dae4 --- /dev/null +++ b/core/src/keyboard/key.rs @@ -0,0 +1,744 @@ +//! Identify keyboard keys. +use smol_str::SmolStr; + +/// A key on the keyboard. +/// +/// This is mostly the `Key` type found in [`winit`]. +/// +/// [`winit`]: https://docs.rs/winit/0.29.10/winit/keyboard/enum.Key.html +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum Key<C = SmolStr> { + /// A key with an established name. + Named(Named), + + /// A key string that corresponds to the character typed by the user, taking into account the + /// user’s current locale setting, and any system-level keyboard mapping overrides that are in + /// effect. + Character(C), + + /// An unidentified key. + Unidentified, +} + +impl Key { + /// Convert `Key::Character(SmolStr)` to `Key::Character(&str)` so you can more easily match on + /// `Key`. All other variants remain unchanged. + pub fn as_ref(&self) -> Key<&str> { + match self { + Self::Named(named) => Key::Named(*named), + Self::Character(c) => Key::Character(c.as_ref()), + Self::Unidentified => Key::Unidentified, + } + } +} + +/// A named key. +/// +/// This is mostly the `NamedKey` type found in [`winit`]. +/// +/// [`winit`]: https://docs.rs/winit/0.29.10/winit/keyboard/enum.Key.html +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[allow(missing_docs)] +pub enum Named { + /// The `Alt` (Alternative) key. + /// + /// This key enables the alternate modifier function for interpreting concurrent or subsequent + /// keyboard input. This key value is also used for the Apple <kbd>Option</kbd> key. + Alt, + /// The Alternate Graphics (<kbd>AltGr</kbd> or <kbd>AltGraph</kbd>) key. + /// + /// This key is used enable the ISO Level 3 shift modifier (the standard `Shift` key is the + /// level 2 modifier). + AltGraph, + /// The `Caps Lock` (Capital) key. + /// + /// Toggle capital character lock function for interpreting subsequent keyboard input event. + CapsLock, + /// The `Control` or `Ctrl` key. + /// + /// Used to enable control modifier function for interpreting concurrent or subsequent keyboard + /// input. + Control, + /// The Function switch `Fn` key. Activating this key simultaneously with another key changes + /// that key’s value to an alternate character or function. This key is often handled directly + /// in the keyboard hardware and does not usually generate key events. + Fn, + /// The Function-Lock (`FnLock` or `F-Lock`) key. Activating this key switches the mode of the + /// keyboard to changes some keys' values to an alternate character or function. This key is + /// often handled directly in the keyboard hardware and does not usually generate key events. + FnLock, + /// The `NumLock` or Number Lock key. Used to toggle numpad mode function for interpreting + /// subsequent keyboard input. + NumLock, + /// Toggle between scrolling and cursor movement modes. + ScrollLock, + /// Used to enable shift modifier function for interpreting concurrent or subsequent keyboard + /// input. + Shift, + /// The Symbol modifier key (used on some virtual keyboards). + Symbol, + SymbolLock, + // Legacy modifier key. Also called "Super" in certain places. + Meta, + // Legacy modifier key. + Hyper, + /// Used to enable "super" modifier function for interpreting concurrent or subsequent keyboard + /// input. This key value is used for the "Windows Logo" key and the Apple `Command` or `⌘` key. + /// + /// Note: In some contexts (e.g. the Web) this is referred to as the "Meta" key. + Super, + /// The `Enter` or `↵` key. Used to activate current selection or accept current input. This key + /// value is also used for the `Return` (Macintosh numpad) key. This key value is also used for + /// the Android `KEYCODE_DPAD_CENTER`. + Enter, + /// The Horizontal Tabulation `Tab` key. + Tab, + /// Used in text to insert a space between words. Usually located below the character keys. + Space, + /// Navigate or traverse downward. (`KEYCODE_DPAD_DOWN`) + ArrowDown, + /// Navigate or traverse leftward. (`KEYCODE_DPAD_LEFT`) + ArrowLeft, + /// Navigate or traverse rightward. (`KEYCODE_DPAD_RIGHT`) + ArrowRight, + /// Navigate or traverse upward. (`KEYCODE_DPAD_UP`) + ArrowUp, + /// The End key, used with keyboard entry to go to the end of content (`KEYCODE_MOVE_END`). + End, + /// The Home key, used with keyboard entry, to go to start of content (`KEYCODE_MOVE_HOME`). + /// For the mobile phone `Home` key (which goes to the phone’s main screen), use [`GoHome`]. + /// + /// [`GoHome`]: Self::GoHome + Home, + /// Scroll down or display next page of content. + PageDown, + /// Scroll up or display previous page of content. + PageUp, + /// Used to remove the character to the left of the cursor. This key value is also used for + /// the key labeled `Delete` on MacOS keyboards. + Backspace, + /// Remove the currently selected input. + Clear, + /// Copy the current selection. (`APPCOMMAND_COPY`) + Copy, + /// The Cursor Select key. + CrSel, + /// Cut the current selection. (`APPCOMMAND_CUT`) + Cut, + /// Used to delete the character to the right of the cursor. This key value is also used for the + /// key labeled `Delete` on MacOS keyboards when `Fn` is active. + Delete, + /// The Erase to End of Field key. This key deletes all characters from the current cursor + /// position to the end of the current field. + EraseEof, + /// The Extend Selection (Exsel) key. + ExSel, + /// Toggle between text modes for insertion or overtyping. + /// (`KEYCODE_INSERT`) + Insert, + /// The Paste key. (`APPCOMMAND_PASTE`) + Paste, + /// Redo the last action. (`APPCOMMAND_REDO`) + Redo, + /// Undo the last action. (`APPCOMMAND_UNDO`) + Undo, + /// The Accept (Commit, OK) key. Accept current option or input method sequence conversion. + Accept, + /// Redo or repeat an action. + Again, + /// The Attention (Attn) key. + Attn, + Cancel, + /// Show the application’s context menu. + /// This key is commonly found between the right `Super` key and the right `Control` key. + ContextMenu, + /// The `Esc` key. This key was originally used to initiate an escape sequence, but is + /// now more generally used to exit or "escape" the current context, such as closing a dialog + /// or exiting full screen mode. + Escape, + Execute, + /// Open the Find dialog. (`APPCOMMAND_FIND`) + Find, + /// Open a help dialog or toggle display of help information. (`APPCOMMAND_HELP`, + /// `KEYCODE_HELP`) + Help, + /// Pause the current state or application (as appropriate). + /// + /// Note: Do not use this value for the `Pause` button on media controllers. Use `"MediaPause"` + /// instead. + Pause, + /// Play or resume the current state or application (as appropriate). + /// + /// Note: Do not use this value for the `Play` button on media controllers. Use `"MediaPlay"` + /// instead. + Play, + /// The properties (Props) key. + Props, + Select, + /// The ZoomIn key. (`KEYCODE_ZOOM_IN`) + ZoomIn, + /// The ZoomOut key. (`KEYCODE_ZOOM_OUT`) + ZoomOut, + /// The Brightness Down key. Typically controls the display brightness. + /// (`KEYCODE_BRIGHTNESS_DOWN`) + BrightnessDown, + /// The Brightness Up key. Typically controls the display brightness. (`KEYCODE_BRIGHTNESS_UP`) + BrightnessUp, + /// Toggle removable media to eject (open) and insert (close) state. (`KEYCODE_MEDIA_EJECT`) + Eject, + LogOff, + /// Toggle power state. (`KEYCODE_POWER`) + /// Note: Note: Some devices might not expose this key to the operating environment. + Power, + /// The `PowerOff` key. Sometime called `PowerDown`. + PowerOff, + /// Initiate print-screen function. + PrintScreen, + /// The Hibernate key. This key saves the current state of the computer to disk so that it can + /// be restored. The computer will then shutdown. + Hibernate, + /// The Standby key. This key turns off the display and places the computer into a low-power + /// mode without completely shutting down. It is sometimes labelled `Suspend` or `Sleep` key. + /// (`KEYCODE_SLEEP`) + Standby, + /// The WakeUp key. (`KEYCODE_WAKEUP`) + WakeUp, + /// Initate the multi-candidate mode. + AllCandidates, + Alphanumeric, + /// Initiate the Code Input mode to allow characters to be entered by + /// their code points. + CodeInput, + /// The Compose key, also known as "Multi_key" on the X Window System. This key acts in a + /// manner similar to a dead key, triggering a mode where subsequent key presses are combined to + /// produce a different character. + Compose, + /// Convert the current input method sequence. + Convert, + /// The Final Mode `Final` key used on some Asian keyboards, to enable the final mode for IMEs. + FinalMode, + /// Switch to the first character group. (ISO/IEC 9995) + GroupFirst, + /// Switch to the last character group. (ISO/IEC 9995) + GroupLast, + /// Switch to the next character group. (ISO/IEC 9995) + GroupNext, + /// Switch to the previous character group. (ISO/IEC 9995) + GroupPrevious, + /// Toggle between or cycle through input modes of IMEs. + ModeChange, + NextCandidate, + /// Accept current input method sequence without + /// conversion in IMEs. + NonConvert, + PreviousCandidate, + Process, + SingleCandidate, + /// Toggle between Hangul and English modes. + HangulMode, + HanjaMode, + JunjaMode, + /// The Eisu key. This key may close the IME, but its purpose is defined by the current IME. + /// (`KEYCODE_EISU`) + Eisu, + /// The (Half-Width) Characters key. + Hankaku, + /// The Hiragana (Japanese Kana characters) key. + Hiragana, + /// The Hiragana/Katakana toggle key. (`KEYCODE_KATAKANA_HIRAGANA`) + HiraganaKatakana, + /// The Kana Mode (Kana Lock) key. This key is used to enter hiragana mode (typically from + /// romaji mode). + KanaMode, + /// The Kanji (Japanese name for ideographic characters of Chinese origin) Mode key. This key is + /// typically used to switch to a hiragana keyboard for the purpose of converting input into + /// kanji. (`KEYCODE_KANA`) + KanjiMode, + /// The Katakana (Japanese Kana characters) key. + Katakana, + /// The Roman characters function key. + Romaji, + /// The Zenkaku (Full-Width) Characters key. + Zenkaku, + /// The Zenkaku/Hankaku (full-width/half-width) toggle key. (`KEYCODE_ZENKAKU_HANKAKU`) + ZenkakuHankaku, + /// General purpose virtual function key, as index 1. + Soft1, + /// General purpose virtual function key, as index 2. + Soft2, + /// General purpose virtual function key, as index 3. + Soft3, + /// General purpose virtual function key, as index 4. + Soft4, + /// Select next (numerically or logically) lower channel. (`APPCOMMAND_MEDIA_CHANNEL_DOWN`, + /// `KEYCODE_CHANNEL_DOWN`) + ChannelDown, + /// Select next (numerically or logically) higher channel. (`APPCOMMAND_MEDIA_CHANNEL_UP`, + /// `KEYCODE_CHANNEL_UP`) + ChannelUp, + /// Close the current document or message (Note: This doesn’t close the application). + /// (`APPCOMMAND_CLOSE`) + Close, + /// Open an editor to forward the current message. (`APPCOMMAND_FORWARD_MAIL`) + MailForward, + /// Open an editor to reply to the current message. (`APPCOMMAND_REPLY_TO_MAIL`) + MailReply, + /// Send the current message. (`APPCOMMAND_SEND_MAIL`) + MailSend, + /// Close the current media, for example to close a CD or DVD tray. (`KEYCODE_MEDIA_CLOSE`) + MediaClose, + /// Initiate or continue forward playback at faster than normal speed, or increase speed if + /// already fast forwarding. (`APPCOMMAND_MEDIA_FAST_FORWARD`, `KEYCODE_MEDIA_FAST_FORWARD`) + MediaFastForward, + /// Pause the currently playing media. (`APPCOMMAND_MEDIA_PAUSE`, `KEYCODE_MEDIA_PAUSE`) + /// + /// Note: Media controller devices should use this value rather than `"Pause"` for their pause + /// keys. + MediaPause, + /// Initiate or continue media playback at normal speed, if not currently playing at normal + /// speed. (`APPCOMMAND_MEDIA_PLAY`, `KEYCODE_MEDIA_PLAY`) + MediaPlay, + /// Toggle media between play and pause states. (`APPCOMMAND_MEDIA_PLAY_PAUSE`, + /// `KEYCODE_MEDIA_PLAY_PAUSE`) + MediaPlayPause, + /// Initiate or resume recording of currently selected media. (`APPCOMMAND_MEDIA_RECORD`, + /// `KEYCODE_MEDIA_RECORD`) + MediaRecord, + /// Initiate or continue reverse playback at faster than normal speed, or increase speed if + /// already rewinding. (`APPCOMMAND_MEDIA_REWIND`, `KEYCODE_MEDIA_REWIND`) + MediaRewind, + /// Stop media playing, pausing, forwarding, rewinding, or recording, if not already stopped. + /// (`APPCOMMAND_MEDIA_STOP`, `KEYCODE_MEDIA_STOP`) + MediaStop, + /// Seek to next media or program track. (`APPCOMMAND_MEDIA_NEXTTRACK`, `KEYCODE_MEDIA_NEXT`) + MediaTrackNext, + /// Seek to previous media or program track. (`APPCOMMAND_MEDIA_PREVIOUSTRACK`, + /// `KEYCODE_MEDIA_PREVIOUS`) + MediaTrackPrevious, + /// Open a new document or message. (`APPCOMMAND_NEW`) + New, + /// Open an existing document or message. (`APPCOMMAND_OPEN`) + Open, + /// Print the current document or message. (`APPCOMMAND_PRINT`) + Print, + /// Save the current document or message. (`APPCOMMAND_SAVE`) + Save, + /// Spellcheck the current document or selection. (`APPCOMMAND_SPELL_CHECK`) + SpellCheck, + /// The `11` key found on media numpads that + /// have buttons from `1` ... `12`. + Key11, + /// The `12` key found on media numpads that + /// have buttons from `1` ... `12`. + Key12, + /// Adjust audio balance leftward. (`VK_AUDIO_BALANCE_LEFT`) + AudioBalanceLeft, + /// Adjust audio balance rightward. (`VK_AUDIO_BALANCE_RIGHT`) + AudioBalanceRight, + /// Decrease audio bass boost or cycle down through bass boost states. (`APPCOMMAND_BASS_DOWN`, + /// `VK_BASS_BOOST_DOWN`) + AudioBassBoostDown, + /// Toggle bass boost on/off. (`APPCOMMAND_BASS_BOOST`) + AudioBassBoostToggle, + /// Increase audio bass boost or cycle up through bass boost states. (`APPCOMMAND_BASS_UP`, + /// `VK_BASS_BOOST_UP`) + AudioBassBoostUp, + /// Adjust audio fader towards front. (`VK_FADER_FRONT`) + AudioFaderFront, + /// Adjust audio fader towards rear. (`VK_FADER_REAR`) + AudioFaderRear, + /// Advance surround audio mode to next available mode. (`VK_SURROUND_MODE_NEXT`) + AudioSurroundModeNext, + /// Decrease treble. (`APPCOMMAND_TREBLE_DOWN`) + AudioTrebleDown, + /// Increase treble. (`APPCOMMAND_TREBLE_UP`) + AudioTrebleUp, + /// Decrease audio volume. (`APPCOMMAND_VOLUME_DOWN`, `KEYCODE_VOLUME_DOWN`) + AudioVolumeDown, + /// Increase audio volume. (`APPCOMMAND_VOLUME_UP`, `KEYCODE_VOLUME_UP`) + AudioVolumeUp, + /// Toggle between muted state and prior volume level. (`APPCOMMAND_VOLUME_MUTE`, + /// `KEYCODE_VOLUME_MUTE`) + AudioVolumeMute, + /// Toggle the microphone on/off. (`APPCOMMAND_MIC_ON_OFF_TOGGLE`) + MicrophoneToggle, + /// Decrease microphone volume. (`APPCOMMAND_MICROPHONE_VOLUME_DOWN`) + MicrophoneVolumeDown, + /// Increase microphone volume. (`APPCOMMAND_MICROPHONE_VOLUME_UP`) + MicrophoneVolumeUp, + /// Mute the microphone. (`APPCOMMAND_MICROPHONE_VOLUME_MUTE`, `KEYCODE_MUTE`) + MicrophoneVolumeMute, + /// Show correction list when a word is incorrectly identified. (`APPCOMMAND_CORRECTION_LIST`) + SpeechCorrectionList, + /// Toggle between dictation mode and command/control mode. + /// (`APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE`) + SpeechInputToggle, + /// The first generic "LaunchApplication" key. This is commonly associated with launching "My + /// Computer", and may have a computer symbol on the key. (`APPCOMMAND_LAUNCH_APP1`) + LaunchApplication1, + /// The second generic "LaunchApplication" key. This is commonly associated with launching + /// "Calculator", and may have a calculator symbol on the key. (`APPCOMMAND_LAUNCH_APP2`, + /// `KEYCODE_CALCULATOR`) + LaunchApplication2, + /// The "Calendar" key. (`KEYCODE_CALENDAR`) + LaunchCalendar, + /// The "Contacts" key. (`KEYCODE_CONTACTS`) + LaunchContacts, + /// The "Mail" key. (`APPCOMMAND_LAUNCH_MAIL`) + LaunchMail, + /// The "Media Player" key. (`APPCOMMAND_LAUNCH_MEDIA_SELECT`) + LaunchMediaPlayer, + LaunchMusicPlayer, + LaunchPhone, + LaunchScreenSaver, + LaunchSpreadsheet, + LaunchWebBrowser, + LaunchWebCam, + LaunchWordProcessor, + /// Navigate to previous content or page in current history. (`APPCOMMAND_BROWSER_BACKWARD`) + BrowserBack, + /// Open the list of browser favorites. (`APPCOMMAND_BROWSER_FAVORITES`) + BrowserFavorites, + /// Navigate to next content or page in current history. (`APPCOMMAND_BROWSER_FORWARD`) + BrowserForward, + /// Go to the user’s preferred home page. (`APPCOMMAND_BROWSER_HOME`) + BrowserHome, + /// Refresh the current page or content. (`APPCOMMAND_BROWSER_REFRESH`) + BrowserRefresh, + /// Call up the user’s preferred search page. (`APPCOMMAND_BROWSER_SEARCH`) + BrowserSearch, + /// Stop loading the current page or content. (`APPCOMMAND_BROWSER_STOP`) + BrowserStop, + /// The Application switch key, which provides a list of recent apps to switch between. + /// (`KEYCODE_APP_SWITCH`) + AppSwitch, + /// The Call key. (`KEYCODE_CALL`) + Call, + /// The Camera key. (`KEYCODE_CAMERA`) + Camera, + /// The Camera focus key. (`KEYCODE_FOCUS`) + CameraFocus, + /// The End Call key. (`KEYCODE_ENDCALL`) + EndCall, + /// The Back key. (`KEYCODE_BACK`) + GoBack, + /// The Home key, which goes to the phone’s main screen. (`KEYCODE_HOME`) + GoHome, + /// The Headset Hook key. (`KEYCODE_HEADSETHOOK`) + HeadsetHook, + LastNumberRedial, + /// The Notification key. (`KEYCODE_NOTIFICATION`) + Notification, + /// Toggle between manner mode state: silent, vibrate, ring, ... (`KEYCODE_MANNER_MODE`) + MannerMode, + VoiceDial, + /// Switch to viewing TV. (`KEYCODE_TV`) + TV, + /// TV 3D Mode. (`KEYCODE_3D_MODE`) + TV3DMode, + /// Toggle between antenna and cable input. (`KEYCODE_TV_ANTENNA_CABLE`) + TVAntennaCable, + /// Audio description. (`KEYCODE_TV_AUDIO_DESCRIPTION`) + TVAudioDescription, + /// Audio description mixing volume down. (`KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN`) + TVAudioDescriptionMixDown, + /// Audio description mixing volume up. (`KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP`) + TVAudioDescriptionMixUp, + /// Contents menu. (`KEYCODE_TV_CONTENTS_MENU`) + TVContentsMenu, + /// Contents menu. (`KEYCODE_TV_DATA_SERVICE`) + TVDataService, + /// Switch the input mode on an external TV. (`KEYCODE_TV_INPUT`) + TVInput, + /// Switch to component input #1. (`KEYCODE_TV_INPUT_COMPONENT_1`) + TVInputComponent1, + /// Switch to component input #2. (`KEYCODE_TV_INPUT_COMPONENT_2`) + TVInputComponent2, + /// Switch to composite input #1. (`KEYCODE_TV_INPUT_COMPOSITE_1`) + TVInputComposite1, + /// Switch to composite input #2. (`KEYCODE_TV_INPUT_COMPOSITE_2`) + TVInputComposite2, + /// Switch to HDMI input #1. (`KEYCODE_TV_INPUT_HDMI_1`) + TVInputHDMI1, + /// Switch to HDMI input #2. (`KEYCODE_TV_INPUT_HDMI_2`) + TVInputHDMI2, + /// Switch to HDMI input #3. (`KEYCODE_TV_INPUT_HDMI_3`) + TVInputHDMI3, + /// Switch to HDMI input #4. (`KEYCODE_TV_INPUT_HDMI_4`) + TVInputHDMI4, + /// Switch to VGA input #1. (`KEYCODE_TV_INPUT_VGA_1`) + TVInputVGA1, + /// Media context menu. (`KEYCODE_TV_MEDIA_CONTEXT_MENU`) + TVMediaContext, + /// Toggle network. (`KEYCODE_TV_NETWORK`) + TVNetwork, + /// Number entry. (`KEYCODE_TV_NUMBER_ENTRY`) + TVNumberEntry, + /// Toggle the power on an external TV. (`KEYCODE_TV_POWER`) + TVPower, + /// Radio. (`KEYCODE_TV_RADIO_SERVICE`) + TVRadioService, + /// Satellite. (`KEYCODE_TV_SATELLITE`) + TVSatellite, + /// Broadcast Satellite. (`KEYCODE_TV_SATELLITE_BS`) + TVSatelliteBS, + /// Communication Satellite. (`KEYCODE_TV_SATELLITE_CS`) + TVSatelliteCS, + /// Toggle between available satellites. (`KEYCODE_TV_SATELLITE_SERVICE`) + TVSatelliteToggle, + /// Analog Terrestrial. (`KEYCODE_TV_TERRESTRIAL_ANALOG`) + TVTerrestrialAnalog, + /// Digital Terrestrial. (`KEYCODE_TV_TERRESTRIAL_DIGITAL`) + TVTerrestrialDigital, + /// Timer programming. (`KEYCODE_TV_TIMER_PROGRAMMING`) + TVTimer, + /// Switch the input mode on an external AVR (audio/video receiver). (`KEYCODE_AVR_INPUT`) + AVRInput, + /// Toggle the power on an external AVR (audio/video receiver). (`KEYCODE_AVR_POWER`) + AVRPower, + /// General purpose color-coded media function key, as index 0 (red). (`VK_COLORED_KEY_0`, + /// `KEYCODE_PROG_RED`) + ColorF0Red, + /// General purpose color-coded media function key, as index 1 (green). (`VK_COLORED_KEY_1`, + /// `KEYCODE_PROG_GREEN`) + ColorF1Green, + /// General purpose color-coded media function key, as index 2 (yellow). (`VK_COLORED_KEY_2`, + /// `KEYCODE_PROG_YELLOW`) + ColorF2Yellow, + /// General purpose color-coded media function key, as index 3 (blue). (`VK_COLORED_KEY_3`, + /// `KEYCODE_PROG_BLUE`) + ColorF3Blue, + /// General purpose color-coded media function key, as index 4 (grey). (`VK_COLORED_KEY_4`) + ColorF4Grey, + /// General purpose color-coded media function key, as index 5 (brown). (`VK_COLORED_KEY_5`) + ColorF5Brown, + /// Toggle the display of Closed Captions. (`VK_CC`, `KEYCODE_CAPTIONS`) + ClosedCaptionToggle, + /// Adjust brightness of device, by toggling between or cycling through states. (`VK_DIMMER`) + Dimmer, + /// Swap video sources. (`VK_DISPLAY_SWAP`) + DisplaySwap, + /// Select Digital Video Rrecorder. (`KEYCODE_DVR`) + DVR, + /// Exit the current application. (`VK_EXIT`) + Exit, + /// Clear program or content stored as favorite 0. (`VK_CLEAR_FAVORITE_0`) + FavoriteClear0, + /// Clear program or content stored as favorite 1. (`VK_CLEAR_FAVORITE_1`) + FavoriteClear1, + /// Clear program or content stored as favorite 2. (`VK_CLEAR_FAVORITE_2`) + FavoriteClear2, + /// Clear program or content stored as favorite 3. (`VK_CLEAR_FAVORITE_3`) + FavoriteClear3, + /// Select (recall) program or content stored as favorite 0. (`VK_RECALL_FAVORITE_0`) + FavoriteRecall0, + /// Select (recall) program or content stored as favorite 1. (`VK_RECALL_FAVORITE_1`) + FavoriteRecall1, + /// Select (recall) program or content stored as favorite 2. (`VK_RECALL_FAVORITE_2`) + FavoriteRecall2, + /// Select (recall) program or content stored as favorite 3. (`VK_RECALL_FAVORITE_3`) + FavoriteRecall3, + /// Store current program or content as favorite 0. (`VK_STORE_FAVORITE_0`) + FavoriteStore0, + /// Store current program or content as favorite 1. (`VK_STORE_FAVORITE_1`) + FavoriteStore1, + /// Store current program or content as favorite 2. (`VK_STORE_FAVORITE_2`) + FavoriteStore2, + /// Store current program or content as favorite 3. (`VK_STORE_FAVORITE_3`) + FavoriteStore3, + /// Toggle display of program or content guide. (`VK_GUIDE`, `KEYCODE_GUIDE`) + Guide, + /// If guide is active and displayed, then display next day’s content. (`VK_NEXT_DAY`) + GuideNextDay, + /// If guide is active and displayed, then display previous day’s content. (`VK_PREV_DAY`) + GuidePreviousDay, + /// Toggle display of information about currently selected context or media. (`VK_INFO`, + /// `KEYCODE_INFO`) + Info, + /// Toggle instant replay. (`VK_INSTANT_REPLAY`) + InstantReplay, + /// Launch linked content, if available and appropriate. (`VK_LINK`) + Link, + /// List the current program. (`VK_LIST`) + ListProgram, + /// Toggle display listing of currently available live content or programs. (`VK_LIVE`) + LiveContent, + /// Lock or unlock current content or program. (`VK_LOCK`) + Lock, + /// Show a list of media applications: audio/video players and image viewers. (`VK_APPS`) + /// + /// Note: Do not confuse this key value with the Windows' `VK_APPS` / `VK_CONTEXT_MENU` key, + /// which is encoded as `"ContextMenu"`. + MediaApps, + /// Audio track key. (`KEYCODE_MEDIA_AUDIO_TRACK`) + MediaAudioTrack, + /// Select previously selected channel or media. (`VK_LAST`, `KEYCODE_LAST_CHANNEL`) + MediaLast, + /// Skip backward to next content or program. (`KEYCODE_MEDIA_SKIP_BACKWARD`) + MediaSkipBackward, + /// Skip forward to next content or program. (`VK_SKIP`, `KEYCODE_MEDIA_SKIP_FORWARD`) + MediaSkipForward, + /// Step backward to next content or program. (`KEYCODE_MEDIA_STEP_BACKWARD`) + MediaStepBackward, + /// Step forward to next content or program. (`KEYCODE_MEDIA_STEP_FORWARD`) + MediaStepForward, + /// Media top menu. (`KEYCODE_MEDIA_TOP_MENU`) + MediaTopMenu, + /// Navigate in. (`KEYCODE_NAVIGATE_IN`) + NavigateIn, + /// Navigate to next key. (`KEYCODE_NAVIGATE_NEXT`) + NavigateNext, + /// Navigate out. (`KEYCODE_NAVIGATE_OUT`) + NavigateOut, + /// Navigate to previous key. (`KEYCODE_NAVIGATE_PREVIOUS`) + NavigatePrevious, + /// Cycle to next favorite channel (in favorites list). (`VK_NEXT_FAVORITE_CHANNEL`) + NextFavoriteChannel, + /// Cycle to next user profile (if there are multiple user profiles). (`VK_USER`) + NextUserProfile, + /// Access on-demand content or programs. (`VK_ON_DEMAND`) + OnDemand, + /// Pairing key to pair devices. (`KEYCODE_PAIRING`) + Pairing, + /// Move picture-in-picture window down. (`VK_PINP_DOWN`) + PinPDown, + /// Move picture-in-picture window. (`VK_PINP_MOVE`) + PinPMove, + /// Toggle display of picture-in-picture window. (`VK_PINP_TOGGLE`) + PinPToggle, + /// Move picture-in-picture window up. (`VK_PINP_UP`) + PinPUp, + /// Decrease media playback speed. (`VK_PLAY_SPEED_DOWN`) + PlaySpeedDown, + /// Reset playback to normal speed. (`VK_PLAY_SPEED_RESET`) + PlaySpeedReset, + /// Increase media playback speed. (`VK_PLAY_SPEED_UP`) + PlaySpeedUp, + /// Toggle random media or content shuffle mode. (`VK_RANDOM_TOGGLE`) + RandomToggle, + /// Not a physical key, but this key code is sent when the remote control battery is low. + /// (`VK_RC_LOW_BATTERY`) + RcLowBattery, + /// Toggle or cycle between media recording speeds. (`VK_RECORD_SPEED_NEXT`) + RecordSpeedNext, + /// Toggle RF (radio frequency) input bypass mode (pass RF input directly to the RF output). + /// (`VK_RF_BYPASS`) + RfBypass, + /// Toggle scan channels mode. (`VK_SCAN_CHANNELS_TOGGLE`) + ScanChannelsToggle, + /// Advance display screen mode to next available mode. (`VK_SCREEN_MODE_NEXT`) + ScreenModeNext, + /// Toggle display of device settings screen. (`VK_SETTINGS`, `KEYCODE_SETTINGS`) + Settings, + /// Toggle split screen mode. (`VK_SPLIT_SCREEN_TOGGLE`) + SplitScreenToggle, + /// Switch the input mode on an external STB (set top box). (`KEYCODE_STB_INPUT`) + STBInput, + /// Toggle the power on an external STB (set top box). (`KEYCODE_STB_POWER`) + STBPower, + /// Toggle display of subtitles, if available. (`VK_SUBTITLE`) + Subtitle, + /// Toggle display of teletext, if available (`VK_TELETEXT`, `KEYCODE_TV_TELETEXT`). + Teletext, + /// Advance video mode to next available mode. (`VK_VIDEO_MODE_NEXT`) + VideoModeNext, + /// Cause device to identify itself in some manner, e.g., audibly or visibly. (`VK_WINK`) + Wink, + /// Toggle between full-screen and scaled content, or alter magnification level. (`VK_ZOOM`, + /// `KEYCODE_TV_ZOOM_MODE`) + ZoomToggle, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F1, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F2, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F3, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F4, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F5, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F6, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F7, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F8, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F9, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F10, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F11, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F12, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F13, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F14, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F15, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F16, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F17, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F18, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F19, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F20, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F21, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F22, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F23, + /// General-purpose function key. + /// Usually found at the top of the keyboard. + F24, + /// General-purpose function key. + F25, + /// General-purpose function key. + F26, + /// General-purpose function key. + F27, + /// General-purpose function key. + F28, + /// General-purpose function key. + F29, + /// General-purpose function key. + F30, + /// General-purpose function key. + F31, + /// General-purpose function key. + F32, + /// General-purpose function key. + F33, + /// General-purpose function key. + F34, + /// General-purpose function key. + F35, +} diff --git a/core/src/keyboard/key_code.rs b/core/src/keyboard/key_code.rs deleted file mode 100644 index 74ead170..00000000 --- a/core/src/keyboard/key_code.rs +++ /dev/null @@ -1,203 +0,0 @@ -/// The symbolic name of a keyboard key. -/// -/// This is mostly the `KeyCode` type found in [`winit`]. -/// -/// [`winit`]: https://docs.rs/winit/0.20.0-alpha3/winit/ -#[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)] -#[repr(u32)] -#[allow(missing_docs)] -pub enum KeyCode { - /// The '1' key over the letters. - Key1, - /// The '2' key over the letters. - Key2, - /// The '3' key over the letters. - Key3, - /// The '4' key over the letters. - Key4, - /// The '5' key over the letters. - Key5, - /// The '6' key over the letters. - Key6, - /// The '7' key over the letters. - Key7, - /// The '8' key over the letters. - Key8, - /// The '9' key over the letters. - Key9, - /// The '0' key over the 'O' and 'P' keys. - Key0, - - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, - N, - O, - P, - Q, - R, - S, - T, - U, - V, - W, - X, - Y, - Z, - - /// The Escape key, next to F1. - Escape, - - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - F11, - F12, - F13, - F14, - F15, - F16, - F17, - F18, - F19, - F20, - F21, - F22, - F23, - F24, - - /// Print Screen/SysRq. - Snapshot, - /// Scroll Lock. - Scroll, - /// Pause/Break key, next to Scroll lock. - Pause, - - /// `Insert`, next to Backspace. - Insert, - Home, - Delete, - End, - PageDown, - PageUp, - - Left, - Up, - Right, - Down, - - /// The Backspace key, right over Enter. - Backspace, - /// The Enter key. - Enter, - /// The space bar. - Space, - - /// The "Compose" key on Linux. - Compose, - - Caret, - - Numlock, - Numpad0, - Numpad1, - Numpad2, - Numpad3, - Numpad4, - Numpad5, - Numpad6, - Numpad7, - Numpad8, - Numpad9, - NumpadAdd, - NumpadDivide, - NumpadDecimal, - NumpadComma, - NumpadEnter, - NumpadEquals, - NumpadMultiply, - NumpadSubtract, - - AbntC1, - AbntC2, - Apostrophe, - Apps, - Asterisk, - At, - Ax, - Backslash, - Calculator, - Capital, - Colon, - Comma, - Convert, - Equals, - Grave, - Kana, - Kanji, - LAlt, - LBracket, - LControl, - LShift, - LWin, - Mail, - MediaSelect, - MediaStop, - Minus, - Mute, - MyComputer, - NavigateForward, // also called "Next" - NavigateBackward, // also called "Prior" - NextTrack, - NoConvert, - OEM102, - Period, - PlayPause, - Plus, - Power, - PrevTrack, - RAlt, - RBracket, - RControl, - RShift, - RWin, - Semicolon, - Slash, - Sleep, - Stop, - Sysrq, - Tab, - Underline, - Unlabeled, - VolumeDown, - VolumeUp, - Wake, - WebBack, - WebFavorites, - WebForward, - WebHome, - WebRefresh, - WebSearch, - WebStop, - Yen, - Copy, - Paste, - Cut, -} diff --git a/core/src/keyboard/location.rs b/core/src/keyboard/location.rs new file mode 100644 index 00000000..feff0820 --- /dev/null +++ b/core/src/keyboard/location.rs @@ -0,0 +1,12 @@ +/// The location of a key on the keyboard. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Location { + /// The standard group of keys on the keyboard. + Standard, + /// The left side of the keyboard. + Left, + /// The right side of the keyboard. + Right, + /// The numpad of the keyboard. + Numpad, +} diff --git a/examples/editor/src/main.rs b/examples/editor/src/main.rs index 03d1e283..bf2aaaa3 100644 --- a/examples/editor/src/main.rs +++ b/examples/editor/src/main.rs @@ -134,8 +134,8 @@ impl Application for Editor { } fn subscription(&self) -> Subscription<Message> { - keyboard::on_key_press(|key_code, modifiers| match key_code { - keyboard::KeyCode::S if modifiers.command() => { + keyboard::on_key_press(|key, modifiers| match key.as_ref() { + keyboard::Key::Character("s") if modifiers.command() => { Some(Message::SaveFile) } _ => None, diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index fab81553..b0939d68 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -278,7 +278,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, + event, window.scale_factor(), modifiers, ) { diff --git a/examples/layout/src/main.rs b/examples/layout/src/main.rs index 60dabe54..6cf0e570 100644 --- a/examples/layout/src/main.rs +++ b/examples/layout/src/main.rs @@ -71,9 +71,13 @@ impl Application for Layout { } fn subscription(&self) -> Subscription<Message> { - keyboard::on_key_release(|key_code, _modifiers| match key_code { - keyboard::KeyCode::Left => Some(Message::Previous), - keyboard::KeyCode::Right => Some(Message::Next), + use keyboard::key; + + keyboard::on_key_release(|key, _modifiers| match key { + keyboard::Key::Named(key::Named::ArrowLeft) => { + Some(Message::Previous) + } + keyboard::Key::Named(key::Named::ArrowRight) => Some(Message::Next), _ => None, }) } diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index d1cc7bb0..963c839e 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -1,6 +1,7 @@ use iced::event::{self, Event}; use iced::executor; use iced::keyboard; +use iced::keyboard::key; use iced::theme; use iced::widget::{ self, button, column, container, horizontal_space, pick_list, row, text, @@ -85,7 +86,7 @@ impl Application for App { } Message::Event(event) => match event { Event::Keyboard(keyboard::Event::KeyPressed { - key_code: keyboard::KeyCode::Tab, + key: keyboard::Key::Named(key::Named::Tab), modifiers, .. }) => { @@ -96,7 +97,7 @@ impl Application for App { } } Event::Keyboard(keyboard::Event::KeyPressed { - key_code: keyboard::KeyCode::Escape, + key: keyboard::Key::Named(key::Named::Escape), .. }) => { self.hide_modal(); diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index 96bb8e4e..d5e5bcbe 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -220,23 +220,26 @@ const PANE_ID_COLOR_FOCUSED: Color = Color::from_rgb( 0x47 as f32 / 255.0, ); -fn handle_hotkey(key_code: keyboard::KeyCode) -> Option<Message> { - use keyboard::KeyCode; +fn handle_hotkey(key: keyboard::Key) -> Option<Message> { + use keyboard::key::{self, Key}; use pane_grid::{Axis, Direction}; - let direction = match key_code { - KeyCode::Up => Some(Direction::Up), - KeyCode::Down => Some(Direction::Down), - KeyCode::Left => Some(Direction::Left), - KeyCode::Right => Some(Direction::Right), - _ => None, - }; + match key.as_ref() { + Key::Character("v") => Some(Message::SplitFocused(Axis::Vertical)), + Key::Character("h") => Some(Message::SplitFocused(Axis::Horizontal)), + Key::Character("w") => Some(Message::CloseFocused), + Key::Named(key) => { + let direction = match key { + key::Named::ArrowUp => Some(Direction::Up), + key::Named::ArrowDown => Some(Direction::Down), + key::Named::ArrowLeft => Some(Direction::Left), + key::Named::ArrowRight => Some(Direction::Right), + _ => None, + }; - match key_code { - KeyCode::V => Some(Message::SplitFocused(Axis::Vertical)), - KeyCode::H => Some(Message::SplitFocused(Axis::Horizontal)), - KeyCode::W => Some(Message::CloseFocused), - _ => direction.map(Message::FocusAdjacent), + direction.map(Message::FocusAdjacent) + } + _ => None, } } diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index 20d34be6..6955551e 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -1,11 +1,13 @@ -use iced::keyboard::KeyCode; -use iced::theme::{Button, Container}; +use iced::alignment; +use iced::executor; +use iced::keyboard; +use iced::theme; use iced::widget::{button, column, container, image, row, text, text_input}; +use iced::window; 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, + Alignment, Application, Command, ContentFit, Element, Length, Rectangle, + Renderer, Subscription, Theme, }; use ::image as img; @@ -147,7 +149,7 @@ impl Application for Example { let image = container(image) .padding(10) - .style(Container::Box) + .style(theme::Container::Box) .width(Length::FillPortion(2)) .height(Length::Fill) .center_x() @@ -202,9 +204,10 @@ impl Application for Example { self.screenshot.is_some().then(|| Message::Png), ) } else { - button(centered_text("Saving...")).style(Button::Secondary) + button(centered_text("Saving...")) + .style(theme::Button::Secondary) } - .style(Button::Secondary) + .style(theme::Button::Secondary) .padding([10, 20, 10, 20]) .width(Length::Fill) ] @@ -213,7 +216,7 @@ impl Application for Example { crop_controls, button(centered_text("Crop")) .on_press(Message::Crop) - .style(Button::Destructive) + .style(theme::Button::Destructive) .padding([10, 20, 10, 20]) .width(Length::Fill), ] @@ -256,16 +259,10 @@ impl Application for Example { } fn subscription(&self) -> Subscription<Self::Message> { - event::listen_with(|event, status| { - if let event::Status::Captured = status { - return None; - } + use keyboard::key; - if let Event::Keyboard(keyboard::Event::KeyPressed { - key_code: KeyCode::F5, - .. - }) = event - { + keyboard::on_key_press(|key, _modifiers| { + if let keyboard::Key::Named(key::Named::F5) = key { Some(Message::Screenshot) } else { None diff --git a/examples/stopwatch/src/main.rs b/examples/stopwatch/src/main.rs index 0b0f0607..8a0674c1 100644 --- a/examples/stopwatch/src/main.rs +++ b/examples/stopwatch/src/main.rs @@ -86,12 +86,16 @@ impl Application for Stopwatch { }; fn handle_hotkey( - key_code: keyboard::KeyCode, + key: keyboard::Key, _modifiers: keyboard::Modifiers, ) -> Option<Message> { - match key_code { - keyboard::KeyCode::Space => Some(Message::Toggle), - keyboard::KeyCode::R => Some(Message::Reset), + use keyboard::key; + + match key.as_ref() { + keyboard::Key::Named(key::Named::Space) => { + Some(Message::Toggle) + } + keyboard::Key::Character("r") => Some(Message::Reset), _ => None, } } diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index 609f9087..2e837fa3 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -1,6 +1,7 @@ use iced::event::{self, Event}; use iced::executor; use iced::keyboard; +use iced::keyboard::key; use iced::widget::{ self, button, column, container, pick_list, row, slider, text, text_input, }; @@ -93,12 +94,12 @@ impl Application for App { Command::none() } Message::Event(Event::Keyboard(keyboard::Event::KeyPressed { - key_code: keyboard::KeyCode::Tab, + key: keyboard::Key::Named(key::Named::Tab), modifiers, .. })) if modifiers.shift() => widget::focus_previous(), Message::Event(Event::Keyboard(keyboard::Event::KeyPressed { - key_code: keyboard::KeyCode::Tab, + key: keyboard::Key::Named(key::Named::Tab), .. })) => widget::focus_next(), Message::Event(_) => Command::none(), diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index aad47c20..3d79f087 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -260,15 +260,21 @@ impl Application for Todos { } fn subscription(&self) -> Subscription<Message> { - keyboard::on_key_press(|key_code, modifiers| { - match (key_code, modifiers) { - (keyboard::KeyCode::Tab, _) => Some(Message::TabPressed { + use keyboard::key; + + keyboard::on_key_press(|key, modifiers| { + let keyboard::Key::Named(key) = key else { + return None; + }; + + match (key, modifiers) { + (key::Named::Tab, _) => Some(Message::TabPressed { shift: modifiers.shift(), }), - (keyboard::KeyCode::Up, keyboard::Modifiers::SHIFT) => { + (key::Named::ArrowUp, keyboard::Modifiers::SHIFT) => { Some(Message::ToggleFullscreen(window::Mode::Fullscreen)) } - (keyboard::KeyCode::Down, keyboard::Modifiers::SHIFT) => { + (key::Named::ArrowDown, keyboard::Modifiers::SHIFT) => { Some(Message::ToggleFullscreen(window::Mode::Windowed)) } _ => None, diff --git a/futures/src/keyboard.rs b/futures/src/keyboard.rs index 855eecd4..8e7da38f 100644 --- a/futures/src/keyboard.rs +++ b/futures/src/keyboard.rs @@ -1,6 +1,6 @@ //! Listen to keyboard events. use crate::core; -use crate::core::keyboard::{Event, KeyCode, Modifiers}; +use crate::core::keyboard::{Event, Key, Modifiers}; use crate::subscription::{self, Subscription}; use crate::MaybeSend; @@ -10,7 +10,7 @@ use crate::MaybeSend; /// If the function returns `None`, the key press will be simply /// ignored. pub fn on_key_press<Message>( - f: fn(KeyCode, Modifiers) -> Option<Message>, + f: fn(Key, Modifiers) -> Option<Message>, ) -> Subscription<Message> where Message: MaybeSend + 'static, @@ -22,12 +22,10 @@ where match (event, status) { ( core::Event::Keyboard(Event::KeyPressed { - key_code, - modifiers, - .. + key, modifiers, .. }), core::event::Status::Ignored, - ) => f(key_code, modifiers), + ) => f(key, modifiers), _ => None, } }) @@ -39,7 +37,7 @@ where /// If the function returns `None`, the key release will be simply /// ignored. pub fn on_key_release<Message>( - f: fn(KeyCode, Modifiers) -> Option<Message>, + f: fn(Key, Modifiers) -> Option<Message>, ) -> Subscription<Message> where Message: MaybeSend + 'static, @@ -51,11 +49,12 @@ where match (event, status) { ( core::Event::Keyboard(Event::KeyReleased { - key_code, + key, modifiers, + .. }), core::event::Status::Ignored, - ) => f(key_code, modifiers), + ) => f(key, modifiers), _ => None, } }) diff --git a/src/lib.rs b/src/lib.rs index 002d2a79..446590ec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -230,7 +230,8 @@ pub mod event { pub mod keyboard { //! Listen and react to keyboard events. - pub use crate::core::keyboard::{Event, KeyCode, Modifiers}; + pub use crate::core::keyboard::key; + pub use crate::core::keyboard::{Event, Key, Location, Modifiers}; pub use iced_futures::keyboard::{on_key_press, on_key_release}; } diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 1b2fa947..73beeac3 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -1,6 +1,7 @@ //! Display a dropdown list of searchable and selectable options. use crate::core::event::{self, Event}; use crate::core::keyboard; +use crate::core::keyboard::key; use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::overlay; @@ -436,14 +437,14 @@ where } if let Event::Keyboard(keyboard::Event::KeyPressed { - key_code, + key: keyboard::Key::Named(named_key), modifiers, .. }) = event { let shift_modifer = modifiers.shift(); - match (key_code, shift_modifer) { - (keyboard::KeyCode::Enter, _) => { + match (named_key, shift_modifer) { + (key::Named::Enter, _) => { if let Some(index) = &menu.hovered_option { if let Some(option) = state.filtered_options.options.get(*index) @@ -455,8 +456,7 @@ where event_status = event::Status::Captured; } - (keyboard::KeyCode::Up, _) - | (keyboard::KeyCode::Tab, true) => { + (key::Named::ArrowUp, _) | (key::Named::Tab, true) => { if let Some(index) = &mut menu.hovered_option { if *index == 0 { *index = state @@ -492,8 +492,8 @@ where event_status = event::Status::Captured; } - (keyboard::KeyCode::Down, _) - | (keyboard::KeyCode::Tab, false) + (key::Named::ArrowDown, _) + | (key::Named::Tab, false) if !modifiers.shift() => { if let Some(index) = &mut menu.hovered_option { diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index b95a45e4..09a0cac0 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -1,6 +1,7 @@ //! Display a multi-line text input for text editing. use crate::core::event::{self, Event}; use crate::core::keyboard; +use crate::core::keyboard::key; use crate::core::layout::{self, Layout}; use crate::core::mouse; use crate::core::renderer; @@ -646,34 +647,48 @@ impl Update { }, Event::Keyboard(event) => match event { keyboard::Event::KeyPressed { - key_code, + key, modifiers, text, + .. } if state.is_focused => { - if let Some(motion) = motion(key_code) { - let motion = - if platform::is_jump_modifier_pressed(modifiers) { + if let keyboard::Key::Named(named_key) = key.as_ref() { + if let Some(motion) = motion(named_key) { + let motion = if platform::is_jump_modifier_pressed( + modifiers, + ) { motion.widen() } else { motion }; - return action(if modifiers.shift() { - Action::Select(motion) - } else { - Action::Move(motion) - }); + return action(if modifiers.shift() { + Action::Select(motion) + } else { + Action::Move(motion) + }); + } } - match key_code { - keyboard::KeyCode::Enter => edit(Edit::Enter), - keyboard::KeyCode::Backspace => edit(Edit::Backspace), - keyboard::KeyCode::Delete => edit(Edit::Delete), - keyboard::KeyCode::Escape => Some(Self::Unfocus), - keyboard::KeyCode::C if modifiers.command() => { + match key.as_ref() { + keyboard::Key::Named(key::Named::Enter) => { + edit(Edit::Enter) + } + keyboard::Key::Named(key::Named::Backspace) => { + edit(Edit::Backspace) + } + keyboard::Key::Named(key::Named::Delete) => { + edit(Edit::Delete) + } + keyboard::Key::Named(key::Named::Escape) => { + Some(Self::Unfocus) + } + keyboard::Key::Character("c") + if modifiers.command() => + { Some(Self::Copy) } - keyboard::KeyCode::V + keyboard::Key::Character("v") if modifiers.command() && !modifiers.alt() => { Some(Self::Paste) @@ -694,16 +709,16 @@ impl Update { } } -fn motion(key_code: keyboard::KeyCode) -> Option<Motion> { - match key_code { - keyboard::KeyCode::Left => Some(Motion::Left), - keyboard::KeyCode::Right => Some(Motion::Right), - keyboard::KeyCode::Up => Some(Motion::Up), - keyboard::KeyCode::Down => Some(Motion::Down), - keyboard::KeyCode::Home => Some(Motion::Home), - keyboard::KeyCode::End => Some(Motion::End), - keyboard::KeyCode::PageUp => Some(Motion::PageUp), - keyboard::KeyCode::PageDown => Some(Motion::PageDown), +fn motion(key: key::Named) -> Option<Motion> { + match key { + key::Named::ArrowLeft => Some(Motion::Left), + key::Named::ArrowRight => Some(Motion::Right), + key::Named::ArrowUp => Some(Motion::Up), + key::Named::ArrowDown => Some(Motion::Down), + key::Named::Home => Some(Motion::Home), + key::Named::End => Some(Motion::End), + key::Named::PageUp => Some(Motion::PageUp), + key::Named::PageDown => Some(Motion::PageDown), _ => None, } } diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 8d28e8ee..c3dce8be 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -14,6 +14,7 @@ use editor::Editor; use crate::core::alignment; use crate::core::event::{self, Event}; use crate::core::keyboard; +use crate::core::keyboard::key; use crate::core::layout; use crate::core::mouse::{self, click}; use crate::core::renderer; @@ -748,9 +749,7 @@ where return event::Status::Captured; } } - Event::Keyboard(keyboard::Event::KeyPressed { - key_code, text, .. - }) => { + Event::Keyboard(keyboard::Event::KeyPressed { key, text, .. }) => { let state = state(); if let Some(focus) = &mut state.is_focused { @@ -761,14 +760,13 @@ where let modifiers = state.keyboard_modifiers; focus.updated_at = Instant::now(); - match key_code { - keyboard::KeyCode::Enter - | keyboard::KeyCode::NumpadEnter => { + match key.as_ref() { + keyboard::Key::Named(key::Named::Enter) => { if let Some(on_submit) = on_submit.clone() { shell.publish(on_submit); } } - keyboard::KeyCode::Backspace => { + keyboard::Key::Named(key::Named::Backspace) => { if platform::is_jump_modifier_pressed(modifiers) && state.cursor.selection(value).is_none() { @@ -788,7 +786,7 @@ where update_cache(state, value); } - keyboard::KeyCode::Delete => { + keyboard::Key::Named(key::Named::Delete) => { if platform::is_jump_modifier_pressed(modifiers) && state.cursor.selection(value).is_none() { @@ -810,7 +808,7 @@ where update_cache(state, value); } - keyboard::KeyCode::Left => { + keyboard::Key::Named(key::Named::ArrowLeft) => { if platform::is_jump_modifier_pressed(modifiers) && !is_secure { @@ -825,7 +823,7 @@ where state.cursor.move_left(value); } } - keyboard::KeyCode::Right => { + keyboard::Key::Named(key::Named::ArrowRight) => { if platform::is_jump_modifier_pressed(modifiers) && !is_secure { @@ -840,7 +838,7 @@ where state.cursor.move_right(value); } } - keyboard::KeyCode::Home => { + keyboard::Key::Named(key::Named::Home) => { if modifiers.shift() { state .cursor @@ -849,7 +847,7 @@ where state.cursor.move_to(0); } } - keyboard::KeyCode::End => { + keyboard::Key::Named(key::Named::End) => { if modifiers.shift() { state.cursor.select_range( state.cursor.start(value), @@ -859,7 +857,7 @@ where state.cursor.move_to(value.len()); } } - keyboard::KeyCode::C + keyboard::Key::Character("c") if state.keyboard_modifiers.command() => { if let Some((start, end)) = @@ -869,7 +867,7 @@ where .write(value.select(start, end).to_string()); } } - keyboard::KeyCode::X + keyboard::Key::Character("x") if state.keyboard_modifiers.command() => { if let Some((start, end)) = @@ -887,7 +885,7 @@ where update_cache(state, value); } - keyboard::KeyCode::V => { + keyboard::Key::Character("v") => { if state.keyboard_modifiers.command() && !state.keyboard_modifiers.alt() { @@ -924,12 +922,12 @@ where state.is_pasting = None; } } - keyboard::KeyCode::A + keyboard::Key::Character("a") if state.keyboard_modifiers.command() => { state.cursor.select_all(value); } - keyboard::KeyCode::Escape => { + keyboard::Key::Named(key::Named::Escape) => { state.is_focused = None; state.is_dragging = false; state.is_pasting = None; @@ -937,9 +935,11 @@ where state.keyboard_modifiers = keyboard::Modifiers::default(); } - keyboard::KeyCode::Tab - | keyboard::KeyCode::Up - | keyboard::KeyCode::Down => { + keyboard::Key::Named( + key::Named::Tab + | key::Named::ArrowUp + | key::Named::ArrowDown, + ) => { return event::Status::Ignored; } _ => { @@ -971,17 +971,19 @@ where return event::Status::Captured; } } - Event::Keyboard(keyboard::Event::KeyReleased { key_code, .. }) => { + Event::Keyboard(keyboard::Event::KeyReleased { key, .. }) => { let state = state(); if state.is_focused.is_some() { - match key_code { - keyboard::KeyCode::V => { + match key.as_ref() { + keyboard::Key::Character("v") => { state.is_pasting = None; } - keyboard::KeyCode::Tab - | keyboard::KeyCode::Up - | keyboard::KeyCode::Down => { + keyboard::Key::Named( + key::Named::Tab + | key::Named::ArrowUp + | key::Named::ArrowDown, + ) => { return event::Status::Ignored; } _ => {} diff --git a/winit/src/application.rs b/winit/src/application.rs index 46d1cddc..bf48538d 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -462,7 +462,7 @@ async fn run_instance<A, E, C>( if let Some(event) = conversion::window_event( window::Id::MAIN, - &window_event, + window_event, state.scale_factor(), state.modifiers(), ) { diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 2e382c39..387289e8 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -128,7 +128,7 @@ pub fn window_settings( /// Converts a winit window event into an iced event. pub fn window_event( id: window::Id, - event: &winit::event::WindowEvent, + event: winit::event::WindowEvent, scale_factor: f64, modifiers: winit::keyboard::ModifiersState, ) -> Option<Event> { @@ -163,7 +163,7 @@ pub fn window_event( Some(Event::Mouse(mouse::Event::CursorLeft)) } WindowEvent::MouseInput { button, state, .. } => { - let button = mouse_button(*button); + let button = mouse_button(button); Some(Event::Mouse(match state { winit::event::ElementState::Pressed => { @@ -178,8 +178,8 @@ pub fn window_event( winit::event::MouseScrollDelta::LineDelta(delta_x, delta_y) => { Some(Event::Mouse(mouse::Event::WheelScrolled { delta: mouse::ScrollDelta::Lines { - x: *delta_x, - y: *delta_y, + x: delta_x, + y: delta_y, }, })) } @@ -198,18 +198,33 @@ pub fn window_event( logical_key, state, text, + location, .. }, .. } => Some(Event::Keyboard({ - let key_code = key_code(logical_key); + let key = key(logical_key); let modifiers = self::modifiers(modifiers); + let location = match location { + winit::keyboard::KeyLocation::Standard => { + keyboard::Location::Standard + } + winit::keyboard::KeyLocation::Left => keyboard::Location::Left, + winit::keyboard::KeyLocation::Right => { + keyboard::Location::Right + } + winit::keyboard::KeyLocation::Numpad => { + keyboard::Location::Numpad + } + }; + match state { winit::event::ElementState::Pressed => { keyboard::Event::KeyPressed { - key_code, + key, modifiers, + location, text: text .as_ref() .map(winit::keyboard::SmolStr::to_string), @@ -217,8 +232,9 @@ pub fn window_event( } winit::event::ElementState::Released => { keyboard::Event::KeyReleased { - key_code, + key, modifiers, + location, } } } @@ -230,7 +246,7 @@ pub fn window_event( } WindowEvent::Focused(focused) => Some(Event::Window( id, - if *focused { + if focused { window::Event::Focused } else { window::Event::Unfocused @@ -246,7 +262,7 @@ pub fn window_event( Some(Event::Window(id, window::Event::FilesHoveredLeft)) } WindowEvent::Touch(touch) => { - Some(Event::Touch(touch_event(*touch, scale_factor))) + Some(Event::Touch(touch_event(touch, scale_factor))) } WindowEvent::Moved(position) => { let winit::dpi::LogicalPosition { x, y } = @@ -449,125 +465,328 @@ pub fn touch_event( /// /// [`winit`]: https://github.com/rust-windowing/winit /// [`iced`]: https://github.com/iced-rs/iced/tree/0.10 -pub fn key_code(key: &winit::keyboard::Key) -> keyboard::KeyCode { - use keyboard::KeyCode; +pub fn key(key: winit::keyboard::Key) -> keyboard::Key { + use keyboard::key::Named; use winit::keyboard::NamedKey; match key { - winit::keyboard::Key::Character(c) => match c.as_str() { - "1" => KeyCode::Key1, - "2" => KeyCode::Key2, - "3" => KeyCode::Key3, - "4" => KeyCode::Key4, - "5" => KeyCode::Key5, - "6" => KeyCode::Key6, - "7" => KeyCode::Key7, - "8" => KeyCode::Key8, - "9" => KeyCode::Key9, - "0" => KeyCode::Key0, - "a" => KeyCode::A, - "b" => KeyCode::B, - "c" => KeyCode::C, - "d" => KeyCode::D, - "e" => KeyCode::E, - "f" => KeyCode::F, - "g" => KeyCode::G, - "h" => KeyCode::H, - "i" => KeyCode::I, - "j" => KeyCode::J, - "k" => KeyCode::K, - "l" => KeyCode::L, - "m" => KeyCode::M, - "n" => KeyCode::N, - "o" => KeyCode::O, - "p" => KeyCode::P, - "q" => KeyCode::Q, - "r" => KeyCode::R, - "s" => KeyCode::S, - "t" => KeyCode::T, - "u" => KeyCode::U, - "v" => KeyCode::V, - "w" => KeyCode::W, - "x" => KeyCode::X, - "y" => KeyCode::Y, - "z" => KeyCode::Z, - _ => KeyCode::Unlabeled, - }, - winit::keyboard::Key::Named(named_key) => match named_key { - NamedKey::Escape => KeyCode::Escape, - NamedKey::F1 => KeyCode::F1, - NamedKey::F2 => KeyCode::F2, - NamedKey::F3 => KeyCode::F3, - NamedKey::F4 => KeyCode::F4, - NamedKey::F5 => KeyCode::F5, - NamedKey::F6 => KeyCode::F6, - NamedKey::F7 => KeyCode::F7, - NamedKey::F8 => KeyCode::F8, - NamedKey::F9 => KeyCode::F9, - NamedKey::F10 => KeyCode::F10, - NamedKey::F11 => KeyCode::F11, - NamedKey::F12 => KeyCode::F12, - NamedKey::F13 => KeyCode::F13, - NamedKey::F14 => KeyCode::F14, - NamedKey::F15 => KeyCode::F15, - NamedKey::F16 => KeyCode::F16, - NamedKey::F17 => KeyCode::F17, - NamedKey::F18 => KeyCode::F18, - NamedKey::F19 => KeyCode::F19, - NamedKey::F20 => KeyCode::F20, - NamedKey::F21 => KeyCode::F21, - NamedKey::F22 => KeyCode::F22, - NamedKey::F23 => KeyCode::F23, - NamedKey::F24 => KeyCode::F24, - NamedKey::PrintScreen => KeyCode::Snapshot, - NamedKey::ScrollLock => KeyCode::Scroll, - NamedKey::Pause => KeyCode::Pause, - NamedKey::Insert => KeyCode::Insert, - NamedKey::Home => KeyCode::Home, - NamedKey::Delete => KeyCode::Delete, - NamedKey::End => KeyCode::End, - NamedKey::PageDown => KeyCode::PageDown, - NamedKey::PageUp => KeyCode::PageUp, - NamedKey::ArrowLeft => KeyCode::Left, - NamedKey::ArrowUp => KeyCode::Up, - NamedKey::ArrowRight => KeyCode::Right, - NamedKey::ArrowDown => KeyCode::Down, - NamedKey::Backspace => KeyCode::Backspace, - NamedKey::Enter => KeyCode::Enter, - NamedKey::Space => KeyCode::Space, - NamedKey::Compose => KeyCode::Compose, - NamedKey::NumLock => KeyCode::Numlock, - NamedKey::AppSwitch => KeyCode::Apps, - NamedKey::Convert => KeyCode::Convert, - NamedKey::LaunchMail => KeyCode::Mail, - NamedKey::MediaApps => KeyCode::MediaSelect, - NamedKey::MediaStop => KeyCode::MediaStop, - NamedKey::AudioVolumeMute => KeyCode::Mute, - NamedKey::MediaStepForward => KeyCode::NavigateForward, - NamedKey::MediaStepBackward => KeyCode::NavigateBackward, - NamedKey::MediaSkipForward => KeyCode::NextTrack, - NamedKey::NonConvert => KeyCode::NoConvert, - NamedKey::MediaPlayPause => KeyCode::PlayPause, - NamedKey::Power => KeyCode::Power, - NamedKey::MediaSkipBackward => KeyCode::PrevTrack, - NamedKey::PowerOff => KeyCode::Sleep, - NamedKey::Tab => KeyCode::Tab, - NamedKey::AudioVolumeDown => KeyCode::VolumeDown, - NamedKey::AudioVolumeUp => KeyCode::VolumeUp, - NamedKey::WakeUp => KeyCode::Wake, - NamedKey::BrowserBack => KeyCode::WebBack, - NamedKey::BrowserFavorites => KeyCode::WebFavorites, - NamedKey::BrowserForward => KeyCode::WebForward, - NamedKey::BrowserHome => KeyCode::WebHome, - NamedKey::BrowserRefresh => KeyCode::WebRefresh, - NamedKey::BrowserSearch => KeyCode::WebSearch, - NamedKey::BrowserStop => KeyCode::WebStop, - NamedKey::Copy => KeyCode::Copy, - NamedKey::Paste => KeyCode::Paste, - NamedKey::Cut => KeyCode::Cut, - _ => KeyCode::Unlabeled, - }, - _ => KeyCode::Unlabeled, + winit::keyboard::Key::Character(c) => keyboard::Key::Character(c), + winit::keyboard::Key::Named(named_key) => { + keyboard::Key::Named(match named_key { + NamedKey::Alt => Named::Alt, + NamedKey::AltGraph => Named::AltGraph, + NamedKey::CapsLock => Named::CapsLock, + NamedKey::Control => Named::Control, + NamedKey::Fn => Named::Fn, + NamedKey::FnLock => Named::FnLock, + NamedKey::NumLock => Named::NumLock, + NamedKey::ScrollLock => Named::ScrollLock, + NamedKey::Shift => Named::Shift, + NamedKey::Symbol => Named::Symbol, + NamedKey::SymbolLock => Named::SymbolLock, + NamedKey::Meta => Named::Meta, + NamedKey::Hyper => Named::Hyper, + NamedKey::Super => Named::Super, + NamedKey::Enter => Named::Enter, + NamedKey::Tab => Named::Tab, + NamedKey::Space => Named::Space, + NamedKey::ArrowDown => Named::ArrowDown, + NamedKey::ArrowLeft => Named::ArrowLeft, + NamedKey::ArrowRight => Named::ArrowRight, + NamedKey::ArrowUp => Named::ArrowUp, + NamedKey::End => Named::End, + NamedKey::Home => Named::Home, + NamedKey::PageDown => Named::PageDown, + NamedKey::PageUp => Named::PageUp, + NamedKey::Backspace => Named::Backspace, + NamedKey::Clear => Named::Clear, + NamedKey::Copy => Named::Copy, + NamedKey::CrSel => Named::CrSel, + NamedKey::Cut => Named::Cut, + NamedKey::Delete => Named::Delete, + NamedKey::EraseEof => Named::EraseEof, + NamedKey::ExSel => Named::ExSel, + NamedKey::Insert => Named::Insert, + NamedKey::Paste => Named::Paste, + NamedKey::Redo => Named::Redo, + NamedKey::Undo => Named::Undo, + NamedKey::Accept => Named::Accept, + NamedKey::Again => Named::Again, + NamedKey::Attn => Named::Attn, + NamedKey::Cancel => Named::Cancel, + NamedKey::ContextMenu => Named::ContextMenu, + NamedKey::Escape => Named::Escape, + NamedKey::Execute => Named::Execute, + NamedKey::Find => Named::Find, + NamedKey::Help => Named::Help, + NamedKey::Pause => Named::Pause, + NamedKey::Play => Named::Play, + NamedKey::Props => Named::Props, + NamedKey::Select => Named::Select, + NamedKey::ZoomIn => Named::ZoomIn, + NamedKey::ZoomOut => Named::ZoomOut, + NamedKey::BrightnessDown => Named::BrightnessDown, + NamedKey::BrightnessUp => Named::BrightnessUp, + NamedKey::Eject => Named::Eject, + NamedKey::LogOff => Named::LogOff, + NamedKey::Power => Named::Power, + NamedKey::PowerOff => Named::PowerOff, + NamedKey::PrintScreen => Named::PrintScreen, + NamedKey::Hibernate => Named::Hibernate, + NamedKey::Standby => Named::Standby, + NamedKey::WakeUp => Named::WakeUp, + NamedKey::AllCandidates => Named::AllCandidates, + NamedKey::Alphanumeric => Named::Alphanumeric, + NamedKey::CodeInput => Named::CodeInput, + NamedKey::Compose => Named::Compose, + NamedKey::Convert => Named::Convert, + NamedKey::FinalMode => Named::FinalMode, + NamedKey::GroupFirst => Named::GroupFirst, + NamedKey::GroupLast => Named::GroupLast, + NamedKey::GroupNext => Named::GroupNext, + NamedKey::GroupPrevious => Named::GroupPrevious, + NamedKey::ModeChange => Named::ModeChange, + NamedKey::NextCandidate => Named::NextCandidate, + NamedKey::NonConvert => Named::NonConvert, + NamedKey::PreviousCandidate => Named::PreviousCandidate, + NamedKey::Process => Named::Process, + NamedKey::SingleCandidate => Named::SingleCandidate, + NamedKey::HangulMode => Named::HangulMode, + NamedKey::HanjaMode => Named::HanjaMode, + NamedKey::JunjaMode => Named::JunjaMode, + NamedKey::Eisu => Named::Eisu, + NamedKey::Hankaku => Named::Hankaku, + NamedKey::Hiragana => Named::Hiragana, + NamedKey::HiraganaKatakana => Named::HiraganaKatakana, + NamedKey::KanaMode => Named::KanaMode, + NamedKey::KanjiMode => Named::KanjiMode, + NamedKey::Katakana => Named::Katakana, + NamedKey::Romaji => Named::Romaji, + NamedKey::Zenkaku => Named::Zenkaku, + NamedKey::ZenkakuHankaku => Named::ZenkakuHankaku, + NamedKey::Soft1 => Named::Soft1, + NamedKey::Soft2 => Named::Soft2, + NamedKey::Soft3 => Named::Soft3, + NamedKey::Soft4 => Named::Soft4, + NamedKey::ChannelDown => Named::ChannelDown, + NamedKey::ChannelUp => Named::ChannelUp, + NamedKey::Close => Named::Close, + NamedKey::MailForward => Named::MailForward, + NamedKey::MailReply => Named::MailReply, + NamedKey::MailSend => Named::MailSend, + NamedKey::MediaClose => Named::MediaClose, + NamedKey::MediaFastForward => Named::MediaFastForward, + NamedKey::MediaPause => Named::MediaPause, + NamedKey::MediaPlay => Named::MediaPlay, + NamedKey::MediaPlayPause => Named::MediaPlayPause, + NamedKey::MediaRecord => Named::MediaRecord, + NamedKey::MediaRewind => Named::MediaRewind, + NamedKey::MediaStop => Named::MediaStop, + NamedKey::MediaTrackNext => Named::MediaTrackNext, + NamedKey::MediaTrackPrevious => Named::MediaTrackPrevious, + NamedKey::New => Named::New, + NamedKey::Open => Named::Open, + NamedKey::Print => Named::Print, + NamedKey::Save => Named::Save, + NamedKey::SpellCheck => Named::SpellCheck, + NamedKey::Key11 => Named::Key11, + NamedKey::Key12 => Named::Key12, + NamedKey::AudioBalanceLeft => Named::AudioBalanceLeft, + NamedKey::AudioBalanceRight => Named::AudioBalanceRight, + NamedKey::AudioBassBoostDown => Named::AudioBassBoostDown, + NamedKey::AudioBassBoostToggle => Named::AudioBassBoostToggle, + NamedKey::AudioBassBoostUp => Named::AudioBassBoostUp, + NamedKey::AudioFaderFront => Named::AudioFaderFront, + NamedKey::AudioFaderRear => Named::AudioFaderRear, + NamedKey::AudioSurroundModeNext => Named::AudioSurroundModeNext, + NamedKey::AudioTrebleDown => Named::AudioTrebleDown, + NamedKey::AudioTrebleUp => Named::AudioTrebleUp, + NamedKey::AudioVolumeDown => Named::AudioVolumeDown, + NamedKey::AudioVolumeUp => Named::AudioVolumeUp, + NamedKey::AudioVolumeMute => Named::AudioVolumeMute, + NamedKey::MicrophoneToggle => Named::MicrophoneToggle, + NamedKey::MicrophoneVolumeDown => Named::MicrophoneVolumeDown, + NamedKey::MicrophoneVolumeUp => Named::MicrophoneVolumeUp, + NamedKey::MicrophoneVolumeMute => Named::MicrophoneVolumeMute, + NamedKey::SpeechCorrectionList => Named::SpeechCorrectionList, + NamedKey::SpeechInputToggle => Named::SpeechInputToggle, + NamedKey::LaunchApplication1 => Named::LaunchApplication1, + NamedKey::LaunchApplication2 => Named::LaunchApplication2, + NamedKey::LaunchCalendar => Named::LaunchCalendar, + NamedKey::LaunchContacts => Named::LaunchContacts, + NamedKey::LaunchMail => Named::LaunchMail, + NamedKey::LaunchMediaPlayer => Named::LaunchMediaPlayer, + NamedKey::LaunchMusicPlayer => Named::LaunchMusicPlayer, + NamedKey::LaunchPhone => Named::LaunchPhone, + NamedKey::LaunchScreenSaver => Named::LaunchScreenSaver, + NamedKey::LaunchSpreadsheet => Named::LaunchSpreadsheet, + NamedKey::LaunchWebBrowser => Named::LaunchWebBrowser, + NamedKey::LaunchWebCam => Named::LaunchWebCam, + NamedKey::LaunchWordProcessor => Named::LaunchWordProcessor, + NamedKey::BrowserBack => Named::BrowserBack, + NamedKey::BrowserFavorites => Named::BrowserFavorites, + NamedKey::BrowserForward => Named::BrowserForward, + NamedKey::BrowserHome => Named::BrowserHome, + NamedKey::BrowserRefresh => Named::BrowserRefresh, + NamedKey::BrowserSearch => Named::BrowserSearch, + NamedKey::BrowserStop => Named::BrowserStop, + NamedKey::AppSwitch => Named::AppSwitch, + NamedKey::Call => Named::Call, + NamedKey::Camera => Named::Camera, + NamedKey::CameraFocus => Named::CameraFocus, + NamedKey::EndCall => Named::EndCall, + NamedKey::GoBack => Named::GoBack, + NamedKey::GoHome => Named::GoHome, + NamedKey::HeadsetHook => Named::HeadsetHook, + NamedKey::LastNumberRedial => Named::LastNumberRedial, + NamedKey::Notification => Named::Notification, + NamedKey::MannerMode => Named::MannerMode, + NamedKey::VoiceDial => Named::VoiceDial, + NamedKey::TV => Named::TV, + NamedKey::TV3DMode => Named::TV3DMode, + NamedKey::TVAntennaCable => Named::TVAntennaCable, + NamedKey::TVAudioDescription => Named::TVAudioDescription, + NamedKey::TVAudioDescriptionMixDown => { + Named::TVAudioDescriptionMixDown + } + NamedKey::TVAudioDescriptionMixUp => { + Named::TVAudioDescriptionMixUp + } + NamedKey::TVContentsMenu => Named::TVContentsMenu, + NamedKey::TVDataService => Named::TVDataService, + NamedKey::TVInput => Named::TVInput, + NamedKey::TVInputComponent1 => Named::TVInputComponent1, + NamedKey::TVInputComponent2 => Named::TVInputComponent2, + NamedKey::TVInputComposite1 => Named::TVInputComposite1, + NamedKey::TVInputComposite2 => Named::TVInputComposite2, + NamedKey::TVInputHDMI1 => Named::TVInputHDMI1, + NamedKey::TVInputHDMI2 => Named::TVInputHDMI2, + NamedKey::TVInputHDMI3 => Named::TVInputHDMI3, + NamedKey::TVInputHDMI4 => Named::TVInputHDMI4, + NamedKey::TVInputVGA1 => Named::TVInputVGA1, + NamedKey::TVMediaContext => Named::TVMediaContext, + NamedKey::TVNetwork => Named::TVNetwork, + NamedKey::TVNumberEntry => Named::TVNumberEntry, + NamedKey::TVPower => Named::TVPower, + NamedKey::TVRadioService => Named::TVRadioService, + NamedKey::TVSatellite => Named::TVSatellite, + NamedKey::TVSatelliteBS => Named::TVSatelliteBS, + NamedKey::TVSatelliteCS => Named::TVSatelliteCS, + NamedKey::TVSatelliteToggle => Named::TVSatelliteToggle, + NamedKey::TVTerrestrialAnalog => Named::TVTerrestrialAnalog, + NamedKey::TVTerrestrialDigital => Named::TVTerrestrialDigital, + NamedKey::TVTimer => Named::TVTimer, + NamedKey::AVRInput => Named::AVRInput, + NamedKey::AVRPower => Named::AVRPower, + NamedKey::ColorF0Red => Named::ColorF0Red, + NamedKey::ColorF1Green => Named::ColorF1Green, + NamedKey::ColorF2Yellow => Named::ColorF2Yellow, + NamedKey::ColorF3Blue => Named::ColorF3Blue, + NamedKey::ColorF4Grey => Named::ColorF4Grey, + NamedKey::ColorF5Brown => Named::ColorF5Brown, + NamedKey::ClosedCaptionToggle => Named::ClosedCaptionToggle, + NamedKey::Dimmer => Named::Dimmer, + NamedKey::DisplaySwap => Named::DisplaySwap, + NamedKey::DVR => Named::DVR, + NamedKey::Exit => Named::Exit, + NamedKey::FavoriteClear0 => Named::FavoriteClear0, + NamedKey::FavoriteClear1 => Named::FavoriteClear1, + NamedKey::FavoriteClear2 => Named::FavoriteClear2, + NamedKey::FavoriteClear3 => Named::FavoriteClear3, + NamedKey::FavoriteRecall0 => Named::FavoriteRecall0, + NamedKey::FavoriteRecall1 => Named::FavoriteRecall1, + NamedKey::FavoriteRecall2 => Named::FavoriteRecall2, + NamedKey::FavoriteRecall3 => Named::FavoriteRecall3, + NamedKey::FavoriteStore0 => Named::FavoriteStore0, + NamedKey::FavoriteStore1 => Named::FavoriteStore1, + NamedKey::FavoriteStore2 => Named::FavoriteStore2, + NamedKey::FavoriteStore3 => Named::FavoriteStore3, + NamedKey::Guide => Named::Guide, + NamedKey::GuideNextDay => Named::GuideNextDay, + NamedKey::GuidePreviousDay => Named::GuidePreviousDay, + NamedKey::Info => Named::Info, + NamedKey::InstantReplay => Named::InstantReplay, + NamedKey::Link => Named::Link, + NamedKey::ListProgram => Named::ListProgram, + NamedKey::LiveContent => Named::LiveContent, + NamedKey::Lock => Named::Lock, + NamedKey::MediaApps => Named::MediaApps, + NamedKey::MediaAudioTrack => Named::MediaAudioTrack, + NamedKey::MediaLast => Named::MediaLast, + NamedKey::MediaSkipBackward => Named::MediaSkipBackward, + NamedKey::MediaSkipForward => Named::MediaSkipForward, + NamedKey::MediaStepBackward => Named::MediaStepBackward, + NamedKey::MediaStepForward => Named::MediaStepForward, + NamedKey::MediaTopMenu => Named::MediaTopMenu, + NamedKey::NavigateIn => Named::NavigateIn, + NamedKey::NavigateNext => Named::NavigateNext, + NamedKey::NavigateOut => Named::NavigateOut, + NamedKey::NavigatePrevious => Named::NavigatePrevious, + NamedKey::NextFavoriteChannel => Named::NextFavoriteChannel, + NamedKey::NextUserProfile => Named::NextUserProfile, + NamedKey::OnDemand => Named::OnDemand, + NamedKey::Pairing => Named::Pairing, + NamedKey::PinPDown => Named::PinPDown, + NamedKey::PinPMove => Named::PinPMove, + NamedKey::PinPToggle => Named::PinPToggle, + NamedKey::PinPUp => Named::PinPUp, + NamedKey::PlaySpeedDown => Named::PlaySpeedDown, + NamedKey::PlaySpeedReset => Named::PlaySpeedReset, + NamedKey::PlaySpeedUp => Named::PlaySpeedUp, + NamedKey::RandomToggle => Named::RandomToggle, + NamedKey::RcLowBattery => Named::RcLowBattery, + NamedKey::RecordSpeedNext => Named::RecordSpeedNext, + NamedKey::RfBypass => Named::RfBypass, + NamedKey::ScanChannelsToggle => Named::ScanChannelsToggle, + NamedKey::ScreenModeNext => Named::ScreenModeNext, + NamedKey::Settings => Named::Settings, + NamedKey::SplitScreenToggle => Named::SplitScreenToggle, + NamedKey::STBInput => Named::STBInput, + NamedKey::STBPower => Named::STBPower, + NamedKey::Subtitle => Named::Subtitle, + NamedKey::Teletext => Named::Teletext, + NamedKey::VideoModeNext => Named::VideoModeNext, + NamedKey::Wink => Named::Wink, + NamedKey::ZoomToggle => Named::ZoomToggle, + NamedKey::F1 => Named::F1, + NamedKey::F2 => Named::F2, + NamedKey::F3 => Named::F3, + NamedKey::F4 => Named::F4, + NamedKey::F5 => Named::F5, + NamedKey::F6 => Named::F6, + NamedKey::F7 => Named::F7, + NamedKey::F8 => Named::F8, + NamedKey::F9 => Named::F9, + NamedKey::F10 => Named::F10, + NamedKey::F11 => Named::F11, + NamedKey::F12 => Named::F12, + NamedKey::F13 => Named::F13, + NamedKey::F14 => Named::F14, + NamedKey::F15 => Named::F15, + NamedKey::F16 => Named::F16, + NamedKey::F17 => Named::F17, + NamedKey::F18 => Named::F18, + NamedKey::F19 => Named::F19, + NamedKey::F20 => Named::F20, + NamedKey::F21 => Named::F21, + NamedKey::F22 => Named::F22, + NamedKey::F23 => Named::F23, + NamedKey::F24 => Named::F24, + NamedKey::F25 => Named::F25, + NamedKey::F26 => Named::F26, + NamedKey::F27 => Named::F27, + NamedKey::F28 => Named::F28, + NamedKey::F29 => Named::F29, + NamedKey::F30 => Named::F30, + NamedKey::F31 => Named::F31, + NamedKey::F32 => Named::F32, + NamedKey::F33 => Named::F33, + NamedKey::F34 => Named::F34, + NamedKey::F35 => Named::F35, + _ => return keyboard::Key::Unidentified, + }) + } + _ => keyboard::Key::Unidentified, } } diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 93f0cde3..dc659c1a 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -645,7 +645,7 @@ async fn run_instance<A, E, C>( if let Some(event) = conversion::window_event( id, - &window_event, + window_event, window.state.scale_factor(), window.state.modifiers(), ) { From 03f5a351c37dbe1b0a286583e620d1cf074f1b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Tue, 16 Jan 2024 13:31:02 +0100 Subject: [PATCH 260/286] Use `SmolStr` for `text` field in `KeyPressed` event --- core/src/keyboard/event.rs | 3 ++- core/src/keyboard/key.rs | 2 +- core/src/lib.rs | 2 ++ winit/src/conversion.rs | 4 +--- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/src/keyboard/event.rs b/core/src/keyboard/event.rs index b1792415..1eb42334 100644 --- a/core/src/keyboard/event.rs +++ b/core/src/keyboard/event.rs @@ -1,4 +1,5 @@ use crate::keyboard::{Key, Location, Modifiers}; +use crate::SmolStr; /// A keyboard event. /// @@ -20,7 +21,7 @@ pub enum Event { modifiers: Modifiers, /// The text produced by the key press, if any. - text: Option<String>, + text: Option<SmolStr>, }, /// A keyboard key was released. diff --git a/core/src/keyboard/key.rs b/core/src/keyboard/key.rs index ef48dae4..dbde5196 100644 --- a/core/src/keyboard/key.rs +++ b/core/src/keyboard/key.rs @@ -1,5 +1,5 @@ //! Identify keyboard keys. -use smol_str::SmolStr; +use crate::SmolStr; /// A key on the keyboard. /// diff --git a/core/src/lib.rs b/core/src/lib.rs index 54ea5839..864df6e6 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -75,3 +75,5 @@ pub use size::Size; pub use text::Text; pub use vector::Vector; pub use widget::Widget; + +pub use smol_str::SmolStr; diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs index 387289e8..90a5d27f 100644 --- a/winit/src/conversion.rs +++ b/winit/src/conversion.rs @@ -225,9 +225,7 @@ pub fn window_event( key, modifiers, location, - text: text - .as_ref() - .map(winit::keyboard::SmolStr::to_string), + text, } } winit::event::ElementState::Released => { From ff268c8c4268d930fc337636302175d44e201448 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott <idscott@system76.com> Date: Tue, 9 Jan 2024 12:25:53 -0800 Subject: [PATCH 261/286] Update to `softbuffer` 0.3, tracking up to `age` sets of primitives --- Cargo.toml | 2 +- renderer/src/compositor.rs | 1 + tiny_skia/src/window/compositor.rs | 121 ++++++++++++++++++----------- 3 files changed, 79 insertions(+), 45 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ac72f212..1f2da434 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,7 +145,7 @@ resvg = "0.36" rustc-hash = "1.0" smol = "1.0" smol_str = "0.2" -softbuffer = "0.2" +softbuffer = "0.3.4" syntect = "5.1" sysinfo = "0.28" thiserror = "1.0" diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 9d0ff9ab..f9afdea4 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -238,6 +238,7 @@ impl Candidate { default_font: settings.default_font, default_text_size: settings.default_text_size, }, + _compatible_window, ); Ok(Compositor::TinySkia(compositor)) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 87ded746..d99b85d4 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -5,18 +5,21 @@ use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use std::collections::VecDeque; use std::marker::PhantomData; +use std::num::NonZeroU32; pub struct Compositor<Theme> { + context: Option<softbuffer::Context>, settings: Settings, _theme: PhantomData<Theme>, } pub struct Surface { - window: softbuffer::GraphicsContext, - buffer: Vec<u32>, + window: softbuffer::Surface, clip_mask: tiny_skia::Mask, - primitives: Option<Vec<Primitive>>, + // Primitives of existing buffers, by decreasing age + primitives: VecDeque<Vec<Primitive>>, background_color: Color, } @@ -27,9 +30,9 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( settings: Self::Settings, - _compatible_window: Option<&W>, + compatible_window: Option<&W>, ) -> Result<Self, Error> { - Ok(new(settings)) + Ok(new(settings, compatible_window)) } fn create_renderer(&self) -> Self::Renderer { @@ -47,16 +50,21 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { height: u32, ) -> Surface { #[allow(unsafe_code)] - let window = - unsafe { softbuffer::GraphicsContext::new(window, window) } - .expect("Create softbuffer for window"); + let window = if let Some(context) = self.context.as_ref() { + unsafe { softbuffer::Surface::new(context, window) } + .expect("Create softbuffer surface for window") + } else { + let context = unsafe { softbuffer::Context::new(window) } + .expect("Create softbuffer context for window"); + unsafe { softbuffer::Surface::new(&context, window) } + .expect("Create softbuffer surface for window") + }; Surface { window, - buffer: vec![0; width as usize * height as usize], clip_mask: tiny_skia::Mask::new(width, height) .expect("Create clip mask"), - primitives: None, + primitives: VecDeque::new(), background_color: Color::BLACK, } } @@ -67,10 +75,9 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { width: u32, height: u32, ) { - surface.buffer.resize((width * height) as usize, 0); surface.clip_mask = tiny_skia::Mask::new(width, height).expect("Create clip mask"); - surface.primitives = None; + surface.primitives.clear(); } fn fetch_information(&self) -> Information { @@ -121,8 +128,15 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { } } -pub fn new<Theme>(settings: Settings) -> Compositor<Theme> { +pub fn new<W: HasRawWindowHandle + HasRawDisplayHandle, Theme>( + settings: Settings, + compatible_window: Option<&W>, +) -> Compositor<Theme> { + #[allow(unsafe_code)] + let context = compatible_window + .and_then(|w| unsafe { softbuffer::Context::new(w) }.ok()); Compositor { + context, settings, _theme: PhantomData, } @@ -139,48 +153,67 @@ pub fn present<T: AsRef<str>>( let physical_size = viewport.physical_size(); let scale_factor = viewport.scale_factor() as f32; - let mut pixels = tiny_skia::PixmapMut::from_bytes( - bytemuck::cast_slice_mut(&mut surface.buffer), - physical_size.width, - physical_size.height, - ) - .expect("Create pixel map"); + surface + .window + .resize( + NonZeroU32::new(physical_size.width).unwrap(), + NonZeroU32::new(physical_size.height).unwrap(), + ) + .unwrap(); - let damage = surface - .primitives - .as_deref() + // TODO Add variants to `SurfaceError`? + let mut buffer = surface + .window + .buffer_mut() + .map_err(|_| compositor::SurfaceError::Lost)?; + + let age = buffer.age(); + + // Forget primatives for back buffers older than `age` + // Or if this is a new buffer, keep at most two. + let max = if age == 0 { 2 } else { age }; + while surface.primitives.len() as u8 > max { + let _ = surface.primitives.pop_front(); + } + + let last_primitives = if surface.primitives.len() as u8 == age { + surface.primitives.pop_front() + } else { + None + }; + + let damage = last_primitives .and_then(|last_primitives| { (surface.background_color == background_color) - .then(|| damage::list(last_primitives, primitives)) + .then(|| damage::list(&last_primitives, primitives)) }) .unwrap_or_else(|| vec![Rectangle::with_size(viewport.logical_size())]); - if damage.is_empty() { - return Ok(()); - } - - surface.primitives = Some(primitives.to_vec()); + surface.primitives.push_back(primitives.to_vec()); surface.background_color = background_color; - let damage = damage::group(damage, scale_factor, physical_size); + if !damage.is_empty() { + let damage = damage::group(damage, scale_factor, physical_size); - backend.draw( - &mut pixels, - &mut surface.clip_mask, - primitives, - viewport, - &damage, - background_color, - overlay, - ); + let mut pixels = tiny_skia::PixmapMut::from_bytes( + bytemuck::cast_slice_mut(&mut buffer), + physical_size.width, + physical_size.height, + ) + .expect("Create pixel map"); - surface.window.set_buffer( - &surface.buffer, - physical_size.width as u16, - physical_size.height as u16, - ); + backend.draw( + &mut pixels, + &mut surface.clip_mask, + primitives, + viewport, + &damage, + background_color, + overlay, + ); + } - Ok(()) + buffer.present().map_err(|_| compositor::SurfaceError::Lost) } pub fn screenshot<T: AsRef<str>>( From 7289b6091b61b0aa448a756cfe32211c78a4cce0 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott <idscott@system76.com> Date: Tue, 9 Jan 2024 07:19:15 -0800 Subject: [PATCH 262/286] WIP raw-window-handle 0.6 --- Cargo.toml | 18 +++++--- graphics/src/compositor.rs | 12 ++--- renderer/src/compositor.rs | 51 ++++++++++++--------- src/application.rs | 7 ++- tiny_skia/src/window/compositor.rs | 56 ++++++++++++----------- wgpu/src/window/compositor.rs | 73 ++++++++++++++++++------------ winit/src/application.rs | 24 ++++++---- winit/src/clipboard.rs | 3 +- 8 files changed, 142 insertions(+), 102 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1f2da434..421c7c76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,8 @@ thiserror.workspace = true image.workspace = true image.optional = true +winit.workspace = true + [profile.release-opt] inherits = "release" codegen-units = 1 @@ -126,7 +128,10 @@ bytemuck = { version = "1.0", features = ["derive"] } cosmic-text = "0.10" futures = "0.3" glam = "0.24" -glyphon = "0.4" +# glyphon = "0.4" +# TODO update for wgpu 0.19 +# https://github.com/grovesNL/glyphon/pull/80 +glyphon = { git = "https://github.com/EggShark/glyphon" } guillotiere = "0.6" half = "2.2" image = "0.24" @@ -140,12 +145,12 @@ once_cell = "1.0" ouroboros = "0.17" palette = "0.7" qrcode = { version = "0.12", default-features = false } -raw-window-handle = "0.5" +raw-window-handle = "0.6" resvg = "0.36" rustc-hash = "1.0" smol = "1.0" smol_str = "0.2" -softbuffer = "0.3.4" +softbuffer = "0.4.1" syntect = "5.1" sysinfo = "0.28" thiserror = "1.0" @@ -158,7 +163,8 @@ wasm-bindgen-futures = "0.4" wasm-timer = "0.2" web-sys = "0.3" web-time = "0.2" -wgpu = "0.18" +wgpu = "0.19" winapi = "0.3" -window_clipboard = "0.3" -winit = { git = "https://github.com/iced-rs/winit.git", rev = "b91e39ece2c0d378c3b80da7f3ab50e17bb798a5", features = ["rwh_05"] } +# window_clipboard = "0.3" +window_clipboard = { git = "https://github.com/ids1024/window_clipboard", branch = "raw-window-handle-0.6" } +winit = { git = "https://github.com/iced-rs/winit.git", rev = "b91e39ece2c0d378c3b80da7f3ab50e17bb798a5", features = ["rwh_06"] } diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index b8b575b4..6a4c7909 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -4,11 +4,11 @@ use crate::{Error, Viewport}; use iced_core::Color; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use thiserror::Error; /// A graphics compositor that can draw to windows. -pub trait Compositor: Sized { +pub trait Compositor<W: HasWindowHandle + HasDisplayHandle>: Sized { /// The settings of the backend. type Settings: Default; @@ -19,9 +19,9 @@ pub trait Compositor: Sized { type Surface; /// Creates a new [`Compositor`]. - fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn new( settings: Self::Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Result<Self, Error>; /// Creates a [`Self::Renderer`] for the [`Compositor`]. @@ -30,9 +30,9 @@ pub trait Compositor: Sized { /// Crates a new [`Surface`] for the given window. /// /// [`Surface`]: Self::Surface - fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn create_surface( &mut self, - window: &W, + window: W, width: u32, height: u32, ) -> Self::Surface; diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index f9afdea4..17157c66 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -3,29 +3,36 @@ use crate::graphics::compositor::{Information, SurfaceError}; use crate::graphics::{Error, Viewport}; use crate::{Renderer, Settings}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::env; -pub enum Compositor<Theme> { - TinySkia(iced_tiny_skia::window::Compositor<Theme>), +pub enum Compositor<W: HasWindowHandle + HasDisplayHandle, Theme> { + TinySkia(iced_tiny_skia::window::Compositor<W, Theme>), #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::window::Compositor<Theme>), + Wgpu(iced_wgpu::window::Compositor<W, Theme>), } -pub enum Surface { - TinySkia(iced_tiny_skia::window::Surface), +pub enum Surface<W: HasWindowHandle + HasDisplayHandle> { + TinySkia(iced_tiny_skia::window::Surface<W>), #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::window::Surface), + Wgpu(iced_wgpu::window::Surface<'static>), } -impl<Theme> crate::graphics::Compositor for Compositor<Theme> { +// XXX Clone bound +// XXX Send/Sync? +// 'static? +impl< + W: Clone + Send + Sync + HasWindowHandle + HasDisplayHandle + 'static, + Theme, + > crate::graphics::Compositor<W> for Compositor<W, Theme> +{ type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface; + type Surface = Surface<W>; - fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn new( settings: Self::Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Result<Self, Error> { let candidates = Candidate::list_from_env().unwrap_or(Candidate::default_list()); @@ -33,7 +40,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { let mut error = Error::GraphicsAdapterNotFound; for candidate in candidates { - match candidate.build(settings, compatible_window) { + match candidate.build(settings, compatible_window.clone()) { Ok(compositor) => return Ok(compositor), Err(new_error) => { error = new_error; @@ -56,12 +63,12 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { } } - fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn create_surface( &mut self, - window: &W, + window: W, width: u32, height: u32, - ) -> Surface { + ) -> Surface<W> { match self { Self::TinySkia(compositor) => Surface::TinySkia( compositor.create_surface(window, width, height), @@ -75,7 +82,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut Surface, + surface: &mut Surface<W>, width: u32, height: u32, ) { @@ -114,7 +121,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::TinySkia(_compositor), crate::Renderer::TinySkia(renderer), - Surface::TinySkia(surface), + Surface::TinySkia(ref mut surface), ) => renderer.with_primitives(|backend, primitives| { iced_tiny_skia::window::compositor::present( backend, @@ -129,7 +136,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::Wgpu(compositor), crate::Renderer::Wgpu(renderer), - Surface::Wgpu(surface), + Surface::Wgpu(ref mut surface), ) => renderer.with_primitives(|backend, primitives| { iced_wgpu::window::compositor::present( compositor, @@ -161,7 +168,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::TinySkia(_compositor), Renderer::TinySkia(renderer), - Surface::TinySkia(surface), + Surface::TinySkia(ref mut surface), ) => renderer.with_primitives(|backend, primitives| { iced_tiny_skia::window::compositor::screenshot( surface, @@ -226,11 +233,11 @@ impl Candidate { ) } - fn build<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>( + fn build<Theme, W: HasWindowHandle + HasDisplayHandle + Send + Sync>( self, settings: Settings, - _compatible_window: Option<&W>, - ) -> Result<Compositor<Theme>, Error> { + _compatible_window: Option<W>, + ) -> Result<Compositor<W, Theme>, Error> { match self { Self::TinySkia => { let compositor = iced_tiny_skia::window::compositor::new( diff --git a/src/application.rs b/src/application.rs index 9518b8c5..d7be6719 100644 --- a/src/application.rs +++ b/src/application.rs @@ -1,6 +1,8 @@ //! Build interactive cross-platform applications. use crate::{Command, Element, Executor, Settings, Subscription}; +use std::sync::Arc; + pub use crate::style::application::{Appearance, StyleSheet}; /// An interactive cross-platform application. @@ -208,7 +210,10 @@ pub trait Application: Sized { Ok(crate::shell::application::run::< Instance<Self>, Self::Executor, - crate::renderer::Compositor<Self::Theme>, + crate::renderer::Compositor< + Arc<winit::window::Window>, + Self::Theme, + >, >(settings.into(), renderer_settings)?) } } diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index d99b85d4..788d7297 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -4,33 +4,36 @@ use crate::graphics::damage; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::collections::VecDeque; use std::marker::PhantomData; use std::num::NonZeroU32; -pub struct Compositor<Theme> { - context: Option<softbuffer::Context>, +pub struct Compositor<W: HasDisplayHandle + HasWindowHandle, Theme> { + context: Option<softbuffer::Context<W>>, settings: Settings, _theme: PhantomData<Theme>, } -pub struct Surface { - window: softbuffer::Surface, +pub struct Surface<W: HasDisplayHandle + HasWindowHandle> { + window: softbuffer::Surface<W, W>, clip_mask: tiny_skia::Mask, // Primitives of existing buffers, by decreasing age primitives: VecDeque<Vec<Primitive>>, background_color: Color, } -impl<Theme> crate::graphics::Compositor for Compositor<Theme> { +// XXX avoid clone bound? +impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> + crate::graphics::Compositor<W> for Compositor<W, Theme> +{ type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface; + type Surface = Surface<W>; - fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn new( settings: Self::Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Result<Self, Error> { Ok(new(settings, compatible_window)) } @@ -43,20 +46,19 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ) } - fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn create_surface( &mut self, - window: &W, + window: W, width: u32, height: u32, - ) -> Surface { - #[allow(unsafe_code)] + ) -> Surface<W> { let window = if let Some(context) = self.context.as_ref() { - unsafe { softbuffer::Surface::new(context, window) } + softbuffer::Surface::new(context, window) .expect("Create softbuffer surface for window") } else { - let context = unsafe { softbuffer::Context::new(window) } + let context = softbuffer::Context::new(window.clone()) .expect("Create softbuffer context for window"); - unsafe { softbuffer::Surface::new(&context, window) } + softbuffer::Surface::new(&context, window) .expect("Create softbuffer surface for window") }; @@ -71,7 +73,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut Surface, + surface: &mut Surface<W>, width: u32, height: u32, ) { @@ -90,7 +92,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Self::Surface, + surface: &mut Surface<W>, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -128,13 +130,13 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { } } -pub fn new<W: HasRawWindowHandle + HasRawDisplayHandle, Theme>( +pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( settings: Settings, - compatible_window: Option<&W>, -) -> Compositor<Theme> { + compatible_window: Option<W>, +) -> Compositor<W, Theme> { #[allow(unsafe_code)] - let context = compatible_window - .and_then(|w| unsafe { softbuffer::Context::new(w) }.ok()); + let context = + compatible_window.and_then(|w| softbuffer::Context::new(w).ok()); Compositor { context, settings, @@ -142,9 +144,9 @@ pub fn new<W: HasRawWindowHandle + HasRawDisplayHandle, Theme>( } } -pub fn present<T: AsRef<str>>( +pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( backend: &mut Backend, - surface: &mut Surface, + surface: &mut Surface<W>, primitives: &[Primitive], viewport: &Viewport, background_color: Color, @@ -216,8 +218,8 @@ pub fn present<T: AsRef<str>>( buffer.present().map_err(|_| compositor::SurfaceError::Lost) } -pub fn screenshot<T: AsRef<str>>( - surface: &mut Surface, +pub fn screenshot<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( + surface: &mut Surface<W>, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 090e0e9f..e2dc4901 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -6,13 +6,13 @@ use crate::graphics::compositor; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle}; +use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::marker::PhantomData; /// A window graphics backend for iced powered by `wgpu`. #[allow(missing_debug_implementations)] -pub struct Compositor<Theme> { +pub struct Compositor<W, Theme> { settings: Settings, instance: wgpu::Instance, adapter: wgpu::Adapter, @@ -20,15 +20,18 @@ pub struct Compositor<Theme> { queue: wgpu::Queue, format: wgpu::TextureFormat, theme: PhantomData<Theme>, + w: PhantomData<W>, } -impl<Theme> Compositor<Theme> { +impl<W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, Theme> + Compositor<W, Theme> +{ /// Requests a new [`Compositor`] with the given [`Settings`]. /// /// Returns `None` if no compatible graphics adapter could be found. - pub async fn request<W: HasRawWindowHandle + HasRawDisplayHandle>( + pub async fn request( settings: Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Option<Self> { let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { backends: settings.internal_backend, @@ -41,6 +44,7 @@ impl<Theme> Compositor<Theme> { if log::max_level() >= log::LevelFilter::Info { let available_adapters: Vec<_> = instance .enumerate_adapters(settings.internal_backend) + .iter() .map(|adapter| adapter.get_info()) .collect(); log::info!("Available adapters: {available_adapters:#?}"); @@ -48,7 +52,7 @@ impl<Theme> Compositor<Theme> { #[allow(unsafe_code)] let compatible_surface = compatible_window - .and_then(|window| unsafe { instance.create_surface(window).ok() }); + .and_then(|window| instance.create_surface(window).ok()); let adapter = instance .request_adapter(&wgpu::RequestAdapterOptions { @@ -100,14 +104,14 @@ impl<Theme> Compositor<Theme> { let (device, queue) = loop { - let limits = limits.next()?; + let required_limits = limits.next()?; let device = adapter.request_device( &wgpu::DeviceDescriptor { label: Some( "iced_wgpu::window::compositor device descriptor", ), - features: wgpu::Features::empty(), - limits, + required_features: wgpu::Features::empty(), + required_limits, }, None, ).await.ok(); @@ -125,6 +129,7 @@ impl<Theme> Compositor<Theme> { queue, format, theme: PhantomData, + w: PhantomData, }) } @@ -136,10 +141,13 @@ impl<Theme> Compositor<Theme> { /// Creates a [`Compositor`] and its [`Backend`] for the given [`Settings`] and /// window. -pub fn new<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>( +pub fn new< + Theme, + W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, +>( settings: Settings, - compatible_window: Option<&W>, -) -> Result<Compositor<Theme>, Error> { + compatible_window: Option<W>, +) -> Result<Compositor<W, Theme>, Error> { let compositor = futures::executor::block_on(Compositor::request( settings, compatible_window, @@ -150,10 +158,10 @@ pub fn new<Theme, W: HasRawWindowHandle + HasRawDisplayHandle>( } /// Presents the given primitives with the given [`Compositor`] and [`Backend`]. -pub fn present<Theme, T: AsRef<str>>( - compositor: &mut Compositor<Theme>, +pub fn present<W, Theme, T: AsRef<str>>( + compositor: &mut Compositor<W, Theme>, backend: &mut Backend, - surface: &mut wgpu::Surface, + surface: &mut wgpu::Surface<'static>, primitives: &[Primitive], viewport: &Viewport, background_color: Color, @@ -204,14 +212,19 @@ pub fn present<Theme, T: AsRef<str>>( } } -impl<Theme> graphics::Compositor for Compositor<Theme> { +impl< + W: HasDisplayHandle + HasWindowHandle + wgpu::WasmNotSendSync + 'static, + Theme, + > graphics::Compositor<W> for Compositor<W, Theme> +{ type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = wgpu::Surface; + // XXX generic instead of 'static + type Surface = wgpu::Surface<'static>; - fn new<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn new( settings: Self::Settings, - compatible_window: Option<&W>, + compatible_window: Option<W>, ) -> Result<Self, Error> { new(settings, compatible_window) } @@ -224,14 +237,15 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { ) } - fn create_surface<W: HasRawWindowHandle + HasRawDisplayHandle>( + fn create_surface( &mut self, - window: &W, + window: W, width: u32, height: u32, - ) -> wgpu::Surface { - #[allow(unsafe_code)] - let mut surface = unsafe { self.instance.create_surface(window) } + ) -> wgpu::Surface<'static> { + let mut surface = self + .instance + .create_surface(window) .expect("Create surface"); self.configure_surface(&mut surface, width, height); @@ -241,7 +255,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut Self::Surface, + surface: &mut wgpu::Surface<'static>, width: u32, height: u32, ) { @@ -255,6 +269,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { height, alpha_mode: wgpu::CompositeAlphaMode::Auto, view_formats: vec![], + desired_maximum_frame_latency: 2, }, ); } @@ -271,7 +286,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Self::Surface, + surface: &mut wgpu::Surface<'static>, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -292,7 +307,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn screenshot<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - _surface: &mut Self::Surface, + _surface: &mut wgpu::Surface<'static>, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -313,8 +328,8 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { /// Renders the current surface to an offscreen buffer. /// /// Returns RGBA bytes of the texture data. -pub fn screenshot<Theme, T: AsRef<str>>( - compositor: &Compositor<Theme>, +pub fn screenshot<W, Theme, T: AsRef<str>>( + compositor: &Compositor<W, Theme>, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, diff --git a/winit/src/application.rs b/winit/src/application.rs index bf48538d..d639a36b 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -24,6 +24,7 @@ use crate::{Clipboard, Error, Proxy, Settings}; use futures::channel::mpsc; use std::mem::ManuallyDrop; +use std::sync::Arc; /// An interactive, native cross-platform application. /// @@ -105,7 +106,7 @@ pub fn run<A, E, C>( where A: Application + 'static, E: Executor + 'static, - C: Compositor<Renderer = A::Renderer> + 'static, + C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use futures::task; @@ -149,9 +150,12 @@ where log::debug!("Window builder: {builder:#?}"); - let window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; + // XXX Arc? + let window = Arc::new( + builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?, + ); #[cfg(target_arch = "wasm32")] { @@ -183,7 +187,7 @@ where }; } - let compositor = C::new(compositor_settings, Some(&window))?; + let compositor = C::new(compositor_settings, Some(window.clone()))?; let mut renderer = compositor.create_renderer(); for font in settings.fonts { @@ -248,13 +252,13 @@ async fn run_instance<A, E, C>( >, mut control_sender: mpsc::UnboundedSender<winit::event_loop::ControlFlow>, init_command: Command<A::Message>, - window: winit::window::Window, + window: Arc<winit::window::Window>, should_be_visible: bool, exit_on_close_request: bool, ) where A: Application + 'static, E: Executor + 'static, - C: Compositor<Renderer = A::Renderer> + 'static, + C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use futures::stream::StreamExt; @@ -268,7 +272,7 @@ async fn run_instance<A, E, C>( let mut clipboard = Clipboard::connect(&window); let mut cache = user_interface::Cache::default(); let mut surface = compositor.create_surface( - &window, + window.clone(), physical_size.width, physical_size.height, ); @@ -608,7 +612,7 @@ pub fn update<A: Application, C, E: Executor>( messages: &mut Vec<A::Message>, window: &winit::window::Window, ) where - C: Compositor<Renderer = A::Renderer> + 'static, + C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { for message in messages.drain(..) { @@ -659,7 +663,7 @@ pub fn run_command<A, C, E>( ) where A: Application, E: Executor, - C: Compositor<Renderer = A::Renderer> + 'static, + C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use crate::runtime::command; diff --git a/winit/src/clipboard.rs b/winit/src/clipboard.rs index f7a32868..8f5c5e63 100644 --- a/winit/src/clipboard.rs +++ b/winit/src/clipboard.rs @@ -15,7 +15,8 @@ enum State { impl Clipboard { /// Creates a new [`Clipboard`] for the given window. pub fn connect(window: &winit::window::Window) -> Clipboard { - let state = window_clipboard::Clipboard::connect(window) + #[allow(unsafe_code)] + let state = unsafe { window_clipboard::Clipboard::connect(window) } .ok() .map(State::Connected) .unwrap_or(State::Unavailable); From 985acb2b1532b3e56161bd35201c4a2e21a86b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 08:05:19 +0100 Subject: [PATCH 263/286] Fine-tune event loop of `multi-window` applications --- winit/src/multi_window.rs | 233 +++++++++++++++++++++----------------- 1 file changed, 130 insertions(+), 103 deletions(-) diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index dc659c1a..84c81bea 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -229,7 +229,21 @@ where task::Poll::Pending => match control_receiver.try_next() { Ok(Some(control)) => match control { Control::ChangeFlow(flow) => { - event_loop.set_control_flow(flow); + use winit::event_loop::ControlFlow; + + match (event_loop.control_flow(), flow) { + ( + ControlFlow::WaitUntil(current), + ControlFlow::WaitUntil(new), + ) if new < current => {} + ( + ControlFlow::WaitUntil(target), + ControlFlow::Wait, + ) if target > Instant::now() => {} + _ => { + event_loop.set_control_flow(flow); + } + } } Control::CreateWindow { id, @@ -362,7 +376,6 @@ async fn run_instance<A, E, C>( runtime.track(application.subscription().into_recipes()); let mut messages = Vec::new(); - let mut redraw_pending = false; debug.startup_finished(); @@ -409,13 +422,15 @@ async fn run_instance<A, E, C>( } Event::EventLoopAwakened(event) => { match event { - event::Event::NewEvents(start_cause) => { - redraw_pending = matches!( - start_cause, - event::StartCause::Init - | event::StartCause::Poll - | event::StartCause::ResumeTimeReached { .. } - ); + event::Event::NewEvents( + event::StartCause::Init + | event::StartCause::ResumeTimeReached { .. }, + ) => { + for (_id, window) in window_manager.iter_mut() { + // TODO once widgets can request to be redrawn, we can avoid always requesting a + // redraw + window.raw.request_redraw(); + } } event::Event::PlatformSpecific( event::PlatformSpecific::MacOS( @@ -503,7 +518,9 @@ async fn run_instance<A, E, C>( redraw_request: Some(redraw_request), } => match redraw_request { window::RedrawRequest::NextFrame => { - ControlFlow::Poll + window.raw.request_redraw(); + + ControlFlow::Wait } window::RedrawRequest::At(at) => { ControlFlow::WaitUntil(at) @@ -653,103 +670,113 @@ async fn run_instance<A, E, C>( } } } + event::Event::AboutToWait => { + if events.is_empty() && messages.is_empty() { + continue; + } + + debug.event_processing_started(); + let mut uis_stale = false; + + for (id, window) in window_manager.iter_mut() { + let mut window_events = vec![]; + + events.retain(|(window_id, event)| { + if *window_id == Some(id) || window_id.is_none() + { + window_events.push(event.clone()); + false + } else { + true + } + }); + + if window_events.is_empty() && messages.is_empty() { + continue; + } + + let (ui_state, statuses) = user_interfaces + .get_mut(&id) + .expect("Get user interface") + .update( + &window_events, + window.state.cursor(), + &mut window.renderer, + &mut clipboard, + &mut messages, + ); + + window.raw.request_redraw(); + + if !uis_stale { + uis_stale = matches!( + ui_state, + user_interface::State::Outdated + ); + } + + for (event, status) in window_events + .into_iter() + .zip(statuses.into_iter()) + { + runtime.broadcast(event, status); + } + } + + debug.event_processing_finished(); + + // TODO mw application update returns which window IDs to update + if !messages.is_empty() || uis_stale { + let mut cached_interfaces: HashMap< + window::Id, + user_interface::Cache, + > = ManuallyDrop::into_inner(user_interfaces) + .drain() + .map(|(id, ui)| (id, ui.into_cache())) + .collect(); + + // Update application + update( + &mut application, + &mut compositor, + &mut runtime, + &mut clipboard, + &mut control_sender, + &mut proxy, + &mut debug, + &mut messages, + &mut window_manager, + &mut cached_interfaces, + ); + + // we must synchronize all window states with application state after an + // application update since we don't know what changed + for (id, window) in window_manager.iter_mut() { + window.state.synchronize( + &application, + id, + &window.raw, + ); + + // TODO once widgets can request to be redrawn, we can avoid always requesting a + // redraw + window.raw.request_redraw(); + } + + // rebuild UIs with the synchronized states + user_interfaces = + ManuallyDrop::new(build_user_interfaces( + &application, + &mut debug, + &mut window_manager, + cached_interfaces, + )); + } + } _ => {} } } } - - debug.event_processing_started(); - let mut uis_stale = false; - - for (id, window) in window_manager.iter_mut() { - let mut window_events = vec![]; - - events.retain(|(window_id, event)| { - if *window_id == Some(id) || window_id.is_none() { - window_events.push(event.clone()); - false - } else { - true - } - }); - - if !redraw_pending - && window_events.is_empty() - && messages.is_empty() - { - continue; - } - - let (ui_state, statuses) = user_interfaces - .get_mut(&id) - .expect("Get user interface") - .update( - &window_events, - window.state.cursor(), - &mut window.renderer, - &mut clipboard, - &mut messages, - ); - - if !uis_stale { - uis_stale = matches!(ui_state, user_interface::State::Outdated); - } - - for (event, status) in - window_events.into_iter().zip(statuses.into_iter()) - { - runtime.broadcast(event, status); - } - } - - debug.event_processing_finished(); - - // TODO mw application update returns which window IDs to update - if !messages.is_empty() || uis_stale { - let mut cached_interfaces: HashMap< - window::Id, - user_interface::Cache, - > = ManuallyDrop::into_inner(user_interfaces) - .drain() - .map(|(id, ui)| (id, ui.into_cache())) - .collect(); - - // Update application - update( - &mut application, - &mut compositor, - &mut runtime, - &mut clipboard, - &mut control_sender, - &mut proxy, - &mut debug, - &mut messages, - &mut window_manager, - &mut cached_interfaces, - ); - - // we must synchronize all window states with application state after an - // application update since we don't know what changed - for (id, window) in window_manager.iter_mut() { - window.state.synchronize(&application, id, &window.raw); - } - - // rebuild UIs with the synchronized states - user_interfaces = ManuallyDrop::new(build_user_interfaces( - &application, - &mut debug, - &mut window_manager, - cached_interfaces, - )); - } - - for (_id, window) in window_manager.iter_mut() { - // TODO once widgets can request to be redrawn, we can avoid always requesting a - // redraw - window.raw.request_redraw(); - } - - redraw_pending = false; } let _ = ManuallyDrop::into_inner(user_interfaces); From 468f7432dd96839a86a7bac751351fcf43b7ae63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector0193@gmail.com> Date: Tue, 20 Dec 2022 10:42:53 +0100 Subject: [PATCH 264/286] Add `vectorial_text` example --- examples/vectorial_text/Cargo.toml | 9 ++ examples/vectorial_text/src/main.rs | 175 ++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 examples/vectorial_text/Cargo.toml create mode 100644 examples/vectorial_text/src/main.rs diff --git a/examples/vectorial_text/Cargo.toml b/examples/vectorial_text/Cargo.toml new file mode 100644 index 00000000..76c1af7c --- /dev/null +++ b/examples/vectorial_text/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "vectorial_text" +version = "0.1.0" +authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"] +edition = "2021" +publish = false + +[dependencies] +iced = { path = "../..", features = ["canvas", "debug"] } diff --git a/examples/vectorial_text/src/main.rs b/examples/vectorial_text/src/main.rs new file mode 100644 index 00000000..54ca7c5e --- /dev/null +++ b/examples/vectorial_text/src/main.rs @@ -0,0 +1,175 @@ +use iced::alignment::{self, Alignment}; +use iced::mouse; +use iced::widget::{ + canvas, checkbox, column, horizontal_space, row, slider, text, +}; +use iced::{ + Element, Length, Point, Rectangle, Renderer, Sandbox, Settings, Theme, + Vector, +}; + +pub fn main() -> iced::Result { + VectorialText::run(Settings { + antialiasing: true, + ..Settings::default() + }) +} + +struct VectorialText { + state: State, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + SizeChanged(f32), + AngleChanged(f32), + ScaleChanged(f32), + ToggleJapanese(bool), +} + +impl Sandbox for VectorialText { + type Message = Message; + + fn new() -> Self { + Self { + state: State::new(), + } + } + + fn title(&self) -> String { + String::from("Vectorial Text - Iced") + } + + fn update(&mut self, message: Message) { + match message { + Message::SizeChanged(size) => { + self.state.size = size; + } + Message::AngleChanged(angle) => { + self.state.angle = angle; + } + Message::ScaleChanged(scale) => { + self.state.scale = scale; + } + Message::ToggleJapanese(use_japanese) => { + self.state.use_japanese = use_japanese; + } + } + + self.state.cache.clear(); + } + + fn view(&self) -> Element<Message> { + let slider_with_label = |label, range, value, message: fn(f32) -> _| { + column![ + row![ + text(label), + horizontal_space(Length::Fill), + text(format!("{:.2}", value)) + ], + slider(range, value, message).step(0.01) + ] + .spacing(2) + }; + + column![ + canvas(&self.state).width(Length::Fill).height(Length::Fill), + column![ + checkbox( + "Use Japanese", + self.state.use_japanese, + Message::ToggleJapanese + ), + row![ + slider_with_label( + "Size", + 2.0..=80.0, + self.state.size, + Message::SizeChanged, + ), + slider_with_label( + "Angle", + 0.0..=360.0, + self.state.angle, + Message::AngleChanged, + ), + slider_with_label( + "Scale", + 1.0..=20.0, + self.state.scale, + Message::ScaleChanged, + ), + ] + .spacing(20), + ] + .align_items(Alignment::Center) + .spacing(10) + ] + .spacing(10) + .padding(20) + .into() + } + + fn theme(&self) -> Theme { + Theme::Dark + } +} + +struct State { + size: f32, + angle: f32, + scale: f32, + use_japanese: bool, + cache: canvas::Cache, +} + +impl State { + pub fn new() -> Self { + Self { + size: 40.0, + angle: 0.0, + scale: 1.0, + use_japanese: false, + cache: canvas::Cache::new(), + } + } +} + +impl<Message> canvas::Program<Message> for State { + type State = (); + + fn draw( + &self, + _state: &Self::State, + renderer: &Renderer, + theme: &Theme, + bounds: Rectangle, + _cursor: mouse::Cursor, + ) -> Vec<canvas::Geometry> { + let geometry = self.cache.draw(renderer, bounds.size(), |frame| { + let palette = theme.palette(); + let center = bounds.center(); + + frame.translate(Vector::new(center.x, center.y)); + frame.scale(self.scale); + frame.rotate(self.angle * std::f32::consts::PI / 180.0); + + frame.fill_text(canvas::Text { + position: Point::new(0.0, 0.0), + color: palette.text, + size: self.size.into(), + content: String::from(if self.use_japanese { + "ベクトルテキスト🎉" + } else { + "Vectorial Text! 🎉" + }), + horizontal_alignment: alignment::Horizontal::Center, + vertical_alignment: alignment::Vertical::Center, + shaping: text::Shaping::Advanced, + ..canvas::Text::default() + }) + }); + + vec![geometry] + } +} From 66bea7bb6d4575c1d36d28a10e08dc60a0ea20b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 13:22:02 +0100 Subject: [PATCH 265/286] Apply scaling during `Frame::fill_text` in `iced_wgpu` --- wgpu/src/geometry.rs | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index e0bff67e..36092da0 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -1,4 +1,5 @@ //! Build and draw geometry. +use crate::core::text::LineHeight; use crate::core::{Point, Rectangle, Size, Vector}; use crate::graphics::color; use crate::graphics::geometry::fill::{self, Fill}; @@ -318,14 +319,41 @@ impl Frame { pub fn fill_text(&mut self, text: impl Into<Text>) { let text = text.into(); - let position = if self.transforms.current.is_identity { - text.position + let (position, size, line_height) = if self + .transforms + .current + .is_identity + { + (text.position, text.size, text.line_height) } else { - let transformed = self.transforms.current.raw.transform_point( + let position = self.transforms.current.raw.transform_point( lyon::math::Point::new(text.position.x, text.position.y), ); - Point::new(transformed.x, transformed.y) + let size = + self.transforms.current.raw.transform_vector( + lyon::math::Vector::new(0.0, text.size.0), + ); + + let line_height = match text.line_height { + LineHeight::Absolute(size) => { + let new_height = self + .transforms + .current + .raw + .transform_vector(lyon::math::Vector::new(0.0, size.0)) + .y; + + LineHeight::Absolute(new_height.into()) + } + LineHeight::Relative(factor) => LineHeight::Relative(factor), + }; + + ( + Point::new(position.x, position.y), + size.y.into(), + line_height, + ) }; let bounds = Rectangle { @@ -340,8 +368,8 @@ impl Frame { content: text.content, bounds, color: text.color, - size: text.size, - line_height: text.line_height, + size, + line_height, font: text.font, horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, From 5aa741a177e6220640ea884827f93f152cbd07d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 13:27:39 +0100 Subject: [PATCH 266/286] Apply scaling during `Frame::fill_text` in `iced_tiny_skia` --- tiny_skia/src/geometry.rs | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 5f28b737..4cc04c6e 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -1,4 +1,5 @@ -use crate::core::{Point, Rectangle, Size, Vector}; +use crate::core::text::LineHeight; +use crate::core::{Pixels, Point, Rectangle, Size, Vector}; use crate::graphics::geometry::fill::{self, Fill}; use crate::graphics::geometry::stroke::{self, Stroke}; use crate::graphics::geometry::{Path, Style, Text}; @@ -96,17 +97,32 @@ impl Frame { pub fn fill_text(&mut self, text: impl Into<Text>) { let text = text.into(); - let position = if self.transform.is_identity() { - text.position + let (position, size, line_height) = if self.transform.is_identity() { + (text.position, text.size, text.line_height) } else { - let mut transformed = [tiny_skia::Point { + let mut position = [tiny_skia::Point { x: text.position.x, y: text.position.y, }]; - self.transform.map_points(&mut transformed); + self.transform.map_points(&mut position); - Point::new(transformed[0].x, transformed[0].y) + let (_, scale_y) = self.transform.get_scale(); + + let size = text.size.0 * scale_y; + + let line_height = match text.line_height { + LineHeight::Absolute(size) => { + LineHeight::Absolute(Pixels(size.0 * scale_y)) + } + LineHeight::Relative(factor) => LineHeight::Relative(factor), + }; + + ( + Point::new(position[0].x, position[0].y), + size.into(), + line_height, + ) }; let bounds = Rectangle { @@ -121,8 +137,8 @@ impl Frame { content: text.content, bounds, color: text.color, - size: text.size, - line_height: text.line_height, + size, + line_height, font: text.font, horizontal_alignment: text.horizontal_alignment, vertical_alignment: text.vertical_alignment, From fda96a9eda261b9fbe499eae1c6eedcfa252c5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 13:44:30 +0100 Subject: [PATCH 267/286] Simplify `Transform` API in `iced_wgpu::geometry` --- wgpu/src/geometry.rs | 132 ++++++++++++++++++++----------------------- 1 file changed, 60 insertions(+), 72 deletions(-) diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index 36092da0..04718441 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -1,6 +1,6 @@ //! Build and draw geometry. use crate::core::text::LineHeight; -use crate::core::{Point, Rectangle, Size, Vector}; +use crate::core::{Pixels, Point, Rectangle, Size, Vector}; use crate::graphics::color; use crate::graphics::geometry::fill::{self, Fill}; use crate::graphics::geometry::{ @@ -116,19 +116,26 @@ struct Transforms { } #[derive(Debug, Clone, Copy)] -struct Transform { - raw: lyon::math::Transform, - is_identity: bool, -} +struct Transform(lyon::math::Transform); impl Transform { - /// Transforms the given [Point] by the transformation matrix. - fn transform_point(&self, point: &mut Point) { + fn is_identity(&self) -> bool { + self.0 == lyon::math::Transform::identity() + } + + fn scale(&self) -> (f32, f32) { + (self.0.m12, self.0.m22) + } + + fn transform_point(&self, point: Point) -> Point { let transformed = self - .raw + .0 .transform_point(euclid::Point2D::new(point.x, point.y)); - point.x = transformed.x; - point.y = transformed.y; + + Point { + x: transformed.x, + y: transformed.y, + } } fn transform_style(&self, style: Style) -> Style { @@ -143,8 +150,8 @@ impl Transform { fn transform_gradient(&self, mut gradient: Gradient) -> Gradient { match &mut gradient { Gradient::Linear(linear) => { - self.transform_point(&mut linear.start); - self.transform_point(&mut linear.end); + linear.start = self.transform_point(linear.start); + linear.end = self.transform_point(linear.end); } } @@ -164,10 +171,7 @@ impl Frame { primitives: Vec::new(), transforms: Transforms { previous: Vec::new(), - current: Transform { - raw: lyon::math::Transform::identity(), - is_identity: true, - }, + current: Transform(lyon::math::Transform::identity()), }, fill_tessellator: tessellation::FillTessellator::new(), stroke_tessellator: tessellation::StrokeTessellator::new(), @@ -210,14 +214,14 @@ impl Frame { let options = tessellation::FillOptions::default() .with_fill_rule(into_fill_rule(rule)); - if self.transforms.current.is_identity { + if self.transforms.current.is_identity() { self.fill_tessellator.tessellate_path( path.raw(), &options, buffer.as_mut(), ) } else { - let path = path.transform(&self.transforms.current.raw); + let path = path.transform(&self.transforms.current.0); self.fill_tessellator.tessellate_path( path.raw(), @@ -242,13 +246,14 @@ impl Frame { .buffers .get_fill(&self.transforms.current.transform_style(style)); - let top_left = - self.transforms.current.raw.transform_point( - lyon::math::Point::new(top_left.x, top_left.y), - ); + let top_left = self + .transforms + .current + .0 + .transform_point(lyon::math::Point::new(top_left.x, top_left.y)); let size = - self.transforms.current.raw.transform_vector( + self.transforms.current.0.transform_vector( lyon::math::Vector::new(size.width, size.height), ); @@ -285,14 +290,14 @@ impl Frame { Cow::Owned(dashed(path, stroke.line_dash)) }; - if self.transforms.current.is_identity { + if self.transforms.current.is_identity() { self.stroke_tessellator.tessellate_path( path.raw(), &options, buffer.as_mut(), ) } else { - let path = path.transform(&self.transforms.current.raw); + let path = path.transform(&self.transforms.current.0); self.stroke_tessellator.tessellate_path( path.raw(), @@ -319,43 +324,29 @@ impl Frame { pub fn fill_text(&mut self, text: impl Into<Text>) { let text = text.into(); - let (position, size, line_height) = if self - .transforms - .current - .is_identity - { - (text.position, text.size, text.line_height) - } else { - let position = self.transforms.current.raw.transform_point( - lyon::math::Point::new(text.position.x, text.position.y), - ); + let (position, size, line_height) = + if self.transforms.current.is_identity() { + (text.position, text.size, text.line_height) + } else { + let (_, scale_y) = self.transforms.current.scale(); - let size = - self.transforms.current.raw.transform_vector( - lyon::math::Vector::new(0.0, text.size.0), - ); + let position = + self.transforms.current.transform_point(text.position); - let line_height = match text.line_height { - LineHeight::Absolute(size) => { - let new_height = self - .transforms - .current - .raw - .transform_vector(lyon::math::Vector::new(0.0, size.0)) - .y; + let size = Pixels(text.size.0 * scale_y); - LineHeight::Absolute(new_height.into()) - } - LineHeight::Relative(factor) => LineHeight::Relative(factor), + let line_height = match text.line_height { + LineHeight::Absolute(size) => { + LineHeight::Absolute(Pixels(size.0 * scale_y)) + } + LineHeight::Relative(factor) => { + LineHeight::Relative(factor) + } + }; + + (position, size, line_height) }; - ( - Point::new(position.x, position.y), - size.y.into(), - line_height, - ) - }; - let bounds = Rectangle { x: position.x, y: position.y, @@ -451,26 +442,24 @@ impl Frame { /// Applies a translation to the current transform of the [`Frame`]. #[inline] pub fn translate(&mut self, translation: Vector) { - self.transforms.current.raw = self - .transforms - .current - .raw - .pre_translate(lyon::math::Vector::new( - translation.x, - translation.y, - )); - self.transforms.current.is_identity = false; + self.transforms.current.0 = + self.transforms + .current + .0 + .pre_translate(lyon::math::Vector::new( + translation.x, + translation.y, + )); } /// Applies a rotation in radians to the current transform of the [`Frame`]. #[inline] pub fn rotate(&mut self, angle: f32) { - self.transforms.current.raw = self + self.transforms.current.0 = self .transforms .current - .raw + .0 .pre_rotate(lyon::math::Angle::radians(angle)); - self.transforms.current.is_identity = false; } /// Applies a uniform scaling to the current transform of the [`Frame`]. @@ -486,9 +475,8 @@ impl Frame { pub fn scale_nonuniform(&mut self, scale: impl Into<Vector>) { let scale = scale.into(); - self.transforms.current.raw = - self.transforms.current.raw.pre_scale(scale.x, scale.y); - self.transforms.current.is_identity = false; + self.transforms.current.0 = + self.transforms.current.0.pre_scale(scale.x, scale.y); } /// Produces the [`Primitive`] representing everything drawn on the [`Frame`]. From d09f36e054b00cad206431654392fc68ba2b345b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 13:45:29 +0100 Subject: [PATCH 268/286] Fix missing semi-colon lint in `vectorial_text` example --- examples/vectorial_text/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/vectorial_text/src/main.rs b/examples/vectorial_text/src/main.rs index 54ca7c5e..d366b907 100644 --- a/examples/vectorial_text/src/main.rs +++ b/examples/vectorial_text/src/main.rs @@ -167,7 +167,7 @@ impl<Message> canvas::Program<Message> for State { vertical_alignment: alignment::Vertical::Center, shaping: text::Shaping::Advanced, ..canvas::Text::default() - }) + }); }); vec![geometry] From dd032d9a7a73dc28c12802e1e702d0aebe92e261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 14:25:39 +0100 Subject: [PATCH 269/286] Implement vectorial text support for `iced_wgpu` --- wgpu/src/geometry.rs | 225 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 188 insertions(+), 37 deletions(-) diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index 04718441..a1583a07 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -1,6 +1,7 @@ //! Build and draw geometry. +use crate::core::alignment; use crate::core::text::LineHeight; -use crate::core::{Pixels, Point, Rectangle, Size, Vector}; +use crate::core::{Color, Pixels, Point, Rectangle, Size, Vector}; use crate::graphics::color; use crate::graphics::geometry::fill::{self, Fill}; use crate::graphics::geometry::{ @@ -8,6 +9,7 @@ use crate::graphics::geometry::{ }; use crate::graphics::gradient::{self, Gradient}; use crate::graphics::mesh::{self, Mesh}; +use crate::graphics::text::{self, cosmic_text}; use crate::primitive::{self, Primitive}; use lyon::geom::euclid; @@ -123,8 +125,13 @@ impl Transform { self.0 == lyon::math::Transform::identity() } + fn is_scale_translation(&self) -> bool { + self.0.m12.abs() < 2.0 * f32::EPSILON + && self.0.m21.abs() < 2.0 * f32::EPSILON + } + fn scale(&self) -> (f32, f32) { - (self.0.m12, self.0.m22) + (self.0.m11, self.0.m22) } fn transform_point(&self, point: Point) -> Point { @@ -324,49 +331,193 @@ impl Frame { pub fn fill_text(&mut self, text: impl Into<Text>) { let text = text.into(); - let (position, size, line_height) = - if self.transforms.current.is_identity() { - (text.position, text.size, text.line_height) - } else { - let (_, scale_y) = self.transforms.current.scale(); + let (scale_x, scale_y) = self.transforms.current.scale(); - let position = - self.transforms.current.transform_point(text.position); + if self.transforms.current.is_scale_translation() + && scale_x == scale_y + && scale_x > 0.0 + && scale_y > 0.0 + { + let (position, size, line_height) = + if self.transforms.current.is_identity() { + (text.position, text.size, text.line_height) + } else { + let position = + self.transforms.current.transform_point(text.position); - let size = Pixels(text.size.0 * scale_y); + let size = Pixels(text.size.0 * scale_y); - let line_height = match text.line_height { - LineHeight::Absolute(size) => { - LineHeight::Absolute(Pixels(size.0 * scale_y)) - } - LineHeight::Relative(factor) => { - LineHeight::Relative(factor) - } + let line_height = match text.line_height { + LineHeight::Absolute(size) => { + LineHeight::Absolute(Pixels(size.0 * scale_y)) + } + LineHeight::Relative(factor) => { + LineHeight::Relative(factor) + } + }; + + (position, size, line_height) }; - (position, size, line_height) + let bounds = Rectangle { + x: position.x, + y: position.y, + width: f32::INFINITY, + height: f32::INFINITY, }; - let bounds = Rectangle { - x: position.x, - y: position.y, - width: f32::INFINITY, - height: f32::INFINITY, - }; + // TODO: Honor layering! + self.primitives.push(Primitive::Text { + content: text.content, + bounds, + color: text.color, + size, + line_height, + font: text.font, + horizontal_alignment: text.horizontal_alignment, + vertical_alignment: text.vertical_alignment, + shaping: text.shaping, + clip_bounds: Rectangle::with_size(Size::INFINITY), + }); + } else { + let mut font_system = + text::font_system().write().expect("Write font system"); - // TODO: Use vectorial text instead of primitive - self.primitives.push(Primitive::Text { - content: text.content, - bounds, - color: text.color, - size, - line_height, - font: text.font, - horizontal_alignment: text.horizontal_alignment, - vertical_alignment: text.vertical_alignment, - shaping: text.shaping, - clip_bounds: Rectangle::with_size(Size::INFINITY), - }); + let mut buffer = cosmic_text::BufferLine::new( + &text.content, + cosmic_text::AttrsList::new(text::to_attributes(text.font)), + text::to_shaping(text.shaping), + ); + + let layout = buffer.layout( + font_system.raw(), + text.size.0, + f32::MAX, + cosmic_text::Wrap::None, + ); + + let translation_x = match text.horizontal_alignment { + alignment::Horizontal::Left => text.position.x, + alignment::Horizontal::Center + | alignment::Horizontal::Right => { + let mut line_width = 0.0f32; + + for line in layout.iter() { + line_width = line_width.max(line.w); + } + + if text.horizontal_alignment + == alignment::Horizontal::Center + { + text.position.x - line_width / 2.0 + } else { + text.position.x - line_width + } + } + }; + + let translation_y = { + let line_height = text.line_height.to_absolute(text.size); + + match text.vertical_alignment { + alignment::Vertical::Top => text.position.y, + alignment::Vertical::Center => { + text.position.y - line_height.0 / 2.0 + } + alignment::Vertical::Bottom => { + text.position.y - line_height.0 + } + } + }; + + let mut swash_cache = cosmic_text::SwashCache::new(); + + for run in layout.iter() { + for glyph in run.glyphs.iter() { + let physical_glyph = glyph.physical((0.0, 0.0), 1.0); + + let start_x = translation_x + glyph.x + glyph.x_offset; + let start_y = translation_y + glyph.y_offset + text.size.0; + let offset = Vector::new(start_x, start_y); + + if let Some(commands) = swash_cache.get_outline_commands( + font_system.raw(), + physical_glyph.cache_key, + ) { + let glyph = Path::new(|path| { + use cosmic_text::Command; + + for command in commands { + match command { + Command::MoveTo(p) => { + path.move_to( + Point::new(p.x, -p.y) + offset, + ); + } + Command::LineTo(p) => { + path.line_to( + Point::new(p.x, -p.y) + offset, + ); + } + Command::CurveTo( + control_a, + control_b, + to, + ) => { + path.bezier_curve_to( + Point::new( + control_a.x, + -control_a.y, + ) + offset, + Point::new( + control_b.x, + -control_b.y, + ) + offset, + Point::new(to.x, -to.y) + offset, + ); + } + Command::QuadTo(control, to) => { + path.quadratic_curve_to( + Point::new(control.x, -control.y) + + offset, + Point::new(to.x, -to.y) + offset, + ); + } + Command::Close => { + path.close(); + } + } + } + }); + + self.fill(&glyph, text.color); + } else { + // TODO: Raster image support for `Canvas` + let [r, g, b, a] = text.color.into_rgba8(); + + swash_cache.with_pixels( + font_system.raw(), + physical_glyph.cache_key, + cosmic_text::Color::rgba(r, g, b, a), + |x, y, color| { + self.fill( + &Path::rectangle( + Point::new(x as f32, y as f32) + offset, + Size::new(1.0, 1.0), + ), + Color::from_rgba8( + color.r(), + color.g(), + color.b(), + color.a() as f32 / 255.0, + ), + ); + }, + ) + } + } + } + } } /// Stores the current transform of the [`Frame`] and executes the given From 4cb53a6e225f9e533126eb03d3cc34be3fd09f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 14:48:33 +0100 Subject: [PATCH 270/286] Implement vectorial text support for `iced_tiny_skia` --- graphics/src/geometry/text.rs | 135 +++++++++++++++++++++++++++++++- tiny_skia/src/geometry.rs | 93 ++++++++++++---------- wgpu/src/geometry.rs | 142 +--------------------------------- 3 files changed, 188 insertions(+), 182 deletions(-) diff --git a/graphics/src/geometry/text.rs b/graphics/src/geometry/text.rs index 0bf7ec97..d314e85e 100644 --- a/graphics/src/geometry/text.rs +++ b/graphics/src/geometry/text.rs @@ -1,6 +1,8 @@ use crate::core::alignment; use crate::core::text::{LineHeight, Shaping}; -use crate::core::{Color, Font, Pixels, Point}; +use crate::core::{Color, Font, Pixels, Point, Size, Vector}; +use crate::geometry::Path; +use crate::text; /// A bunch of text that can be drawn to a canvas #[derive(Debug, Clone)] @@ -32,6 +34,137 @@ pub struct Text { pub shaping: Shaping, } +impl Text { + /// Computes the [`Path`]s of the [`Text`] and draws them using + /// the given closure. + pub fn draw_with(&self, mut f: impl FnMut(Path, Color)) { + let mut font_system = + text::font_system().write().expect("Write font system"); + + let mut buffer = cosmic_text::BufferLine::new( + &self.content, + cosmic_text::AttrsList::new(text::to_attributes(self.font)), + text::to_shaping(self.shaping), + ); + + let layout = buffer.layout( + font_system.raw(), + self.size.0, + f32::MAX, + cosmic_text::Wrap::None, + ); + + let translation_x = match self.horizontal_alignment { + alignment::Horizontal::Left => self.position.x, + alignment::Horizontal::Center | alignment::Horizontal::Right => { + let mut line_width = 0.0f32; + + for line in layout.iter() { + line_width = line_width.max(line.w); + } + + if self.horizontal_alignment == alignment::Horizontal::Center { + self.position.x - line_width / 2.0 + } else { + self.position.x - line_width + } + } + }; + + let translation_y = { + let line_height = self.line_height.to_absolute(self.size); + + match self.vertical_alignment { + alignment::Vertical::Top => self.position.y, + alignment::Vertical::Center => { + self.position.y - line_height.0 / 2.0 + } + alignment::Vertical::Bottom => self.position.y - line_height.0, + } + }; + + let mut swash_cache = cosmic_text::SwashCache::new(); + + for run in layout.iter() { + for glyph in run.glyphs.iter() { + let physical_glyph = glyph.physical((0.0, 0.0), 1.0); + + let start_x = translation_x + glyph.x + glyph.x_offset; + let start_y = translation_y + glyph.y_offset + self.size.0; + let offset = Vector::new(start_x, start_y); + + if let Some(commands) = swash_cache.get_outline_commands( + font_system.raw(), + physical_glyph.cache_key, + ) { + let glyph = Path::new(|path| { + use cosmic_text::Command; + + for command in commands { + match command { + Command::MoveTo(p) => { + path.move_to( + Point::new(p.x, -p.y) + offset, + ); + } + Command::LineTo(p) => { + path.line_to( + Point::new(p.x, -p.y) + offset, + ); + } + Command::CurveTo(control_a, control_b, to) => { + path.bezier_curve_to( + Point::new(control_a.x, -control_a.y) + + offset, + Point::new(control_b.x, -control_b.y) + + offset, + Point::new(to.x, -to.y) + offset, + ); + } + Command::QuadTo(control, to) => { + path.quadratic_curve_to( + Point::new(control.x, -control.y) + + offset, + Point::new(to.x, -to.y) + offset, + ); + } + Command::Close => { + path.close(); + } + } + } + }); + + f(glyph, self.color); + } else { + // TODO: Raster image support for `Canvas` + let [r, g, b, a] = self.color.into_rgba8(); + + swash_cache.with_pixels( + font_system.raw(), + physical_glyph.cache_key, + cosmic_text::Color::rgba(r, g, b, a), + |x, y, color| { + f( + Path::rectangle( + Point::new(x as f32, y as f32) + offset, + Size::new(1.0, 1.0), + ), + Color::from_rgba8( + color.r(), + color.g(), + color.b(), + color.a() as f32 / 255.0, + ), + ); + }, + ); + } + } + } + } +} + impl Default for Text { fn default() -> Text { Text { diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 4cc04c6e..b00f4676 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -97,54 +97,65 @@ impl Frame { pub fn fill_text(&mut self, text: impl Into<Text>) { let text = text.into(); - let (position, size, line_height) = if self.transform.is_identity() { - (text.position, text.size, text.line_height) - } else { - let mut position = [tiny_skia::Point { - x: text.position.x, - y: text.position.y, - }]; + let (scale_x, scale_y) = self.transform.get_scale(); - self.transform.map_points(&mut position); + if self.transform.is_scale_translate() + && scale_x == scale_y + && scale_x > 0.0 + && scale_y > 0.0 + { + let (position, size, line_height) = if self.transform.is_identity() + { + (text.position, text.size, text.line_height) + } else { + let mut position = [tiny_skia::Point { + x: text.position.x, + y: text.position.y, + }]; - let (_, scale_y) = self.transform.get_scale(); + self.transform.map_points(&mut position); - let size = text.size.0 * scale_y; + let size = text.size.0 * scale_y; - let line_height = match text.line_height { - LineHeight::Absolute(size) => { - LineHeight::Absolute(Pixels(size.0 * scale_y)) - } - LineHeight::Relative(factor) => LineHeight::Relative(factor), + let line_height = match text.line_height { + LineHeight::Absolute(size) => { + LineHeight::Absolute(Pixels(size.0 * scale_y)) + } + LineHeight::Relative(factor) => { + LineHeight::Relative(factor) + } + }; + + ( + Point::new(position[0].x, position[0].y), + size.into(), + line_height, + ) }; - ( - Point::new(position[0].x, position[0].y), - size.into(), + let bounds = Rectangle { + x: position.x, + y: position.y, + width: f32::INFINITY, + height: f32::INFINITY, + }; + + // TODO: Honor layering! + self.primitives.push(Primitive::Text { + content: text.content, + bounds, + color: text.color, + size, line_height, - ) - }; - - let bounds = Rectangle { - x: position.x, - y: position.y, - width: f32::INFINITY, - height: f32::INFINITY, - }; - - // TODO: Use vectorial text instead of primitive - self.primitives.push(Primitive::Text { - content: text.content, - bounds, - color: text.color, - size, - line_height, - font: text.font, - horizontal_alignment: text.horizontal_alignment, - vertical_alignment: text.vertical_alignment, - shaping: text.shaping, - clip_bounds: Rectangle::with_size(Size::INFINITY), - }); + font: text.font, + horizontal_alignment: text.horizontal_alignment, + vertical_alignment: text.vertical_alignment, + shaping: text.shaping, + clip_bounds: Rectangle::with_size(Size::INFINITY), + }); + } else { + text.draw_with(|path, color| self.fill(&path, color)); + } } pub fn push_transform(&mut self) { diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index a1583a07..4d7f443e 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -1,7 +1,6 @@ //! Build and draw geometry. -use crate::core::alignment; use crate::core::text::LineHeight; -use crate::core::{Color, Pixels, Point, Rectangle, Size, Vector}; +use crate::core::{Pixels, Point, Rectangle, Size, Vector}; use crate::graphics::color; use crate::graphics::geometry::fill::{self, Fill}; use crate::graphics::geometry::{ @@ -9,7 +8,6 @@ use crate::graphics::geometry::{ }; use crate::graphics::gradient::{self, Gradient}; use crate::graphics::mesh::{self, Mesh}; -use crate::graphics::text::{self, cosmic_text}; use crate::primitive::{self, Primitive}; use lyon::geom::euclid; @@ -380,143 +378,7 @@ impl Frame { clip_bounds: Rectangle::with_size(Size::INFINITY), }); } else { - let mut font_system = - text::font_system().write().expect("Write font system"); - - let mut buffer = cosmic_text::BufferLine::new( - &text.content, - cosmic_text::AttrsList::new(text::to_attributes(text.font)), - text::to_shaping(text.shaping), - ); - - let layout = buffer.layout( - font_system.raw(), - text.size.0, - f32::MAX, - cosmic_text::Wrap::None, - ); - - let translation_x = match text.horizontal_alignment { - alignment::Horizontal::Left => text.position.x, - alignment::Horizontal::Center - | alignment::Horizontal::Right => { - let mut line_width = 0.0f32; - - for line in layout.iter() { - line_width = line_width.max(line.w); - } - - if text.horizontal_alignment - == alignment::Horizontal::Center - { - text.position.x - line_width / 2.0 - } else { - text.position.x - line_width - } - } - }; - - let translation_y = { - let line_height = text.line_height.to_absolute(text.size); - - match text.vertical_alignment { - alignment::Vertical::Top => text.position.y, - alignment::Vertical::Center => { - text.position.y - line_height.0 / 2.0 - } - alignment::Vertical::Bottom => { - text.position.y - line_height.0 - } - } - }; - - let mut swash_cache = cosmic_text::SwashCache::new(); - - for run in layout.iter() { - for glyph in run.glyphs.iter() { - let physical_glyph = glyph.physical((0.0, 0.0), 1.0); - - let start_x = translation_x + glyph.x + glyph.x_offset; - let start_y = translation_y + glyph.y_offset + text.size.0; - let offset = Vector::new(start_x, start_y); - - if let Some(commands) = swash_cache.get_outline_commands( - font_system.raw(), - physical_glyph.cache_key, - ) { - let glyph = Path::new(|path| { - use cosmic_text::Command; - - for command in commands { - match command { - Command::MoveTo(p) => { - path.move_to( - Point::new(p.x, -p.y) + offset, - ); - } - Command::LineTo(p) => { - path.line_to( - Point::new(p.x, -p.y) + offset, - ); - } - Command::CurveTo( - control_a, - control_b, - to, - ) => { - path.bezier_curve_to( - Point::new( - control_a.x, - -control_a.y, - ) + offset, - Point::new( - control_b.x, - -control_b.y, - ) + offset, - Point::new(to.x, -to.y) + offset, - ); - } - Command::QuadTo(control, to) => { - path.quadratic_curve_to( - Point::new(control.x, -control.y) - + offset, - Point::new(to.x, -to.y) + offset, - ); - } - Command::Close => { - path.close(); - } - } - } - }); - - self.fill(&glyph, text.color); - } else { - // TODO: Raster image support for `Canvas` - let [r, g, b, a] = text.color.into_rgba8(); - - swash_cache.with_pixels( - font_system.raw(), - physical_glyph.cache_key, - cosmic_text::Color::rgba(r, g, b, a), - |x, y, color| { - self.fill( - &Path::rectangle( - Point::new(x as f32, y as f32) + offset, - Size::new(1.0, 1.0), - ), - Color::from_rgba8( - color.r(), - color.g(), - color.b(), - color.a() as f32 / 255.0, - ), - ); - }, - ) - } - } - } + text.draw_with(|path, color| self.fill(&path, color)); } } From acee3b030baf4df24a871e56789772c677b66bcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 15:31:29 +0100 Subject: [PATCH 271/286] Fix paths with negative coordinates in `iced_tiny_skia` --- tiny_skia/src/backend.rs | 18 ++++++++++-------- tiny_skia/src/geometry.rs | 17 +++++++++++------ tiny_skia/src/primitive.rs | 4 ---- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/tiny_skia/src/backend.rs b/tiny_skia/src/backend.rs index 706db40e..d1393b4d 100644 --- a/tiny_skia/src/backend.rs +++ b/tiny_skia/src/backend.rs @@ -543,7 +543,6 @@ impl Backend { path, paint, rule, - transform, }) => { let bounds = path.bounds(); @@ -566,9 +565,11 @@ impl Backend { path, paint, *rule, - transform - .post_translate(translation.x, translation.y) - .post_scale(scale_factor, scale_factor), + tiny_skia::Transform::from_translate( + translation.x, + translation.y, + ) + .post_scale(scale_factor, scale_factor), clip_mask, ); } @@ -576,7 +577,6 @@ impl Backend { path, paint, stroke, - transform, }) => { let bounds = path.bounds(); @@ -599,9 +599,11 @@ impl Backend { path, paint, stroke, - transform - .post_translate(translation.x, translation.y) - .post_scale(scale_factor, scale_factor), + tiny_skia::Transform::from_translate( + translation.x, + translation.y, + ) + .post_scale(scale_factor, scale_factor), clip_mask, ); } diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index b00f4676..501638e0 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -40,9 +40,12 @@ impl Frame { } pub fn fill(&mut self, path: &Path, fill: impl Into<Fill>) { - let Some(path) = convert_path(path) else { + let Some(path) = + convert_path(path).and_then(|path| path.transform(self.transform)) + else { return; }; + let fill = fill.into(); self.primitives @@ -50,7 +53,6 @@ impl Frame { path, paint: into_paint(fill.style), rule: into_fill_rule(fill.rule), - transform: self.transform, })); } @@ -60,9 +62,12 @@ impl Frame { size: Size, fill: impl Into<Fill>, ) { - let Some(path) = convert_path(&Path::rectangle(top_left, size)) else { + let Some(path) = convert_path(&Path::rectangle(top_left, size)) + .and_then(|path| path.transform(self.transform)) + else { return; }; + let fill = fill.into(); self.primitives @@ -73,12 +78,13 @@ impl Frame { ..into_paint(fill.style) }, rule: into_fill_rule(fill.rule), - transform: self.transform, })); } pub fn stroke<'a>(&mut self, path: &Path, stroke: impl Into<Stroke<'a>>) { - let Some(path) = convert_path(path) else { + let Some(path) = + convert_path(path).and_then(|path| path.transform(self.transform)) + else { return; }; @@ -90,7 +96,6 @@ impl Frame { path, paint: into_paint(stroke.style), stroke: skia_stroke, - transform: self.transform, })); } diff --git a/tiny_skia/src/primitive.rs b/tiny_skia/src/primitive.rs index 0ed24969..7718d542 100644 --- a/tiny_skia/src/primitive.rs +++ b/tiny_skia/src/primitive.rs @@ -13,8 +13,6 @@ pub enum Custom { paint: tiny_skia::Paint<'static>, /// The fill rule to follow. rule: tiny_skia::FillRule, - /// The transform to apply to the path. - transform: tiny_skia::Transform, }, /// A path stroked with some paint. Stroke { @@ -24,8 +22,6 @@ pub enum Custom { paint: tiny_skia::Paint<'static>, /// The stroke settings. stroke: tiny_skia::Stroke, - /// The transform to apply to the path. - transform: tiny_skia::Transform, }, } From 5d4c55c07a80d93e6009e94c2a861ad549d30aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Wed, 17 Jan 2024 15:53:08 +0100 Subject: [PATCH 272/286] Fix `paint` not being transformed in `iced_tiny_skia` --- tiny_skia/src/geometry.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs index 501638e0..74a08d38 100644 --- a/tiny_skia/src/geometry.rs +++ b/tiny_skia/src/geometry.rs @@ -48,10 +48,13 @@ impl Frame { let fill = fill.into(); + let mut paint = into_paint(fill.style); + paint.shader.transform(self.transform); + self.primitives .push(Primitive::Custom(primitive::Custom::Fill { path, - paint: into_paint(fill.style), + paint, rule: into_fill_rule(fill.rule), })); } @@ -70,13 +73,16 @@ impl Frame { let fill = fill.into(); + let mut paint = tiny_skia::Paint { + anti_alias: false, + ..into_paint(fill.style) + }; + paint.shader.transform(self.transform); + self.primitives .push(Primitive::Custom(primitive::Custom::Fill { path, - paint: tiny_skia::Paint { - anti_alias: false, - ..into_paint(fill.style) - }, + paint, rule: into_fill_rule(fill.rule), })); } @@ -91,10 +97,13 @@ impl Frame { let stroke = stroke.into(); let skia_stroke = into_stroke(&stroke); + let mut paint = into_paint(stroke.style); + paint.shader.transform(self.transform); + self.primitives .push(Primitive::Custom(primitive::Custom::Stroke { path, - paint: into_paint(stroke.style), + paint, stroke: skia_stroke, })); } From 8bf238697226e827dc983f9d89afbd0e252c5254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 09:55:27 +0100 Subject: [PATCH 273/286] Remove `Compositor` window generic And update `glyphon` and `window_clipboard` --- Cargo.toml | 10 ++-- examples/custom_shader/src/scene/pipeline.rs | 2 + examples/integration/src/main.rs | 12 +++-- futures/src/lib.rs | 4 +- futures/src/{maybe_send.rs => maybe.rs} | 16 +++++- graphics/Cargo.toml | 1 + graphics/src/compositor.rs | 23 ++++++-- graphics/src/lib.rs | 1 + renderer/Cargo.toml | 1 - renderer/src/compositor.rs | 36 +++++-------- src/application.rs | 7 +-- tiny_skia/Cargo.toml | 1 - tiny_skia/src/window/compositor.rs | 56 ++++++++++---------- wgpu/Cargo.toml | 1 - wgpu/src/window/compositor.rs | 40 +++++--------- winit/src/application.rs | 8 +-- winit/src/multi_window.rs | 14 +++-- winit/src/multi_window/window_manager.rs | 7 +-- 18 files changed, 126 insertions(+), 114 deletions(-) rename futures/src/{maybe_send.rs => maybe.rs} (53%) diff --git a/Cargo.toml b/Cargo.toml index 421c7c76..131a4ef5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -128,10 +128,7 @@ bytemuck = { version = "1.0", features = ["derive"] } cosmic-text = "0.10" futures = "0.3" glam = "0.24" -# glyphon = "0.4" -# TODO update for wgpu 0.19 -# https://github.com/grovesNL/glyphon/pull/80 -glyphon = { git = "https://github.com/EggShark/glyphon" } +glyphon = "0.5" guillotiere = "0.6" half = "2.2" image = "0.24" @@ -165,6 +162,5 @@ web-sys = "0.3" web-time = "0.2" wgpu = "0.19" winapi = "0.3" -# window_clipboard = "0.3" -window_clipboard = { git = "https://github.com/ids1024/window_clipboard", branch = "raw-window-handle-0.6" } -winit = { git = "https://github.com/iced-rs/winit.git", rev = "b91e39ece2c0d378c3b80da7f3ab50e17bb798a5", features = ["rwh_06"] } +window_clipboard = "0.4" +winit = { git = "https://github.com/iced-rs/winit.git", rev = "b91e39ece2c0d378c3b80da7f3ab50e17bb798a5" } diff --git a/examples/custom_shader/src/scene/pipeline.rs b/examples/custom_shader/src/scene/pipeline.rs index 124b421f..50b70a98 100644 --- a/examples/custom_shader/src/scene/pipeline.rs +++ b/examples/custom_shader/src/scene/pipeline.rs @@ -97,6 +97,7 @@ impl Pipeline { usage: wgpu::TextureUsages::TEXTURE_BINDING, view_formats: &[], }, + wgpu::util::TextureDataOrder::LayerMajor, &normal_map_data, ); @@ -122,6 +123,7 @@ impl Pipeline { usage: wgpu::TextureUsages::TEXTURE_BINDING, view_formats: &[], }, + wgpu::util::TextureDataOrder::LayerMajor, &skybox_data, ); diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs index b0939d68..ed61459f 100644 --- a/examples/integration/src/main.rs +++ b/examples/integration/src/main.rs @@ -24,6 +24,8 @@ use winit::{ keyboard::ModifiersState, }; +use std::sync::Arc; + #[cfg(target_arch = "wasm32")] use wasm_bindgen::JsCast; #[cfg(target_arch = "wasm32")] @@ -59,6 +61,8 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { #[cfg(not(target_arch = "wasm32"))] let window = winit::window::Window::new(&event_loop)?; + let window = Arc::new(window); + let physical_size = window.inner_size(); let mut viewport = Viewport::with_physical_size( Size::new(physical_size.width, physical_size.height), @@ -81,7 +85,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { backends: backend, ..Default::default() }); - let surface = unsafe { instance.create_surface(&window) }?; + let surface = instance.create_surface(window.clone())?; let (format, (device, queue)) = futures::futures::executor::block_on(async { @@ -115,9 +119,9 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { .request_device( &wgpu::DeviceDescriptor { label: None, - features: adapter_features + required_features: adapter_features & wgpu::Features::default(), - limits: needed_limits, + required_limits: needed_limits, }, None, ) @@ -136,6 +140,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { present_mode: wgpu::PresentMode::AutoVsync, alpha_mode: wgpu::CompositeAlphaMode::Auto, view_formats: vec![], + desired_maximum_frame_latency: 2, }, ); @@ -188,6 +193,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> { present_mode: wgpu::PresentMode::AutoVsync, alpha_mode: wgpu::CompositeAlphaMode::Auto, view_formats: vec![], + desired_maximum_frame_latency: 2, }, ); diff --git a/futures/src/lib.rs b/futures/src/lib.rs index d54ba18a..b0acb76f 100644 --- a/futures/src/lib.rs +++ b/futures/src/lib.rs @@ -15,7 +15,7 @@ pub use futures; pub use iced_core as core; -mod maybe_send; +mod maybe; mod runtime; pub mod backend; @@ -25,7 +25,7 @@ pub mod keyboard; pub mod subscription; pub use executor::Executor; -pub use maybe_send::MaybeSend; +pub use maybe::{MaybeSend, MaybeSync}; pub use platform::*; pub use runtime::Runtime; pub use subscription::Subscription; diff --git a/futures/src/maybe_send.rs b/futures/src/maybe.rs similarity index 53% rename from futures/src/maybe_send.rs rename to futures/src/maybe.rs index a6670f0e..1a0bd1d1 100644 --- a/futures/src/maybe_send.rs +++ b/futures/src/maybe.rs @@ -6,6 +6,13 @@ mod platform { pub trait MaybeSend: Send {} impl<T> MaybeSend for T where T: Send {} + + /// An extension trait that enforces `Sync` only on native platforms. + /// + /// Useful to write cross-platform async code! + pub trait MaybeSync: Sync {} + + impl<T> MaybeSync for T where T: Sync {} } #[cfg(target_arch = "wasm32")] @@ -16,6 +23,13 @@ mod platform { pub trait MaybeSend {} impl<T> MaybeSend for T {} + + /// An extension trait that enforces `Send` only on native platforms. + /// + /// Useful to write cross-platform async code! + pub trait MaybeSync {} + + impl<T> MaybeSync for T {} } -pub use platform::MaybeSend; +pub use platform::{MaybeSend, MaybeSync}; diff --git a/graphics/Cargo.toml b/graphics/Cargo.toml index 6741d7cf..4f323f9e 100644 --- a/graphics/Cargo.toml +++ b/graphics/Cargo.toml @@ -21,6 +21,7 @@ web-colors = [] [dependencies] iced_core.workspace = true +iced_futures.workspace = true bitflags.workspace = true bytemuck.workspace = true diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index 6a4c7909..e6b9030b 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -2,13 +2,14 @@ //! surfaces. use crate::{Error, Viewport}; -use iced_core::Color; +use crate::core::Color; +use crate::futures::{MaybeSend, MaybeSync}; use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use thiserror::Error; /// A graphics compositor that can draw to windows. -pub trait Compositor<W: HasWindowHandle + HasDisplayHandle>: Sized { +pub trait Compositor: Sized { /// The settings of the backend. type Settings: Default; @@ -19,7 +20,7 @@ pub trait Compositor<W: HasWindowHandle + HasDisplayHandle>: Sized { type Surface; /// Creates a new [`Compositor`]. - fn new( + fn new<W: Window + Clone>( settings: Self::Settings, compatible_window: Option<W>, ) -> Result<Self, Error>; @@ -30,7 +31,7 @@ pub trait Compositor<W: HasWindowHandle + HasDisplayHandle>: Sized { /// Crates a new [`Surface`] for the given window. /// /// [`Surface`]: Self::Surface - fn create_surface( + fn create_surface<W: Window + Clone>( &mut self, window: W, width: u32, @@ -77,6 +78,20 @@ pub trait Compositor<W: HasWindowHandle + HasDisplayHandle>: Sized { ) -> Vec<u8>; } +/// A window that can be used in a [`Compositor`]. +/// +/// This is just a convenient super trait of the `raw-window-handle` +/// traits. +pub trait Window: + HasWindowHandle + HasDisplayHandle + MaybeSend + MaybeSync + 'static +{ +} + +impl<T> Window for T where + T: HasWindowHandle + HasDisplayHandle + MaybeSend + MaybeSync + 'static +{ +} + /// Result of an unsuccessful call to [`Compositor::present`]. #[derive(Clone, PartialEq, Eq, Debug, Error)] pub enum SurfaceError { diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs index 7a213909..76de56bf 100644 --- a/graphics/src/lib.rs +++ b/graphics/src/lib.rs @@ -50,3 +50,4 @@ pub use transformation::Transformation; pub use viewport::Viewport; pub use iced_core as core; +pub use iced_futures as futures; diff --git a/renderer/Cargo.toml b/renderer/Cargo.toml index 56e17209..a159978c 100644 --- a/renderer/Cargo.toml +++ b/renderer/Cargo.toml @@ -27,5 +27,4 @@ iced_wgpu.workspace = true iced_wgpu.optional = true log.workspace = true -raw-window-handle.workspace = true thiserror.workspace = true diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 17157c66..a7c63444 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -1,36 +1,28 @@ use crate::core::Color; -use crate::graphics::compositor::{Information, SurfaceError}; +use crate::graphics::compositor::{Information, SurfaceError, Window}; use crate::graphics::{Error, Viewport}; use crate::{Renderer, Settings}; -use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::env; -pub enum Compositor<W: HasWindowHandle + HasDisplayHandle, Theme> { - TinySkia(iced_tiny_skia::window::Compositor<W, Theme>), +pub enum Compositor<Theme> { + TinySkia(iced_tiny_skia::window::Compositor<Theme>), #[cfg(feature = "wgpu")] - Wgpu(iced_wgpu::window::Compositor<W, Theme>), + Wgpu(iced_wgpu::window::Compositor<Theme>), } -pub enum Surface<W: HasWindowHandle + HasDisplayHandle> { - TinySkia(iced_tiny_skia::window::Surface<W>), +pub enum Surface { + TinySkia(iced_tiny_skia::window::Surface), #[cfg(feature = "wgpu")] Wgpu(iced_wgpu::window::Surface<'static>), } -// XXX Clone bound -// XXX Send/Sync? -// 'static? -impl< - W: Clone + Send + Sync + HasWindowHandle + HasDisplayHandle + 'static, - Theme, - > crate::graphics::Compositor<W> for Compositor<W, Theme> -{ +impl<Theme> crate::graphics::Compositor for Compositor<Theme> { type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface<W>; + type Surface = Surface; - fn new( + fn new<W: Window + Clone>( settings: Self::Settings, compatible_window: Option<W>, ) -> Result<Self, Error> { @@ -63,12 +55,12 @@ impl< } } - fn create_surface( + fn create_surface<W: Window + Clone>( &mut self, window: W, width: u32, height: u32, - ) -> Surface<W> { + ) -> Surface { match self { Self::TinySkia(compositor) => Surface::TinySkia( compositor.create_surface(window, width, height), @@ -82,7 +74,7 @@ impl< fn configure_surface( &mut self, - surface: &mut Surface<W>, + surface: &mut Surface, width: u32, height: u32, ) { @@ -233,11 +225,11 @@ impl Candidate { ) } - fn build<Theme, W: HasWindowHandle + HasDisplayHandle + Send + Sync>( + fn build<Theme, W: Window>( self, settings: Settings, _compatible_window: Option<W>, - ) -> Result<Compositor<W, Theme>, Error> { + ) -> Result<Compositor<Theme>, Error> { match self { Self::TinySkia => { let compositor = iced_tiny_skia::window::compositor::new( diff --git a/src/application.rs b/src/application.rs index d7be6719..9518b8c5 100644 --- a/src/application.rs +++ b/src/application.rs @@ -1,8 +1,6 @@ //! Build interactive cross-platform applications. use crate::{Command, Element, Executor, Settings, Subscription}; -use std::sync::Arc; - pub use crate::style::application::{Appearance, StyleSheet}; /// An interactive cross-platform application. @@ -210,10 +208,7 @@ pub trait Application: Sized { Ok(crate::shell::application::run::< Instance<Self>, Self::Executor, - crate::renderer::Compositor< - Arc<winit::window::Window>, - Self::Theme, - >, + crate::renderer::Compositor<Self::Theme>, >(settings.into(), renderer_settings)?) } } diff --git a/tiny_skia/Cargo.toml b/tiny_skia/Cargo.toml index df4c6143..68b2a03a 100644 --- a/tiny_skia/Cargo.toml +++ b/tiny_skia/Cargo.toml @@ -22,7 +22,6 @@ bytemuck.workspace = true cosmic-text.workspace = true kurbo.workspace = true log.workspace = true -raw-window-handle.workspace = true rustc-hash.workspace = true softbuffer.workspace = true tiny-skia.workspace = true diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 788d7297..b5e9bcd8 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -4,34 +4,33 @@ use crate::graphics::damage; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use std::collections::VecDeque; use std::marker::PhantomData; use std::num::NonZeroU32; -pub struct Compositor<W: HasDisplayHandle + HasWindowHandle, Theme> { - context: Option<softbuffer::Context<W>>, +pub struct Compositor<Theme> { + context: Option<softbuffer::Context<Box<dyn compositor::Window>>>, settings: Settings, _theme: PhantomData<Theme>, } -pub struct Surface<W: HasDisplayHandle + HasWindowHandle> { - window: softbuffer::Surface<W, W>, +pub struct Surface { + window: softbuffer::Surface< + Box<dyn compositor::Window>, + Box<dyn compositor::Window>, + >, clip_mask: tiny_skia::Mask, // Primitives of existing buffers, by decreasing age primitives: VecDeque<Vec<Primitive>>, background_color: Color, } -// XXX avoid clone bound? -impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> - crate::graphics::Compositor<W> for Compositor<W, Theme> -{ +impl<Theme> crate::graphics::Compositor for Compositor<Theme> { type Settings = Settings; type Renderer = Renderer<Theme>; - type Surface = Surface<W>; + type Surface = Surface; - fn new( + fn new<W: compositor::Window>( settings: Self::Settings, compatible_window: Option<W>, ) -> Result<Self, Error> { @@ -46,19 +45,21 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> ) } - fn create_surface( + fn create_surface<W: compositor::Window + Clone>( &mut self, window: W, width: u32, height: u32, - ) -> Surface<W> { + ) -> Surface { let window = if let Some(context) = self.context.as_ref() { - softbuffer::Surface::new(context, window) + softbuffer::Surface::new(context, Box::new(window.clone()) as _) .expect("Create softbuffer surface for window") } else { - let context = softbuffer::Context::new(window.clone()) - .expect("Create softbuffer context for window"); - softbuffer::Surface::new(&context, window) + let context = + softbuffer::Context::new(Box::new(window.clone()) as _) + .expect("Create softbuffer context for window"); + + softbuffer::Surface::new(&context, Box::new(window.clone()) as _) .expect("Create softbuffer surface for window") }; @@ -73,7 +74,7 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> fn configure_surface( &mut self, - surface: &mut Surface<W>, + surface: &mut Surface, width: u32, height: u32, ) { @@ -92,7 +93,7 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Surface<W>, + surface: &mut Surface, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -130,13 +131,14 @@ impl<W: HasDisplayHandle + HasWindowHandle + Clone, Theme> } } -pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( +pub fn new<W: compositor::Window, Theme>( settings: Settings, compatible_window: Option<W>, -) -> Compositor<W, Theme> { +) -> Compositor<Theme> { #[allow(unsafe_code)] - let context = - compatible_window.and_then(|w| softbuffer::Context::new(w).ok()); + let context = compatible_window + .and_then(|w| softbuffer::Context::new(Box::new(w) as _).ok()); + Compositor { context, settings, @@ -144,9 +146,9 @@ pub fn new<W: HasWindowHandle + HasDisplayHandle, Theme>( } } -pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( +pub fn present<T: AsRef<str>>( backend: &mut Backend, - surface: &mut Surface<W>, + surface: &mut Surface, primitives: &[Primitive], viewport: &Viewport, background_color: Color, @@ -218,8 +220,8 @@ pub fn present<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( buffer.present().map_err(|_| compositor::SurfaceError::Lost) } -pub fn screenshot<W: HasDisplayHandle + HasWindowHandle, T: AsRef<str>>( - surface: &mut Surface<W>, +pub fn screenshot<T: AsRef<str>>( + surface: &mut Surface, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml index a460c127..1d3b57a7 100644 --- a/wgpu/Cargo.toml +++ b/wgpu/Cargo.toml @@ -32,7 +32,6 @@ glyphon.workspace = true guillotiere.workspace = true log.workspace = true once_cell.workspace = true -raw-window-handle.workspace = true wgpu.workspace = true lyon.workspace = true diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index e2dc4901..0c063d0b 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -6,13 +6,11 @@ use crate::graphics::compositor; use crate::graphics::{Error, Viewport}; use crate::{Backend, Primitive, Renderer, Settings}; -use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; - use std::marker::PhantomData; /// A window graphics backend for iced powered by `wgpu`. #[allow(missing_debug_implementations)] -pub struct Compositor<W, Theme> { +pub struct Compositor<Theme> { settings: Settings, instance: wgpu::Instance, adapter: wgpu::Adapter, @@ -20,16 +18,13 @@ pub struct Compositor<W, Theme> { queue: wgpu::Queue, format: wgpu::TextureFormat, theme: PhantomData<Theme>, - w: PhantomData<W>, } -impl<W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, Theme> - Compositor<W, Theme> -{ +impl<Theme> Compositor<Theme> { /// Requests a new [`Compositor`] with the given [`Settings`]. /// /// Returns `None` if no compatible graphics adapter could be found. - pub async fn request( + pub async fn request<W: compositor::Window>( settings: Settings, compatible_window: Option<W>, ) -> Option<Self> { @@ -45,7 +40,7 @@ impl<W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, Theme> let available_adapters: Vec<_> = instance .enumerate_adapters(settings.internal_backend) .iter() - .map(|adapter| adapter.get_info()) + .map(wgpu::Adapter::get_info) .collect(); log::info!("Available adapters: {available_adapters:#?}"); } @@ -129,7 +124,6 @@ impl<W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, Theme> queue, format, theme: PhantomData, - w: PhantomData, }) } @@ -141,13 +135,10 @@ impl<W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, Theme> /// Creates a [`Compositor`] and its [`Backend`] for the given [`Settings`] and /// window. -pub fn new< - Theme, - W: HasWindowHandle + HasDisplayHandle + wgpu::WasmNotSendSync, ->( +pub fn new<W: compositor::Window, Theme>( settings: Settings, compatible_window: Option<W>, -) -> Result<Compositor<W, Theme>, Error> { +) -> Result<Compositor<Theme>, Error> { let compositor = futures::executor::block_on(Compositor::request( settings, compatible_window, @@ -158,8 +149,8 @@ pub fn new< } /// Presents the given primitives with the given [`Compositor`] and [`Backend`]. -pub fn present<W, Theme, T: AsRef<str>>( - compositor: &mut Compositor<W, Theme>, +pub fn present<Theme, T: AsRef<str>>( + compositor: &mut Compositor<Theme>, backend: &mut Backend, surface: &mut wgpu::Surface<'static>, primitives: &[Primitive], @@ -212,17 +203,12 @@ pub fn present<W, Theme, T: AsRef<str>>( } } -impl< - W: HasDisplayHandle + HasWindowHandle + wgpu::WasmNotSendSync + 'static, - Theme, - > graphics::Compositor<W> for Compositor<W, Theme> -{ +impl<Theme> graphics::Compositor for Compositor<Theme> { type Settings = Settings; type Renderer = Renderer<Theme>; - // XXX generic instead of 'static type Surface = wgpu::Surface<'static>; - fn new( + fn new<W: compositor::Window>( settings: Self::Settings, compatible_window: Option<W>, ) -> Result<Self, Error> { @@ -237,7 +223,7 @@ impl< ) } - fn create_surface( + fn create_surface<W: compositor::Window>( &mut self, window: W, width: u32, @@ -328,8 +314,8 @@ impl< /// Renders the current surface to an offscreen buffer. /// /// Returns RGBA bytes of the texture data. -pub fn screenshot<W, Theme, T: AsRef<str>>( - compositor: &Compositor<W, Theme>, +pub fn screenshot<Theme, T: AsRef<str>>( + compositor: &Compositor<Theme>, backend: &mut Backend, primitives: &[Primitive], viewport: &Viewport, diff --git a/winit/src/application.rs b/winit/src/application.rs index d639a36b..c5e11167 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -106,7 +106,7 @@ pub fn run<A, E, C>( where A: Application + 'static, E: Executor + 'static, - C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, + C: Compositor<Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use futures::task; @@ -258,7 +258,7 @@ async fn run_instance<A, E, C>( ) where A: Application + 'static, E: Executor + 'static, - C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, + C: Compositor<Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use futures::stream::StreamExt; @@ -612,7 +612,7 @@ pub fn update<A: Application, C, E: Executor>( messages: &mut Vec<A::Message>, window: &winit::window::Window, ) where - C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, + C: Compositor<Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { for message in messages.drain(..) { @@ -663,7 +663,7 @@ pub fn run_command<A, C, E>( ) where A: Application, E: Executor, - C: Compositor<Arc<winit::window::Window>, Renderer = A::Renderer> + 'static, + C: Compositor<Renderer = A::Renderer> + 'static, <A::Renderer as core::Renderer>::Theme: StyleSheet, { use crate::runtime::command; diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 84c81bea..21196460 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -24,6 +24,7 @@ use crate::{Clipboard, Error, Proxy, Settings}; use std::collections::HashMap; use std::mem::ManuallyDrop; +use std::sync::Arc; use std::time::Instant; /// An interactive, native, cross-platform, multi-windowed application. @@ -150,9 +151,11 @@ where log::info!("Window builder: {:#?}", builder); - let main_window = builder - .build(&event_loop) - .map_err(Error::WindowCreationFailed)?; + let main_window = Arc::new( + builder + .build(&event_loop) + .map_err(Error::WindowCreationFailed)?, + ); #[cfg(target_arch = "wasm32")] { @@ -184,7 +187,8 @@ where }; } - let mut compositor = C::new(compositor_settings, Some(&main_window))?; + let mut compositor = + C::new(compositor_settings, Some(main_window.clone()))?; let mut window_manager = WindowManager::new(); let _ = window_manager.insert( @@ -388,7 +392,7 @@ async fn run_instance<A, E, C>( } => { let window = window_manager.insert( id, - window, + Arc::new(window), &application, &mut compositor, exit_on_close_request, diff --git a/winit/src/multi_window/window_manager.rs b/winit/src/multi_window/window_manager.rs index d54156e7..9e15f9ea 100644 --- a/winit/src/multi_window/window_manager.rs +++ b/winit/src/multi_window/window_manager.rs @@ -6,6 +6,7 @@ use crate::multi_window::{Application, State}; use crate::style::application::StyleSheet; use std::collections::BTreeMap; +use std::sync::Arc; use winit::monitor::MonitorHandle; #[allow(missing_debug_implementations)] @@ -34,7 +35,7 @@ where pub fn insert( &mut self, id: Id, - window: winit::window::Window, + window: Arc<winit::window::Window>, application: &A, compositor: &mut C, exit_on_close_request: bool, @@ -43,7 +44,7 @@ where let viewport_version = state.viewport_version(); let physical_size = state.physical_size(); let surface = compositor.create_surface( - &window, + window.clone(), physical_size.width, physical_size.height, ); @@ -122,7 +123,7 @@ where C: Compositor<Renderer = A::Renderer>, <A::Renderer as crate::core::Renderer>::Theme: StyleSheet, { - pub raw: winit::window::Window, + pub raw: Arc<winit::window::Window>, pub state: State<A>, pub viewport_version: u64, pub exit_on_close_request: bool, From b9dc106a56a9f91673f3a64b05e8413150adf5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 09:58:54 +0100 Subject: [PATCH 274/286] Remove `winit` dependency from `iced` root crate --- Cargo.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 131a4ef5..665dc5a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,8 +70,6 @@ thiserror.workspace = true image.workspace = true image.optional = true -winit.workspace = true - [profile.release-opt] inherits = "release" codegen-units = 1 From 4c90ed6a1b50331d889d79aacbf653fc6d98950f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 09:59:36 +0100 Subject: [PATCH 275/286] Remove patch version from `softbuffer` --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 665dc5a1..c9dee6b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -145,7 +145,7 @@ resvg = "0.36" rustc-hash = "1.0" smol = "1.0" smol_str = "0.2" -softbuffer = "0.4.1" +softbuffer = "0.4" syntect = "5.1" sysinfo = "0.28" thiserror = "1.0" From 1701ec815d3f25ea8097e806081e7a3ac9ba4d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:02:50 +0100 Subject: [PATCH 276/286] Remove redundant `ref mut` in `iced_renderer::compositor` --- renderer/src/compositor.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index a7c63444..0b56f101 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -113,7 +113,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::TinySkia(_compositor), crate::Renderer::TinySkia(renderer), - Surface::TinySkia(ref mut surface), + Surface::TinySkia(surface), ) => renderer.with_primitives(|backend, primitives| { iced_tiny_skia::window::compositor::present( backend, @@ -128,7 +128,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::Wgpu(compositor), crate::Renderer::Wgpu(renderer), - Surface::Wgpu(ref mut surface), + Surface::Wgpu(surface), ) => renderer.with_primitives(|backend, primitives| { iced_wgpu::window::compositor::present( compositor, @@ -160,7 +160,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ( Self::TinySkia(_compositor), Renderer::TinySkia(renderer), - Surface::TinySkia(ref mut surface), + Surface::TinySkia(surface), ) => renderer.with_primitives(|backend, primitives| { iced_tiny_skia::window::compositor::screenshot( surface, From 5fc49edc55a0e64c4c46ca55eddafe9d4e8232e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:06:30 +0100 Subject: [PATCH 277/286] Make `compatible_window` mandatory in `Compositor` --- graphics/src/compositor.rs | 2 +- renderer/src/compositor.rs | 4 ++-- tiny_skia/src/window/compositor.rs | 26 ++++++++++---------------- wgpu/src/window/compositor.rs | 6 +++--- winit/src/application.rs | 2 +- winit/src/multi_window.rs | 3 +-- 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index e6b9030b..0188f4d8 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -22,7 +22,7 @@ pub trait Compositor: Sized { /// Creates a new [`Compositor`]. fn new<W: Window + Clone>( settings: Self::Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Result<Self, Error>; /// Creates a [`Self::Renderer`] for the [`Compositor`]. diff --git a/renderer/src/compositor.rs b/renderer/src/compositor.rs index 0b56f101..f10ed048 100644 --- a/renderer/src/compositor.rs +++ b/renderer/src/compositor.rs @@ -24,7 +24,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn new<W: Window + Clone>( settings: Self::Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Result<Self, Error> { let candidates = Candidate::list_from_env().unwrap_or(Candidate::default_list()); @@ -228,7 +228,7 @@ impl Candidate { fn build<Theme, W: Window>( self, settings: Settings, - _compatible_window: Option<W>, + _compatible_window: W, ) -> Result<Compositor<Theme>, Error> { match self { Self::TinySkia => { diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index b5e9bcd8..86400aa0 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -9,7 +9,7 @@ use std::marker::PhantomData; use std::num::NonZeroU32; pub struct Compositor<Theme> { - context: Option<softbuffer::Context<Box<dyn compositor::Window>>>, + context: softbuffer::Context<Box<dyn compositor::Window>>, settings: Settings, _theme: PhantomData<Theme>, } @@ -32,7 +32,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn new<W: compositor::Window>( settings: Self::Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Result<Self, Error> { Ok(new(settings, compatible_window)) } @@ -51,17 +51,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { width: u32, height: u32, ) -> Surface { - let window = if let Some(context) = self.context.as_ref() { - softbuffer::Surface::new(context, Box::new(window.clone()) as _) - .expect("Create softbuffer surface for window") - } else { - let context = - softbuffer::Context::new(Box::new(window.clone()) as _) - .expect("Create softbuffer context for window"); - - softbuffer::Surface::new(&context, Box::new(window.clone()) as _) - .expect("Create softbuffer surface for window") - }; + let window = softbuffer::Surface::new( + &self.context, + Box::new(window.clone()) as _, + ) + .expect("Create softbuffer surface for window"); Surface { window, @@ -133,11 +127,11 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { pub fn new<W: compositor::Window, Theme>( settings: Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Compositor<Theme> { #[allow(unsafe_code)] - let context = compatible_window - .and_then(|w| softbuffer::Context::new(Box::new(w) as _).ok()); + let context = softbuffer::Context::new(Box::new(compatible_window) as _) + .expect("Create softbuffer context"); Compositor { context, diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 0c063d0b..105d83a8 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -137,11 +137,11 @@ impl<Theme> Compositor<Theme> { /// window. pub fn new<W: compositor::Window, Theme>( settings: Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Result<Compositor<Theme>, Error> { let compositor = futures::executor::block_on(Compositor::request( settings, - compatible_window, + Some(compatible_window), )) .ok_or(Error::GraphicsAdapterNotFound)?; @@ -210,7 +210,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn new<W: compositor::Window>( settings: Self::Settings, - compatible_window: Option<W>, + compatible_window: W, ) -> Result<Self, Error> { new(settings, compatible_window) } diff --git a/winit/src/application.rs b/winit/src/application.rs index c5e11167..5fcdbbd8 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -187,7 +187,7 @@ where }; } - let compositor = C::new(compositor_settings, Some(window.clone()))?; + let compositor = C::new(compositor_settings, window.clone())?; let mut renderer = compositor.create_renderer(); for font in settings.fonts { diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs index 21196460..3f0ba056 100644 --- a/winit/src/multi_window.rs +++ b/winit/src/multi_window.rs @@ -187,8 +187,7 @@ where }; } - let mut compositor = - C::new(compositor_settings, Some(main_window.clone()))?; + let mut compositor = C::new(compositor_settings, main_window.clone())?; let mut window_manager = WindowManager::new(); let _ = window_manager.insert( From 4b7744b9806397c9891b1fc179df8a61eaa3670d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:35:27 +0100 Subject: [PATCH 278/286] Support out-of-order `Buffer` ages in `iced_tiny_skia` --- tiny_skia/src/window/compositor.rs | 32 ++++++++++++++---------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 86400aa0..c0aabdb6 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -20,9 +20,9 @@ pub struct Surface { Box<dyn compositor::Window>, >, clip_mask: tiny_skia::Mask, - // Primitives of existing buffers, by decreasing age - primitives: VecDeque<Vec<Primitive>>, + primitive_stack: VecDeque<Vec<Primitive>>, background_color: Color, + max_age: u8, } impl<Theme> crate::graphics::Compositor for Compositor<Theme> { @@ -61,8 +61,9 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { window, clip_mask: tiny_skia::Mask::new(width, height) .expect("Create clip mask"), - primitives: VecDeque::new(), + primitive_stack: VecDeque::new(), background_color: Color::BLACK, + max_age: 0, } } @@ -74,7 +75,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ) { surface.clip_mask = tiny_skia::Mask::new(width, height).expect("Create clip mask"); - surface.primitives.clear(); + surface.primitive_stack.clear(); } fn fetch_information(&self) -> Information { @@ -159,7 +160,6 @@ pub fn present<T: AsRef<str>>( ) .unwrap(); - // TODO Add variants to `SurfaceError`? let mut buffer = surface .window .buffer_mut() @@ -167,27 +167,25 @@ pub fn present<T: AsRef<str>>( let age = buffer.age(); - // Forget primatives for back buffers older than `age` - // Or if this is a new buffer, keep at most two. - let max = if age == 0 { 2 } else { age }; - while surface.primitives.len() as u8 > max { - let _ = surface.primitives.pop_front(); - } + let last_primitives = { + surface.max_age = surface.max_age.max(age); + surface.primitive_stack.truncate(surface.max_age as usize); - let last_primitives = if surface.primitives.len() as u8 == age { - surface.primitives.pop_front() - } else { - None + if age > 0 { + surface.primitive_stack.get(age as usize - 1) + } else { + None + } }; let damage = last_primitives .and_then(|last_primitives| { (surface.background_color == background_color) - .then(|| damage::list(&last_primitives, primitives)) + .then(|| damage::list(last_primitives, primitives)) }) .unwrap_or_else(|| vec![Rectangle::with_size(viewport.logical_size())]); - surface.primitives.push_back(primitives.to_vec()); + surface.primitive_stack.push_front(primitives.to_vec()); surface.background_color = background_color; if !damage.is_empty() { From b6b3e9b9f995abf5cc65814e143418b6f1ec7464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:42:02 +0100 Subject: [PATCH 279/286] Avoid stacking new primitives when undamaged --- tiny_skia/src/window/compositor.rs | 38 ++++++++++++++++-------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index c0aabdb6..dae57975 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -185,29 +185,31 @@ pub fn present<T: AsRef<str>>( }) .unwrap_or_else(|| vec![Rectangle::with_size(viewport.logical_size())]); + if damage.is_empty() { + return Ok(()); + } + surface.primitive_stack.push_front(primitives.to_vec()); surface.background_color = background_color; - if !damage.is_empty() { - let damage = damage::group(damage, scale_factor, physical_size); + let damage = damage::group(damage, scale_factor, physical_size); - let mut pixels = tiny_skia::PixmapMut::from_bytes( - bytemuck::cast_slice_mut(&mut buffer), - physical_size.width, - physical_size.height, - ) - .expect("Create pixel map"); + let mut pixels = tiny_skia::PixmapMut::from_bytes( + bytemuck::cast_slice_mut(&mut buffer), + physical_size.width, + physical_size.height, + ) + .expect("Create pixel map"); - backend.draw( - &mut pixels, - &mut surface.clip_mask, - primitives, - viewport, - &damage, - background_color, - overlay, - ); - } + backend.draw( + &mut pixels, + &mut surface.clip_mask, + primitives, + viewport, + &damage, + background_color, + overlay, + ); buffer.present().map_err(|_| compositor::SurfaceError::Lost) } From 150ce65e209414847ae133a70c833addd3086e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:43:52 +0100 Subject: [PATCH 280/286] Nest `age` declaration inside `last_primitives` --- tiny_skia/src/window/compositor.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index dae57975..08a49bc5 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -165,9 +165,9 @@ pub fn present<T: AsRef<str>>( .buffer_mut() .map_err(|_| compositor::SurfaceError::Lost)?; - let age = buffer.age(); - let last_primitives = { + let age = buffer.age(); + surface.max_age = surface.max_age.max(age); surface.primitive_stack.truncate(surface.max_age as usize); From 3cf8f77d6537f9d864f4a554b2fff46676a761f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:52:25 +0100 Subject: [PATCH 281/286] Resize surface in `configure_surface` in `iced_tiny_skia` --- tiny_skia/src/window/compositor.rs | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 08a49bc5..17d21100 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -57,14 +57,18 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { ) .expect("Create softbuffer surface for window"); - Surface { + let mut surface = Surface { window, clip_mask: tiny_skia::Mask::new(width, height) .expect("Create clip mask"), primitive_stack: VecDeque::new(), background_color: Color::BLACK, max_age: 0, - } + }; + + self.configure_surface(&mut surface, width, height); + + surface } fn configure_surface( @@ -73,6 +77,14 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { width: u32, height: u32, ) { + surface + .window + .resize( + NonZeroU32::new(width).expect("Non-zero width"), + NonZeroU32::new(height).expect("Non-zero height"), + ) + .expect("Resize surface"); + surface.clip_mask = tiny_skia::Mask::new(width, height).expect("Create clip mask"); surface.primitive_stack.clear(); @@ -152,14 +164,6 @@ pub fn present<T: AsRef<str>>( let physical_size = viewport.physical_size(); let scale_factor = viewport.scale_factor() as f32; - surface - .window - .resize( - NonZeroU32::new(physical_size.width).unwrap(), - NonZeroU32::new(physical_size.height).unwrap(), - ) - .unwrap(); - let mut buffer = surface .window .buffer_mut() From c929e6f5dd30044df4e7400ab633eaf0a53ce3dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:56:02 +0100 Subject: [PATCH 282/286] Use `Self::Surface` in `Compositor` implementors --- tiny_skia/src/window/compositor.rs | 6 +++--- wgpu/src/window/compositor.rs | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 17d21100..781ed8a5 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -50,7 +50,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { window: W, width: u32, height: u32, - ) -> Surface { + ) -> Self::Surface { let window = softbuffer::Surface::new( &self.context, Box::new(window.clone()) as _, @@ -73,7 +73,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut Surface, + surface: &mut Self::Surface, width: u32, height: u32, ) { @@ -100,7 +100,7 @@ impl<Theme> crate::graphics::Compositor for Compositor<Theme> { fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut Surface, + surface: &mut Self::Surface, viewport: &Viewport, background_color: Color, overlay: &[T], diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 105d83a8..31cf3819 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -228,7 +228,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { window: W, width: u32, height: u32, - ) -> wgpu::Surface<'static> { + ) -> Self::Surface { let mut surface = self .instance .create_surface(window) @@ -241,7 +241,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn configure_surface( &mut self, - surface: &mut wgpu::Surface<'static>, + surface: &mut Self::Surface, width: u32, height: u32, ) { @@ -272,7 +272,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn present<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - surface: &mut wgpu::Surface<'static>, + surface: &mut Self::Surface, viewport: &Viewport, background_color: Color, overlay: &[T], @@ -293,7 +293,7 @@ impl<Theme> graphics::Compositor for Compositor<Theme> { fn screenshot<T: AsRef<str>>( &mut self, renderer: &mut Self::Renderer, - _surface: &mut wgpu::Surface<'static>, + _surface: &mut Self::Surface, viewport: &Viewport, background_color: Color, overlay: &[T], From 74a6e58cbc3354d45ed6cd86e58c624a946d0f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 10:57:53 +0100 Subject: [PATCH 283/286] Remove comment in `iced_winit::application` --- winit/src/application.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/winit/src/application.rs b/winit/src/application.rs index 5fcdbbd8..09bf63cc 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -150,7 +150,6 @@ where log::debug!("Window builder: {builder:#?}"); - // XXX Arc? let window = Arc::new( builder .build(&event_loop) From cba56ea76821a3204923d34c3fe634730a86f22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 11:02:53 +0100 Subject: [PATCH 284/286] Fix typo `Send -> Sync` --- futures/src/maybe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/futures/src/maybe.rs b/futures/src/maybe.rs index 1a0bd1d1..c564a739 100644 --- a/futures/src/maybe.rs +++ b/futures/src/maybe.rs @@ -24,7 +24,7 @@ mod platform { impl<T> MaybeSend for T {} - /// An extension trait that enforces `Send` only on native platforms. + /// An extension trait that enforces `Sync` only on native platforms. /// /// Useful to write cross-platform async code! pub trait MaybeSync {} From bdb8f4966ea75c0147165541771ed3f952ac8d13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 11:21:41 +0100 Subject: [PATCH 285/286] Fix grammar in `iced_futures::maybe` module --- futures/src/maybe.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/futures/src/maybe.rs b/futures/src/maybe.rs index c564a739..c6a507c1 100644 --- a/futures/src/maybe.rs +++ b/futures/src/maybe.rs @@ -2,14 +2,14 @@ mod platform { /// An extension trait that enforces `Send` only on native platforms. /// - /// Useful to write cross-platform async code! + /// Useful for writing cross-platform async code! pub trait MaybeSend: Send {} impl<T> MaybeSend for T where T: Send {} /// An extension trait that enforces `Sync` only on native platforms. /// - /// Useful to write cross-platform async code! + /// Useful for writing cross-platform async code! pub trait MaybeSync: Sync {} impl<T> MaybeSync for T where T: Sync {} @@ -19,14 +19,14 @@ mod platform { mod platform { /// An extension trait that enforces `Send` only on native platforms. /// - /// Useful to write cross-platform async code! + /// Useful for writing cross-platform async code! pub trait MaybeSend {} impl<T> MaybeSend for T {} /// An extension trait that enforces `Sync` only on native platforms. /// - /// Useful to write cross-platform async code! + /// Useful for writing cross-platform async code! pub trait MaybeSync {} impl<T> MaybeSync for T {} From 9df7bf8ec30ca76016018bc758b4323760e231b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= <hector@hecrj.dev> Date: Thu, 18 Jan 2024 15:41:19 +0100 Subject: [PATCH 286/286] Use `workspace` dependency for `raw-window-handle` in `iced_core` --- core/Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index be92a572..32dd3df2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -23,8 +23,7 @@ palette.workspace = true palette.optional = true [target.'cfg(windows)'.dependencies] -# TODO: Use `workspace` dependency once `wgpu` upgrades `raw-window-handle` -raw-window-handle = "0.6" +raw-window-handle.workspace = true [dev-dependencies] approx = "0.5"