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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 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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ä$r#)Na@r9)<lH)Sq;pELPdxb*yr?CVVv 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≤s9h@LqUr{7i=Z3`!A! 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�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�>glJB-S$?}H*#CjWa?RE*)++0RyfzBa;4tq(Q~z4 zKRn}JFtaJzP%eD&qdWf@K6^jAWTnqmxh`i~g-+{_M@ur7^Go*l&RP-O!&n&Td-dXj zE9Dz*c?wS1JnP-@8=i*C<&t)O<H}vXWz|EslUYJFSDeq!x)vkHa8%+jN9DX6U!E;@ zn5FHabFT=UWeNCl@Sj{u_M?DW;p9V?=PQ&hnEOvYh3U^?c88j8f99WPs5fGm_ob=g z-=^ii6L^knDwCYeGxNY@hYL;}Zk`3F+*U4{DW4(yZkdzqR)w1nn5~~&Svk$%%AaVd zLiODmGXk3}txGSpuQhyhFe${wHY3f3Ep(;O6TumBeI_Z5K5M0}ILkH{-A=U#<5Ko@ zV9#D{<lHSV!yq-;zWmzV6qYBKIP|>_Prg&Mp8v;BjyT&2%Y(O1{>WVR=#Wcwzq?va zh1!ZuPdqM&#lAk-sF$Vo_=EX%#~U>%ThbN(^gF*{)7~(@>AQW&t8j~LOPB=rzCX=* zZga-U*I9Su{A^tG=T5pId3CGdq?Seb_bR>D*?e;LyOispCvnz8R#=iPctMNdSHE+8 z3)4P6f0o0q8zs+vz3APO5Y1rqu0Un&rdL@u?;P(n+3zVmr_bwMaKGm<Uyjv|Umfo^ z3LFh<omco)%W0G6vJ1W@OP^@HIrL@k#ut?fUN`u)7w+te{A5x7%OE4iIXx~h<JQy) z$7|<51vI-}d>ANv$FFz0%#@@Eqq=wJW^1!1c`M)Eap-B<8`F)V>0kXm9eeqdac6K) zfmfHruDj`<%#3?aI2$hxOJDD2FSJ+cb*(|dEPiDTOZNO~gYb(B_lJMv-mllXMPu1# zZ?2@Qn(uSpUW+`}cKPMrNp5fAd5kxlShT||_+SptPyg^_k$a*?gSW){xCS43r!~p? z*qv6pZH~`v@&e>fmDJj*T4vl{p3a={XsVUU63fjGFNqy)W|+5o5yNb=l2hl^d~e+~ z^pmo!Z<!@7F?&_T$w`7Uq$Xv}n!tZvb59qWSkIg1fpgA#`piwwxnrX7==?K#X``f= zUU_@&{eRDX{9p2F`_yFqJ@Rulef~P<q3+|A2FqO}Ct8^K@NV>9{&}8zmZ!(->+_TU zIVx`X7&+<mlg$y2k59buJ&{W^N$kggocT9$-&U<(xl%z(SVm*x;Wo3a=Drhl9khDq z{VuC6+2=;G%o4HYodNTGjP6c&Vf7};sBHSRT|LiNl`rNmJSlzb-VrxV&Qm`xD}LvY zY`7Ks`u?&+8_8xni*FluuBgaOd~(Hd>Zw+@|MOnP8czGte9ZIAx`Qzv@7gt7H>+X1 zG+D~#U!lCnory=!-AH~lVbzzzAKDA!nrqwk&riLwWBsv}&kX-gZhT`?x+A2ny5Vl~ zbWy!^Z8u|HuR9*Wt!dHaAaUPR)l51qB~zl^Zt?$P`!8oyl+>2I*X?Y4oVnx4?02;+ zObs!g_Lf}Vx`MA#GUT)3>CCfiU*prV*|RL3yjrt$$Kscjj=^VACFPtBe^(HAu+45k zj)tk?>q1S3H|O>_=V<M#>g|8Nr!^>P5C7geagS?!SLJ)2e<@=r41f4!g_%Xxh8q^e z?4Ms`>=JA7QSg=*QutD-Z}z0mdG}o7H^s}#H@YNU-}xb^$COv{{+G-t<%%=9H=bv^ zoFKgDWtlC@jo%+$XLx*@wA)bjLP4M2tE^MIt{>L&$k`sa{s@Cn?UhvuQuWeBOy|4y z#EP|r`2XH9`<1%%0)^z0eWw@R`H(Zk@`F~V=j+G!+19q5i7DqbJ9l8u$_sl%uclUq zUKWa+Uo3Uy=i<ZrYJXWiO*Hzs<fnT0;_BPYHQ|i2H$9oV+%-E{K4D6;l79Kx>8IE1 zwVC%jIjHyLx#jI=R+&!O<{xsyHpKj_^Q^3-8Ea1Lf9CUH!}2S^ykF-u-?Tc;czuH9 z>nTmAe=hLptu24Iy72ykjb3FB7JdyWnttcd)7ptS61R3`I$5~AkyDP_#d7s{z?+Io z-+HZXbh)!<?^>zJX|Znc#2K7HlS>wqH*U_X*eX)ezed^exay2)YB$dvJ~`Xuim7$~ zB9m!hu9v?%K0dd0^6o7+&Y!q^>uJDz-5EjY=MHXj%%A&a>MY}{itlFCxEU7}>8(HZ zsr%cX_wPHux(Cd1*phiNr`}-Q_P*^-?|M0(&p&6ZFMc>qMS53RvX__ft7QME><Rl{ z>1<JK)qZ@YKF0d%I-cLxPi{E5QSy-R{e0PVi+|c3`L{P@>C7$b(mrK&RLC$f?q!{M zETp-%tju_uGuy6WeqPbLDz>IieuoM#PkK`vt|hRcY;inm*<+@n$&I;(rFA8br{q+p zAF}j6mwIjIo%?gQGyP7vbN9j83;$U6m3-B@AK(1`o~C9p-}keT&kx8MZ1=O3%6y+A zd#~<n1gBheK`sBkN?t#EZA10CGq3u^UhC+4{xg@2n{ejmoQFk4KbY*D_ldi+mU+xh z{I@dr{X)}O^A=p{a14KaWvYWwTzGc6(P44r=|1bHE|$vmxc+SAX8SkFX(p<b7k_?G zI9U32{-=90noGoPYb?~C;aMlLZvT7PZ)-1aJC-x|vL^3=du{&L)eqaa$$s}q>AGj% zcI(=K=;bP&a}L?tvK(sDnSUTQ$Nl(=+%H?tPdw~C|DVnqmYDC1Og7w?ZB&^5OFJ=` z^?W=gqWtD?=!c(Qul;UkoXULBNnRv&Psp5;sn@2>{(QsKkyBW8m*~Z3Rl*eyR!%P3 zu(fYz?S=LuVg=hopK|P;sONMe+2^H)z!%5mL6a}~ws)JX_*F0eQT?sJtuHxGHl0j3 z&ucXI(B=ciyLJZbT=hOW>caE{;lGX+0YRH3Wv?->Yrm+T{!d8f@`cK>6XLPWxvh`; zdX$d2oMh(}m!9&(O5lrHvsLD5w~J<7DehA){Y{CPwWUJ;=*@j)w=PxwpJuVm(Oz3| z+Y#RvxAtW-ZeU#=(44e8P%U|WOW*QE=QYnxmwMuG)cKUGe=OghQ@<C@=#u!h;7yyT z?2+T^nr=;gc-YtO{M@JBs!z=##QmbAqT8dJcC!a(|1k>pdT(>*=H|jVUuNt+xyOI! zEvpNc7UXUBPM>X+X;Jq5;vO;aziJNW-bMPR<R5G7n!e}oPrdui%H{@=hrR|he%5&< z9?p1CeP@N=&dV`VF5NqLer}%QYR+#<G&B~-*h!sESbd>RjnV(6#r)>_pO@#}u6(}j z%@;<7kkxCRvzN~H%w04&!*=7l&eF4A4!@ke(SAyc!Avz*<754@-)t*fT?1@Gmx(9O zo6G$ChoDhQ4zK^zS*)8(o5D=p?4922<#cYFy2!o!`mZg^jx?vt+EOZBy1iHL?EIsj z6L@WJy6o&+_WuS8)0V?O9@!mQTY7L3_mnOb_0Q^aBes}_Ea-8&=WZ;(!Qx?~zG+rY z&5`@Iv+oAJIAmeNZqQk4=F=iIQG#9IFy}wZkF`PTytz#OD^BSCcyGhUd$a7k^Us~1 zU6|`PtM~G1VRz-eb1CPpdpCY=Iomnq?P2|c^NiLOp0KryF=U98ceOf~;WYn2=enia z74Dkot}T^W_9xHi$L{*%JJFdpO6T7(;r+g3Sq}fqw>|%QPZ*u}_&{0LAyi8~t?~Sc zqxXI?_~)2NJ=0iL5OBR(JX?F$63g$-z1eaNr|kGHc1i8dU~<hh%(0MDyTafb*;*ub zsXa(5c;$uW*YWAM@>;GkM)d4hW3udQa?@NjL#`!(8~Q!xEL2OKWo1_?xk63#yv*6i z@WnEH@!Xfqld}$fTE+Bfqw24TZ6ywo&rb7fRO!oe-mm?>S<!t;viahf@3od(TclLt zcep*p=CdX9(%{t_bJ?!iJvKQm_ao<n(Ik~COE&M^Ubwb<+0Wad3<c*d{d%qRawmgi z;McB_7kc%ra>=W#Z^+voX**>(W4hnDNeQ;{&*c`~e=oO$dFd{d4X#@c1unh({KAw? z;ct!OmaNzDuydEU6WT2GJf!sBHjZu1IunF?W<<G4911=sD04g`g}26Js^Ja0l9MWa zk7ZW0UwdYwwt6jlu5`|{hSQ9q>0cGpHb~z3`T3@&+J9wdtG~}Kbh9bEyOqEDq(bSf zpF8xncIHlh_QN0~H}q@I%xg8=lULW@Xy-q9k!{B8kT+`KwE?d`RJ^DXn?HZ2Y_gGA z_W8Hx*rhMYZksJwK6meb0oR+QZa)4y{ZFJ+oRgARadXP-3ZL_fLatYNJI1MsZkC<- zx3Bi`%(Nowrq35=1|@l^C9FTVkM+3Sw&Rn(op>wgb9TmN6}hSYmhHW-H<>r?HhKHD zbn@vsFE2xj)RSws1$KO2x;gFn*`~@@YuK(&i#QVzlhb!6VZWE!Oqpp<9~7C~t4~{Z zf9}_HOxK<>en>M_w!8N@<k%sBUl!+VY}ExFU;AY$`Y%Z|=sGR_K%(e~iZbWg(qxNS z*>8V;D6ra9vxY%UJmY@b`;PUFmPgu7E$y$!I%!wL@0IoDoy{T3>gDR5`|Zx1Q+6wI z;0fN<=j-`t<7I=lXA5r2+-80~*U0ow&Ktou+aK&;*YEzgNg`j>L%qUYHBa5+eviyC zZ=-eV{q{&+P0yIX_xz2YXK&M)CEpt^uRDKh*Ma>a$6j-9k$g9M-#br*hl@`~6k8dZ z+{*HaZj|pfd>@;=<g|XK-Gk=~HVRML6LHD1bVgr))q$56BmCxCsIO!EtQ=u>^{(OJ zPpgd6sylvKJpK}yos(TPfA8Vhl9`1%&e;e5?tP^*bIy#Otrp%!ap$^t?(6QbZK{-? zxM=bE+xz??a((X2OuF-bo$0-_9sjfTFxsZyt7rSS_M_9Y>-7`Mk8RhkiGT3a-Qd1e z>g4dFf!e{m_v%Vt9lg0sai?T;eq__#t>;_PI%EXr)Ko;ZR$UA$-OuH?(0Hnwj>EZ# z>+{|pxL0ETV$vM7%m1q1OcFh}oXz{g?cJYm@MNXW>osG4n!<D@_f4(uVWx6Vfh^w* zY_;tjYHAZ#*Wc*Vn|$P6<;;X{eX5uD-S4?qa^aR>@&%J$U0M^g`**FH^(+0gZ1Be~ zip`S*73DwuNmtCy&|qC0-+n*ypZnfV7w_9=Cp7x~w`P8D^U3VLd5`}8T&}F*dc8*E zWvoW2yidcFo>b2zuI;LV6{QtcGpd#^UC_t2$wk9k@abIkq8dAaw`XQ=j85Nr?)0=1 zcRwU;(L9mvE1P|}QSf0_kl!nTmU&%%itNQtf18zOYQ|_x-D&pcQg2O0)RbjzrJ{3m z4<9!5{JQ$`%P#`Vi{5@qToO8)>&5o%XI`%5lB_!L=3tPO_A%LH|JdMZzJAXqpVZyH zQ|zhKgjHSVC$S|bnpl6fS;DqL;k^C^xr0FuReAC|=kvSrr%vyC8QA>#s^{*>+HbaQ zmhbV<w@uk;an~euq0`K{zb);0&hFuyx_$Gfv|I+c`+3JIh5s7uIX&@Csz*h=#9R00 zPU`=3)>=+}l(}yXf8D$Xh2B4&#mwq4Tem(S-g^3_m1_g@+CqQN$dJ>IWxt^DF6iYR zbIFb~mLI&A*XP<?J5yL(n;-m9P;vXUZPMI^K1@$1<SM#9Ua7^tEj8l#xx8a_JL1w0 zK0LT`)}tQ{rk$tu-8xZYR$+be>9@M?54Xs?D}Herwie(``^0yB?ZGxXSY!Ubnp0nP zZs+H({s;B-d-rcU_kYWS+0Ct!3u<m!o;rBGbfK-@p0ei`t*>8eSL8I9nel3w&+7~( zH;;oRoagrZ**x)lZ{F@jij6PdxBWMmwzA+?){SQ^<}<InIhAxiS?VjJ6rX*c+&P<T z;U&sD`+sao_<C;Js)!GaGaf8ju}$l-_9Ua_{ra-+jdpm?4s<un(YU3amV3zkbwueK z36D1g>grqknC$NSn1BBCW_f;QZr^hf32rOG(q`<{ny2^U18c$WIX|wMRNeY<_dAc* z^sftrO?{tA@ZJ`-=&(|Imw1PHUAp@J!b9=Kg)KcblMLs|#LcZslHfg>V3@JEuj1YH z<U^_R=R5N5Q9Ekqz~IAhW1rRASce`}(OAP-F6nP}F5_6ad}ZQWD~{iWDwfHcHZ%60 zo#EabmS)(jqiy#}a`!iri&gg~Z%}_4fBnWJwQc8@ok}yc-pku|=tlL)NgP{sPgp<U zJ;mwj-P?JuWaCAR*E8S02$-wpyS=;oXZy2+Pi@~5?i&67Uhj9Oo@KfD^RNAWJ74_# zpqKLh-hr@W&x6k{u<=}Gub5~vqiBPV?CDsc#UG!)>Rqk=&HdpnwNv>sKUXI&3-0>( zuIr(e;flV=2QCVA7McAKJ*R(Av%K!wkzlVxMcq0{p*0RXUDIVQz2g78?dXB$e%i+l z&)u`C^1^0oF1_o2&(2<U&epr{qTVbXwJ$n0%g)_=q9mVY^T^UBz;LhPwlgtD4YXY+ zdve<aaqcO<r#JV@qGexiq;kAoY`OBhX?c@r^WCG<X8%rijywKjcI<bB{G_)xyBU_{ zvhp=DzEr&Yu$Dc{cd2couEE)3nTE?aUv)V3EPMXfLSS;P1jjWFIey7qzLC6%b(>_4 zS;Zf#yEJ)Y=}cSQWm~5RM%>k%u`4jHRBVg&7SU4$Lf?-uG^<{J$$2RBNZ!uP{(R2U zF7Q=YI&xahd*7_c)cmqzS?2AJDQhy%XU8&kX1=(W+Oj;e@P>qoOU5J{9*MiXH-8ko zQtxj(lD4OO?(}@~*w4@9^dB6X5ik0>CdbHai}sYHC({iDGz*@b+qW}|yV;6;N<!?y z`#paqJexn$@ocE^Rk5{~O)i|T3g7&M?Q)7&=ZxmJp~7jqovpt3>|iy1u=(5LYTjoJ zH(8nNg(6yu9I}q7KG>&Wxaj<eExTAg*IWonUi%?=u7xhs;oEF)r$v}A4LN%+V%@7f z|NrGa`lhR4y=QLk>HSi#g+q)z`F@?d(cRvda4lg~Z<@xcOD=JJ6V{(ww@~8cPO+mL zzoZUMX)^7vxS{sp=w}8F!)wgj-uP&0EZuzO(zosGOR6_qs8~C9#j*ZbD{Xr<uKGPp z(4Lun{>koIgD##%hiLCF)!~UQsq>mIuiohAXDK=F%AC9Uol~qU-}>w=)cf%M*`IG0 zetvAf5b|Y@<Jn`2CGMZQ<-AYk;OT_fM{idADY&%z<E;fTyO!j%7lx=ds>-i<<U9Mv z?V~?79nR;=mNxa6&bDVRuba=~x~n-#<u6`;*rajJu+%j~{?o>lysyO0v`?CIN<~wP z?{06d=aR)mT@Q*(wpo6hk$A7^v)19=m!G_ezOeq25vQ=T=B7JOzDpg+Q87QaaNa|y z5A&MsTULD4af|M``LHyr;+>7mzq+>1eMK)O?s;Xv8+m)#m(7>Gk9BdX%ras8|B0!v zY5(5TM^k<lH{1VBe0o3n(cdXMYkmJ5|9-57`;^=U*_eFkd))Ecoz9;7o^ru@x~p2F zEo-4{sgt-y;g$!fJmFT(M&e#(r|(4;C7+vmcj~Td#|<j(H|4(Fa?hYR_nh<_-<&U} zcTS3HzF+oucDfF~{+ufx!yEOZja=8NCGYM2dU5sV9qhkDg?~K0_@bTd{>~FJJEAY> zSj2Wc$-TI7>qPa(3nkUpo|M+V-J##Vu4KYBOaIQZ&0$aehn2smzM5bndH47Ro15$z z@`oGhIhsvU{>pr0{y4G7psG&t8^6JWnLJ-RMLsmLy>O5E(34%I#QC>8kSWlmIlKJ= z&rD^B%aW%Sov`0|*L!_P+TS8R<*P0Fy&L@2p8Hj>LtMvYwx98jq?q%*R;A3dzogqq z1hZ@q$}wA^t2SZb7si<eTp1=mKPXMniAivr#S$|kGsw_a_Oqk+{PGB``~BRvtHorq z`Q(CA|5rcyWBYJ*iHKm|#n1<7kKeks|E)ZtyViSxoLim5`Hw!Hz4P54=M;SVvhZWJ znZ{f_UWH{$YrmggcI<eIuG6o#mlniX>8`w~wcqmTm8GI@9QU5SS$a|{<B!Oxl=sfB zBNM9|?kmbNPM*QPjWvE6<J#Vhfrl;L2E3QFR#<xOk9X?K-BNEvniqw7*bA4o{b2oc z_~+7tmqb#pSWVe4@=QEp^6RR%2m247)U=3|ntuJ%H0k5po%XMO@se#hPrW@;wZ!_> z8&w{c7@m>+mQcxJY8hR&El=W@%Y)fw4+>TU*Mtbwx@7&Fq4JBbc(UQ8)0b}UH`%xR zh}=xh<Ig0{PMmCZoZnDu-Wv&ybMN`qGfkM$`pI@zc2UsM+grI_#%r$*J$3Qt<BLDP z+ROg?r)|IQz<G1q+s})a#>(CK^I!#&Q6F1B$Gg2J1wLQ8@xCv=^Q7@-A)BoBODF6y zuGt&s_s{g0nk?ZN>;J(%UAf--M!Zn{i^=nr1}}Yj%v3gJkHOhlCAsbnrIRe@F?*%k zHw8_el^U*CpVKBjJuvB2%A6DP(<*ODOfFvB@3i*mxl-P^u(jLWHrOZZv@A1vsk7PS zM>U6LXpfXpm~>QfvFY27cfK5B`yrTY?!eP;$eNqXb$1@Gu{^`-Rw*ujhekW4hI#SJ zjg2NBzf$_=URh0!W7Qd_-V-)<^}ZMMj@hUdg$F)5dcwFUVt#1LwhLRk(l7t4IdZJ! z=mYr|FAgkN-s@Q>-w-Y=y0-nr-L$M7&m)h15q8nwiTdpD^6irBoo)qtq+jl45RZ3T zDDHOe!1M(>mTlMNz5eUi^M}d1-o3r~LP3);(szBj?d$%xowr`pEs6cU<-6YAGIKw+ z${B6j!XNyptdb3llUR39Jk!V0*5$OGd%`r!ZD-!z{dxX-LjJkzlz&%**E4>*RADp6 zw2kM5_LG8b%op$YPRu_4JV&ZFQ2w9(Qpb&6R<eK04&Lwg+jsWQul7S<vU0ZbF%}no zdy`_dQp0f>>y5)dH*xe>%$GhpMTdD(<q?fn`QhP@SvF*FO`T+@FQC46|G#-9Y~|IH z#M`8IG$ef2Tj?NCDf=w9ctfh)4TH`D`+2(F=q>-NF7S1Y{GEewOFHYDlJ6c(dHo{N zM{tje0DrQ-+u<$K=CRFkNIBVj&$r~PDhr!kSmc@siLnRlO0F`+>s#O9oBQ7G+{2J9 z`{ZL2+EpJvJ^H{`u;W?M*QsVw_m_N+zF2#9S^AFTElVda_w!_m+#b6zM|n@=NgH$K z5R>WC6RcKVd>@*<+Hi*X`_5a5?{A&1lKp$}g7jwTdu+d#Yn*)W^=Kxy4aZC=eWspA z4G~}W{AN%;v-R0;->sL9+lff2Oj-3icJq_Ey)W;H@t>1hqyE@E)ZQv}=3Coi^}m&R z|CBbL)@r`{S0-li$4!#c^$!*b+HRlGuraszn_ln{*}#vo9qn9Std{bJO)kC4rnx}; z#{H(MrY+sRyX>vDvguDwRR4YB^{*K{Mjs3Lp7LB~3g?&OJKOVl-Rsz6yWU#Mzx(EY zUX16>+mp{Om1=UHw32hX*&8y)s9dcl+FWk-MtiG^!mkfo=DEc^T`Q9Q;+f4hpP0!~ zzq&W>k&GA9D1NRl?kV1%d%~T||5f|4AItt;Fm@68yxCvb^&#Kah3n6E_ef;F*g1zw z{#cgg!7oC0oQ`eV(=1;#mw!L&YqoG-$J<YCSiBB;{pLP<w|e<GHO?DPuT|I|%<8=F z@h5Xe+f~LV+r&!zZ>9J7{aF$7?qH$jkDDhsuQ}gitTTF~TDZk;VdBY*|Br6e^ZTi# ziOvrGpY}#t=K8rmmn`S<#wW~g%C|Q)t=BY&XKVOrkg;Ko)pYxVwpL%+WAu)_X1&Jw zt^6xXOT*sU@{Quxmc5P>iYbZzwzxQ&**eLmzjw8?y}8H!(xVyk=6vaHSR|sC{Af|* z(%ln_(&|}`@1FJai|8}+w==(&Fa8(0v1VsmP)*lq{WFQ&hFj|*=h$%C*q8-=etz`h z$@V##H|}~AtDlWM|7+Gvt{*%vpBS*avuvL~_iwuT|2ICe|K7OSo#ti_7q0ztG=lBZ zUblk%<?sG4kGQ{nJzKrmrT>C=?g=0N|ElJ{^o{99taNp3KQ2{yq`Fb^kD*m+`)*6q zrq7bsX3t1(6`Xtb*oH+MD~c~C+&I$_TG;%2yWi<!zZbr^7S!|e=td(Ix$1VU`wN1E zU+*uiixb}Zz2D-j=7TNf>uiHp|9Sk)*|*N%Owi_w@j}(SS?64YA1gE6T9<92-<j!E zvg^r9-d}4^-BzCYZy)Q@)o!14{xil+YPf0WkahBB=G@?L{ve+<f?v-amN1u`k{BR8 z|8T|CsQEsP&+o~fw=%T*{k{GJ!-M2Y|7$M(aAI;gk<-0A&Hsc``B96jJU8b&IcRgx z#FS6up!mZjjuVUXZ7vn?ziV5ow`v3Lt%plAlU^Q-S$HL3_MF>GG}}sZFV($tzRYm3 zO)P)Uf0KLH-^cPxZer2tNOGCz?l`090kd1kG?PbcKMrTw8=0o|_4!@h`dQ*r<E8~~ zlpomfwFUF;oATgo%+9|`*Ke)uT2~(V#9?J;LeI<Hub;PQGzJT;ie|riecs;hn?K4Q zJ!UB8F4Z2o`oVrrX&JL5pIs}wqD$m-XPhgT)q2MM?CVd9*wZ$soeX}^&hs|v;(K4^ zS7%OLI9Kjz$h5)p*NOPBbo&&YG`*~+TP3{@#3<}#`#Rrx`|Rwda8>;q>B_lnkFV&N z-#^Z%U;KEB<xBU({pqi!%_yAa*_vCjB6#`#OOdMr`O`fe^=Cz`UwwI9Qi_l94V@_) z!c_fqCT}^DEumTNo6MK$w4PT_aLO&qyUky&KltYHr?jl^W6zRxndj%Rh#h(7e0_1N zgy5dHZc&qacKLAEJuUupt6$;aoUnG+U7O}l>-aw>WB<twZ=N!3XZ`o()s*$=*S1eh zzP0nJPxYBS_nVLNrEgkRelLT?B>C6OA9W_ncwSzy6#Da~_q4L{b(f0gwWYTh_x}~R z`sq>U|FF6D-#l2}TIA#3dr!!A(!8T0UxE)Gwx1Qx9V?z~R`RW(U8W@X0!J3_CB<3B zk!fbj3`#Dg`RE32-jYAN+^e)oVt2Wa+s)bwr+>45{WtUU5@RpJ<nwLwYfa{!pUxNc zI+$PDjOTnn@I{$LCl_qs)%`fxtGiP(#ZJxtMF1b0?~N-ndjE#5J9l2~`%XsooILr7 zsl|qmQjSDcum5~f;{(T~Ri!zX)jucgDc!K}bN6}P`5(W_@BX`kZ?E^i5|Iy^#diH( z@YGK+c!$J;s|*}f8Hb)rFS<WVZK69{HMic%VmtfgZ+D#t4tjk3_HxJ7y-s#b{W5RF zW-YL2mSx+)-p?iKx&PA6&9ZL0dFS3*RXttJknfI*asAAu<Qd#+@7gaan&)PDvt2() zT29{Z#kt+Z|2ggVN$0MPxi`oARMPZX?q}L-JQsYN)HBce`tC<3*Vy_#NJ)qe3gB3# z7rf8nKw0`d;m>T>Eq{3Dz1g34OS)cV+awQ7i}?ZtRxc~9W__%%$SgWHJz-~u+Wxmj zS-NUn1?D?!V|e}FovLzsu&jOA&%zt+l~Fu@A6{f<K78a=Cs*f@Og_Hpw|AP(-0<~N zOx&z_2P)2Lywm*>^HrkZi`?U@Std5CSJrO2@X6qO4F7TS#{84b)=A|T=j(kbxLrDb zxnbs7*}9gjrkxshpa0hSkY9Oqe)iOpdBQ6_;)Ggkc*PFu9SqrZNzg6KTB26YX!+p} zwLfy^*v&MPn}5;g2ZNbbO|+=u3quJz-cJ+W_+&C@@+Zqbw-;<qWbCg#ka((JKkD&X z@Am!b%_l9sDdZm9!_Ivv>b{oDz0?~&?les5v8ukl>r|-D;^T5M+J7!v+@62C<?P}$ zs~1N|oPAXM|I^tH(}?~DB7MmbvOWt}t>>-~4UMdx@NHu)cU+q2)Y}t;kIb^Wl=NuH z%DqXfUv17`&M+wQm=<Z;TCet8BS?S8TDSTg5%#|Gw<esKe6RZLL8*fwM;*@cSthK~ zYRPUdSlVTv5^Ho>`nRi;LfDP=%)7>%Y6kE4H+tU*46AgCGn*}3l4VjRKJBUZ1uu2J zyZxVYA}02qv|Aae?|Melf9}hMPwT39+qd*Yt?vB!Y0CaNx*wd)w_I1;nt6WZO1?us z9ZK&rJW3Y+FeS#J$)06`+*y`+{<Eag(q|-VCzW!w9iQmazg>@iT8iVxgABYY?h8N7 zn&YRq{P*1jb~Bp~UV8H6Qri}l{aOBdd757x7yDsr@l+wSapEp<qx|f2i+wEH^Nw6y z$+&&(=f_e{($26?sXophVYYmy)c@2gveyMwcf~b7wYA9qFkRT>*v~J<7K=98mze!7 zh`hh;+^+CdteY*L$2Kp&c`)Akcm3KULNe8IrW2N3vEP>!^xU^-f6uwUQ?5uqO?(zR z``U@JNhPnZHvN>kV|_<!&E%|2@qR{(`$}zh+iJerE@Dt__$y%Vxulw%7P9HKO+n4V zbK~{cHQDXuJM+)(i08kgC9rmn%B9tXPZEAB>+DxK=fM@z_U5TYPsvq-<$c9_<US-D z@7r={(u3>HX>H59KgwVGQN3zU_2MO+b+b06?a_I#{^0lR3HKH9lOA1*?Jau!U|NB= zh5_%fNXgd*OBMWOrGt|H-->*8D!=++U&G?ZFLcVE*G$w&@;$fGd)FrUf-64utB-4Y z#_^vOaf~$QJ=%9K()o<hoz8ojvGYVH_RgDo;Kf3wqWM>5s9m2m!#m;Kn%R3ClO#?p zPsw@rCUnhDP0kxP1AUSu56^s|*ihrg^xZj!nYTgqZ<(jx?GO8^-^t3Ksr`L-nf<Sy z%XuDjvOTGvB2**R?=PURG_bT!iSLTZZ;if5i{D(yNyyR*p47JAtnKFfx|hO7W7Y~s zUSzAYh-*~ws+r$&rQOo0<e8e(d{y6Xwzi93wDIkHefXQi7mhD>I=#>C&p*@Ve`;B@ z{FK8V|2E4eoCv&U_2r#RKTmn`yq?D?P8;}bc`kcD*x5PnQcs=9H?DsZ+}=MGoFhN= zH;aAx;}4FdcWMJto|b+v``z*BqSNPzo!R@7na+INvr&G#({<C2i9B1&rZE4h+`qE? z#cr<C)48XtU$j@&`LIm8A+PK%W2w!qyRN5LO|jPE@a8L${M7RC!?eKqH|+<_T@UIk z^v&BT@xIxq{N=%=2WB<@Rn1t<_w*#I-dq0V@BFNvG`zfK!8+ye4Y`@WtqUa7rzhuR zANwclr*7eQA>B0pJliVe%S-3=bef6D<*;TIRtYb)Do>VYPd;<$e5L5BxYa@GNftr# z>s0je&(#GU{9>}_we#(~(6bI+jnmz}+CBO#RQQ8Eb$RKHZRd}jQp%WZT)k|HpXuX# zbM;v3E9Xx0{^_2){@j=AM_x{fi08V_@oVh{`PdWl)lW^yP~Ry1jqTc;u&KIHeGde} zBPK6;wk7Qj|Bd_BzopI`wyfoP{KrFvMYqZ7r9y4c+4-+uUS`ohu}<c4MwP`~pOuV; zYFytG6Q}%?-(a|+qy1LY?XR^fPpml0#(RCz#h??M+xpw<O*Z<U%I-1$9wVPvbu;)q z&$oxOe(lzM-^`hC{=H{bO*7-J-mg!R*Cy5k+^Wsl@NiM8(TexAK9lDiEBv^dce~V< zn;Rwau6|As>-qjs$Ln^+s?Wk_UesiS{=A!B^Nw@=uKOG9d9+L)?=4}M4u1ILu*HYW zI#VeL>G>z!RI=<3gqgbT?9xm~_hfOHxZF&8v#k^Bw_lf6YRk)U&QR<7W}UmyY{&DN z2Jg;iId9IJGWo#4*{sp!%NX~4F;n~b*vH7}{O9Bu!Cag_Z)kJ+M&)Fj7yYbp_I0jl z-MyaMwiYvu&vs^t?X~8=5PZHbFx*2~OMf22q}Lnf+0JMa=ZgL9c=rmc&sl{{XBd}z zc^8~M_+3ePfstMI%qu^(J(Icn;^v9<2QvjrzgqMhKReZDVyMS;!;QX^zg_6Mc64)Q z@3Lq2D(%eA|6WrqX?5@A;ujy%CN#|`op(d{!TVkH-VL&oT&_0A&fM?2?%4{n7r#He zb<EZ%4J`dQG0ga+_(QQpq5iwiv48eI-*M$@&-X8yvBm*sK3KlcRhaX_&F4~yU-!H3 z$?~uDj=FCQ=llD|=wJ!oGw<~8_h(x5*;MV4S|Q>!{e){^!CuLG5>;un^3K}#1v~CU z^_cLQZh6LZvCntS0-I$E+5&?vOnd%*QsIj!3T{o#-pz?32lsKa_%!!E<NsjV#@<}0 z6?HiGO=GX1=ncEZlUA?y)VwS7w+wzQB^4q5_<6-UeU3fWa*u7KPl{hu=`UeB%{uvw zHs_Jbpn}=GvzB-VUElpg#6ZZHtzzr-#JuS#bKF>}WqBs+@z0hs;y8M|GVv1M_mBU+ zho0Ta+qSB=G&3^OXDLU=ip7b27b?@1t>3P8tl{md`e}=@FJFwCn&6Vf$x~I*yvR!9 z{46iOrP=<5y#6~vl!P=(ZOX0Y{w-LOwnpvMt2Yw5?3dS^54N_+W7|EkTg9UGPPc<q z3g2Dk;@H*K*iP7}waFftvypK@->zkSjhF7ET=@P__~KjR#6*MV&m#E`U+g_AbXib7 zeZDB~qbjLpW&RAS_uH!%Jvnzh=;ya(8fN^JlXLE#;9%WyXX=rnro(erW+-e@OFnh* zwTgX*-O81b<;TM+{@%RV`2ES9b;rKkv&@r~iaB>~Q;*#e*01f~z8k%+%dakYSCD(K zkYzcWzQq2wR@K{WE#CG14Lm7PeD2GmNjA1${`jaXi~mgXwT|(6KE>*%(4QLaZ@$bc zUBZ>liF=;uTN|8z?6mI1S=u*OozC`YSRB;9O8Zu^HPbrBH%v)6PCd;z0>?J8rH9AP zZrk|j@|n$wVV|eWEjE;MHI05Rm7=rq^NpV0&vG8$i&?xmX6|(7*QHSkadT|4b>&TG z$ay%~N_umC@=WXdEtfM}>O!^3GWT}*si)U|Y`^yNJCptPV~Y>S7b(t{;ZD|@8`M<$ zis`cN>xUPuzh3*er0#_!ho`Gtp61Ip+B+wEhxgCiZF6i^vGttj;Ja5EV}vg|_k4b) ztePxtd}s2txY9;5%as@7&65w`+?^Gx?KUrU%k^2Oc`OeaHauRgvoHFA`p+uY>+|OO zRR3!%PVs!*qmVv*N&25V{JZ{5Xpbz+;aPiD;PrymbJkPBzNgHN4F9Y0@@e|srOhQ@ z_Mdk;F>h1dzl+QacHQUeC-B*rU%e2r@c%njFU|nN^x7wqe9r^E_s!<B@O}Bqy)j|M zh7;>FroZZP*?c16>dTUd37h!mPJYP0*X}u6x7mRlvpL#Rf&^48$`qfpm=(J(aFG|^ z?EWA&^upz>J8l=aAN?T6YjIA%ck6}tIjc%$l~3RO@h8va=;PDvOfIqMu1LERwtWBL zpSC}q?k>8yz5C<grBm(KWz`jPe)42%EV8>`qWV@@ElEl^o7?aFZv(D9{MSE;9Bxsv zTQP;zSLqt>y6X1q57T<|CqKTogYmnbt&QlV3;*V(o4%aaye~xZEYI5qMz%`@nXG5A z&S4XNFoE$wA<Mp3AL3&!n>k0Ru0HrvvF$`@TUl2>lZw`!@W(s&bko~DD^1zjzWL#u zbPN0Bk5K{jYOn78_#`D0-}G3;fFoE~(vYF?dY^x;MZqtJ6HhwMCVugiJblutQY!D( zQ4N;gd27D6<j!)MHtomKRUh`u-M!+;Vu28uSzK%r3d3{{23j3IoH2XZBeMvm?f<8* z{{Cu`iu)!LdqIcJnLF7}uUR#3X>r-N|Nm#*y{=lEwrh8UTgz@iRfZIKy(>0VpXaPN zqx0Ql(JBU)bumTFe*(^&sc6)0i|^g3s&lY^neUCeGlb9N-MPNtPhyXmQ9Ro{f9cm* zcT-NEylHxsf5p8Uw>CcyDZKyw>B~#Yb3~&gs&)5FKV)I`d5VX!&i1zT$F8Kryl9Lt zU);6)g_P6G+%~nx$DiC_p1ytC9nWZX8J~8q&kFB%xw|VJxFFrO_{6#BNqxJ_zdE0= zn6$XTRJ29T;p(rKdlSsP1TDmN`d3snX5QFbS<iQ>Uu|FQo4IGd)HYXS%_+{G^)c?j zvVGxZq5)lZgNz0DzMQn|?ey<2)|XrKq%}{o+S?P?A={hvd+E(TUyZl({rh@8zkNTa z{QhzVPSJTD?Wz~we3n?UG0E9KUc>G7Q6|QD6KBjikr_3ARpG7Pon3tq7q*ndHT_vx zIQv1=+-=g=+t2Jiw(67V)3|~#*{*BLtu5>KgmY$eckP(IFmZXnw3-9+q|8o=?)=KR z?>|%18}6(fv*R|aiu(Ic&tE*7{p;p~R}$`YeLmb{WEyweXO`@-gc;hEA{E!WX2hi$ zo|~QQ{F--)+Ja{G=PKgaG8gAuKk}>Km6T8S#{0e74rG=+GR;u0<l3|7M{$1C{L;Xd zs20QC-j7Qs`kwv&HZO<&`O_fJmK8I0+i)%m+^4+M-nc#8^^1L8Ql!cCC(FJ)GuSz= zFthaPfgc(QSB_O2OWn3?*_xcJZG2{@#gbO`?3R0XZ@O{c!E2gNlLc>xFPC$C>A3RP z-h+44t+q9r&zvC3>v{OZ<@S#g-)k|vRe7-3_6kGXIfJ>ZM(<W9O<87{Fv+@fr*vic z#T%Jte1$jKX8TT0I~8;P$-4Np%*kR;)O0_@nP{$eb&Zj#dc5^yp&h@`V(q^-y<~sf z@ZMh*s^Ff@RK1y#M_cmJ61Nhmg!4?7qU-mWU)eJ?FyZ5ehK<M9@hyAyb29tw6{a!Y z{XV~2U~^4=L*z*V=l$ZxO>HA&l(W3PO*nHnW}kR;TjeB~m0xY^7cr~XE<X7sEv@OU zO6<wnj0-;Vm#P{%)QEc@ne{IA<>mErzU+IvF6z+)>qzT&ySJ<tJQ%m={r;pLyEPM) zXXF=g%}?tP-;ihYvi8;fZzuH>3)0>Q-#DvUf5LWBg-ptn@LvKaWHW00^C$896f65D zZQ8+ZY04`ytMF9k<>#_DB=;CTJ7#8*_e|%y!aip6xsHdYpR#zxuuK2=QK1ikvzPsv z#V7TV?HOz>z^9b$&(>7O%wG5Pp7sBOTkVow2;YA9&0fLn?cKRsOqM<Wx$yH9>#g;- zd-j;03r;mpmY?+P_SF-<g0+=F#=+qmL?aH0D_>m@^8C@%nTMX8)9rnt65ngIVqZ?R zd55XT+AP~OQSW;k&hMSSe1T7a|FPfakCe5(<XX;pkL~%!tV#3BD=a0~-~TfA`@Dvd zT9$3s)}7|tX8U8Bl)Yb4kDF=Rqci1e|1afI@$fE?>e2L!-XFI1Zl+(?zIj(y1UG4# zE)()GPu_S$wz|qR!DH8)rnfPXY7(;r-(QfM`}F$7RhM4>n3CG{?>LjbbkZM_yNiEi zwMd@k%KkTD>r(*@70b<X^5z!mCm$!R%29v&G1dH<`Qu;88}%kx{l2*)_4#LKo!5UF zf=i3831mw*t!~t}TJ0yEq2D{L>35pW0V&@6gKI6XXE$d*&d%L)NBi-dL^gZN%QHNi ztM<)N*s4&=e@{LsS0-r1)n<PSWj+4>gA&Ki#dtDJ_`JYQ;i8AhwnuNWpS@*!e?6f- z<e0HbZqGzZ(-rBi-z*)odZ#?tbGYbRUX|1m-5t|aj1Sp8m~Az?``+xWYpxrVM+L`c z-`!I!&yw?QcV58D1?i;;mkQRrYrL-3{B~pYjjIiJS5{Bh&6!a$v-VZb)oYFneU4kR z=P%(uS!}-JdP{sJQ{vvA{r&&0&wCcjZsCwFexP_#*&jakv-@|8bXi|B<*uE)K6F?8 z?a(F5uPizGYJsDdZ{G8Rmm8<$9eWnqUinITUZ|qdVUePmHRpDjJ>qj-Hzz*vy{oO_ zmGl==CRk79O@FtrYw4kgSdn|@7&4Z1{+h7WLieP?`W>atY##Tll(dp}<Z|80d2`>C zQR-NN-N}?Z4>jJOF&x=B+*9`ZpDAAYH|(ci@5}oMztWR_9Y64{^L=#k@9YoLFa3C1 z?s0!k{hj9N&srpBAI!}2QI}-cR#)5Rx#h<$#rG|Jx8&JVZ}(i8b7$+X-3RYJaGT)v zINM_Wx`RLdvpp@};eW91+OdcBrm@zF?(c&VcZK|Wd91ehQ(BFj>C@=2ivi0+B+vDJ zpD!u5EARFHMSHG&<$HW}hL<wGXW!ptM`vXxRTy7dDY!i0<b^u5I-3Q1*w=H{oC*j_ zu97glz1iW^{_tzpG~WAFnp;S&X9?zg7s_yf!NttOpyF|=)`!aJ!r#w+oSkiycFBI- zQPH_uXY+hISJd36)p_c1gyLkg+v3xkE2I~mnOa(yQ|flvg+bu&TPq``%gc|w-ShcG zYpr3Bw1o7X<Hu6D;?5m>o<G%|DX%=e!heamp`4#Y<@D7bOLG4h+;G2m`Mhd{q)~t3 z;=F@5=GbH(j@ngbo0__;ubJx++Z5J6(>mHs+KN71-&*tY?u@kLmog8deyc1~oy2Mw zcG0kX!IMLNi}$GK6zBNAsh+TE^#+TTv-4gX&byvgv17Xa>;seExY@DZR{3zEtW<ZU z@_yZ;n=i_{uZ`woIMaWAMU&arw&h2UKT&&ed1LaT`>!7*clCe!*WZ6*9&_2-@Rk3| zU0st-@t&Xb^~#;^YvX%1@qIYh_jYo;&zq{?zcLNqzkjLgd>|gc<SX*x!4pOwnJe<n z_y1SSee7Stc8HO03*Q8X>k~_-Ke{OO`$mOIgx8^CUTd?yXu8$@SokYRej(2UzXRp! zvAcIle8|lx@V~Qaqn@8u!g|LuR#$eeE_l4){nu>e*maMV=&-(iHlcU=PNVu;m3vIq zy;tsE?cj00cWFnYYVOaA9V;fTytzT>5|8-Z>hBe^re3|EV&1hb@Me!~&!w-+K6~;y zY?@GbhpqqY)bx4GcIJ14rfH=z-kxJ9wD{mkO}TvD<XGX?XK$D{U)>S^@SpLHc<pA% z`R6*nnI@{=-LSCpR>Y<mac3q3Cre3Za(%nHQ}@`WgEnDyzEi(H(>eR=S^k#Y4az>R zEv5XuDm`P1{~5dpez2Bh<-yb0i|3fwdU#G<VJiD3H*`(Xt7kQ5n_lPD=tZSpleVts zoR)2H_v#v-`Ku*jXRrI}Ieot30kKB0)aFwDIHMm4In5hmzV`Ud&DtyS^56H!=Vg8c zcI>w$?&SBWzWqACI6uXitz%-dV#C?W8C^F%GA&<q`e}D!{}G$RZQ8txR|*D&ESc9B zl(>^q#v@kE(Rg3YWW_hLOj7Gt>M^h8e6>bx$sNV_doRc{)lXG->Rnd5`p}NmH$QS` zsr|mCx7Y5|-vraFxzi(GU$|&z<ae<0QbNMrxwoD7F)qFtygvSSTx5C0mj12fe-sb+ zmpm`X$iDvl`Mno=I#?%nNidiy%g??xzcbGM=VIen9yw38eI?ggzuQ*NKNuExJy|^Z zsmZ0KHtxKaOSkNB*!_6k(*9dpuBpwRw#L!5Wb<iL?bK(JnoqC%SaH#%_<i8=>(2l0 zNk29GzPV~j+ManVVZ0d%A{;ju8^yOC2zbI@(zS0|RZ1FP^3IbgZ;Fhvf@<#m%R9rr zQS7?^hh%=a{BtGE^&202_5L97u=eFAS7SYAc_o%34HBG-4=naLnA!51`OU)LL7bN& z8=PKUn)%{Vw~x66&yL<>i%;CBDoJS4Wlc3crS##2O@>CI=r_+VkB|1OUqAKp(o1X= zQ+#Z-uO5j0@TsBuWVx2><1KGu-kp>8k#B!1ki)#EZ*Sl&A^U&xI@)inyv*@A{Kud9 zvn0H|4f2i|S$<#d_jApOfNKf0*-tJ;)cIFPtk?YUdHX4Q`Oc@yH|}K*=YA#d=bO-$ z@aGff{H>ncnC&-f$NrNi@(*k1bJm%^vJto%@lP_xo|WNgx8O^Ihj~8#i!aXmrI%H= zPt~u#(e$)Qzs!@#*XF<KIpy|vz3`H352pYZYjy6In@%2S>pND<_i4(9RcfzNxn60U zymEM9@2nT+|LX7;bG>*oJLLFN&r9tZ2b}GkR1e>mW4<kVYVoACA2%KN>hJgWmhhf? zB`a?4*DB4b;{5j`=T7j4Sv@ORZr?Xit=BpCPeALH`i_~wcIlsvR_+wN_Fnq)-Jicq zKUVni6u<hU(O7i)Y~^otowbE=%_pUoPk&H$ao(FWum0kbH9<|8T+fO_C;xqR#`f&8 zNt&h~>vI46iIdFh_1}J`uFb|QZMx(As!2YzmF&OoS?u1JvbgWlofYP}MxRgKP;bo1 ze4F>5J>qVP%1kTvvV30t8M-^xGM!{kuyX$L!`b=4!)w_`LSp3tY6UI{Xm9yytM~OF z``o|9S5{BFdgOVWL)+|>6(#qL{wJsi%r(5peM&j^S;nu*e|wo3<fnw~^|0CcUv}Yv z4?kx7vH!Wbc2k1ymqjl%EGFw++O<;hyywy4wOPBi-M!&`_^@PppxK!v$u>zDv)FIv zyt()zSj_ctda)e8MgLv{<BPgp!cVnS!{5x<sn#p2IWg?92lI+qULlGL4Zn1Tm!GrS zBJ8$!W}*4>kB?$@1=sIoyY2t{yL|7%^9LVq{%oth@BP%%sgL!OAD8m|yEx~6@vI+z z@@Ezn?u%{uv~%PC>256(4{tPo9w;?m_F1uVoYvu`AB+99PVk;_I%e2>gW;juDp^ji zxqX*;KED&W#cj*+X!E0&+nC;We||ad$LHt|$GbnePcjs0E;RF9_=az}X~h0?p<^Zv zJs*C|3^`Kzwo142SN?|;2L+CuPN+Gw^Bj}>v~H7)#gjgER6pK#=r;dh@#lXo&p7TT z`Ow`Wy6KC3hw#pv531&edXKNOd9a5i{@=SFGHZ%A%x&5xIe$gU>NmSTexHA?p6|qF zwdrSjPRkvc_QU<;ooh$7ROX9SFML$8D|P}$+t-A;6^5&uGwM%m<I`I@Y5Rh=o$`Fw zmC`>>m+?vdu-W3Mtbf;YtG(8_vJu6>h2^Vq7$2+7U^CQuWorDD=l=G|v!47`n7k%) z^0!T)jSA5nRa@8d{*N{|>sQ0|Nk@4}#=%OXOVbmoboX3!i|#cvSs2-NtlH$9YH^-X z#;+2#`9j6sPk5)@`tgxtpWCyqtjn$+J8L>|siWSx3qswd_ip>$Gg`ja|4;1siS|{q zSQq)s)ShK*<}r8KtH>hRc+-RHJYVZ8OYNwf&sXs~)mcO-s#;NZdG)VfON-5S>w5^h zT2{`VF}q>!liH|Ckto?#{*av0Df)bxQ)h4#S3b*;-=BRpqMIxIb>(HZ<+rvk4(wgt zW>PtS)3;@Bn%lm93@?##KES^Bzj)fA<LBQ>rdN1K&AV@1$7uD-uC_raj5oSzkJZn# zNi1iQOkKrxd|lDT>#G*N>{!L!Ui+?MKdm74E#hmgo_z0XB$2Y<%Ua9o=G}+uf*zf| z!5vb3a^kZ{-*t;Q%NZUoHC%pdkLjs?x4GJ{rzgx_XeabhLSmCz<<=FE9#0?tX40yP ziDNm(uCRHrTcW=$7k|dd8U7ReC%D<NtUdUz;Fel#PS!C?_EheR8Jkc4eiSsnXhLm! zRrxKwvI~4~VwDolR#Y6=zT{bv(VHbYS<I4i`3@Q#NYgqJ9Qx$iw+ZvR)KAQJHaVHC zwmd;<*U2RI9p4tM{PMtH&aWdy7pr!Zf4*^N@t<uh^Mzx6wY;9EP?lM9ThHKr*~!l? zYqvdTX;eFvWwIkB@L)IV$4gU8<9nZ8T)xY5OOe!;)!#YSsi`cFWXQG&xS08O&2Giz z&l@ze4Kj-JYs49K(mdSneR*@?Y3L+ZmhY}^+n<Y@?sy&1Ia~YCmDD*q5_NWawsX#j z>5YqAb9$;>!@XxthRb-8TfeS)>BVETmc?*OPSYf*`<p+%<Vr3%9Gh@f>sL4XcA+Wr zKTMa6i+143Q+sfhCoKGtL$qsc?K@`XIqeJfnw%0@b5-O0x$or>a!iqWlUJ;DuSw4h zSYzmK6lFa9xZBIaEuP2iQ@P$<WL&u~ZI-6=-EfKS!gB^WHcPo=Q&VS_@M|&&lqc+r z{ysNw5_4#4-f?kBe~%~u$Gg2vGiK#3S$_P)`NW*sTm53iQlXz^E*CLYA1uk5wM_jj z`%7Ef)PmQm7Ea`6n)vy^<r}{Y>|Px?WH<5cOIF1NhuRLLRSLY>Juy$s?6LFw-^XVc zX7*luSY!NcKJ!=CPM6oxHFfR&n?KsI+%x_EnA5ME(c8S~_{xbvkKXdxd^xk{43o{? z`nv`R7wz?%zbzBV66*f4y2nyv`HxGEv%SoHdEacUKflUt={u|T9KKJkUxQXJEB?B$ z_|wzV=PXRV9o4YkeZBSMWhI$5@ude`GX8(a`coJCGk?0Ubmznes@<w?ua`~9yApnN z$?}~aZ*O<{x3=)>neX;OPxpSDdTRP~-g?=}^XIln{FW`7EMn2iWVAn?d;foVSKjXr zj<{wjzP$XyX7MADJ@w7E?PE$^oA&Qz`4+5md5XyN?avnUZ1~50#hz7t$?5fdJ$%6h zD-Yi9`g|>h|9F;-+^ik5)Q|B^S-+0?-dzr<>uW!)OuMyu5ktG0z^i+bP8%if&H210 zr`+jz-qr{Ap5}h$IW2Q1oKfQUs`F1J&*``EGIjFo(D$;Q!Oj?FKlx*P_Q7vnbs<5< z`zjvQ*O<Oa-*NWfch!z(Z%%$(YP8q1t=|0KC;fx3^ILOG{<$5KKepH8p7+AM*8B3E z_H!53mEKc(eqTMk(mbvC{@u#eUOA_2mzCXo@N2^P&fey%ud>f{D{QqHJ&nYFDRAo* zKQ#((TUeCed6hjVx8|1AQpwv&-&Erl)Oue@dh#Zvd{XE#-3pgSaYts<&g@xlyYkK1 z1<Q`q1@UgYEB#yU&C;ZIHCB?3pF{{9u3n!oyX{z|h($oz&#<X?4$jcE2wb^%;|vuG zmjjWtTfV2&W*o~(lDQ%_XVMI&_Ove_=5JaTyfuCX<Hg^fuf5=5Fcg|+pZ{kPA49wQ zf%*xo39(E9$Diz1X7fMH@IXA}VZpbxAC`zS#6DiX(r)1+&8}>xHZjKo!RfaaHNI?+ zF0kbNo-HzWpFxRB{reT^cjmr1mML^;@0RAX3Y88$7j|*i?^yNh7N7H`ydUke@_k>Y z95C)%q_!;mXh+7Qg*UeA#`s3>u)EGPQOh#4?dXl`E@jX4=S#ml?PvJox#`F2`}+&d zpAi=p;@czk_@makbBPB`<|N8->FZDZduK=cqwA9#m2Y$<F09y+G*>Q2bY+={o$kt; z5!DBu`m&yW-W|B?h1HfgjgS?q)&2?^9XJuIzC))&YHM>*ov&aeZ_ebKp*<g-ZP@3n zZ#}>D%k|wn{mVShZb)5ter2_s4)>k1biIJ`X4l}wHj>kWlmA?jI6rmm%L{4VMjJhQ zPirLGXHW9zvAp3QDz*M<<r_DjuG}vNIfN%kl&Akbydqj?ZXKW3wa4>)1HF$=(J_nN zZRqrK%ie`qo>7;tnMnH7ANVO|^X!a?^SrB9erTPo?&-b8+qUGe*yE=Qc&0Bo;q*OW zZS3h^0?bRy0+$?i4L+-@;aZrT+g_TjQ@!+y&)wq5!kN04%+#7USN2bC*>67c)6HjH zrpB^A%CznZtax3Sz2W`23v-veRyfbDeehp+YDfR_GX|W$b$okkerT=Q;P|R!N)T&+ z?Bqi)f>(rvaHItn-?Q@FVdlx|F^hw5XYdYRR;6}fv%lYen;buU!qO#~Z{D)f^UJQY zc(i<8*x$Z<O+y^>w#AWl6GDG|U-(+X_xobm$!9}*&oA6)f95Kmz}E}6<lfi&?7Lg} zt5jyiyY)UTkJno;^u-G#yl-HVad2}lo&S4Tt%vNdYWuGVb4v?yel5(B(!bQyKU?#e zNr=w`=hh=K4|-Gi>+E>qjh(&!{?fd^Yvvx`sLOx-78@@5%eu=(b7hCU4SUg~#wq3< zeAVag_7vRh{ZxG5-NEPj$G+|SSf=^r`KeFF6}3E1uI}C!;Z~mZx3chLUE7z74a@2@ z<n#WTHmzQ5VQI2^UduWDzc+m}KXf;o_{vshZp3zT#`#%mrq($Z@yT7yJi2lBx|fxF z*CsD}-7mRFBJ;}g?1js|8JV|vv$m%i-<tJ7W{ONs;v}IvF=}bCT*2(3n@=v9pSo-M z+XY|FA2c|1<_bgCywL1pHCz%?x5`|sm7n#H-?Y^F)tM~e*{z~%!7Opbw*7+3GWI+# zUSw*UHY5FF{PnDm*J&+(b0&GNxVAd7!?%@zo13w5>q*u7+YdM`IFV_z?Sh@2JU3%2 z`{%`NDy7NOg=JssmC6>%eUXXZeC~U)eVp0j!uPD9<{v-YVrP20*v<3!lS+$ky$=en z$C>)O&1y0+%X-Pyx$fl8<P0D6rCcfD^Y1Kb4(_Nu*8SyW@bp<BDNjPX*z_2^N?v6D zxbT+0S;MQ^P_8?XKRx$gR%5twe$~Ef|L*fd-eY%_DcY1>tM3_nu*Rc!76aQZ^`M)j zW#;W>*})~(?ZT{`jaDry-m&G-N{Qy~l^b@dupgHFc2MJEVgH>gBELlT`d!(2a<-x0 zN0X^JVj?{ozu2Dby{u4ByS(|d<SUiOdetXPieAoHDYmNc)IH71bGP}6?MPU?aow*< zz8S~%h41>x*cf5C^8IboC4XbpPfoaWNpj{<lM7K?r?(lle*6^u=y`aurF6Hpb*;y- z)83CitrTo-Q~c;$Dt7Y5>L-eJ<>#hnCRu!|-pqS^=YktYOgd-fCtnCSvq0YM?%r#5 z=j_gZv}w<*^0R#{`NgqXU+j(aBqh=0Q(Xyhha=6G-+RNkLoNIeb93PCmwBuGLelSX zKaV{>W2eKpJLgZYU@Cs+nVlfhJbiN9m;0v<Bsb*8FP*t^;)c~JhPQ1qybY=g*q>dz zaXjJtvE-6AnK^2V9<vYHoD8_-WpGDf>VxAN{}(7S*|Xa>PB%^9y~MYEdBTsJAJ5%p zYFB3L(dF|#=KS^7-{%UKuPphO;9i=3IdJ8{JIuFKJTL5XyxDZgsi$XhoAlA%JCkLz z?whY!dGdbNhBb>;tiC9$d?|WD*v#Jcl@HHf<7J)A5O3_cmg`uWTO~`~)z@z%-fo`w z{7g)U$eHNodM5ScogR7NcQUF!Xg2+SDN^(APR6qs`MZa8tZ&Cm<(p`<<ja@YE3-eW zDEO&cEZ2Ma$&}3x)vqpoAAVG3m*c-Ao!v=x%eAiEJALhXbbZ+|M!)693{Easzt&B6 zuI}79Q&r6F>q)K=H{5-``Qo{NsN~x`)zgnuO7|K`&z4Rt{v_tJ%;QI@Y0lc5>VRy6 zoga&g+C0-;qqk0+&!)P>hTT>1!eyW5d*-Jsi8k91yGGobQT;@$Q^f4HXMy%Suar9j z-`6(1PpeH9+i*AQ`iI|z*GeZm@RWRIZ-313{I{5`O~3UQ917I9WXsUQ-|JA)^62OL zUnaFi>zsGYjM+55wD|vrK;9~ugtzBbyITa?c70!#RwHr1?c$fpef#-3*p7%T(m#K& zy7*J*tj!^fuKcCmw!8F&rhYp!|0_@HGB-<?w@kk0vsp~{%$6yYRb#vO>)`#W7CxP2 zFJ|fX$TqTkzL9ZPv0|sX+<VUT2mgy5Q|8|@^W*vQ=Wp}=n6bTO$qsBj^Qz{SRHi|f z<YAFH`UhudCFfmwCtk|2*6Z}uS=mjIrZW=)j+HoEZ}@yABA;*C)Ku$b5AMuax-#RI zu#MZ{x~^sNyq^;GEX&iG>LloOcHVk(6I1J}p$>Dh(<^(98A->xTg)$!Sfd@_q}H%- z<-(a#=X0Ia%oZ~5*kQ8F{n>Bv@JS48*E!|Xiu-gAEIalzL_<&g%{GRuA17&>&T;pA zv)FKt*rL+omoAn1M?d<wtm~tV`8mxUPnYaF(X6SsN+;lq$L^%YvdNl$@!>hbCNkQc zdstrPooT+j?~8B3^+i_mrRGSPW=HL2)#<+?$#QH)Nl=Ax#<8H7%lw=b^Vn_N&hNQC zYv*o<$!Dc+Us>TPG^MgkwrZu|Jr)KFAMd1<8@A00+mLm4PP@yQsg;*hlx!m83gWdY z3zx+z+^*o#>ir%4^xtN~i6`et%-Xz2Cb;`d#i}h!*aLbuacy6or`5Dea^p*<Z;nSN z&vN1D5SCnQ?LFIexzXBN!mP*o{x(0qV)u2vyle8S-xI&r9{Dp}ZI}5iQQt+2rH`@5 zZ~5QMx<qa7`+QbOwRK&eyY%Me+RC4*x>(V`b*-^~ae|!<ci*x<nM;e_%-!2*|IbS8 z*2VZUznovx8o!_J`|I7mo&1~kKQ`?@pCBjyAd6ims^oqLhh+-;9`~k2w#hT3OZh}q zw+4DWc2jiPG$l*REH~V7?`#H^ov)?0z2sI2=PQ@1{*$$z?`6in?rTpSclXQ6bzi>M zGhKU+jnp>je``NpU-)6~nkSDYm3^(Y+jZ|U@2bpv&$+HfW*1ea+c_Fv-g?9D@4Xpa zmu;JtO3h#Feb7gaJ^R3<5Q9Eh4ZE{d%ci|ba1=?u`Lt)QtX`yW+UEz;ny&Ut-|Vw@ znwmiZ&yI=-Yc?j{Idt;sMzu;$--B15ru=2v#kM=+?@yH-TD#UPZac?X{?skFsZ>z* zSB04WW}c1P>b9-sG`V(^B}1vI{IzcstI}c1lR0_js;^i!l>Yi|(c$U9!60FMVyjBy zx3!Bp%>-;GosZe1;;+?X+x-2|vTuj-jZcLBV^C)*d%JM0{){PWngy-6%6I7;`EpA) z^U!RbJ+lq?HlI5Z)mv(QE9sI=`Kgkxd;twN>^hfQ&f6pWrEaN*p5g2zT<@Zsmt3ga zx$;;BOX`H1iSH)QiQV)e&w};mn$m=$D%FQ>W_y@tF_}e|-|1HI&3pB!WiOY)E`6)@ zhZNFGRknQbezVNb#6msYlPNg(zGK$^dq)@M#RlEbT=`qCzP;s@fwVQl?bH3tH!K^@ zXBav7yx6rx>*dLNBIQ<QQ<{Rm97t;_zIx?-<E)R{4*%3^b3G~V5VzEP@51bvS?B+} z+xjRYsp;Oegj*`oAMZ#%P%}QP>{sBjsVC~o9ha-$*LYZ&wDL4|=ILbox^qwZ`lXWd zUVOd}y1&I3?`SW~Ke)?upV^PUwkL`o9Zz3gGqui|`T4;af*&@lIrj3}*&maZum?|1 zFnRsE(%yMed2Qjen2WYEmOUuRI-gnmwqe&-o9nk`e|^Iw;1zh~-i6-w<t$%b#L6En zs4!6#{Hc<#An(||-Am?+9&=4Uc4eiqW~M{ZdAGw0G;J5$HchzevD0kBy6xQNZQ^ea zZ&MaN#`wv#d19^kyZ1Az#1EHqCj|VB&nmciB_db+`K+rt{=Uu=jz75YwD;N;{*S>` zznFFWl<yQ9Tv_I}hjqGb;mxB?yZw80S@SQRSeg{AR60$1*}r8bCr=bjDvM29**N{d zl%DsZa{b4)X{|lu%Wy<6_fFS=owuIG2R2V;o$aYKHT<z?vc=0l4QZ<<LIz)7sWk26 zpZ$$@<`q%H)Vi>vHh$idEAMlZ`aKD+^pq*OTf+aQebRZRuU4rO4u1Pz$CZ;`v)}4; ztgV7)?X?oWCEkbJo>w)0i%qy?aNtY&;j<?_by_@_#MXOm{lAk%ym@|L=e4J&B@V~d zvDlrK`Tli{MuGp{XKRX1o%i^*ov-uttQ!-ybjY=r&+B~^`tH{<yOKP`dUk%Z$^7R< zN;)SW=-8<B_PF{?qq-{7vg|95uB^J1uqe=EqS7o!UM<hsT$Y<mMr)4Fn7t&)+3e(H zwxbN!1e%XrG_|#<j(Y#QZ`b*YGw=SA{A0NDy@Sp1f_drndc{xU&os<;`0id`FTwO} z5+`5o0mGlqX9#^sV+nZ^=`Jvj!D;!9NmG9Bd*7Hp>qB*sWpJ6x-OZaVw=A9HWiTUq z(z63>X-1tAY!%uEHylW9y!mi_@P#v$trHf#ww<y0nzO>G!l>3$x7RrD{Nh_}RBLa) zEM?hj8;K+?m5b+XQc}!PUTSEcbK9VnzIJM*!Ln5|CW=|DxG(m6+o3(7`~I%}{H=fH z>y!e$Gxc$nbG4q%yLsJ(^`7{T^Zc0xw-e^XxNg<;`@J&ju)p6%wY6S`$0D~}+_fua z_j0zKo8EVBRqp?MQKZu2PK#Ohw`so?%3l%F;a?oHR92F0L(ZO(tZ$QgQcWH$;=Q(D zwvi_PE<URZ!KQv^H{Ac7vQ%35rfWvXCok<|o7DE0M^=~Ut~hAWogN|RYJKfNNb|?L zEBYG?4PM>o2uQ2>b}Tc0jsB_C^>cXkv&Qc&)Gxa6#qfjhoqCIJ1*ca1*kL-S)TnJ| zk!AR&1&iKha23yA^G>ZcU<P0PF7IuN|7U*T*ebrf&oMGICbr6FrrO4X-ug1rB0o*M zv?RUvTH~^$C5s9J8AKUn?Y78GPIoES`L^VCWJCD_@dO421qM$S$B^titBiDI-wo9T ziph5)O;i(1)|jsFi=Ol2WlwOZlT*-?8>vQOJ%0>pCO%ACc=F=b&{fjQJ?rzfKM>=s z&i(W9(H5S-CmUw7nfe8rmGLXhs&T4vOmSvEG0jf#aRSSiHXFyYywav;ZDT&{HQ$=* zeD3PsuSNMklpgK;?&5y7zq3B#`V=+OYKAhA!)fP_{d@50`aOq>vpW|Tmc8e@m~kkw zj8P*uSWt*F=|z6D{j8sS=ZYj&%lf|mtlRugwU5nq-v8J?pQL0M8aNj`yzynN^54JD zWi|d4?0<j$wEJiO`5C1Ktb6NURkzNJFwi}zINc!avf>W?W1E`auiTua^?%O8*RxjM zb37!Qlb@vU_2lI8%_ip!`26Gr7-YY?r$w&yJXG-KVb&Gbk`rB<PQGQEe<(74=KiS1 z8`n-T>+DT*JL$IXOY(~K$=<*6;!+z-+ukM4ZBS|Ro87!r!ddigo%g}oHvN0c=dIrO z$L0K6Rf#yo-h)q)BraNoUh93jN~JeVKwPpj%J4;6oyv^h4-vaB?|Hp7$nZ~o<b%+% zrTsQ@3Ul5l+xTTgeP_+NTvAh)aci%-qUOBjS4>;?GMXpv?pAug)4o03_xV&o-DSrt zN+KiHtF|w*?=CNTpupCmuEFoC88m;(J4=i2Z7Jn*`FR`7!{*q0>F`+`{KV9E-d^<+ zC2zml9h@R{oB7q%PJ!J??w7B86x{G-k?D~KAM9?~I9y7(CY@sX|FFaqM_$+Ho*OdT zAAEI{dQ$7C7PGr6KHF{Gs`OJ6Gp_7EKW$;|q>voP@(=A_mKrNcf7-3l=C5e=b=@=d z`A;6mvA<SGSlb&iXCbR|y7PrUmN6ey0`y|!yl%SWoAb{&^2Q+e^WO-QzxvhXSM!e* z@O=`=xvH6;w8(`sXKG_%wd?GRhWuMLXIRbN3UA1^75FyAE@Ik}f)_zElz%S$V*J-* z&y8xA46jN2Yxv*xSKse%TlD<ty$LKiuX|RmdYLL6dZoIx##~3*&auq3Z`v{A!j9P2 z2dxh;FMaZTVl(@PmCS<Gfp4W=ykGlbrw6~UpC$K|eovO09Fted+KOgfPCprYYG1hT zhIqe&wx#_ooBv%270kbG5}@CiFM4d#=c>1pFN;6l$2mpnK5upLwNQrStfYh=TI**U zmI~N<DjCiz&0TwcAM3odt%sQ^O}!?0#`Nx6|L&N?FS+(RhHH<V{Uy2WU`%u7^o9D% zs>*ZE)p^IPF*?_K_u+Hh$yJ+<y*l>p!&Q~-6H2BrPgdjQm6pm@IW?O*HL|ons<D>$ z>CN;Vdrq0|eRHnL|4jAc+dB)Z8+W9?v+p@xtMK&LkDV9KottMI-B`MMj+w>Gi1zQ3 zHkj_Xa%{^X8|i*tyXscqn9Uk5FW<7*EAd$JmGjmT$)-Q6Oy<4uT79a2foS?l&iUHq z+^Wq9OU@shCe{C*N$BPlvrifaYBsBVKJK0rpQu~Km413c&n-!IlewXlZ#|7|%gg0@ zj=Qdzsk>54R_e~IC&4?Vo<|;@ZEE5o9oz7BT5|-mnWW0Sb-V5d2hHlqH^}wW*|xs- zqsX0a3IE*}|NE}+PglbKT%F-99z%=6mu~#af4tH3+S&<Do{Y<{A9<no{AcW%7Ay8L zBfZ7OPu!|GGEVtcJF&gu=;tcS_t}0dk99R?)cS?oK5A+gOb#vo+}FEznsmtOJ$IX@ zZ=a`PB$=Q6sE&WzS^-5(-#zTlR~y!_#XT|p?3G+1nzLH^b`DSW<ez&?RgLFLTdL+v zV$6D#c5Am|PuoJpwQC=&<ahg<kk7i!GtRERZ*I)Ge~CQS34PZcl9K0gFIAr>!#r8y zm%;K=H_W=eJvnT#b7sos#9OCR?QSu?j?0lV`fD+({&MY)sSo}C{I_MOl70K_;jI5x zWC}7OU0i$Qc#Hn*D^*E4dGJz8(bHvauLHjn^m7=ly?Mi5?^Ob?UiAmNMdu7=En~D- zm?SXShUIhI!rnKbz3ZwE?`I1Mzv7g&W#P$*7M`mEgEvGZ&oOn)d04@6c!mDmMee2w z{taj67%c1;yU=y|sf~%_`N+J5sfBI3Cp<f@^zP&7>xaHXe|TT-`{8}>=@g!NL%H?F z(V1^1f4Tqt*`JS6f7X}3T=tFa^<l|(=k_+O?~1CbHT~BaxTnC9JwENRu4Cp@V*|x0 zHQSFRX@u97A6vv(?0BZ(>%EoN54x*_EYD6iFA6fAwkk2)bVrIW`zh50-!#1pj|tw> z_Yym?y6f%z=*MAAx3BJe^WpjWUi-K?yR1taUo&mro-j{@^M&k5oAX^>E0+cf?SG+= zwL7@_O?SRk&0ikt&iVFp^YeMr0)@UCMwCDQJMqT#BO(WPnCIQ>*lZXh^*JVT)#b3q zCU4IaKTVt&wjkH@^1r&fveit{TfZ{h;`3T@Lz{DhW`^*a^yJ&6wR^tYXWe1Fe16;c z&f`l?Hu&<MzV+qt#rfx7m>jxi@Jr2j`mO8FFPxp6B`T{Qw4t8!+|81LzSh^t&-bL} zh#sxK(fo%gl}D_nwDI$Ag~yv#CM;}T&wH$vasQz^Li6_@l#g54+;yn3tZidaZ1c<b z2Vc0%qj&tZ@3g;p;B>~7$s3p4a-AfwGVo?<T(EB_kK^u;Qyp%ayJyuhvlZ85EQ)kf z4iz_6*rmoN>bPUp^C$AYg|E-_Ed1a1HLdK#1mp8(zupv)6aE%gvW%;pJFB$xJm<WL z%T9)5IJw^wl$hY#Zn!eoarVBfw*La|FKS=q?=291{qV)B-|r7JX2{HFuzRHcKSx%y zPj0rWac}4<+j_oTR}R+Kylu9US*Txdq;P5TRUx(DbJsGYMTCOi-3o7B!F2Q+(`k9m zYZE_4PpG;Rm3yHqdB5exuNmu3K8cF^HKo`k_)N*3<z3fb_$+u_v?c8ge@1yD%VCCz zy)P$kp8DY1_6KGB#}X6l)Q<%k3CdqAxqfs?=8DYkc0aSuK3Nm3ps)4g(-PDF*YC~{ zcTM(f{`ko?{Z{VOeOm?3h<h}1l~ljD8Fg*Vou8hQUnXg+TG_Pr*p8DIip*`#Z)QI& zDz|zvo5g;%=fzLwn=9WJUd}b&|HHkNr<Olj;@kHjcf$Y1)W#RljYZ~a*?Z1xI6rIE z)_K!{%a3Q&%r@c3ye6FZt|~=q)~3C4w(NhayQ2A^nxsd`ha#CP3$zYLGyJ*Pta{<Z zk*)q$vpz6%>rLe{owGFfZvRUAmAm(fn|cc_+NIX~-81-sf33XfWy=!RvtPyYe`w4+ zxo@R{)bcnD!C7+WqCV`?o?I(`KwbCDF2_I4XBgAw&NkWLnzLxmm#WfhH`8k0r(W25 zmT@Ap+Kl1?JM(*48}7}WE?PIcd8_31ybmR>)D+)N5Hh>?e)_^%i`&eaznroiZ#9Q3 z3XZd%aNy#WHl^25`uytqRr5maIP>nRRyBA}%6u*>$}xQjTg_cl*}q$);<nDa=~{UH zri8ko_qM<@-6^szpYzsDZ}5Bno^z9beWQic=k9gkt3O11k@a8v?Ra+M<-;FVb49Ru ztPhy{@tc?r_nhwu^`<|reP4QRo>qo@R!LctxAENQ`^%j}ZfpA7V^nuNcUOK@a-Z); zRvV^eq34gkv0`6$z>MYSlpmjqo3CHkyj5)l|4b$Q#pkXVeyy$kePh4S0dAXR340x* z=h_OrFK4v<eDy}SilR+sZVtbpT+wt@(~`5#H(#6jbyq^kQky$xHL|CF{&HWu<DTrP z?u%wWr^)DF=rcaRy5gAfjAt*FwYRN3_Jt#E%_jY0TQh%M{I#Si!X@~BWRJhAo!wy_ z<*he-SE@^HQxX4qIx~G%*)6vF|0RxYd3nD6HqZSOiOkUN51w9&u=d#5&v{sK-LdY& zxv~lE*Mn1cu>4$;(zaA$tES!B*eCZ3_jew&XqCBYyV5e+>x1>J*XzT6u3!5he$~gF z7AsZ$y*ze3a?`3DgX-izxzGQmeK_y4rmy$d{PgGh{iog*^6~y~^2wa~`z$%jLJuUZ zJyyx{EZ^;C@uU0yIPLFqzd1N%X=cCBmNm;ZuI;_<`-cB@(CVMFxjIhv=(4{SSi>K@ zrJPwhq3UYElRYeDe2+rY@11OZzqPRc!Jb2vjbDU#^t0S<=jFuB2rlq+i<<K`Z_CmT zk8LYHEBx2|xZfphm&I%D9Fu?R|FbQxf0NViWt1#uoP2VQtX#;t>t3-v`qO)Ajkj&S z_C)^vTz|PG@06P@Uq?N>b;GNmp5@>5xtDW%#Fgh?=|7`??&+GX27bMj{M%exrz~!K zw^!9~r-oatX`S1n^m~;#2EH?=dq2C@v(dzlGl~D+VUhNErE9<Etf@}^t9b0w^65v6 z9JBr27^Kfwdh^l82}j-=iReu~c6ZMAM^mzsvnFx19=s-H=WuvNm!NsB(AICa;vd^x zN=OQ@_P8eH-*8^=?)+sXjQL%!&U6H-)@$<q;c_fp`uZeCKx@J4lTqx-3NIe~)c^bE z;(O_D-dqhIQ<!XISN*a~d-cuUhVfS5jWUyJ@mZ2;Q`|dNH?m%PY_Xzt*Q;3!CYRex zldn8Jpf&Zz0~75e^@iHhXEbm4AG`NNWp=o7s&X&ud?{1&sN$eiPd0AqpPD(LGD4*N z6_3i(&)<?h7Nmd4a@lgOB4Ek6eb%Y|i;_)lC}r>`>m8htT9CH0a2~T?SL!dr!(W)z zn_BFZKD^)R{&An&q8oBTHMO~K*7x3K`Yn3v?vJ;k_xv3t=hT+2S$uSUT+d69D|b4c z{fIortt)bSYx&%H^1D6@JgutacyOZmb4Oi8d0fesxGCSA)l4_!O))D~bC+)Is9tWI zr@KRBhJR?t52f;R&pwGH2tC!j-&_28qRU^~&+mQD&9}Yw*vRzLjUD0bNj%YyKSxx= z3-7Vc4165zGrN4%3EyI&vjx@OSKc2h$=D>Ge!FQi>vJYE>BB20o^PEYt<APlF!1K; z;`rXz(`M|xmd3BVzE<<b#XX&uc78UD?Dg9`IcSMDPu0ZVIZtABI>UM@+G{4qAANJo zilv&%_tD)IYO%JvCyI+(JZ|t7z9u)<FZaAv+rs<e@6LTVab@L3m&IZ;v};axaz?yg zB=c%xzE8ei$-)}HbJN2sPPfj_n<5?aZ}#W6w;AGpJq!67^XQ<2-!Aoi>sxn+|5Hsp z>Q*;Bvp4l|Ntnr{0=+fIODg?uyxZbCkG<#CiHuotk;ZSOYm?3vWK6bVeHFfa@3KQ1 zw$^d)x!hhqQE*4+r0N%+_#+!Ny5^p|lK(KwWp3%NlVRraHg)%AX<Xy17W-6|RS;JE zI##LqV(I4NY?Us5YJTv__`X}{Uw3HTm-koy&wg=qR{5#AVE@lKufD$jSh9cnzgORC zY^(o$TKL;4gQ-2=X$$}NTO2pa7q9i35)f?hIx_#oCw}HV%a7fb2q~_Uk3BoRGc3D# z#pAF##|_5kZyb8OyXr;#p<honNJmFrof%Ljn`h=ZEmZr5*paQ9bh=WciXL6=Humw8 zOO$%L&E^d6`^k+>?{Z^h;`dy>-MeuAcf+UI{3p-P;`aBnp0m!VW3}3Zd>hWhTh?6j zyEod;`E_Bf+@uJuvohT;a)c^R`7mA=xO+`3Ii~6JlGiiMGwQ=-R@P@W__#+Kzmb^~ zX#1pKe!PpNeT~XC&UJ}<?0BL}a=)*e`^8T%N8<MEhN~OXldG3KR}c4kWthGC-Q~V7 zi%OTL>wV8SvHRMA8Hpy1ep@?c&9`D!-t}$c8iQ#QV%FUMGG!OPqqWh!-s7w8&-HD6 z<21=fMLYNT#h#mqbEH%AV)jevN6%kpZkw&zv{PE{9j|2R!uePE#Q4_Pro3)zW>~+> zHqqR*=O<^=w>!mN?4R4tMXXf&a^&%h4V{cTZDV{({{Q_g?_m7t#`h&_>W^CqY|=QI zB*m)1yZPJ=p{b?DkM3@e-jH1sX>~QOq`srw;kH!mTM@>LmG|G<^37+=<r154Y+308 zCZ|^`X4q#<FQ2i@@42JTI*BVE#7!o2w13-qMd<R4#gn`ZL_O`V1?Ehg)gx22E?R8r zPRlv7lJ6d0a5m|Fj_sleQdM!=0zz)Bct4B%#^iI>-nW?fS6;d7zO3wLJ9j{qa!zpa z-O$4>FE1@wVzn`|vU8g~^X9KFqLlA8@9|i4MQw3v#QB4JB(7y1DZR3JV%fvEi4V6O z-1a5CqRr&=m7GYav&}CjpH5Ejo3cCOW^VqiZm|TDQyQPIUO6jb`{djF^T+4O%XUmu ztB<$dx<A?N-Jf=kv#EwZ+gj%J?pg71<H?N0Tke-Pe|A<oKCyWU@9r0CJ_l?roxbzX z=R2F&Dox(LbhNjA5}~J>HQ^YOe(Mye)01x8bFbUOo5Cc`y6lQ^RB`O12&EHpS3=W2 z*BR(}9VkDsbE2BW@;srR!OI@L7IP8&QEAz|ai{tN?*}_q=JALpuV;NdEyMf5w^Kj3 zp8sD`yI)`p>$crOg3CO=7yrxqvr+xjx>=jzRu?^H?~tsyAZc&XtRsBnuLr|HiJ-?* znr_ejT$~?M+|0GS;M~m_`s+kkn${lr&3kV3rB%x|8_u0OpMP<V<E<|;_oZ(vo)p{G zvQx@XbDa%uiD&eNzl<BDPxk)i{I;LH-s<G(td)G>kH7nK&KJ>-l0Wy0@B91SZHHga zk*GVrW_BUp;Z;4J|9_wS@z&-+aGG3?iDg}(XDfF~`L~N3L@(_(TPFBvr?hNUz@4K! z@y)+&OBR#`-}+=}e7^Itrs4cKiDt{Dzk4`YnzLd}<klBrSJpc6?%T_D+4Zk~Y^q(Y zwCM&3r=Z)_nV;+zZZdtm&-7fkl3e_qh~N)<S@qSQo0jgMk)ac9(0@*(F@Ih9Iw?)o zH^;t}tFpD6)Y!i?xkAK8Jvb&_;(B|b)+eC}{3iu3-!YL{e__)1v_BJWI!7KkwlQN# z3QzKZ3%}o`*=FtLZ~7s@vQ=bm=rR5O`}xej|Kr<#;h%lo>kkYT%UqA^|7Bn6ps&BW z>k8Z6Q?EOm^>^%Lowh4_!^#Rd_oGit%Dp<%OJo=8CH3a%bnKgx8WE>Gf3wf+Z?iN+ z({?omOuN14u}XHA<;sJP_#&lGKk1z#eN?N}#dp!<<w7-PH+~(}5H0mw&9%!Q<Kdg? z4;r0cxk|;06HJriwWsqezus{3!<Ai;k@+chrq}j6)HSR<7ch5EwEfW~H|u=+dJBx7 z#_@5g^(^g*+v>aMF~8@`mC2#D4|m#Y$Uf0M8u5MIcKM6UIUja>{$Kbt?`*G%=d@?b z%L>aGQe4u)eBXarcjDdQKmX;o`ft7)JXKUsg<=1UnePq<vTs&*joM_@>?riEEYP+} z&xUEsjJy7xJ+oR>jGauazg_a0-<?=wds>-mr<0HTVTl~Gof-0KVF!Nk?C<FAI`ws? zg`7vU)tv9A59D3wx^^PvTnyXqc`uy5%&<N9{`CX-c{g{J)NEH&e{9(;R6pUw)f;_B zibMI{vWn{DYFz)biRT%UvgUcqyTXt8u1o&m{iR`Z?aZ$;YkXa;R%9GW-7vlB)~rWO z(l;$9XkL~uy!mo@;oOxE^%)svT+5Spayak#M7444C1*qKEgroE$={}LyJ~xb<>Zp% zvztT(x9n@FJO8(!kN1*>PO^sb-{{FNBb#!?WnY<e-0tf78*}B(b1kkF$vH<izJ5@v zzvrh4KmX)qm2Vau{-yVM_O`>Hu07$|%l-A+;fQB0TaO%3SnnLi@=WIL%iT$BI!8r< zWt3i?XJ*(i!(#5oy1lCvwZtB{o6L3*F4*-V+Q8)8$xq?|3z|Ru$yaCkJF7!_%Y)z1 zCd>Pd?r+u==1A=P`_QrY%aY&P?P6yy7+Wp>%TiJ0_wW4VYk&Vtb~vnP!}I2AspUVr zWq<vqy}Z(K|EWo9(6(BgxVRq-Ehdjt&vG$bx1F=;qy9<8s%g>wH{RV)^OZY3-A^dx z#Z;{yM;~bY?<itYJ$NqTqg~LR*+D;;?EiiGy@bKy(1fVS2X_<NFa9xIo27SZ=X*Z? zi14?^-{-f67;RVG7{ki&<YeTtK6jny_eOS$R#u$yJhDk<rH0+U19P|Y<aQq0dr-B~ zL*<KJQO$h8ULWQ<xm(_)?Iv@)3%9N2F$@k<ex26Se)>i+%ZH?6OAr2e`Jo{>MNfE% z>xPhgH$&6F=zx;-&N&+<RvZoS3w&bZ@#9s`ev#J-FQdAWsyF?3b1-jVXJLx(xfip( zy>fl4m|VH~Q&FU>nM&j&^`?FGeny-*v+be{BPO4-Q!`~xej)Q#z2Mk&+2RmJKJUw) zZ&>W*zM_%iYIW~v!=&EhOIW5|n<Di{v}&5>E6LIs-3(H*4(y3}dinE2lfBzmKk0sp z4iEg2w0y>_BV{inpD4L8^u72mdezCgYrXN@X3Ld@Z%_Wb>@0SpRJ<cr-RfOqXK1>? z)FY~`&s_rNf6e*eQ^hZC{A}UwBa@vkJ<pk)89(dXo@sLm`4XyBTvSZIh+WcIwI^Og z{M8%h;3HK{ok_~Z>UWFR9(|&DFfG13$Z5*syGgfF-0D|N)IF*&Z@Q{&x2@%DM*rtR zoNOy!eYbO9n5y`<QuMRhQwx4GS&3jlft~7>E1z4)SIeB!PdmV-DfL6ScJAH1oomZm z+MCa*2zwv&f1J$gvFD`pDIZh6-8^!9sisTY{S-Z4SsDM*Qww@!#IuLDQObU{)U4aQ zdH30>i|Q&Km2Eo8mtMQ$)7{3nRINK{ll|_oW;}@JVUTTC+va|Gfm-TY%k_qgZ!TOr z@-IZ!XwnRszH`SXE^J+>*ljcG)Uq9imu46w*PTjdvyR-FdVQwH^z|n?j4gK_m?gYo z-<0MpCT}mhFa3W?X8ugwYpGcu%O^J|IxledS~cHI<@t#VzNKLw&&>&a{Y`Yu>sZYW zAHj!aoJ(HLmRg^Gf6i%FhWEP;?X}MRUv>R%&->zsWmhZr<VFQppZi|9LFdx9`~N4# zm43Z8C%L@tp0#(=&+4Rorx@$}&ISHel|Q4($)goj|6BN4@`lvqeydXVolk10yrP(C z^p5ov+jWKmQPaiGa<q9HN@n#r7cRdp`RmCKCI7X5CZyG!J-06_U&Vah;RyBT_pcqy zId=SsO?RQK(BEVYqtfz!Tlv=Bwk+P6`X|Z8NN2a+p2KtFkN*7o-ZG`eDqU~$XG6)o z>UXDhpZmSdOU!hw)#~Y<8`sua*w43pQDkMVBl&dN%;iU7gg@(;T}my|_{a3uY_hx9 z*_FI{c0a6})7-pgn$~-I*)r_A$M!ii=&D^$Y4Nvd87F41xyN4W|Apsr{>HG$lh+vE z<9RJxwa7Nnev(gPu*ctThxYM#neI`FbeCSD=KPsC`F+<j>1P#&Rb@4kcJI#?T3C92 z&K%X>O02W_*M5%anPif4&rO1%FX2&o|GZ%4g_pIndKe`Aj_v!q_2u>npX<MVPcICM z`}!!J`}jvzra5g)$0|FObUvi82-M4+wNYE{zuM`DE~oD2$m#1?U%hyKedkJ!H%88y z;h~+2rK`nV)z<pm<h(2-%ETEgmVSCs^xjg-^76y)JKse*cwS<guB~CAsmEYCIe5C+ zl}nPTi`4RDwfs&8h&;?NxPEZ^tDJDrgNwO0t-rc6?qOu<#{S*G_U&97R&g6y-l;lN zw)mlp`GZ$B^(mL+E>AD0nfGkL&ek;Z<ufE^&-&a}Y@otfP<wXPT=(gUouV_7c&;1! zU7Wf?@X3BZ8*4{SzQ0<F4j6{$7+TjBaqzw@)cC$_?XjBDQ?tAJetXzFez4c<`5}eq zN7q9&HmS-+oj0Ah>10iQTcLSSX`i{I{MquScc(ovY4Lg<JBjmR-rRduIp;)p4}SHX zeOl&^qSYMJ=VdRyq$jCve)nn4h6#-lD=w~Dl)6+SOjhIFj?QPh`PUj7SI@jK^W~$Q zt8ugTq)a-Hv#h(mPiao9LjUoDHd3E<cl<aQrX;rMrntklFB)aSx#Fe!%1aDo{UkeY zN8Pw5{qO9G&ky$TU#mWLH*(UwuYqifB`z=d{_b7Qe643In{$iYe5x;TJr`I|x<SpP zR%U|xv+d?@Z|e3;;FG_z$4h8aT21-J{HBA3i&kn+R%_DiIimB=*6q^24$k!VvtF5A z-mIg}AaMWmrX|{%?(gf(zCM0^m)kwST)%nRf|ldgv$Ev*j;U{WX>~o$`Ljc^;l5>W z4QpSob22_|GPmOUa<NN(r`$5O_+2>Yzp$P`l*jK<L)|fM7mmyJm%n`XUi2V-!EsK5 zIs2<kw*Roa*x8-dVQR3b(!#MzFnbnHSnngF(~Di38xGtvdGIUGW}js3w+|H_T}vK% z-|yl4VXJvx`QMrI<t`#sD<-}!6PuV7^<>vt&72z^4n};&+j4v?KSrNa@z$Bl)g6?2 zqS$-xUY?m-%Y=VC^E)(iQcqa!i_a~BRx3TG@1IrdKP#+8zuDU8#-j@^SuIl@EV+Ac zc5!K=`sar+{QRr7oICk6#WmMxt2gHiQ`TJRAFCGGg=%PjS^jOyZnfa*P2o06_?!6| zm6eyZ<Qv!AyJGQuiLrM2+LI<OlKVv>?w8D~5Z9=G6>(<2gX#GwW4Sj{YQDSriYwb> zbl81oE?Jb6ztQa5<hM+xX9tVb-oLnC$nf0%>X(AkH$VI~{rD*fw%LZV4~;Lomd=~! z#-DbV^UqYJ-v5Os&g5~eJn>D@&A+qu1+NufvCpN|U7uuncFy_nX<6pSdF^WcED8^t z&)yRLpeNZ;&R8Ej!{eKd|17CE#*?CRBW5?e&~=PYF_<n;y4S8$e4W_Yz0##d&lZVv zos4zc=IfSme4*R^T~e#evR~bZ^?g{vG}GZ6)8X>To#9feTH82FEKYhw%sIYJ>fr8( zY}3=OwLVF#JwHBwwt2%kul=C2LwsCM%;Jw61ts#A4qcnrkv*+0W76xkMQ+R*tDWDM z*~>&9<eRbF(Q(1Y#U9pq7c;8GH7>Ks@E;FLKlZ{rBmAmsb#vJ%>kE5>&dz9SV_my4 zPbTzvfYIHvJkKvCYG-YDc4P8)J%NHZ8{VEPv&i4PF=TCj?)7;y#e-Ac9sQXuZL?`& z7mt0k(L9Uoa&jJbU)pXgy}EJUmix#5ZB^H8xVlx?s&4Jw4TTMCzvo4SdqxHaF=rVs zDc6`RWO+>R@LcXYs}CHgvbZjisWkb_eV)eZxMt6-(#fKmpL;y7T$`fDnBScFN+kc! zAJdPo&wKs%VJh16F01X}Gl_Kvov+DxA9z;yE!xHTltP=O#+6**2~`JAo?dWfQp+{Z z2PYqGz4;Bc7NG9B-Q3L|b1hVRY~}eY?pSYAZ@ey9V|1@*QBHGhFi#HKsjHD<Yw!PF zl`>(|%O0s^)t`&Y{@s0O#&g?OIBAaZfiIJKo-W&L6q+n+)cnTTZK}vulj$ik{^>lG z3OA1K2%nxGd?|hB|0cUDJEomHIr+}Z>Y&~&A<6o?l;w9Hn6pzeZfDF?or`5pZ(jF& zpD&s8(Qf^*8w=hGE_{71x#U%jPw}%L;p+Bj?9rb*ika6j-PAd}%laSZ_Tvlg6p3s< zmMb+S|J-uv-?2rHG&x)3Ebg-J-}7<Ws#l8_?cRTFNyQHx&-+VxrWskR%4)rK#O!9; z-N3NY^XI&u8>h-yZhU$~F5QJs?Xt$X?b1?dwsYsYc(=tmecQ=={$PIovD{9@b-T~B z=%4##@T+!0`>S>(S>D6Ky4G(e&EWJGTA==O?Gxr(hKr6(Fz;tjTFT7x<;~@X72P6J ztt3Lzp078VzoKyR%C^@Nc_s@ete>W_XG7AW`hS)$ZdUPB{*}?{U7`BV`{L^QQ;{pU z6n;4IaOD2)=(KE}{#wCfae`-C(Zon~-+i^I@yv@<k4`ziS@Ut3%A0~u9y2tJ7Rwtv zJ+stn_4C4&oUulymVe%BahbL5UYC-u5C5BO2TJp{+>Epr`hEONVM<W$6O$SD6yn+E zM;{GWu3ofLru2T+<lQeWe3`hs>&QNyW3CyGckyKj@xJ?ZdF9z3;j<S=PVW3wbmdfO z*{#wI=@ovRTcjteN3}n6?)?=!b5GpWHUEtd=ZA{?G5)sBZ^G(;D4sR1cTN-0<f-h? zvv?FReGgk6@1=y>z32On{Ml?E+o_rP`HI%8$1}^{*-CwGT(&7zr}uEk3qQlV71xgJ zQk&<0<K4L*C0gfxYel;6eyL!8FCq58`+}d0(|1q)Z&q>d$$>ln7V=zwxhjKaey@G) zqifcG41er7cs~8nHojk4%U{(R$FfYGwf!uceeH+5=KAX5Pm?lZ15J;oT~WNO6}>>_ z!1*IDy7Xr+6BJ2Z`*_w|v+_Ty+-Ca*dQE>}aNA&>Zs9@y$)yG}y6+Uff2ddcW<r?a zg+<LPf7mQvD9XrwJ~lo&rq^M1`<Z7xQ#`mYJSbAJ`}81k&RO=%;3d!AHBWqct<KZ! zEoXgLl=Pn$=Vn>o*Xx|cy6TD5mWfr%TJ>F|3wAncYh`Sc{dP5?Y=_<fqaXb%FWV_@ zcR6SDy{ca1(%GBS8~vM0OZv_?eLeEx+{Y5V>}L*N9{+kKbDu9TaB{ol{D~K%<m^0b zTSXi$Pf$KMWAV<Mr05-to4>rQTX!=tMVxor^NfHtHF4WzJL=5bWAESJ&Go0-eMyv0 z?fI47otoXDvAgC}{alz{=J(f~=~ehEM&)I`C*urPrWe=$D`w*6OE>@XNw#Biln<*P z=d^Fx+I``nwM=$44P4c=zk|OWa9H<b0r%?H_gxz6l7#R2&oS>Q7ZcsAdGgIGiz_VC znD&QfZ2mlly+7}au3_t(gr1BIYR8LA<{q^9_~U~9R5z1_JLajb<G$VH$Zz$cqw~AY zWx3f(Wm~(tqSkvQd}Nf9JaPZovAc8Rk5=yZ>~riyXVhdHo<$S*_Aoo&dYNSuoW1+r z=i5x@Z{C=AFusz*Ce!zMeV&1?<7WM=Wy{la%1_*HT=ToY#C5}4*Y^c|CpQ$Wf9g_m z^4$5u8RdbDs}&`~F8-`hNoM8{J`?h#XFAL4<PAGt+>HtG=}TF1a>lAntCwrr_!I_N zzW5~eUM)2uEpX@cXK$(xN!1rl5}RS~tCh8URmJ|hsUL0&{|IIM7tzZqdOZ00JzIvb zmoIc*ORmbC=<loLx7$*_eDT_>eeS``7U8~=-OQ?rPqjZhX`*||&s1Ia+-D&lY4IEL z)L!QEemE@Q|G22MZ}pyrdAn!iUSE@LIYBe@cfjS!SF_h1+{mhHot;#t@-wO@W0$_6 zt^e+C{(E_%0-N(P&TpMR%j&m^T7zoHoc8BFzQ-m$o;&;Sl4CPtg%5t2V7Nwg@gB>? zTBo$`KK$fUP%3xQvO}lx@~ud>pe9#AiQ*%YCcY2E-_E|s%5yRKQniNj?zbP@4Ue6T zT)*h2JYV%3?weoq=GQy?H+hwJhPP<)^UJ&Dzw}~?s}cHerR*nDO7NqL8dYYMlU|p_ zv+_JqJ$LC{O!!7sd*eI&D^{O05!T?3i2cW;c`&;D`@AWeT#o!!W#o~oyrJ4`|7e5l z>pKgJ4aE(Le_ei{9K60cGcfp0)TOzG2dB-A&-i=)9?O!qvu`No-#@tDve@iTu+H8% zc6rUhyTU6Eezm>aU1M`f@7tlJjGHswRNqll_clx1kjcOF$;7<Wir_PId{(Kx&tUcB zv5L{IslFV$rJQj^YPiU~cL&8HMeJvK&G`B4$i`H?qnY8)R~$1uVzle6-%j2i@3wSr zjtpwiX1>4RZ~D`J8$aw!`}9yp?eV#k3uj(L)*gwOD|9w5|C9Q!>X$jwZkRVa|C1_h zs{iAav;V>Ed#U$q=3MRFo1P;o@h`CFW9;*5-+Z?GZ~3?I<X+!%CC1N8KJcWP{dtwM zpQpG|fw%nMjNXqc6R#Qeh{=U6UcK=<*WMK0I{rrK;{|H+60?}}O+W4~t!mnx{_gIN z4+k$UzIlFP$VRLF{&QD*PrEMoY$*9TH1A{o?u+v4ICi_9f4ySEd%t~7@1>3{S?+CR z!nnEc%(;Ir|JWP<Ie+ozXU@xaf8?(EvF2-SX?oPv<h7A+X8coGv}kMFbM`6ajI;U` z<v)J^&hr0V&+>E2+>Pqw0{%~|$Ue63fGz*Ow=ez}9{&G3@6URjZ|DBoW;T@Enfvyk z%(FG2JohzKmsw6!uT)l<%<{DC^_1xJo+HKQzc{;HmHX#p*4;I~$UwL3@z0WX^P9JI zz6;DsihNM*C&SY>@rH5FNsX<Jrq^sYuAjO8`?>A48{QqeC|qfgzx$&+^D4{jix`*5 zOU*F-KK=i(jwm0tAG?}wullm1vdKpJcI>C^D|gi8Ny)h8OncKA!scD^fXC#`Nsq1- zTcj(0n}pAu@;PDEuI@5_{b#lBlZ>uOoO-+})X}G@aX-)I_%r{m+Y1)fn3?s}`~I-p z%;&mUL65OmQSF&lmDjb9YefNvn7?jcxBq$M^sTv(N9AiyayN-p%P_ybwCe2nGs`>q z7v4GS620K5%dZ!E{<=S&#h!ffOLBty@fTWmlDk4zeJ*RQPhC7|M*X3ZlQP^969uC+ z9o`w8kls-K_}`l))_bm>u~F|kxl#JbcfO-j6l=~KWxeWHcmL3ar_s+Z8Xe!eLZBeo z$XDiBWYp$d30;BO%rx2Gi?vr5T|WBftyR;!tS^dRI2SGCsa=@-#%_nb(01kGqdR;) z9Dje#{`I-_bssqIoH_aQjPNAqHCxv&bD5Iv%jzB=kbS|(eQMeI+6<@QbVkSHqR-6J zce*YK@n=frd;a$B$NLX{@Y&b<-#EPUR)Ve2`LrpkU-*>r{Al=h#-=(cGO<cUPgL&a zkI&0{l9sIutUo_xwchzDb8hDr)XLuxzH$D@?Nz+D^UoCv`4&bg{uc_}>$59XS2Evj z$8wdm`9*49B>z3_T)e!axyxco`^7$$$unFNrW_Xun^l}HGwWNgZ{CV`S#z=iR{ri- zdAakS|D?(<pKWD0-#dzOryVPh&<!@*8Bu<HmmK@7X?maLN0?8}KeXP(H)*-en#?BG zMIy;FkLVn9;@@TwZt{2Kw2b_@^Dnd6bN`%~Vc+|O|9HF9uGd#1_wn03JNMUp(Lax# zJRjAMx8HZ3U6Q}1q275}^s`wVXN>Cp6lYeI>pfU)*`vJjM5jr|n<Uno0WA^Im*ys4 z3Vl9f!|rau0>8Cg+%Yne$KnI73qQ@t^HFAKUASzGn$o0>=?4{p8F&o?{ntDHD>Y#f z%rEm2SCIK|_&}<_t<d_vKP`Dx4_x^C`~Ulk_0L28=UlS=_DHfgHL*!_!TZ<cEDA^G zyZ7{Ktmb<>hv|5wjL+I@{%O;$9s8+0m%){PZ$aP53x9mh-2HizJwMjBu=De3G4aW& z?7lyi81_%TyR_|ow8hoK+RpQS=qP)41uxrgAkCB$wpl=U;(~}@SzSWWR@)b^w)lMJ zp3wPgFSFC{ZC2xOE^PR`=1w8E+?Q()>Za$F6{=kRdBr&M-J1S`YuknQNw*owE(%+| z;Jdu?oE71sq3-52#V48dih`DLOyS~b-^(pys-Rn_czp79MfF!E*^Ba2Z@6vDlascY zKZ_|w|J;twToYes!HNULlOJz*aXo8>yl&>Jsuczw?jG{I8}Ikh((ZiSi@C8zU${&z zU!Ps_W_9m^Wh*Rqs(EhR<UNh;!m86Va(gpw_*zA;pLJ~MLZyxI|BR-tJ+?L@f7*gi z`A0KmpA)e*nXB#3_^<TR_Za3Hsl<QZ_E>LkKi!=s(SLFYe_e4wu*d^7=5YNig=GfH zyWdAOZ*59{{;}i7DTeysYql4fPtEobK5~!kb$V0!j`QWuFCCaSYm5H$1)mpHtoLru z-+yrZqc^iNHWwTIST^U)rx3j|!v~5p4_sqQJ+OU_rQGwtMVU`UF2A^xSfiw1pgJ=p zY^JiD^L*RmH*d(=+>nVoxXeP>oH5$WI{WIa)h{-GQ)yUwo@q&yc)}K&Eys$3{)Ej8 zy&$(PJ?H+Hp3gE39)-_tZCv`%GU2|_Wj%(vSmEis83FREWTSs*?>PK?UE^UBNfBPz zd+HC&DxO8`U(It%&HB9h+p|F>VfnnvB)lRo)?RXA3fdfDe4FpLGbabj4TJONe!ORj zY`6TqXzxc|>+i}^H~FSNvU#2G*Gyuw@mf!j#C9WVox-p+53(7&T={=-6jbosVEg2~ z@k8Z_bAoo}J2Q*SLm7+qw3l4;iF#`Kl7}y#`?&apsa!p~gDg(no}ll+dGfh4@9`4} z^%CFPKh~P)eQ$2tT)%qBn>E#sDtvzUTfEatewU^HYMW{LEcVQ4e!r}E?b;3JO_*)$ z`;c?<tDVbNZ|1M~v;2>UM3wp0vTf}XuOECnYeW7k&!UMgX}?SQ?(PVcs5cKXs+%qR zbo;^m@8%Yn?~6>UlC}|Bd|%dVv6PJaq4wgxcW2&XtM)Vc-7Rr6*W#&xYuovApKdSs z=X>DG#Hoiah8^~K^Wbgf9s9YzlP~n0d#d~KTilFiM?N?FPVuq6pjgZG;miD6CpE4A zif!z=Ygw07AD7l>mG{ALf!)@y=Zc!gXDs}8_eVwAwcXyEzRmNPS5g0Z3XeVi<GS`Q zn+<O*Fh6;1pD*YC?>@7Hk0*L9swi8-Kh5&<U7p_)mMF+F{pib1|HEHVm$klTx5~Gy zH~VdD*84Erdh+K+kNx~}k1x;k;kghbRBX0v%~m7dN%m*1?woq8@$(I>^QOttKWY<Z zH~c@H`@+V1(x1OpbL#(P{Q33VORo2I%+G(d&wkH2`L5^Wjah0R{=cn${_X6~ol^75 z7pL;(S|58n@uvO5wY<~VYyR6_Ol$70Dc+X!Mfc>H@Ar1T{qVQn@4sHAYkuUK6Xk1L zTRz^ITUDHpA<_44lBp8=X$dJln~=|$3TyV7CqDFD{A=m4pK~TT_};&~I<CZ~=2Xf4 zqdD^)?wXvL^saZm!SC}*uh(Rr{`r4S@WRWwA960ey&~`<GvdJNUAC7QH@!SBD?39> zj&Zq|<Ck^=Esk61^0Ve$a-JOU^{eR&R$Z<KOjB6rUHxg0S@rK8+s!%ge2*n+UdQ%z zrg+Ve`<sy@@n-F23!VAR+wTj#E;V?j6ZL<ghnT&|Oxsy!-oJTx=IjYu<6jTn21$57 zj+i5_S^QVzmfb#nE9a2C3o^gYD7m`maPJJ4O|CiTWo~KDN$v33k*G7dcx7`@;Nd&{ zBAHx`OuP5aIpy89M`Lx#-8r}8G}4~TZ!IgC*FX2`y~^#8mUlE?95CGJt<I6Mho}79 z4W$XUe_njD>h|UrleevG+#C1s@7V~kg%kg3R#l(9l;6iZkNeB}b7s!}7v5OJ5~C+| zR907GVyvK@`w8PsuhZ}7YyJ9{@S#rTPCt|K%k%R)SEv6fPoFDlINj{WpUfq83Wvi| zT_Rp3RPk&o)hnK~{SaeineX;H4>yF{%w7EKjYW?s*R5Ht>y}o8KWF=-X6cfDQDMrB z6@fBRS_w(+NxWVerhngjJL9_5wDw!mnSUJVkIFKNY}-n5PaZm;w|YiQQ@Zt`m6dTm zuEEW()BeN>tu48>Y*E{?%tWK*lWy=o-^cHjb*6Y(>Rg@k%Zoib%e~LA|0#K%UT(Sj zn#POhXYO_{MD>oIIQ^jB^to;NJ@t!gj;AkucP!2MneWwvmp0yq-BTW`H8Q=P_2ht^ zPDY5c@Bu}E1G=+*ELp7IzTjTR*EfsYmR{d1>SZmY|I?>3aCr#NEY{GoKR$6<EPw5H z!O)iH@|SX^?g`IKX8nA4%lYI_{V8?MN0rl)^Do}nx9?c|mYDweou6kdd!BJ3Zq4c+ zvhiNbC2|pR6^)0FZ2FY($X__PJ3Y(M`;BXZYnS(d91XEEy~@k}giVdN+cmL#@ytb9 z?h5=@S;Xemv1xK1&1>I#ZepUChPRCQztV3NFId{L=ercNd^_uz>o@V;1ecq4nKfp~ zEIX^&e%OA_J@)GIYg>(%D(&xHvw!{}X*JiwTXt$LTYoA$`Spj#%QxC@6{{|kn|yl9 zYk}G7z8BZ<XC4f`Bx~&79A^5`Dkj+R|CA}q%X}RgJEVd>nz{YZ=2@^~)@%{qkTB=z zo1eHZy5BwTx6g!ohZHp354$~yXMZqfve?a#wmF^rGsSrMH@v#A`ovAu%+4JPSDw(w z(f2D2ym;N2_ekaY8;Wis7w25NIaB@Z^2aNyQ)fPmn6vovtW)QVLxfG2@HZ~qaqeo^ z95c<g3%0uyR?eTI$adIJ<^1W;BJTWM@_xJa*{i&_p4G$i{ZY()_QjGfoqJ0wjjt`L zef#2{Y^aD2qX82O+a#L@>NjN8%-jFw{cC~0<^7(1w|d;0b9uU0KW9&K6JNru%VJ@} z`zzG<mCV)yeU~RC+dlO7-S&N<Mym9=EgD?;z8bUi&-KYfZA^UVH=k+E{VPw-Pkz@s zdE?AY=gx_+`+mQX?|OdX^?iKx?N@gg{#d>;ZN{X7EZ>*iVsLpO8M*88G==1t;6E~# ze@>iK@^^V-tnV?K(tCQn^;R+}eT$qEuN<_MoZKB)w9C|b*Z)b}F%J%%zGLLS?(2=C zpI#{3^tFBeaDqeH5et(Slh5hA-&Jm{|5eyz@%u%h^1CNCH`#~Im|S?}!=}#rt9@6= z2e~Nnbr*l_So4+Z_SwYN?F+wNo!qcKaI2pecUuDggLNx5+@BnweDkQ+M_DfB*&?iS z9=}nDV7PVT+&e$-q%s-Xo=;uh&Isx3xhj1BxS!>mw@Vh!eCNr(tDu;1+VsN_ax?#| zKbR{dy>NHd<YZCf6=6RkXTFq)k?5*X-Ke^;r--e-Tt`#z@xHWghj-jsu<V@uUI&$v zAx$eKg{y1x)9a;v`!h~o+wE8)Suof7?cEo_NfnRslRuodpYzY0zcV|@SfcwKv;BjA zmw!f255Jb7IJ-MarE<d&wdL&(9|ff(MBaHJellggYx=9?(=~Pv_wjA3onW{xutIrq z0B`Pn)$2EujYOXmPTrkal|6BbfKhv<#Pse1Q?9Xc@UR4Fu@xJne@LlOdpuECxoVx| zYvXt273<D@&iL^-p|EkM^1<&aD^Dj|$hRBYhFI&krmZP$-ju%4r;L|t{p61(rdKyB zX8KMxX=MC5;mNb4X8D^x4SD5+RW>!;p0&a<@M5fW>c-6Mz}mZYYTIIUT=+I_zsGhb z=R@9H%~GplW)IF^`_W%_;q-&|*AKnlerEgZ8%dU#=dZAyy0r51gOB_hZ4b=UbK7*V zP=&AfTXa(I{L;v|TeCg($easg`+m1l#=&ga`?=q<({(pYKQv3`kTlQvEz2Hu*RUQ@ zGBS^vZaz&pVNLnTe>Kz3*gU+k=>GcMhE0b;YZIL3mAV_($Um8LWZIefmzzJXKV(pQ z@`vQ|nEUZ78T9oT{+aVPO!t1E?c{Lu%j^3ejs5mMmvpKXYYgPqmNHn`VO$cq>m`Fv zq}1L-qgfjk`aBM~D)3cqYViq%u9GJ#wJ-I&&+pt;7G!?ysD$|Aw+%wU=Xb7Jm@Ki^ z^zR$K$?C6`C$n$qHeMx{_4e4l)fKM~n?~MX3-;D2iRx5apMGafe+rM#X3zOgE+@S1 zESbJ+!|bj_lR|e0EsK3OD@0zC@3&st0pkaAg60O9gx<Tx;y&qO|NQg5_m4NMOw+r5 zE|7h;<m#92ZR@4Z``<7ZZThSl?3v}np_S}o|Mu&q5Qdh^bJQ-xmKd|UmGVuVRy8wW zR_{(Lvq_60cloRdy2e@+S^Cjl{l|5-Z^FwCS4KYw3O!PNEqzmjsq&eoAg-z`vw25v z$TKCMvU6e8E1JIk{K4Ia?KgQ&|KTFF&TPh{#H$<4E$%J+E5y5gmRXwH^gOmTonm3n zcewDjaa+oGn6Kxoy0ANWmX*wlK#vHKPk|YGzFqD-##?({u(en(ejdltj7QI%k0s7p zb!tT_^R{;~vz>(>*(N@jqVUq`Oz8BmD=9jf7hfm%HzynKGk<)qXZPtZ%NWW!s*Wb^ zI6bFj)yccNSar*rtX^*LYfsiaIpw92)we*w7gH0W=43Y6THpSC(A>P}loz99=N4zJ zxiMdV`)@A3qC6{a=G+>Y4?Z*VI_CssOk=V!@txuy`}3uSeUqQYy?dP5$96YO|Ffud z&jF|F^J3ngbiP05|0N&c=XY+-F#59jE9=M5kFAgO-_H>FT>PB%%^y(~i+XeW#?H^@ z&)=6kq@czX$KCr%;A~iO)c>wO-OUe76hhv==`j*vG@o=spmVyu!>0Wr2X${S-ktDz zi_FE_24#Otze+#sf2i0l(K&tHeV;eF@>!Go7APB7_?~~PBXjY@vV++h=bfLv`J(N? z-j<SA&+A|9IU{^N{od|b=g!9;d#=A+ws%&~?Ku(q#GffOFPbbcDca=DvfnFsUwXc_ zxpC)b|L!dv-K#Y`Cx7(lIzD?+%)M#_Q_ak*!kLNt_;Q4v?&tqe(e(Vx_Sj{4>zRMY zu$+9NA?v$TF@J{G_vEuxWx397C7T_NCwI7-oXzrb7iZ{nzNxA{sj=g7o1yHlp7XXB zud`@!J=1$|wMgdY^5t$OJHnWA+=7*?&oakW<;Fg$lJo9;^E0%{H{0O%0+k;hKGax6 z3e3KiAbG5=?wj+OW~-GaZFd<jH?Ws|;COugqss4#jCZ!B72iFQBGK_RsZi`DOTYh$ z)yCN>ie0sL0yQ=ME`OLRf38?1>tc3R?D^edru#EjR7!3R_SqlLJnyc^(yOKAw@u%L zU0-(PirK$AsTSoa>BW^Y5kj%IR+W6H>)$&+adyl+1I>4ulli8<)BkqZF4JB*u!Y}r zU-!#6$)B&+82DLENtvrT>u4e)TglZ}Rrie<0e-v7#T#DeJ=k~bz4M*wmf5y1>asV! zFX}55OAqnaI+JaF$#|n}&>r*2`#p=oF7KPncqV-DyLIm^!*49wx!zJLr+wec3s+Ql zSNv1;ENT=~-;p6HDQ&*tFZTwE_ZJ(N*zM!_7TbFx=t|2wUxtSldt_$){nwRxwRX{B zoj+@|WUgB3`B|$Je|0W>7<IH})3Vx|(oB|*=Hz)+@3&sRWSP|=hElQ32QS?B)Lr#{ zNyhC`p^Do<CiBB*_$lzeoK`IN<l&QbiBYE)y;Z+#Y(L9}qi@~~=SLZ~cF7XIdsPzt zJX&O3-DJn!VK?WJ?D<bt>u<3bapiyTFiP6Zw>+n4`T1a>U~N@ij_Z#5j?H`Pc0c4c zAHS`+)V?WqSNgAg{+#K(U4`EV%g(K*ZJon{4%<yR_u<V4+ZP||ES{Y!GTgD?*O?;) ztHkfR9#`yiH=QAW%=YNK>|=E*^X^vm9kgRpRnN06yt(y9_!2|;qc?edSM0vn^)2F+ zo86q-2FH{d6qhGlv-OwS!S0ar#B<`)9foDeZ!c_mXem`Q=eK%K{JD)<iVM$o28ra~ zP`h|`I^Xy9&F`36vW=dt^0@eMih9I8iD>Z?bLKO0x$ZYgU3=8n@Uh8;GqLYK8=ll( zYjR@QKOObCz1~J%Qa&e7THKzu<G=RBU2TVVcrPoudTZw81zQf@(!R|lAN_ou)oI=0 z-?fi!?=}p*%f2|XXY-YFE1LVSTK-F1!XDGadb#S+k1Gd*)YbQLPxzeoBl$t>th!GD zYv&rJ8m$vwertiOB)9U!YhUeJyR>E=I8-xZ#oxWz@yjFA=PurNxy$GB^PGT?$0sL5 zv-b0Ui2dux??3-geA}n`+)w|5vL-Cnx9_b8NoCvpAk;PJ+^kUcCHsD?|Jhh?%B1r0 zldj<9r)pUp?3>nbPBjt!wR6@VVG#jt-wCRs57y4maP;)BkKENa#pOttvb@xpo368U z&OKwb6FPk5Ku)#l{}*Sv7cIGEU{hY!rnFXX=9J##(of5SZzaq(*?BUV!?1VFHz`4h z>Gyuv_2{b4OZnuyv9SN{$HO~Hp4)CIv){C3`CT4;!&DyjPeuy<SsQd-Y<MfsTXyiq z<lyIyOnvFgY$vJ7J1aD@maacj^!Cl&8E1ChRhOII7oOZ3^=tn5=Kku*ofo$j%r!F2 zynOQD*KWSKkAk+I2@kV$wC`TQC%x#GjJV>`(=9z*=2MvOxh`Ins8u{;%ahCl#;X7J z%b)vn@u&Uf&$q8iq{!_)*=Ux1Xfj`dkWqGHSi1j~_a6@Te7X7a+v>;W%g?Y0PkG~G zKet}(@z0Pu-s_5d_pa;R{$|PSk9$<)?h8HT`!=D_i}QF^S#|6`ZxKCRPLWq~!fmf2 zLY*%;TWdORH2BhSfBKA?8Op)3%4hB$3R%^DZ~HEzBgG;OS3Rd6T>kgzd*<7-ZnSUy zcCgB#^fH_8Nu|rd@1MGQoY4BWOvU{!bFAC{-1BdgCyO0_?zj3}g-Xrje>czW*q46E z)%A`o*P^K2pOYlil9$>Dm3^G9smlJvWW~*j=#VLQ*ss{nxhD1c@`kM|PUd>Hc3XNI z=D9zcXqEf!iP4KZo3b0l&5>WW-ZR=a{kq7C-PabacpbIeea~{6NeweMGxR)rW^(uS z-072deOs(IC1mkJTgHt?UKf=7V={Q7wV^0XZlmkw`b{f?-pmhAmJw>0+*lxXU`fU* z=8VU$ed-uxT$G>v`}#MI`OBJ@fzMfDzWxmoX%w5hNA~BY9hNJP=&e|Ki~)Ks0E>a; zQl2$h(*kdOYuS1v!^)=W@|HF1bL;b1V(-69HsIsmIbr{Su8YhK5(`75Jnsn`7QXhJ z)bu&7!Z!OkYulb4k;gip7%ECyvgU6**|D~z^7^%&`1v!x*8AP5m*Xj~tM>j=Hv8jt zr(LTigeJ<aC_k~>>xK4dgJrfK&ouv^GxvRacht<I89$9z|1juZaV+HokN=cssYT0d zHoURn<ukXl-k`EB^k~)livoKZ!bHpFUFBKg!7b_h{MeMQGVi04Zq2<pH(jX1^zoJ0 zFApDPZ7}1hS9x}GW}cCv?KPLqrrg(_f$MK@J4o5iTh5tq;-G{V^Rn(IV(s1g-bdPL zS?)3Qn%GyrZqdKxjH_2~Tq`?m`NT5Ux@)YLjxJmgxlTHZBdub`!Qi};(@#o-cM4`n zKG9*`tgF&e>2Oad`D(Gx-KDeda%@jsyKv{LpR%eScN{1!yXPb~`LH!R`~BXFLcy|2 z7^0)g^b%{X7aVgnZ2Bg1CBdwx{CS2S*Rcn;de2|o$(S#`SpS^6xNrH)FUF2_RyR4t zdau2owaCGDf>zBgE*n)9$K9E=Rl*F@Cig74<MLbXa`@y+hvsZ)=bTgH;k5qO)x($D z4m3%w{b;LpQR>i(>KNNS+?!@CF;SA57P0<WMDMK$!WXW+|6>%-yI=J6KPJ9sI>md< zOpgBjW4Q6S%i6XSJzr-X`NyosN=#0!DcpA6m2LB(17Fiuvlkazbib5+C)YDwV@<!v z+3x}k&pF#HUpw66W-AMHes^@E#15PAbSWbx-O#i5Ho8k4QCoH>^IVmeXR*b%nX50Z z?B2YO_nVH_-!CE+JD#qP-gM2SduyEAl{cIVbzdy4yk@*EaCN_0rBC<g-D-dJqK(YN zAD?e_Oi-OQVMp?%pOS?|*U$U1UHR}h>)bwP|4wB~_rQr)X8oBV6z_X6BINe<47StT zJLXj%xWmfyMQTmo@{2Knvle?y-Y08dpX`tvpy%M5bJ(KqT&m=nX_Yxy1-Eri3);R5 zF@K?4{Bmx7t-*e6)||>Tx$kGL3CkSYqjB!{^=CQry`J5;Q?Vv#!nG$cvkqMOt;2j` z|LnkgqXl+ui*^{Ub+&c6H1D&{g^bMy?^?~~)tfg{I>yYj*gqkPH|@EEo~D!kl2uY` z(s|SKoEIFM$NFpw+dhf9z`zI0r%w2E+kG!??O)!rP}gx@$l^Qm`|=Z3KR$nOt<<;Z z#3-ZVtiP0=x&I4RYf{eKQFU-eQNvOH#Vsz`3+ivbGrAgc<U`CSg<5HwKRHTYe$LyU zaKGp9+{Gmsk#9mbhrfBA!X)r)$-ZaFr~g!_+-kV^)b{gt`#FDn4{tAA@w~#$xZnRq zUt{?5s@Xpu-#%i*UsE=Vx5oI>3m>x^@0#ValZ+qdi>v;7qWh8M*DA&<GJB67pL5fG zZnEjIy~bvY)zfE3yqMOLEpchKq^0&f8_~V#F<UeAF7&UM${b_bemdoc%-3Dn2Ofz& z(_6o=>O}d|srqpbH#+4uUJ>hV+3-UD@9Llabw-~$<s8{hzI>@(`Tyjb=c?Sg`bQ2t z_`>j`OX7n399H#X+WEidST)+6kzA_2O6A8n@xMAp(%-%eF+VdWYOCUomk*~dR9dg= zcE7djC*NJ+eV)@Vr5(>c_WHqwg6Fn9@~;!teAs@^<$hf6>Vu!mSL}C=WSi?!tv0iE zZH5-llgQa>wZg66eg-541~0p@K<3=~$_?KOPL(u@YVw|9dpy%npQmZtEZ$XLmbEju z-rJ;ivOo6Lx~LQ-Gu7vRb2peh{y1~Pd6w0zYr}nOyH`d=IkyW>mi&E2$2%>q<YdnD zbMr4Z?>7H5vEubqNy$T3g^vE=ytwe}tk2>}SIQM%sxITq+w<sY&kQ%!xGU>LF6Qj? zxE;1?bLb7b#6Lls=j6HllAjqQwUT$<{La6O*Hb5SaUHCw(kzjEVO{j#t9g2D`+u9B zU;4_mC3?H1e%o07R%Yyc=5*wrLHhsiZoh83F<)9g^KtmZXC)Cco|kU)Y>PS88s@au zJGeB@Z+(p`Q(4oxl}d*W6&z>1!C89xmHwUoPLK7^J?k`;`*3GYx8;4kbN#6XKGWlL zH|X}pupfT7Gp&xVV$G~$a-|8=W)#URxac#dIw-2lchxLuRn=olp0u6k`)0B)_`|C| zGs@qY{J7BaBS?7q>W_v?E<ZQgF#F8RqH<AN^XdMMrFDNxmc@6jOnvqH!AG?K)pFBA zmo<FEm;28>&-rP-<b4;<TI~<HQWnjbXU~`wSlQ2u{Q0o-!Pd*W=EYhss8Tx~@ifJ! zqU+EGt!bC|)y-4=r!UcL`!uiBCR(J&ZfD6&=B#UW85fuMrq?f1ZB=FD$yQj`efrI* z;s;#nE2M1Soc^Of!|a>5!`XBH<$QA!n6qMH&hB3J(CYlTl@)%AcFglT`<P`x$+O8# zQPYZi6nN*^bJzN3Rjo4KwB_^XD=UM=nNRctvd386HQoE;&(w#SzfPI(Z*+XeX}#sx zS}WbsZ+rJFt9|z?X6KQRrI{_;T$JlAdj4|XxRA!o&-E_jMNdbQ`O)fM-ETYZC5IiJ z?7uz!vgMc8vo!zjd+<MZVaj4XuL+sq&v$e%)wg{6#u9esXx<H<*83Zqz8;C&CE*Zz z+3fYKbJx0$PqB!3pKTz^_N97JZCcIyFUlMFFM6)K-@9vt<Lk(5v*#Hn9?7Z;2OOSo zZ}u|VkhaHy8?UWCvv`uHcBHsz>hkKHrG_hOF2)+!3ICp^VQF;1H~7+*W#7%aX3aZ0 z)qd@%$jQf_1wII2Jab#>^5yPXj@Glka(7+RW@_~7be_M(ye!zzw$*$>sOi1qi%wqr z!ufUiw@_KV1xI=h3tj%bK<|_Bi+L4CT2{!qRZIMJo)~%eZK-)=z-`-=oipuw{yMLF ze%d$t|4zxuj@BLd8|<$Z=pB8q^89|EsPL7q=17O;-LU0dBe_&{nexZYs;ADk$Ul@7 za7c<0UbFCHU2)}knTrvAvvhi66TJ5w*v2AYc3}Pn^U520s+0WM#0^z1ap^Gi2KTnK zGSoZF6DXakvcS)9;$45WSuf64N@O+`PK{^E+u|;^!Qx=yRm+N!s|-6=n%&~A=yr5u zjAqO4wtK%(>UVqL-9vNM*Q{++J{Nm`@(t@q<^`Yh|MvW5dpo@+<8$c$wSSvb)!*!9 z_|CTE?1|J1PEG+ubL0<lN%%T6cM1RPyUdbZ`l~U;KC=4#M)i|hljdLLiJO|?+`8J? z>QRiTq0kxGbqU4CFD;NiR&~DSpSN13*FuML-#f!ivbx^SKa^O<BxY>4{GgTeb<>aA zk6(ZA)F(sf=v;yH0H?Db*S?CpY5Iiu>{I^|^H0vE(T`+qWcW)nb=%DOwp@$t<WHGw zz6WV7(`v*27F3qkRRmm~ZxFw5smtoQseKklQ+{|bEpIE_Irq&J$I_+W?|3KG7k{$T z*nL=iJ;&=lHaGKfyW&TO6>TrHCeA(0ccyc>>a}?@{%<tab*t6>vijYrzw4@h78$Nx zY(7^q)BK+K^9qaG#)dkp1OMIJSvEH|y29j7pzxWQ-+Yg?S>6lvV+vez=<On_$L}Vk z`0fob{N=B{{M>fdOOtNc&3$flqtEem^DaqoUGH0~tQ;<9COa><{l0IKm|FU;cOTks zaEP9K@hz?3z-{X-_u1rAKdk3JQ7`q`Kcih@$I4wk=KSimtfz8$f0-I*9g=JQ`Et+S zH#ZJ@1|JfW*nfJ%?sK0)er~k>|8M2*edVrAapK8;-}E@E-Ff=`$QQMSJSneCkM9TF zHJ2z!{jP1cub2A$ch7fLg_M$O*H>I$&N6+C#+~OAE95%=+1A|IwNd29W2=nq%-XS> z5#J9TpRn9%zHzDB>rGZm7k2*S>3?)b!sdUfO!U*+<>`O-H|*?u`b$5ePVChEIX|_I z-TtL~`Muxa$lcc-Je@ToZ|dU1H)Q@_{V>1zqV#8`&!!voT5ly~T$y|8X{^he(6W;$ zMU#3m65fRV3rXj_FSE_yp3Tg;%jbujpXBMQs?rs_O#Z^L2_~=BSjK*BQFZzM-21n_ zTh<Ate?fhX^UHi11^&GEI2gYwtUF1}gje#hOz=<c#P468vOZX+Qyt^+sWHP%%)}(B zfz2ZNLgt#xRX2?*WWP+hQJ${XQTM#9|6tR`nHgu5txs=vsW!hg?IwRjzf0WQ|8a`3 zR%M|*lU059=%~BN-&vJ3XOHC4X8&W~-o?bcWIjGIWB##Cs=uC`*&O(+G2TV@*Pp49 z{R=$x_!9F9cSV15D0tgYqB2kU;l%3LP1^NUuE#{aA1RVBeerD5$Iyqj`~?(d9&0T2 zF+J34lV9|r?$@!!W%nX0^o7G+l(!tY9<sLn=-HbBNp){_y?J{<HPUOr!;kyCn;vy( zypjAC$@(W`uJ_f2|0^VpUtVF`FyYakc`ZgiCsw{YH>>C6c1KSw1^3Al{p}8H&*<<G zIsVNg#xLW~uWH5kh40+<TE9L1ph#AyIB~ty-Df60?Cq?MC*JXXCO%c&Ei=lxvg{jI z?$o#~0==OZrRF7P?evciz9z^z-PQe)-wqv(%H@Z5xK0l2lKG|0l=Y1<x?j^TeDn9e z#T$0}Obar5_GFK8L!x|A=$ex^^O^Vac}dME?b{l#Yl+^?gw2jpFP9b{Iru5SHl$@! z-4s8iOB!`4)0SpQO=7P!Qxm%EzQ}K;8~5{yWPj%KT`8}0W4ibsJEpHb_qO0(o!YvU z1v@R{=A7KMWq*Czo|VCIxfjBozjuFDZT=}Xa#yCOjBc?F`!%8e-^?Fh|33G5sPC)i zw>%{-3;h$lt9;ByZ{;N`zHiEjnt{tciXNS=bZWWgH^c8U`l5Zp7IoO9GHa?W);wo! z+GiNaEGe2Mdg-V@={Acg2OCuk#Ecq+IXaZTzMlVY`v2TLN;f+Wo%Ls)ZgC>GCe|)w z#xH|5Z9~<g+pWK+`RQF?pIN(CD)0Ke_-T&1Zj1Ik(YQ7@>Ueh7p8T1&wur4hXeG3| zP2fULt4r*HsdD?oyI6E9Puy31bnKJs>-s4NU(Nb6ZQ6+puPM5-el27Q6_%;?)wDgb zW7fMDPR0C69zih+=Kt4qu0O44uKZ%+q6O*Ai#=Y~mOTFH@#O4D_a)bl%zL?F;e5{s z(|LLm@()#<PV|$Uyj3LOE+^kzVUyE0zWty4HP5$5#dF%d<yp_Bcbs4exVru3!V^I) zcijK||G$Y}By!Se$(Qd|YB9`|eE6;`&`#zvLs_Jf>RpYL6qg;lXReg96`#3aooCS& z?PXsClVyHov3O6D{<K$edoqLNWd<*%JUf+Sy|&nLjqY>PUN5MU=Xle-&iG-^?;Kr= zSqB<xf|j{EX1l&V$iH`+&>i!c)7?0DcE^6X<t|x$lI3;5278I%J7Q;Mthk(eLac3j z+s*@@^A7}>q<(bNT=$-7fqDD)lOEEiM9;I`{h<8gv(cY?o^OY5dMnMkR>hh5`|%<X z*0srN=gVC>B9x@FB-ZcmcGr0t?icsk%NkoVYR7z@FtJDTta{1)--^#pOp<w)Ft3OC z=-#vCmAn_4_cYt5a8;D1T!~7!se04W=*!CfCvzou9DS>nDH$A@tYYqHpl?wB%4quP z6D6yqUWzq~E`Ij1?!YGA+WpRR=ILzCTFri8vf)?x1IbdqZpqw=_Bvo&{w!C*hH2uH z$$_zF%cYmieWvBGMyj&>m-8DL?*lSZEFaiCidk(t_k6dr?!k~A?~Ctm_B~viFrj|p z#CZP=%(YiH?=O-3k$ZK6Y*FDS)rhutKP{GebgZ5Jh=q^cdY$H>9I3QE1%?+EdwnFF zd(RjbUAbgotaHQcFy9Qb!$ps-Pd|40!_~_5$L==&n4C5JF~_U+!keN$XKzYrIjZ{K zv-$630Rz__+h0O&LaUEOYG30kZ7zMIzjl5}ilLd`V%JTVrbL;pI=nH<cFpsB4ROC^ z_#~vHdd^Rur1oFTvDV^cfbhlGuNRg|$#d_iH#?>J!zN4W=pL>Fd#8Jj)3!X1bG|e^ z?Uwk>o++V^#YC2}Ij&2R+2J|w$n2VsEc1K1hLTIJ7G|ep`^>kx96GVH(4#AY&roF7 z%bz=UrOdzX{=9$p$BNf~-d-&5SDAcnw`+m^!TGB`c5U1%_4YGE(Q>_=*@C>g%Pj7F z+57L?>Pa(K?AoS!u&(pq9MiP&X*qlD3*WwXGkftDx6^Z9oeQz<mP{==l*%{TT;%U} z&v#!651f5q%BgVY%#R9|{_O|Me|&xR#lGps*@(@T<9fcc{#v%<BIi}MVAEHwZ}#nF z$u878X}RpdV)py@9~7<Fej=I4u)as)4uA5k2SuiG^I5I@jGy>>b^VNLewkIX&*Jl0 z4{_Uw{=*5)*VoVWpMLJU>c<%id=J{^9b3#(cB<mvrv?A~^&+oN+AYDhFyeMmW9{Y5 z8?9oNJrL4bq#9auZ};b|2i!YO)^I+*JmtkZmZ_GEVltaQel0&Ne{5^{zom!Y^DllY z>|S!}?2GK@#jP20{}$|Hy>fHu#`&fpk?B|8A3ZYR#pI8Fb&I=?UDDeAXpj4%V+k{O zzvZtwcF}5W-#)Gla!c-RNS^cF(^GG6+1IU7cTYdK)Ml6|VZ7MAw{LbJpKe1Q(~ZtT zw>i$gFHZaZaBcek$uSR7SiT$#k!5hO5oEMBY;rWMyS8@m#f^^hFR^&r=O;72YWUe9 zC$Vm|Rz%yq-%D(JuLrs|PcfX8SNHB%&8(=_t~Z$q_g=afow{IGVPn2+R*yUT=^}ai zxZd-8mO`oA-{yVDJ0rK{bVs~&(rvbi@@GoVpJZNgtMo6p((+#G!Z*zdoq)ZcFS<;e zcg%Gfn^)^PwJnQMJ<cs!l&k-1r%7*8nfa;Nb2`tntE$Q#dY;{}S<p1-$YiyDSJs3k z-){bOZ)LTjYWm(3z3DEqj-+k4U~2DleGhN$;@)SEE!c{ByY~GF-u%duKVtnY9$y9H z_Re+3@|?pIu5|NkW&JG}^S&*;pj^s`CCgZ5w{{VK2lo+=f)DH3mMwUsQo8fr?<*VZ zCBL^n&i|14x@M;K>06$`mzv)wGQ221&b03Ox!SO11K&m4%qD+q<7Yl#>>StTf628{ z_R0r|V5yLr8Qo#h%po5W(<<-D^T%$NndN3G;=Lt2FuvMcbYK3lJ+H6K)6=?f-DAs1 z%R?fcFCA6zT-LUL_u-a_Cq1X+ot|4|5qBl$xyX~9Cpq|Lz7#cnv#9y_F5~NGroA%Q zbLp?HdqTU^M!yGlcdmQTZMLvX;^q~LEi7fPw}^hbyQ9@%wUF$G=Ps3{fol7opL#5H z<<XaZm;YSh4?c3<<4@ns?Gj<2C(oxpwQBXA;L6IYS9X;xwo6&DxaZ1(%PZG@R4|NG zTiT*3X)U+%<kw#uMTLtz+=|`UlLFc^y^AWWzRc&Xy!>PbZ^+Tl{0e^0f)}2=zlM2x zXvd=)io3pYn*6!5<VVEu=RfK<Y`F5}n|y?0&&y@4T)iA^tN;HzY}RE}+c){(<*r9Y zriG7J+MebtD%FW`D{Ri=<GIf%%XB*FN$A-S{Vv<8tSghxT!~wMp(^oyf~}F5(W%VT z8D@Tl%e;7At>?L%vtcezty<Qf2`N46ub$s}jaA~8M$_?$DhUN|R`1QMH#t^kERp)o zkY|Tmp?JaZ8+;l3$(Bp@mOOtMHE(mq9NVT0qbb>**%h{qQtq=J=-m`snDqTb*|XM5 z+9}4@LaSYQ4wx<8dtleHRr6A6#Pt|lzB|VmnAvUi;Zqe}WhlWcHCOO?x)Gzo^@rTb z4+;)^H}m_vY-NB{oZ`{9Cxfj1GU&9;e7x}G`k4(+PdJ*HcI&dt`dK-bkMZk0KL+2U zLH=GAiaoPATiz_w%(OdrwV`a{$FzA{($B8!cD%OGevTDSL9U3bkuH;;R1U|77l*6W zHa*(;N+;^$oYK9O^4Vo`!qXQy&HM8IcENAI$nPtAvoCd>JCQ2kDVN@S|H!t=7^|ZR zwsWo?HK>%A)4iUzX7{}PHExQ18NSU6pNA>m+B{F&TRHXEoLmz{PT$SehiBwo|9)fE zy8kh$R=4%FuK7>iAEYQNwdcv2V_Qv^Sl|EpXU@mD)x68r9ox;{-!9>sqNwpZL2<4# zuZm}n=d)tnUW@CI=@E9^*HoByZ(60W??^|)H0#yN+7GiIW_x_)_`Es%jh~mRq)Pez zyIis1Psrq3{l9NNm2h8sX}bQcMOQE6+VPZBGPRn`N->|SJ}p#us^|WEN1g?H9PC_v z^Sf<gk77TY*w2_^o3K*jZL-<7tO{98&&jsR)BX9o68jf_PTWxNVo_+c(1SR?O2-EA zx4CCF@S1V6o#|rIaecFp#h>L@<vyMVcWmdW)+W4}_~CQa(=Oe<?Fqc<=ReHIRpHNE z|5o{_iqaI3%Ujblpa1@IW3~F^J;uA%b)G$}zT~xz#hHp5EB@boz;t=*<L*~iEz2)W zVBY#fMy2oBo2v_0K3|<N&9R*CM!osI+P81s_u5Zyn&_cv`1FX0rQPa(bGTyU7q+bN z7M9kF$=NUaY1y(rR^|I-rbZdX-)G%%hVOXNl+XoUd0m;+A&--@WvZ`kE}l6fPB>M* z)6>&Vea5-Yl!D@`_5DkW-?-U7xYVR;?cQ!xZpgf;X3MYGGh6l3_UIlnW8cb}$-m}g zkG|S;&!?&nR(<~4bL7tR2RG)1)bVVSEBDp8(^ENZ{ppQdJ+G4;f|Os(fBVz;wAKS3 zR+TMBE8a))^z}<T+wnnR$8{|M1ItQLVauK0rkvceY;DidoCL9?)4S^4O*(o*wP~-# z?TJ5rJ*)XE=8_o`Hp9lS{Z*Ft36J$%2fzJ2ywmN&X_*-1AOGwExp$~9i(J!LYu;DB z*goaaEAbWK!L`rbRx0kQ`@hjWZ=U70Q@5;Fmh9nsFCP3RZr*~@yV*%69vZt`+9}Gr z=*vd2$0q|!)34nBn0#a2Ps0b&XRGC%%l%i?``L><uAemV*X2#~H}AK<|K4X66K~mk z>BF0U{+DEt=wbMKQNb$BXjy^F?*bp;ENRy!P8AFLFDGZ7U6Gl7p`=<u#<6I*sv$>| z#;P|N2NRvoTTS4T&ua@Tow20xUv>EBPah_3wRyd;f7wyd>NbNw)|Wq|Wb)oT+ps!v zdA3tY=CMt$j%_!vdzSF--13Y?jF&6VA1miS_3F-%WvS;3m+;-XP%YnEE+5jv(RXj> zj?F2eC;RVK{&$|P-g{WFclH&xgE{uH6^E~T3%@jM)HJQwV|wrZzKe~w*Bj5j)|$F8 zJ#gkNjZ?n-*=rYftgc#o$?3~-$DjRX65{EH51%-(PAjA8#KliGt%sjn4A8Io@lE%J z(vKz;f#sLCn#;z?xA#QrY0lVF9RJ2d`53S1!50Q6V)<W|aLNh434eSmM&w|i%Mpz^ z`=@vQ{+>`9Vt2OnclYG=$5cy=HmEO-cQ-6#;1AbZe>(L>m)UpWJwg@&XAbY#cyxvR zv4^}-6BZtKwVJc6w}UTw;=Egvq+TTF_+3u(X>VYhtss|~!G2X@N9jyfwY3xF40L^6 zJ<DuLgI>Ma&AoB0-JMhIf-&t?Jy$C;js9Bt7|kwLmgsZ%e&r>9YQGzk+K!zj(b2+Z z%a3VXI~mEYFZpii=hKN1#kUUMeAhU0vUvKw7Y%Q8XT&w{HMw_h?v0qL<^MIlu-%=L z+W3wA$%z=T<@?nhoj*3ee(js-r@qUT<nJ-!^fBtVXSvO3XWAhqW6pwUG6vyg!mD=Q zHx@TKIrmD)4wvtSp0dAAs9j#ZIdXlj$^SAp?T;pQpH!apsWO_FJy8*xwaRC)qqU^s z^J~>+(dmoN?_mET?|ZlZkx%#CU;b(BD=KY||66XO%73JC{jtTGRc~{mf`gKULwV-c zt&p_XI{7$XrTNLAxUKI^T<UuYYm2VU+miNp`jbD#qVLvj;#)l1Y{f*|bJ;5oS-CZ} z`OD5X?aRr1BkwxdNqRxr0RxT8TNysc`CoELIIn5{IO@y64P13GuRs6#wLo|J;UzEa zSk^sTxYNVK`Q3`ZjusX5g)`Ppnc}j!XYYzz22!h&8Z|x#9yqv>tF>Rzf5v6a$w80j zA1fDh&@j3G{9wk40NI=-)z`bP2wpX3oh4v0^Yzj|pWicH7`^j0daJorQkTVIx#7<> zrBC|IO$97ZyKIQvbtCuc3E%aKCHZHLPU}osvfJqCSyrayl6_jeX{)rXCVw<p{#K%t z_v1?U!_FKs9ff_audcAhZOYbtdhW^GAVs@5brwr`rp@C|;7~pDLLpF4jjcyb)3jvU z5h>-LiZ|plgl_hfzT3m@fA~TS%Z!RY9wIMv*$h^kT>bXgQ|I(FuSxrT#a{+(_g=oI zLH3xD1mjlr+KVp6GdIr35q(g2;-V!l!!kb0{;L)9wtJgy^UW5yZ2UBH#_zXmzHjC{ zGrB&h^V)((%NoCi%$@z2vteQFnnlmoiz#zunW#U`eKqURt}|A*FPOP<Fx-ee+*M<C zGn2t>v&5{uvuAi7W<Gv9Ldw_IwELZB`kI3Y8AnUc-j0mlu_$5t*?NPeLPv~*4426V zKd!pQVc7La%iv|t!8NhhKZqq2=O`vWd$CG(a%Sz<kNM}4oPMpitn`w*dQ##?zYqVS z6XfTrGROBM7cGtObv%7AF7-ef|JBBwU2laJ%lRoTw#hlN{1}6IebQ2s>*aHo9o$sn zas5ErjqL|lbu#MwvQR!&+bQYA^~~zs)t8<JGFaH8U6#(`-F)bQN9QhYfBWxtm)ai8 z>b?Eujj@RMfoOM;=QDgbQ?3<BIZyo9C~>&+-QgOspI21wa%W5J@hSdrJ3DO8mmAYR z=}b_Ka^SvnZKl`bgD%Fglam`_Kf9WGWIE=3_}%_--^-u2Mn|rB@UBZMDBN~b^O~pW z3Hc3TJ4}~`Y%IIQbYHn5^H@=1<;1!_KV;wWAKtyu?}a!2G@psxmicQx=W1_RTs(8` z^~$85OICi6{A|g;`PsGhpK+J2-b%mmGUx7&zP<O2pPa9H_ucjf2d_;$|BpXvVrSSV z@vgOw@!NjeH+y}2$m}ly87967;hKLw?P%|JKKE^Z$<NsdNsixR-^VkZQd@TUlU8J= z(ZzrK&u>n4F|!M6cQ4q(9(aV!uQ+|Z=&r(zovNyzO89Oa+i8)t==lTH68q&RXDm;M zmHxamXmX)U=XUo;{kuQ@E}O9ZoO<!K)st7TEzWd#H<hWsy}07>Wp&=xGgl|e@P8G4 zoiau8>URF*dk<$xYo>0Cjx*S>1-2GodCXD0`g)7$59=?lawz<-T2Yho>AGM246)wb z2Z|5uipZ|5nXcJ<eo}}@cv5)z;_G%dTHQ`XO;23D=A6l!bB|-}^e4Q0{^gKF+uGz6 z7wf+~<SBT#X70JVIGu&^wL53FRWE*GBmR-!vSC@|x03(tlDogu>3x@fz>r*Q+Gdy_ zKjo^)oF&d~8F`0y953ZKvZULLamj@47mR^V+3I#(TUM#?J=EOLa*6ZgRdS1-+xr;0 zot9g}x$A49i|UD0r3<>m>~xR)R=G8M`T@80?faxnQa9Y@d6_1{|H}Mv>U$qP`N<n& zpBB7I^NBX__vJf&)>Jf`d4@*Es~HMw7oGKgVNkdJ*mh_0qHPP`%Sq`;OaHB`-!ie! zZQ*J8h5eqtxAz~i|Hl3^_2K1`r&BvCXT-4z9DW=9hBu?~f~()=1%?X?gBt}xZ>e}M z&dk!v;TI3ORpx8{Y^!lR^L~x&-w)4yFMr<na6M!3hA(~oi=_7NUHQ;XP4-i8NnG{v zZA&_5ahI&@=1N#C;Cj8}pV%F{@^AL+cdhULHw?ZvXCHf*dtHs0U09&?`u*j0^&)@5 zr|U_+Sp9<cY!9z*Yre1A<h;cz<gV}Se}3CJ<d(bqrjCdEq!y+vGZhuk?EUTRaPiRE zyGxYM9SrR0XFECfW=X-%_O74r7JXXIa{127&ok8g=SmnRU+?~Ru1NfVK!J|0@2iP3 zvXo?J-mz{s_nLP2mF3%cs|?+fPP%P0<Kjq<wze&wc5{Z<jXf8?xm2sj{xi+sU;Fmy z(UT7^nMW^=Z#vGr?|$=ld#PfH`Spd%l(uzWKNJ6N`-6|(kAE*`x_;){_j8Z`uX$n+ z7vD3ZZ{nYaDdo$)pV=Qb_h<jydXdMqYmcmLDE0C4*dq33<;Fi-AH7_#jq|p#$n(^d zQ@%dvzxDG4_r3KoZVQ9DCzeb95|?$#++fA#_T5MN!;;$8b<L$wS2p}ua_-#OjP{N9 znfopp^l|bTIvh1rtrbgp9wI%@cjDYB^Oi^6JK()rb6sx6$-`UNk7(5GZR0UX-r(Ez zxmZuR?cCS8rB1aCZ*L_}KU(o6!QA#nu+ZM>s`pn8XRMy6mvnl`y1hm`zoz}<Uvl)e z^Y<kEq%{$uQ-8Uvt>y@*GCUl%ac$O$6B!Q+6rNq5acJ)ENu~4J`g&|XRBH8V&g4}% zaIR$P{0YL=kxa)so+i#Yb=g9I`-}A(_w-ligxb!3_?ds~uawQZu7ureF)`-vdTvzv zeYwpL<a;zi>sQXQw|%u@77I@QKD_4CaT8P54!KI6ZSG<x!n+-su52~GqQw^2<+%L3 z){4&=OJ?*w7SP?xf8c=AbMNzuJ=PZFbRC)PELi!~KJ?$rR1>M)7rTPbX~yxtN|bqT zaF^9!<BXF391Aiy|Aao6QqFkf`PWFpWu*a4{0m-L)yYI9e@;3T^(yv3S?e~-`|r=C zGFva1{U+9}$u?kdkKxsgW-=SS(qb=5%=&(kZARgWK#jXI>>phIo$<r%ZBi`ng)LH+ znqgb#C-{eMel~gIeQWQ)$rirH9z8gDWBms^*6QHp)9rbpn|}(O5x-HUoNv^eb@fKG z;nhh$bC)D&E6zO8aee8bWE=O>Nl&^r+q-<Wy)3)vV2YmK4lmVff$lQ3KW5I5N`Kvx zVQl(l4@>{qgs{VJY$L=sezt1n+@ket&7IVi-8Evu=d%s^XDu{6T5mh+iRis2+XW6^ zUM9Zyty|xG?%=DuiGO*dl*&ujFW-OR;sK=@>nA+Fcwj~YpYxiYUB8WGm&opV|E*!= zkqc+M%#uC!ZR%ANHaoM}mw91S@3w5G?PnIhOWEMxzT^<|CE0h;A8!8--tlkmhxKbe zKaCgL_y6^wk4(RluIQ+xR9&6_ma$I!@WD?8uh;xKcbUhq_f}GaiSC#CL1B~pYTNg% z=BxNAB9mP(KUJslE^FBD9c2%jRWGWX%rUlK#QU4!!LR<Ve`_>tU;fQ1l+$0;{%q~T z*;zBZU+vNPu+ie`)5uc3E}6H6m2d2GH_R0&w{3XmtCnTQTN%VqF6ppsZE@yYf5!U% zQ#Q{2a{DvG;!}NJl%;<#cAKv8TDL8(_pRBtMHjy8H8a$?AGSPhj%lh~?V^3zi}sy+ z5dK*Hgv^zD)`88^eDVdK{eE5AQ9sT6)Y%6`!L?tH=bzjD|J4tk)5{xjzU)r={c8zh z`o;&<Yxi93+Wpxm)oyYmzw+J_Q+C}c^_?XBvh9xr&m-q_{p$(w&2R4}@?Y!Gc=WJ_ z+xP2hnI%FsRTAFK_qY4We0X$hx&E>1Co`he?=}Bi{cTeX=cltGqSvQ7)}Os}=l=I| z$y{}r=S*Mg{N+0mn?7Yp*1_dWugxnvmT+DZli6P;clTralNj3vc9!mZw=QP3Uu)Pa zVP@^^x2K}ct$d#I$$M=}^4{$J?aXubtEk@kxu=&JoNt}mx&81@xpTIMzh^&=vWk~G zwqE&C#iw&75|XMi(M_k-4aH<6h4w`U^gmeY{qFAWVu>y1rOqu?vphN7_Qty2_2xfz zv0ScBs&+_;n11ZF{@i@-DZ0k{*~6?e8#BKJ9zXe9NuTM<G8>6WhE?sM&+B&B&+KaR zx^!6N;mc-U(dLbs{H$LKio;|yGtQeFkx+BXdCwsCSY}%P*Z(P(ZGV^j-LHQ8_nZ&^ zGhQ9nm*;T$GXL(s&^b|;OpYIC`Kuze<8-9?p%?9O@0+`BxNmg3+9<W~sHjKr%$G7J zH3d&?F$<i%XGLIcq=vse8;jMMH_wEw+?*$M|Fzf~&B7^qycY%Uh$-tkwmhC)n0@U1 zW}XFaUih57A-%!!bl{GV=DnYHtJ~T9SZZ!(+hkufse9eQ+P5mN|NJtXRVL42X*I=k z<>bht^W&GQTDhs5*~@ZUsnW4Zk7r(?(eouYKXWp@IDgbt`L@@GLX&rUgZHWE=^I~9 zP2zLCZ+kb^Utr;Uwzfs`W|JFF&ndle%%bPAYxk<QJ2RdKJ}_Ib_JR428evyW!6zKI z7~k_hzP+34;r=~M@lDmG&&+-A{IU@{?!mYt`~iQuRfA;T#Mzb6&Hb*@@v^>s;X6V- z?)N6mykGrjJ9D41Ny#dM=*3ST{8jxiY0iFM(f^Z+RhElAc3OUJ=Hf0P+nq)$KHKsA zUHAK1`M-9J#hX@FMy7WpP7Brg!l}f6c`e)J1+j0>R=k;IpckpP$u#BP7V9O<dpfJ; zcdPAEPqnd~lgc&iyj%1`yYjB`H5T2L;Au=H*4n%`njP&MZG`Tms!V-$?A_e&<|od2 zK3gPjZt9ww(Q2={yl$n;-HfxIX)@POMe{$Km(Y|PHnk>N=<I{VC3$ye+}XMP!FQFz z$EHUv@VdF==C4mo^Y6=Q_ZpR-(*5y$e~FoK-u=0^W&5f>=sT=oGoP{E;P1l^_rtHT z?B7%NX!=~M!+A5m8JxQJW4gbv{{Q3b{jU$+4t#02dE3<gQ~lnz)^{Ize{IJ;m5MVz z6rE3G*{fYGGYg45Al%b-=gXeCA-_^Ku>D93m@C%h^XHq`mjb=bhVdaWygcvQ-|X*y zUjAh<bFwsBz{f8WEleZR9-puEVQIT|UfoT3ZMFO4ZC6kKs43o18#Yl**u{|P*24SG zyXWP*)m$~1`Ke$tPim6!AGw&|!*O%AclRC(oqX=r0h`M&WPE%3#C<>b$Nty#cDwRy z;eP)M{J#8$rUd>?>%B6!v_kgA4!4W$jxtf*$98m>aeYzjuJBXoE&j6P_tcbiQ3hp8 zCeF3lAX+0d;b&R7<lM7Xx4+5$vi_54{>JrUjA>)5;Z{BIw@d1iWnLJ}*|gi?;L^D| zs()`YwiV8txiVO~V-df}ev6{dyqV{sS4`Z%_-~70=Qq!gPbM?e<tKAhzc-Md#nO3f z!Sl>n3G<|*I|>8u{*X)h@JF@O?&-0QvisI|{$ApFyzYRY=Xu40hOd3Jv}<mCxpU0< zSomqx53ARutLzYe99Him{Yi0|tF+$Tyu$|TUVM)+e3nvElDtY!{l}v8lKfSiRaYaQ zDAraiNPl(h!q0h)ij!Y2%%1D|;qmXhGxZ(oUa#hPch9VO70b*npBK*-eVxOf;G(zn zSi)aN%}L*M)}@H%Z`hN){$8I;Y;*FvFFe0}6|VIhSQ_k><S->c{{fHuq*Z@YBA+k@ zTV49p_U(zu>*~#{xf7S98C6@ot-fw7xa|5m*WWjP_AfkEq|IbDo#!;qd)Mbv&i~S> zzG^pN71!?>tTkI0<d-#PPRssPYyRu*2ma^ZcJg;lxwble$D$(>-J8DW=`=4@y?L48 z)WnzJQfF&dH%}~>71(F`_`?^0RhJ7K?T<8RxZ4Pe^_{fHn<PKQ-YVXwXVSEi^BRw9 zUT;v@`z-O(g$)}m*LObDRjqF-;@NPrx8QN$-0f>W?k?}s|8RZQkMr)2zeYc{RsA=! z=lx;+<av#*>%Q3?yjAz+ar?`^In6if-h?jaOei~=@IKa4>AL5a=a+hK1n`zLmzUp) zb$I>g*77K+AJ0~N{HB+n(tG}5&%qN??_Vd0yR|28Fr4{thEVY9!@RNk{K6k>*Sesi z=y22eM`*WEU*WP;%U#l5vOC{@+BqXzzHs-V-_wPDOmdmL?BmTXbv+7YGi!~U_dC{H z+FVnA=8gQPPbaGjblvu_y>~SYm8!G9?0O(#M$F~>XI_z?^p^iLy<xEJ=tlmHi+aw* zFF#et(!YM@{yh?}^;>-kM4oTA{CNMr%%AtXaq1QR2lI{poX)GMYc-PGUn_B+%jVy! zJr&P3rNymdyq3woTx9W^fcw(*W{)o&HTZKP;qwGhnPY$Xe%`Izds5-UN8TOM`_G*- z=jvCpUnb>t>&SyyalO}98|ohXc5&x>*)r8twUtxnoZWZ$sobAm>JP*lJAUWc2wj=( zmZ|6VYTc2h-)p`WL@)fyd5>pZ`!C_{2ZaaLS3iEgx$w@Be>?v(e&y&}Hp6wcm1>js zX#?v_q02d5Nxe@GR(%$=Dg8EShxuY(gVe{fnx<ci>^rc{#U<(ex$hkRZg8jO|Cpb4 zX-ecI<E0DkH~ro{aa+R1L#K5=S1|M+sbkq!{!H`7z8zJE56{fn@K5TFz3C~Lnw)c~ z-adOb)S0g<uedX(n(qhC=JIDOf1RIo_e)+2kJx^0`RvbslioO+8O(gwJ^S3gZQYI! ze0zRQ@nuMKs|(_BE1D58ef5p0Tcz*)Hul@L&2Z1Q!YMof3Og@4X==G-Z1^b5ap1?! z<?IJO*Vj*~p1+0B`uMRMn;EXH|B<PcY^af^#iCWU<I+pc3zb3lE~VJd+3_&5?5XB~ z7OmxWTZEFUq&(861=T-On)cYnV9r|B;`Y;5UW&&a`TN09v#_i6!lh*^+BTKFO8O#p zr9JSS<LZM}lI!E=<i0!NyDXxSbE4ES<%>O?=T66`ZrCQ@w?C8XmcOsN1%INTe|Yws z<;&jml+U~$dwHhWGR@>oFFddB;FHRcTHn9q^|6)9WwvWoZ3xx<wKwCTuVvw0ADzwJ zx2E|=9$a}_ivNb?Lo?r?qG@dF$}gt9yv1@#ZM!G`NkfY^>94vg^p*ebk|^{)v-?rX zJNXHm>sG6s`+a|ISnpNqOs*BPX6=hvI@en5@!zx<e|I^PzbAJWvL<o<5wo%SU|Luy zp0u@k(Ys@N%r32;b>iR0XEj;}zjF0^u3J=^e<t=zj<?gM-xe*!ljN?n)wl3>t&oz^ zRp8GoG7$Ax*)ePKF_ADS)0gqLC3|l!Ieyo_>y4R`#O4W~w)HJq&=-1V!Mj@t#Z5Cz zXU>wo^6JVf7q2&0J?_q&Rk-7{>iw&_UmM(C%d}6nOZj!Yxap4TThpDTDpr?QdVe~X z+WP*gsC3Bz8P0f-x20?5PWj4nLq|6#SL=t@fq#lwQzHw0KYG&L_54am#o6#1Y|`qg zkE?mNF@Ksb^fCSD)hX+bO}E|LX1sHv@(O;7cUfh6<;w5GpW3ItOt3yyUzYrD|GGba zZ~dIrbl2tWTyu3>wJ7N*on|Y}w;rmU>s~HmuXdNZTfFN`#*$498?GH^(97h#p0#C> z#l`;qjTiTyT3Q)r8o4I4>g4>kzvoY0=lnkJ-IaNdJWIu_7KpBUcHeE!>59Ld8Z*AN zGQZWlS2A}Qlm6yer^}c)l7)16_wh))P8OM~t+V>x|BMHEi)~gn*1lenf6j(I)9{;$ z)cYxOUavNcpJSCh|JB(IiAvKZ@vW_Uv7l;a$tmyW)s278zI^Z8l;m_!Qlli_=CaPA zhA(e^&%Ymeetnlsa>I;|kKGv-z3{hWjcMA)vajS-N9ZGeqbpOCYnsk>%D%flx9Y?h zo#l)Nj(MImf5w@^_q5mit#BUm1j&i<nQvr`Z2OnL-u7{F$qMcbJ9Qjo1AX>(CS~1q zt6z~lLESdkj=SJQyNX_InBs%Q2X7xQJ#pf~dJ*}_489Tl-U;3J_M0yM&-i)Dj@UV6 zf@}X|^Y63SVn65Bn@w7e^!c4F(k`Am-DmRBA*y1NDTisBan-almB$uD$sb#?th%QB zD$Cg~a_(0*uhBO=@ZsP;kL09Euk0ini_9xZh6kozp8w*<nnXvbs-3wP8xl?>-__x% zvi-DWW%8v<2fE}|_)W;Oc`EW;s&A3a*VT?*=i1qqYHIH@O}1BPKe$NI^=3$W!mY*C zlb8J!ayxtQS?!6lUwXC{>Zdnd=kEG0du%?>v=gRok0+PLx&Kw<Kk0dRlJaZ2Gm4Xs zS{|PERkr`oipZuI72eOjZmAcS?w;SZk^lLtKAsKJ)@1&yeUqDc>DUv-j{?a?stJ6r zPF&t*H><+!Z^iZEpw;V^^Giml@7Q7TJ*i(qc12iYVfx$1*=;Vt&69epc=n!J_hsU1 zrmw5M?%BTJyI)9U%#}=@_Mi#w+xE<D6-bz_w}0No_-#wOOFvsqT;?*P_<up)Zo|E- z`ht7*O7(Z98#%T_td(O*=Xo61{9}TNLAtX3iR>3KuT494uU>b8M>u-1{g&%b6xlNy z)_zR6?{)ouj9SqR{@9hBj*s8j7@xBByf$;P*z0F*_NkmJjn8&1zIVp5D{x<DZ*s@N zTbok?g2gQ^uKu=*_3q-j4E+x}8+NuOs-`sLuF7^eaAuqLvYXcudu}AC?$}rIW?9sa zWd9F}WonP3RGDsXRo_w>bN}K4-86%Pb`d<O?9!g0mmPksX6}BqI_uoy-3RTPU*FmJ z&or>V^H!|Tm9#bMYv;Vol6iiePrvb@O!SApax&E$_NaWa`L;*7Vz+r7?<Vzc9QT;_ zy-DIc$NDPk%=85ApI5fXe7H43-FA9zTP@S?TOR{dieq}-mv1P4UR8Ka-1hYT+Wef^ zK~A5pmTpsjT+6@lU(|<B4PUyIB&rY0lHI-Y$^MfWn-4DR+#|ik)}#7)s%gzdsnjbQ zj;rZ!4SM+TLiLR`CCyd*%Y47S&FY(NJahFmx$~=p7_2TY`LSR4f~fFG74F$v7TRY$ z`lxpJOp%FQl<L{e>6ROHK9wf$$L;-`cCO9%eS-Cx%@f5u9q-p=>xjkV`^}qUc6gTc zX4c&DtEGB7fBrT2<uUU|QRDAN8`#XW%{J}PT(nQsBChFl=yzN7#S%w8EZd;yov+b$ z<@1DZEx+#c1n++GMqT%Q4bR=v5%-_VS#Ddofw8Rr@0XgnN*u>O+^hGPWNq~0&0lto z4{tu#KUin~@8^F-mOn>08sv={77A|_V196A)v^uGQ_k*|ir)P1ibJ~s*Ts~JiE+NO zclE4Sk@rwm-@AOFyRq&Q%bt|E`(AurYiz=A*52RXZQSE$E}Gf=cacfsi<%JA{~J5& z>I@IdaXROHxv8k;+nd#%TmEbJg-526#~<e8vq>*W{h{zAA+lliirD9l32e1B=dZP% zxczR4)~&yp>rC{uVty^yK8wG%XZ0+fb@zqOeO@+IY>#Vdc9G@TlRMW5UpF=M*E^dg z^=p3Qu7gF#I(jvwm#L+ks+u3gyD8>Cb&rHl$${-GPZAv4^Yu4K-zi`GrY+a${Ob$r z{dq50Z&`OfX<^KzI5))~db0wG1EalzKYOn5yjS+YJoD%$?l+q^s>U7;>Cq_KST}RY z;#!|$x6f8sKH-a2d-|qM<nXt)X!Y-bIdVnqv0^U;x!qiO>y1Ri?fR<|v-0k`JYUo? z?{ut&m)GM+*-JfgT5)~J9?UVWX{W6Ae7fP`y=nQ(WM`9YFJ_%^Y4KSRWl(#du<%;+ zG5su)TX#jZO>HDt%sdb8v9<cw@H6p@EAQ90!OgDcukS0(X|_>685oxA=;pb!eZ^wl zWz~z8nrTe;Q!?b0O_Ox3DE^Ug@M81HUhlGR0uozwjv2k4xmNIwS|G!Hx!!vZK0j}{ zE0rHu`CsJD_ah;tx&2JX+n3evWIb&*E4;kwy^nXn&zwEaj(of?G$mn{^*_#K;^B{) zrR^+j^Q{&L8?ep}T~@H{!}D3%%bL`rFU9WM((nFQ@~!9PDVxkrdiOc6udQu->iYAg zU3Xmg@i>XaD{VFN)AzrYdlK0&L)F!^bjk8i<r9-tMNLy$EY+UyB%G=-Sa`vB*0Gez zb+;~dJ6dypacz~#cqA;obk!2U(woj(Zb&SM&{Agp*RXO`v8`5){J|-6y_>zulfoM1 zV$;HJ9x+(8;>TyD@O<s6`^T64tv5aH_AW_2<Xqpid3I0xyPvANCcNoR-&);t!i<MO zNrHD;gy?ChGt>Qcn`XUxaBz#rpRgNYjOR~%_PgT#?6tkn<@d(hlTw7Q?g&|%nw?}K z`N42jy|k5}vF+pM&x?f%&dL~^eDmJIh26gU%Zf#L_Pge7E_l24E;~campx}ajn+(S zUpVdMeo^_}MIUo&Z0BCK-PnKXW%Yx`_$9vU&+ZUke*a+MHTEl}89P5`9Q$>l{4D3Q zqZVx32X@s6?^5KSzHa53?Fq6y+c_3qp2o_w@|pyvQnJ+yrXtY?_Wr;AY;83Cx%x%j z?aK|OyBK<33i)h4w?6s$dzsqBSpxm@+qksmo$gyA!j}7JW@`S2GYi*6niNROIiy9! zpA5Yax8ACL)=`Exyk#fFrnO)DX2yScpW^rIg~ztuZ;ooZ*L<2QT4?fFiNg)A&N##^ z)Snx5b&82wSCIRrNsK4vm>%))NR=`@n7qeaZ-R<Hv%u+3DjkMz&q;{X^1rV7`|vQs zHmPFszR3OR62gxSo^5QOZ}tBg8=vI?32B8)d!IEk6(e6I^KYKO^2ub^X1#=6CA<a8 zDkYenEqtm!t4TgKr#r0FZFhgQUALuV^Tz3$53adizVX4V2fI%nSf{r4y<O60qhtvq z=Y6k!O%<%YGdt^a?g_7DS8gtQa3dsIck^YPkI|;Tsy}Qpk5jhT^f}+W-fq3%F88af z-wbBd&py0%rQ!VKE6s-M-u~FE+`A`d`<Ixhu@|R*)=`__|KY>NXUY%KE#Iwp{YFP? zR~F~YeNs1@D%YI9lp^qE^S5Z}^!QDRp??gv9p~qtGv%qGQm~}2SoWo#TVxJjDVgIt zopr`hw-vGbygn~9^$8RH)zR{H(!nVgy;ZoMUFv-QD}Ska-{GC1x%0}@Y(sX$m{!~g zoWvri6MEp=K8fRNcCEd#AYW?Pk)@N@PgwV<^_KLX$I6AbA3Wu_w)FGw>NIIi^V2N# ze>Z#bT@kteZPEhu%#-)!df&^7-hTLWl4mUspZVn{WiPfKZhp-6chT1wT5EP+^D9e^ zYpQFk;dYH~`_;vtUGt{b|8C`6;WY*OU(MNj=G>eIfmZkV7+*}6e71VxwZgdac`sdF zuG?{QaptT)FVkvf3q1|6-9Jmk;b!P#Szm>Jxi-@^KQ4J+e_Q7DI>nU9N3?ebK07C- zRZ%o8vAAgF|EFtg)m3?A)C2WahD!f0_TQ#3bJF@d&AEm9ay@I^-f!Wl^zwP<)jPwg zl<!yV8~@40?{_`#KD2b_^ar|g_J4a&Z1hX3>R;(9nUr68{mnC+KOSJ+V|7{anCJdJ z+w5T96Kug{N1N}N9I;KkJZbxB|D|$CxehDjS#=~E)sCFBI$L^U=W6wjDO-e+=Ra8< z@p7~L^;z2_YQIb<JicP-x%u`F8Rh@x?>JX@X5O*$>Kz|g7;+St(_2%MrIaHN_{+0d zb26P@bj9y*)4#_b$}Z2Y+O*JJIKm+HZ>@W~CG*A&7WHwnXZLn8CCd29SA0vD*^sRq zAeW!TW_p9Gi<7IiU)aTiF|Jhfo>#%a8SCekURq{sdP3gqR<BL#nYK8qyK{9J#dioC zaewsJ+GZbf|GBEdUtFhI)_W_*_kPz6X6LxzUij_KljFS>%VU-^p0nYV-N$W{sd=Jy z!S2rGZWb}^!RC!h`N2zl=HBT&DfBugrs$X9L8Azr4R?;WX*JKfR${Q+aHIF*@^6z5 zzcLcmdRGyqoW<POCskqkX|_yZcU9=Kz?x;H0UG8PCtizZs^)$5a7w<PO~PN1Dg1}! zPW8^+=kRi!&G!j2AAD!~Cbvd#&mG0uqHnhs?A@uR&HB>%^I^^Ii*Y3y8=Y_YiQJ4( zn&EZb_=feG#_z{Mnr_ZX@@#)HV@(S8G|$Oqlf+_7RzzNwC{upVv-ZFa|47#|^GxM_ z=Zx9&9ZnmhY+QKJvU{goR^2O`Wmj2$F~&9jxaE1^ZPK4l-iQ88?@Qfr|Ka1a3p~}Q z`7ZOGD0Tbd5>GSnilk$`M+E0qXWPj2zBX4+O`Q`LrktVW5GMPf`t=Q4-s$Cv)2BTR z+!)P~`)1aQ`<u-+TlVafkmo;|wASq3KaOdUw_g7hd=s5MtJnWsOQ~Ja(;rI%buXW} zDcAXUHACNwEAJy&R&w>cV2u;{V>Ijj{r}1zf9%~fYh&HXJ%3mym0z1({5NNZ{GILR zmOrU5dKY-J%0^gv*GkUUpEDF}=ADf<Wt=f<kL2&z?=e-`ZDG92Oh0HINZw)1f4^td z%5~+Y>=~<-mnO`#Hv1}QXtC%^m(o)aTXh57V>50_eX%;jbiTLNq`AxZQi|a!uDvIU z9^}8+nRmGI&zuWOmz?xlzu4jZtiGE%0tNHm%-npJKQQI{GNy;A#bLr{cbfT5DKdM? zpze{q+~?BUWxIp_zx*Nc!+ZJOwih=dmwV(I)e3c(`c2zB)B5{<lLtBMHuKIj3jbiL z{b$B?Zw~toBlBN(e#|gEx^o?SrmoD*lPiUb)2-)xxBGa0b+PubEuD53e@|%YoqVZ# znWq_VLAp<}Ftf)@mY8Lp*(cnS_cQnB#T?&xWoyX{vk&ctzHPBn)}AX?QYt$YIYIoS zLMj7;0)wZEV@SEeriO;Hp7v`^R*t_X<QeJ8&Ofrx;@5=``CI4olXJK0U0!VWtuWiI zYR00%@XV{r&H5T5UuW#+X*hZH#0LJ#(@bR&*Ucn2Vv7#ET(xDYvD;?#6~c#CC&@I$ zmi#=PA-B2F*KmfcR#bLya#{4!f&~Y|OcMQlv#<L{eO^<YWan_z%IEEb)3vAACePZF zu}Zwi;pC#3&0WhwYJ4J6^lEm$$hr4?0aJhbg=p)N+{=8Y-_+<VKDmj}L1GGjY13yZ z9sPsTo-9>zd)WWupm$SMqnq;ACA(I57KO<#PrtNcuTYe`r$Q~`yGY@iC#RMar_>(L zoc7))^8x?y)mdxLWo%2o(Uj=LwtBV4dpn1nj2*X_R81W7RxC_zn7udayk_iKTl=}W zna@r}iD;~=$q6}EnBcQ?^9+XByHDHBHj-;{jg!)>o3Sd&A+G1Ga>ndykBzdUgf?qk zzoT$}p?_9JOSQ(WccmttF$!rnI8H6$+G#$c?1XsoCq1@_?C!6U)M^g|_P*6Uk+|l- zX}<k?4sOpe$Ugse@w;x%%MRMR^1qh8xgVRe>le$rD<{6K`Rn*P`gc4xZ>o`(M1iow z|DF)eyX|JL1l)T6`Q#YQ`{ZA)nthg;=Wh3EJxM$N#(CE_N%ogNFBBJ;D(>4E%sGwY zQmCnS&-OKnS#?q+kDf%$-r8qtGQl&SS1&TXYHsi2Sx=@4Fo`LxUbrS&*>2aOMDgV9 zoiWzM+-l<8hoyAnrpVp7`_$OL;$m_5l4r+xYB}X1d%d(C%(uGCdWrYe(H|B)`TJFL z4o<)HVQ;YftO-xw_^dXr4G)f=93wLAu%*m9)_d8>uUlvP#`L+YXS&hH_BuQ4(3ut5 z*Jn>$w_)$f>mRs|s|maib35}O*4F3d+)br&)f=uKnm(iQCTmH}Sw{V;zEjS1vhFL+ z@7$K~HfgO0|55#QZSULiW%qOUMx~{%-F5u7+?m-9+kSd)a2NXU#4S43ZRKngkCj>L zYi>W>#ozXAQJq2P-1BdRzG%l>J7Q<!dv2HVZ;2Ok1t+!(#V?v$c+_oY*V_`Q7u#g^ z>{Ywxl)lnj`FwM)<MT}>_v~5s|Gj@s)T8)$Zs6TrNiLyEA(fsw!OHb7Wj1GhJALQp zF7~6c()+CMD_Pt*TH+_5y5pz^_lpawZ0<iZkbI@K(W}q5?Xbz(_j^|xep)yG`0)n) zxrd7zFCYC~yyM-n-%-BLBjomOiOB!hGd)lC(#ZxH+e-6B?imh^m#6$(V|kl_?eR$l z2?xW&%nz>o`~SoHHzQMz)d{5oZzbQR3x095FMG4|=2w-sb@|EjtrXajw&=Kh@hg!x zjONLkY`Z^Yo|9W3^TQV}7Uo7KZ`jEiT)t26jm5oR85^W+)g@~~BUbTTQR2+GVZB8A zNqo~+C9f~H@BaK@E*)iI`S3o+zS*BSUNG<FD&A+`)Soxy)=sAD_afDvU%pj&^5E@x znrgb<n<rGi-_dC66Sdc3z4m#Tp9Qkd4(?bO+xzUp$;%JzKbmN9sq9>l{lQUrujG9B zPWxQp%NcAc^9`<L{BYQIxOB$($Th6;?AknCPw#Ykw#DYxr>tSWo+)y(IjY(uRPHt3 z%Z2B+O>g+_SO5CXvxMrYVricr>@WCmUiIU9+mCt2o?Gsa`lHOQ+qD19-2GFJ{hzJ& zO6$}r;UlcC(q)^1!{-?tU3vEgU+U6n<rO!j#EtFt|5%{7(!g9;C~6-|s`<XZ(Q5w| ze-yv{)Bpd{&%dX;Xu8#fUo6U6A3Ryjxb)(sS1e0+ZAxsM_EqlglXo}SF3nrzFx&3j zdkOab!~Q>a|H?P<HS-ES_=s0e{Ktu7$v#n+89#DNW1hDD!}j~Vss4ZJ4C`JWJZ|_U z<fO@6u8zYi_de1*A)Xw^8+4)k1^>mL-<D4NFSe&Fy-Ypo!?)^!TEl5aZw7sMcxrQO z)rMWh>B{QU-z<EwZ|32a&kH8&-})n8y?lxvU-~^6edd7GAKuQN`~C3F+EaVhoyxy^ zUoAJ~^}%0@d_S#ajlb?!^X|^3B|L@gFZ<6Kl~3ERs%P%;zV~;1Zq59Me}$efU#oAw ze*cI;Wvp=h-$|f(#&6*jcZ9t?E5!b;?tOmmLdeR+N1E(Zw2n9OM7uF>Q*SQy`E_Q; z8K*awwSpa_g=735?9Aqh^Lf_8n_^_KB3^FI&PU$M*Y?)(d6moYf5=*MbVu9Vy+UT& zJY4y|9bD0<;n})lTdvW;5?Skdv8}sJUbOQ+k2N*9yf*We%wf&@Zj0QEbNG{rXMW+8 z`n<7|cWU0c%(*k?{3$mSU$(?#&uP^icctQsPjHx8=JNfE?C~zHTYGGq*}LrYm!5_d z9(9}NDc}9r-}}gPx5;6{6%QQ?q!=ssk|r3C%b*K65-rCaLGyWX$6KK@ocIM1Vg z{s$9d#=T|#Dzg6^zkcjv*vvhFP8$EM)a(pb{IRo|Ui$Kl-JNFkz4o(hLY`TA=&cMD zk^k7|Hs6Qu&~wEaNx#qQl$3W)<je3bnDLEIKCrRG^nUQA&tLD&`KefCF1$zgLsUzo zdwag@Jv)KJYhU-wyw|go*Q?&l>sP0pJzvB02_`GgR;|A+wdcIn0S-yAX^T92XBKry zAA6mkv&8fKv!o0AyqT_EOh}N*S@Twrb3U(|cU*{r8vnIFlc&2(o_B|Low%afck|@> z1rb{g-dWh^{%|4NeX+lP_i`Mucv*Bhaf0c`^h@WrJTwkCd&7sP<)>nUcKY1*%ZWPo z3ax6}w(CrL@TZ{Y;t_Sxi$9h5XK!`B{OPfl?ANpGKLUGBFdbHAudivI&i{Oy^-<B+ zSKHm$j&6A86aV0%>D?%P%Xa_O->%$CVajQ~S+XhppZ&IbC7$b4PG0&Qa`xRLZ<dBL zr`|pKQc(SW`a|J>mL~<fthJ3dw(P!t_RJLfzMYHRTK2D!?&R2UKfC+Y#my=Q^bC9t zI&R4M;8C#lzzxZ~7k}4hA7=K`EV=M!0&~^AmWGqdo(0Fb+bU)T6z?oo$aea=fR|~B zm#B0>R+W1--zgCrp9J?)QW84aG51qSW;3_>n%-t~dHb=*^Wu`N)m}DVSJj6~^39uk zBRk~7y0^7D2k$JX6FRY>`oggVHBF0Ik|*Y${I!_BPp#1*nkj4}UyZ27gtMKDvrNA! z`OAA3{9}#smhm>wJ6ONdY~R^)dpC!!UfHHm+b{Vkv19c)ExB9s&wsy~H9an6Mfk-Z zr=_-t9xLCdvgdm1J(Z&oU4dq%+cMugh!NF3E~qih_{x=~8ESL?-Ix{RyQzDo#6gD% z$J`1Z?@Or@S#EizdGpQ#LYor|cnwb(pIyrTQAzse6@|{fsdE*h`t5F<F4!$GJ;-wU zF++*_MM?8{`;M)2SH3g5IA`YRrvZm9-tE}BQSRUzt>-s8wjaqYuE|{@<)eHhbUtVP z9FBFa-;XL=Z!ce-@_73D-u?ft-MIfC&n>ca+uQvn-^wfg82tNKZ+dEPL6yIORCe>j z><?}qex&?4@oC~Fu73BYfznTf3JhP_uJBIYlwfD+e6hBwMMdWSH#LP1w^w}s_|0?% z`xKcZw?78AW^G`)9jCc9NyJO&^s6aTw<YsGHagtiuH^Xp!kaLu{j$fN^X;gSEe*TL zb6aC&;LQhrZd&v@W*w|<yMKRHTdjHWue&GKPE6-z+Q#@MYmM}o{$p2EMDH0-$#1RX zzNemCKYd&FoE|GH=dk?kksfRAIZm+A($wAQlbmg~&2^0)e}%SIN=`vkagz6qc^jVG z*?wqk$QrLnWj|$N^m{LJ^xysQ*Zaf%>kp>%u9v$~sIay-!uV+O=PT6<cYdfXxHc)H zUPWj39_3XV>)%c~ws2E=^4g@@^Y<*A>NMPgLeg~#_O9mpR~*tirTWeDi<$qowtV@u z*09gbXTqjp5lM@AUB51r@)S&0(e06%+VX4boS5p_0ak7j)t77MRpl04IM}@8`Q2ZV zD)YIkzg|rIX#eNG|E(CdxHblVtypI^whN2D`z${pY`Mbr*vkK<P3palmuF>NH2u`1 zaC`FmniVsnedQ-D;&8C~@!(o!wP$?T$I7;Rdu1kX<4epomd<=R2H!+{(p~=ZKizOl zdE)kKXA78iOFWh~TE_MA`g>lv_XkUP&&i$f^ze%^o!iNCvS)q&gCBa%&igGIdm`G3 zC)|yc<6GVJU|Nr=$z1Qfjy1cYx2vDHIPs=|@5OljODz|!FY|O;H6g0MNaD-${;eM$ zhgojp6IEBfS7mtX&GYA0tlo_e-#u~lJ*~`|`+VvmgPsCAQwc5a16Ac&h40v7=9z3= z)G>8qhSmiEfu!=ipKaLQ8sE9!lPSElP@?zcWWm6d|20MGYq;BjlOuWdJN!x0IlJ@! z(vufvh;A;K@o{_b<Byg%R)72*KlAhaS(|2kSF1KU_We{|+xkT_=DusS&(r&`oLO<E z*4hWNAI3{nX7Fq^vSqvGad*4p{lk0gzuWOj=<Eo89M=0g?Z%~*myI8Nv|M!YsK4;M zDC-Fqo@!sbXmfelqP9;{=ljgPw%mGShP`cO-^bM(>rTD#Hn5YLF7%`RI?Lm#wpzYz zQZZeIrj?p4tdC##sHaPa92ZVp<D9IiHS6A|hWSf$@0~ul?ZAxQ$}&0Lq;SEQ=Lu)l zojAxdPy006@mtr64*U(1WKYk!wOrcq-;%wdUCTN}e!QOjMEtq;BA#R4wk9a5IhsDd zY$NpeKvg*N-#XrZhU}j`KW5+NJFI{1zPqHzJ+UAE)IV(f6tBmp{&-q%QE2l29~n9I zVsHL)-dld^o9e{kR6Esm^V$0JtK3af?mbK7@qc!D;S0Ggjm&xTE}L&;5t=Yr?TlAS zL*kkxpZ#{{=@cik%6X^l?)SN8s^x0(;RSn6b;_sy1IpS{51UwR6imvpF`GWS?0Rb@ zmtSye@Z)<uspU$qychqO)8L<IVB-7V+49{=^Fn97bH#}}WbRB}R(bnb&b$Jl<tG!b zKUr#%pm$-@!R3CprLCssi+nxDescY(bxJh~385RS=SZ99-;qD|ajE%p_8Yo}z85uD z+s{n7Hk0SwMbj7d|MS0}b0~7XS9x7GTI}$_D#n-2hxa~Q8F+Sw`SauUYRCQ`e){;L z`Rz=fKOZw}rY#UtET}v&XT9=gOGBQL`dRaZO?=M&n9-zqgwM0N>(7;yzaB5}{8-4L zQ_PZf&eFo@h?;Eu?Js+dIp$1!cIn4&C4;5U_<rQfdLqWZt>BcFZsN%cVafL%7V&Q5 z$Z7p@_U5+-FJ`^J%<^3LM`ZBxs*b2zYH?~ax-^7#D|n^zs`_r}pUo|@So~MVv3F-@ zJU_55G-z_3Q)FYmFKbkZfa&g6`>S6cD^aw(ds*<W0pr?0maa3t**WhfFNxZ{M61W> zz;A_sZQov|b2qxUJD4QjYA$>x>VIsZliu2cFC1qjNUK=R{#9}}_Up;Z?uuW(&uu$4 zM?3G>;>@hwGtTIyKY4ZEuS)G^2<uzM_n~hVSV?U^`(WK?i&lq~VjosGb{(rYz!`kd z+g`Zb^7j7xV;{0ptGU0WEjhe3?bnozp@zSde(i1Us^+@#zVq*dBS{8-^ZnemR$L9Z ztTSP~<ehC3u9+V&x7~jC3txMR(K~7B(~BO(O-`F@crTUJ<Z8{!*k2FIR$M%rR`W|_ zeQmu=QJ{V(kN?bzZ9cjDE84s63O3&8&a{0tfkmyCDe@A_`{~CDGw*b5)bsjXX?@_| z6-j%ZU$VJb>l3|8ckoZ>GW;)KAkMtyW(0Fs^A^r2vt_<rR9QYF;mza+d);R~6PvR? z)YNElAp7;7(JwDaPQ8<Sd4lEy_SQ-EyZA#cx)hyCnt#{1;bw*4gQ9uTW?q~3zdu$b z9Bjh-%jYYDyvfIPwTsH7nzydlc4n@V;SPz`>cArJTc)NyazC7nHvGP;87mhao#1+y z)Bn@;ldJC~zVvB-!&Ix=Ju$Ls&5OiXr3<gaRTU+VGd^8tb&36I(6c1JyptQbmhZXD z_T#+a#<gwbi}|x1_nJ;SyJJ_xtZr}T_v-1hq?}i65q<aHFo?@2cpuAK^9Qph@3;E= z<Vx{}86|7#@6XvKVP{?cTc~I8EBShDqs_5%Zt&i|!mjK7_;&xHeXPZPS2*8QKb+I^ zeRbi^1M=Eu?4M+Rys1#v{`UWsS#$gj{#k#pgzw)j^_lP8Hbg4t7DQ`ZlbV0N^I`p@ zwEFnj5sr+<!#7-;@PF3Fx}s(GCmlF{_d%LWdGeXN@o!{~tndB1U#hbB4Pz$%J|DNA zk8Ii=tamT?ubh~DfcI9pWZ*wrt^M^z*F4=8JZAp3*vY7^yYS?(XufZem+#$rDtzxe z@B7227dF3WtFn;^Gk;ebHGlTGNq-V!^w@u1xxx11pYG=$a#NfqR%T9F^59Cs8{h9H z67%b=BeuKTG0rUBC(9n}o%GB%YfGQ<=bzb6XEeFDy*D-7{qE9x)f-w*mVW%1H6{DP zx?}y;9}?f}=3#g~IneLiyrw5f2Gzyy(hW6hgdIv|Ce*$z`gW^!&aR8Li!Zh%X!lK5 z$bH3~#cgvWA@RatD=*>GH>Rw*_(xN_W#j+2$&oXEeXiqI3EwZXwfNWWHS_h3SDXIw zXE^X{zODMZ^Lre&KR<G-YVx|I{fS21PQLq7-<wZ#6kWT#wAgg<!$|vh=cDbj1@&$v zcsZ6RH)l*(G*O3>*UXSD>oWV<$-$Xdd__Fn_viZ^lQZ&N%<(jhWp;0}_~Qf(gBtU1 z9Iq6=6wm8<Dssb8!&Kw!M_JLCwJPz8K5jhapn8@`JL>Ym>Yd?jVpHCTln3^nnjE;$ z>ByvIo&K|S9`=4Mzs$*I-g}igvAG|GZ4OtTxfa&)>U}$xak+A8;I6|dAI#GvH&<|m zz3#ibTW^64R||uv?q%V%|CVt-(C}xk44g2Xx2>HgFze-m*29bYUlg?^UV2)|{)*q? zy_)lMk(&E+`)3<2IX0)q;Bj5>L5n#Hc#pl`YiV&=qWxG=(JJZ7X*vgvC#+fg@u|Sw z8<X^wzrJS?+dShaSAyXwS63G<#T1D%&WZnYetle=`f9%N*9(X9WB*SJKL5<bH!gj3 z0BhZqTQ46>-n&fTV%5c`_J4Kap4ogjHDmp~jdTCyWp{|pt}ed#OUW|qrD5i!2fJ8a zP6>Q7`DMf7j7yPu1}$gu;^L%dFUo#qX*k<3DdN>VuEtHvb!X^u)<i4_6J2b|?UJcm z^;mVw<-3yV%D!E`x29cNe6_-@_fuKWt>aZEA}hAJWPVcixEgWoSlsL-ng@2R_-Ge) zQS~Xu980-nH|DbxH|MKgZ@gY|pm%>$YI5|$<AOE&Egsj)&fMe~J;Unh28sJwmsIwL zEV8&hyLi^zVhLyYb{%1TvtXx;+NHtMf8VROG_5{w_D<@^oMy%Eo;6(OoD-$^vh=p7 zm|x>>Qk|p!Bs}cb<(vD%9&fbDojBQAu%~(Qd95O)g`R=)5Ad=Di!mo@$0iji{GW6u zZrK{sE$<eauV?$=xsSy}efa|uS)S!{RZqqgnLhvECMC5^{no1+8q-?dpOcxSJtflQ znPT^`^t<s3LKIG){d+@Y>I|>sbsrLs)v{*!w{JY>vuS?C^4WO`{#iD`d9&(nXE)s5 zx>l>IKX2Q2lThCJxP(*j-?>r?j~dIJ+kRA&|M6+}!{6L)a;L^ees{B!a^|y(7y5Sk z$nq0eZ+xByd(GW&)!v!AWA?dkbLL(7#Mf7%8Or$RC2OGRQfadeMU#m+pE5nv4jc)b za>Z6s#B^iXm-ly@uBd0aPvu;^+o8?Yg?rw+Sr^`&-Jr$(D1FMyj7jTunwnkGUUh!6 zTAM%Hj9ezwqDyxddaepI+jt^q{+&rzcg#DyL&5FjqhpN+z527S#)d84yo$lPCn)qp z%SqOoyB(+7FJ{`anb+s?8^O3ZA=ZoWwKZmMcKIj2dB1di;rR~V^>gRldF&tk;<I#D zz1Fgoo-eEIXG@50{cXj;{YH2iZ_?Xcce3=~&vD4kFG;q~-0!(hvHf?U;Vb8Ttd>^Q zZv-YE;%huNX}YA0Tij8%ihp@AzaKh1Rz7ItBrElHf?}M_VmWiuh>Mal!$Mcs>(70` z5&e>P<tuC12gTEEBKn?7c$h{73%*{Mp1Ze5pG}@6`Rcz8mTKN(&adBQR%Ei}UJzKG zX>jJ`m$<kh#`iip&TB3<9BtMtKbCfR@9cSB1O8k08Sd1$toc3j&g8Y}j#8n<Q=H3h zK3UZ%cQ#ca{Oi5NWtTVkM!pIbTKY@UcBlBvAF=Mw6ODB8R^-)QV>a}7efJ%2U&1Y( zw1`byAJb!VU)ZhOn^|YXcef#sZLU$R*oubIG@oZj?|fSH@OWRKztjwgsvB3gT=&#h zWmsxA*<#J_y?^!`j^emu$=_Hlocs6Ll=qWf&NMB$Ht+Px>yv!l=DvwKz2JA@yx9@{ zb3ff*RU^t_`e)h|`Iz>KpKOL@-_9=htp97D>@zRx))!a0A9*sbZB3p&Q+2IjY*q8* z=E|lbKHK9BwZ+qRf7Iw&Z^M3uxu7lj^cm4}ky|g!_Z9vt<Yr}^Kbf!pO_ywmd0hza zk-n|c7iD{Y|4rEWR-(WzRbp=Hik{{|zs`(B50-Ps#4fnH{al;G-3sr6(OlEcM(nDy zF>kDT{N&Q3^s8}?J*%H>%T|3VBBO5jz3t$P^<58hJcXaET`8Bfcv~^c2gaAomppy; zS@Z-8K7RQte8ba(T(+AYo8L{CGWEsdvli=boj<-}>-|j)ClW()mqqPx6n;=Pi)G5G z8C$AXS=c^Z(dhYmf9|=mBi)743%{1F>)mK_tze&Qr+oEN*{;i<5ANVO_Ef9CVbx5I z_^d|{t<<Mq^GLp+p|Wesl8oHxs-9LRtIeXWpV|2R;n$TH-8|3So!hVW-qQX4&0YNw z_n6Y|&J|&KqZ%<g;&yS+BzI|+Iq%t@BrW;%M)b;ivCA9QhE^VRnL7PiKq*_;kzd>? zEH5ugvPJIo(p8+9_aaAQ;a=ZhU6HvP|7ZP+@A+3}`Tg{p(l7QC8Q*7oyX<>mku>{- z|7q-u1*uZY;~KUtYd-HBxzwza?cK}g@2!<S1cWbfcKiRgBX3KvRrUfK$If}-^Ig85 zY`$<vuQ2KUlR8_uqPh07^g8EEJ?T9u&^xlJ(D2c<z*CD2(;rvyemnVbW8mS4a@}9M zUM%XqbYmXtv)NL|G!m?JxN9<}-juqnxj8-aWc14`@9PxoXWpOqqN=ZM=Qqu^uWkEF zr!^$s{ov(V_T{D9-R4rxX<G$NKV00XD8V*;nc3+t=VfCBc28_eFf=q;BNg1d*MG;I z&^K%E_f!>MT;UVE;(K|-rcbj!D}BF|X8$tlSwi!Rj!cfMw%v#OgAdRCnBDyO+K*d3 zkFQMp-5@Womz&Oe?5fM!lE-scB7D4+mmV{h-x#XBPU1~^MRcgdvUTUXg?zZLoUBMm zmTg$6d|htNbFZ1rD|&<TOp5CaKAwm?({sU1#qpJ!)K!(kC+2=D&xxA6-sVl+!KkZY zC+>Y0vR(FOr>oYb`s3%-4$Tuic;SBKm$nV@C)lkn>^V`hR@J3e?&+nfDR}}xuAyf< zjiwc?nE8<{*znx66Ta*L>oemWCYgS?dm}u~PT+K)=k9Vz7xt?@?C<87%=~51^j7e0 z{(%jQZL4|K**Up2q#W&)wY<UkcJ8Gq-n|*C*D~CUbk6uSM_AW8eY*dp#e8RXv^`Q- zocVT++wvqEod`9J{SwYXs>ghe9*r~2`=h;b!(I7v71K1I*`#dJy!!Z;=njsUjq8?g zS#<2r%A2P-UrhP?<l0%et$amUlS(2C_@;i|VH}xwd(J|hgsERw+<A4drss)P^MY&L zGv69$+?y$Ku{$c`XyVjmYrY!axGP~h!}dhz#98itGiRABUA9B#v8rLmvh$XFy+&bu z0nHCsW}XV@*=7Cv;TD5W7a}G%G<$fi`#f1=r`WH)T&{P@moEB-2ESC^sH?Xs-y-^| zOW}>)GUL=wVZKZ5u-e^Xu~EPCx5vl1-&$Jga75?Ajk|3)p42bcdSO*L^C`arnzQ!2 zzBS46_Ad3l{0Z_!sqw2m<{Gsfy(!QBcJZO(tIBOGp3kZLJTXyXC!e3((()R!^}1Ww z7H3AyG*eDJYA(5VqPeI++?AMWp;!C1ulryBCFy?a1LKtwxBn~Nb~yRMtqFzKC!2~K zS-0}$zSTSC-Rbbm&RlJvGwYL!*(uE_ta*DjH5Bu<vD-Xa={~jnv~kJOY44u(_H4bR zc<t(@)eSQy%`hl2NIAQxr=Km;wC>9>1+(V8&3>NgD<bRpY|AdaNq-zZy-tL0md$jY z${<|<#t_D9Q_r#as9AP=pS8@tDB9tr+QL&?-t(Q(<MgRq<a=^gyx^ze7rkqH&Mx}D z=Ed7}`+BxX-;VWlGC3YlICr<>nreduUxkjmettde!@@TErRTO;r8GtDwm+M4%pltQ z!s}9oER*Mw>)!XiT<ghpW3Nk=Mr=yXD&8oMStcu&)R_JjwBJ8}=D)jT90rr_MV<Y0 zp~T-+Y(c=qy;0g*4)40N(th8qtzZ5co%CfmCusD!TCK<>|Hu5khyDuse2;g$H0HA{ z6L=l`c+q*8zyJC+h%*Phj>wUJ{b{nHWbUg@OVOOEndzsQuD=%fRI))qUAer{)5LVS zd%Disi!2JFKiQUCvxtrPr}}qKP51m|IfDN3tN+DTuMODbJpJ=l-5cGnI$qdM7Kr%$ z!u9WGYgG~dh_t(3m(Et*Rr>g_ouQ4GVY|#+{huN-u}QO;lU|v+zc^>LN~ok@hMHks z(X-NJ5nQ(xbgz4prIx>Y^ZlpG>}N>n&UWpWi{1KfV#wihcUy{Oq@D*awR*$v+0y5H zxanZ?MUng&yIhur&gIqQcG$MjI4<n%$?TOf;T2ns?6XJ}z7RFr;k{x{A;+IfE0$UR zGh+QFXA|_H;=ne`J0_uek^AfSv2H&2T|y%2;ogwBp{AL0eJ0%dV%hKeUQyQVcjA^u zGOo<sxtVv~x5{sC-4uTB*qQ3GX$8|(PKs@-(m7`0_;1bL;x|?AFXz9C7h;^f(eBUD zHCbX;Qo7jY2w$81I&(VD3k`#?pW0U^AJkF4`dP*D!^c=>r()05ZIbVFZ{$Ca?@ctm zcfa?x$_I<^X5|(4zf?XG{G(Ek<6m&<n86A&S?lBq{+X)%lZ$6<T^1$rbwXjWSMTKo zH(t9hZ?8`O*6R4`%Ee^y=EB<|yqTf<?Pn)l&QFektp!M9&pzT@*ecIosq5lu=bu+& z$$s5?>CD2Mb2ThK^>4m472o`%<Wilw)XAo)r)rCWLS3G2HLWrEw{ZoZWKhE9jk~JW zW=I9BWx0Ik@1;GPD|J?^tKXgD>#03C$!7BE^|FG0>v`ic8Co1}Jh7^ezT}`#<(usJ z+%<3Sf7zZ#yM9NB?wGLHdy&ucZ8LuS&0DPe>u09K4asSF|C=|~>(7|STW`+zhW*;= zgFlzcuM*T3P_X6Yo|Kd`skCa>!F#(ZV>wQ4SX`L$Te2`T@bf(rM%jSJ8ucoZE3av+ zjSs2KyeKL4*me3!)4!E7xRkk0?aR5ebo=Cq&jpNTF3eeUXsztt*#)stCnY%Ub#1&8 zTI0?o`9D=dB01M~zWI+Yc~^>)bC2!HdUW5+SIMnu8|!D8J24s6A*Sus`CsNqzJKU+ zVE*Lj%@w&5UbsrWxb$MZ)8(+qt6$ZwU*mn$%V4&*vx&vw6=^p9dsn^}*>*WCXK@Pu zw5FZ@MMYtsEARLG^_Q^!a?X^I%TC@c=HYDfZ-RR5CW~%!y=6?!<_R`8*7+ru$#E?> z^=(OLG_(J?pZNikmw9c!J41cu?Vk1w<LCMU57(Hd{|cO0FT?Y`^RQ9i(|Pa1p9luD zHu<IRxPIie{J|d!nYW)4*gcWWV!!FWKUE(d2S0wSe7Wv?PyE~uM-msA*k%4`beMgu z;^i%l*q+yHsn=DrJdeu%H8NiAt@Ot9Y{BE@hRftkxB9!s1>d}KlQ~JAyD>lDPD+jV z9*345wfJk-Q#db%PG)!R@4M5rW%0EKAw8$_cFbOJa3yEJ>ohOj1FH)o3|MY(^>6)@ z8NxHMbV2^EQ;bywf8QO|GG%vGX-nZzx2Ro~{dZn(uUdL#+uq<+QT=yrm9PD7@<K6Z z@}~p-lQ;UWef@mCRYG8-J)h)k-n$}eb(Y<jV#nL^;^>@<s~lQ0GyZ(M7r`%K^ZE4d z;{8r8i%NE7Moq1(R;jMcv&r1D_O#=sk6lWe`GWW&r_YJj_;jlI^A1B^shiV|w;cC4 z$C{LyJN0(p%&=sR_m^!iCfl;6viTX!In})J-K#%qOYiP<miu!5@@7H5Hs4?0qYL#` z7JARpyIuS!a?V6H&TE(SA1(}By-|PW9}k^=m$k=C*bi_0keD>#heDe3$LFmVJeKj? zy}Yw<9=Dn78<zX>%CF~fnt#)&`c=bOS7Uzds_EP}+4t{CIA!eQJ(iWl5F}J;mo9Pq zm`UiV3l%MD`p(63f68jC{(EoL3QGy=SFx)b9_MfO`FU~2nmq?H)P58izA1S1?1{w8 zI~zYc?BrPz{Os+Vnbx{{OZQJ*zU5)&o2yQ*zrQ>d8~Y_H|5vr2flGj|PsiRDe^zM6 z$RB&jRKxdZ$)e?<E39v5sa=&j-}&Rb=flDsLatu>#belJ?>-!LwPmi%Es3N}skQHx zKa5@Nrn7g4foVeAl#g-0pO`FmDmv3!JN18S^@HaLXSB4q-EM~3L|l5WTmHD>f_i_} zw|2g`Cq0`wFG_8(>pWVu%k4Ga|IT?b3l488%k+BL`!4vN<Cl3wIkWm&A~Kh*%$RF+ zA#M@#j^-Kp?vv+p_0F5P=KQ=>YU$3`DxEHWU*-9HyLhthueyCJSI)KiFllv9QgD7= z@x+@q3t4g}epxA(#j#xAakBk_h41I__&LvS3Y%+P_d@SPbKy+s{b#4XEPndCzp=Ks zlB2~_O=O|SoMoSmXB%Ag`zp7k&HH84hj;lKgnAOsNIv4}*IK{W=0$qetMm%vRWp}; zKX9Y>HPh8t(Hp@fZ`;ltPZa97`K#P>?pL*C>sQUVE%rm#Lh_9Ghvhe4B<9TC_xsB- zlevp+Z;E7DtemC8_xzrPSzy=ML`#J*NseoIY38#8ZMP{$%{NeItXP{>5#pV1xA_1^ z{KMM(Icbj#JNC_+WVriUes<LTwawb+e=iD=6r7cPKG3?trXw-k_43cogyNIcvtIt? zX}@!QyGV`7UGB<jR_hjik2$<U{?lIxtuB7ovlXwu9@{*xgDEw<C2x(v+#}~?)^1MX zWAt>MCbBuCq9%OJ!{b^n4_9Baw4Eg-dwLb8x7h1)&j;P-dV=}Rt^81XLTC1(&tB%M zW=(qas71oX{pnMN`I{!Wf0C#vzj0`$+2gm>24Op%AL+js$^PSt)NaeSPrTN2CFD%) ze^XK9XJXN_RO0@%1$qZ>D_hKc=-#xIr8GMxsz7@3tGBmKs7mNFKjwM7vd~gnuS}cm zzHIcI$FrZLEj7L7{;*KnW?J*{eTJ={PxkINeca#hKGJt;l}d#?&+M;zuP<Wz{ntBr zekl9<{{_>0+xF_7PT8>X>VzemUcAZb_gi&u_MSyC<q5m9>SfDs$Q>+Wd46#wd$Prp zYgcu4Ty-n@@%8SGc~f3(+V()uXx;B`9BpDT{=4?qUwQX_%I+okVQX?CFYdBx`d&Ws z@1{;qS-y!qmyaf1`qz{6L~g&-tS3e(KOg5@jofuaBZ&QUltJa=sw@|Y)3YMpo!e*1 zml9!<_~+5F=Nk*NdR2w8RrZ9vtGC?9eqH;@eowm%cfS~47P+$h*zr3Wrk^W0?F85C z4tDd{{42C7>1N>3Wj!z24i{hl!0%wBbHw3(nM7E6#=$p}7T!+K5A%+_DiX2&ec!bi zvyygv&M=X3zj$AsZDZ=Ig&Yy?f6I*)SH9-C9$@8=e$I9NyO%w$53l+%<@W16-_kGV z|EhfN^G{qNVeX%=GJ$rf4Ennc2uFGxxS*aAYM%S9H#^(y%fu$j^*WbVoMNlJ$7U(% zp8q3skEe63LW&W;fM$g6GqtTz@e+Q0ZaXCdmvC;fbL<qpax)?<usxUK(*pLbcjjy> zFMqvLaCzP&qt`+aa&G_RdbYELYc!wEG-}+>{+nqV`*eeEq3roHnSbA@*wR+JGC-=- zSErw+e|~S+wct<@clOvlUk_akU2;V$#a1z8`?r&qgSkE|Vzy&s$glZ+NI866WsUBs zL?gZT1v|4+HoZO9IQg&y|K10e8e3kR*f4w6clQI|G&f8(W?!;0DWBDP6W2G9ob<aM ziw_r>ef$34y4Hk88?7JfEuNHEu&+ik<Nu`}`&h5nTfAiU+r8QUSeenE_|;PP?w+`N z@n_Q>&VBx!PX+&+mS^9;mivF9?Z>TFx3B%U|IV@6JWC_`i|riy`w#9HKi=;C^z%KJ zzxU?E+lANJHvM_eJpKRmn||l^`rmxruD0C2<*BFRI>o9f(obaWOh2-1<<9Ms|GnEO zzH_Vi%kve>t_kiDUvNP^VT;|<SG_5`ae{98pAY!)XDmDPcIMmLzvgX;yK(Ij|C9yp z%T~-@zx3tabAA2C9(1)AzE;bhZ8G(w^;V;Ul_q`J1<~BMb$9S|zI<hqwNx<X9Ov#s zZ{u$M=XkdJ^Xu84e{4S`)pc=qO1i{@-^vv=4%RWO!9pG%1$(PaqIjR3l{n9r|Dog9 zKGuBC)&k?Tb9aAb?OK-mR_*(h&pA8?zDxZ`x^&5X&m#Z2|5+QPpCA12vy#p7b;c3> zWB=c{{T8{hH}R_E-5sH#PcJK|7x*sx(pNO!<M|a{&33=?^Z!E*@JzJ{dG_&vk)Fhc zX^p0qC$(3ue7U=xC093Q+k-dXoDSPI@^<h&zw}AaFQ)26Lb~FN(--gAX0Rl)e14g5 zqTsd0hxPZ39}B!uev^17@7&6+OR-_1b^HHiFO6Ml{C|h_?d>kCmu{@QQO^@|pYK!j z0STFPIxo)aZAg~TK3sEQ-PBB*h*=xO(<S-pdRV(>PU`tv@Ty%%Yf)3LL3+l_b*{pq zWmXR^UYWz6=i{3GZK-)&^yxd(8drApz0cS$(>}}O^_dyhdOj`WQl2Gs>sHU7$e#zQ z|60EN-O<L|`RBE$@o^_Z|HDhtQr@+Gx;)|Q1&8S13x44en;9JBowxj6RiRmYH}p8) z%h`@b3%@Kpd7g2O{-Sxm#O`p(=$7u?ne^<NEAPDr50)qFHp%lgKfU{eenO^z`*q%M z#<{sonE}Cj<h3qobs4Iz>?{pFa&<44gk5XK%h}#-rIMzGKkLlx>R1jd|40o9-a7lh z$;S;}`Ib+9==|YE!e0(KbJIzWPj+-W_MZ<ue6X9zZvGdZ@39IOzOXGnx$A#})Gl|! zS9@o(tDBxkp0sXXq(RyK?p<E%!WJ>BHh=S88^z4@YRfwt)|#&AArEf!CQrQHFkA1~ zjSGx1rTpzL*T@O!Y<|6Wwp#Yu|Jy?nR%A`s!z_KYsg~#7p^xQ^bJsdrH{CWjO*@%j zC7qwYinpuTmuX60?8TMy&wrTK)L(zTrY6OA{>1c4Dzn6<nLO0%oxUai%)xg|fzxBt zCoC@iqbqgzLCoeGVy`35dwiehpmTcGsmSRoY|c&&{vt9*iGP+EyZ8F%=k(H!1qS&2 zUNh^cwLpMw#CN-hUn(gIp)bq(C(L*FY$x&4yXue4N#%?;Cq>OzmcQdH=C86@a_&{F z!`YPArc+r@XMIpEyu)nWwB7O2flH3Ni?~i*Ie0^Pg?jRzCsRD;n7@4fJve{QHM<or zf6qL3BggmGFR4$HJeDo{Ka(qTzRrv#&ue7vs%yO5t1nxzd)>k<Gwv*&?OQajsN?5F zrye2cC6)e?)8zG@U0m_`^$pfvva8RWc(pL|<I)3>%r4&q<-C>tH$)tb`59=ExQ%0D z$Gw=1dv{;^wsO6pAj6hCIp#CP(;256kS{pZ`=0Y#HhYZV>Z30X_qdxY>{;=0{j&2l z_bw(FO5dLS@%Z<~&;Mg*1f^QB$G0E(J8_4~+U}>!+x9;QzFYBstI&I9Q|)tKY7FcA zd-v<L9%rim|7uVC+&|qyes=#B8(mW?_HH^I_S4AxUFg@>OZorjwQn{(&bB;Gao?f& z_GPEyweRqs>DeBy_GkJ;8#T2D;XR)!6D+h@Pn6fbk63fMYia2D|7TAwPq4M@_djNM zaGOcQ6a5B9xuXZPwlA2PFe^0wT{>@4JBJ-F)6D(scWigeYyPg^=(=GoWBHEytC5!b zEtl7G+wHa88zwb1!S=BH|CtZ&vl-6vdH$dvR4Jrr<DF~H%dS)#Z`=3o|I>95A5CAc zk<UB$JUf6rVqL*$(e6VQD=u1=Enjo)*K}ji#w#%)@3*Qy*6oxmnZ>>JyX1HC#d+uU zSs&kP@b=)(!xnevD}Pp4v~k*lGM0F~-tRh^SL^SqgwMYI;Ipmanse`s-^4e4&HBN= zB3^j@ewN!D{j#Tg8**o<vagNaV8d1Ke@w(}#%A*=G9}ZGJJwy6teh$J`iS;H)vM~< z8b>T{PiRrhw7==x+--K^g>kv?%cTzY6t}t6ez8sATW7NOgWa6>AI~f(E<4>Qy3|`m zc!tQI6sA2lo@5*le|t0X-~S2*o2`ugYa23ru6=eXm7H9Wc~jf*ZO0m;=vFbg-s|@7 z{C}|=o47@D#iavc!b%U<PGryA@xph4ZDxR?RiK}L%9W>Hvs@-y7@b*b$ak-_{?{Gd z?|f?|uSS_mHQk-Nw503C(uuzI&-uz&G8>mlyym*Rw?K~R_Y{eHC7Dwd4a((o6IXB6 z*W-$C&ny0}C=s_Ya8duv?@1OVD=oemX&!mJG}fng-t3i+lJpNAmvSjv7C-gARH*Ow zCzod4;(M(&<+e|7vfIlK+t%5C5#7|i%|mGKt@PNgttWk}vJScjHLlL_mYo$CGUsB- zf)zGDU$hyz*)=`%Z}!|6e_C>t<V(4p@5jD2y#3&}m+uWv%a`BpE*0fId}3tue)pO8 z=lp)1jpVpy|DY!1o*!%ZbHmhq@uICIH(f$!*9*Ricz<pqm+owJ-!t2ko<Es$Bt!6Q z_~o9(rC!e!4x||_=h?M@&HUIu+vv;1^->90i`M@YsO??8Zu|N#E6ZQah@84?>Vu`- zOmSZ#4#yQ{{Nn$3Yr1t-*z&l5<#rpp=H<_g3I2GcvG-cjuL+y?GRVJud$6bGM5&p< zE0w6Q*VR|gZoIo8pL5T~*k%c-<&Sv&bN2LJK6yf7dv$r|@<5Jdvu3bWR!+IJTt;|N z_AG|QCai0f587JxFaE!Nr{0uJFO{U-K0I^UQ|^1``@KK?k@r|sPqLbq*CuCP*yeKX zn1R=H3)36R>`t1Cu3CHHCLi0f)2ClFcrTyzOz}kW;bjdQCmuUBLF;nFiN}mP1=enq zXJ+49k##P4;_43{IrK85RG0OyNKx7OK<o8xai7@wN9$Idtd1-8TI(;}DmFd3jxl^G z+x8?M*MwW|vVMKz$`%xUnRHNJ^xsF{5I6fdVLnzT*s@tx9-Kbu=DXgv>soDl4^~|J z=b?LI_Qq?1>cNL^&JO02^nB;~th2KC6I)r+3>VdPq4#I=P1yO>ZJ&Mitfa1Gw>;X5 zWwM;u{O7E<Qoqi7Dv8O2UE;Y~@gBn+>(5;&@fQs-;OAF-^3H*aPijt2jgaxNN$)nb zq?pVry+7rW`o`Mi>uq~1+FpE;sGR9C|J>};GfXDjOe#%3b+LDE$@3@Y!X(pgtUCGO z<%DD3HUAoke+^~`QRZiok~h9$Xt6CJ^3ByBv%h|6h%>o*VM*2P1Ij<XEc4V~SDZPc z`F7%+a?_LZ)lJX7ReAL>Ffk&At!+Qc9{ZcZ3A5EIDmKh-J}<dQ(!2Gjg4&EUNfBAT z(wBYDnrl+NE%}|(!RIi~Wv8vLl|8fa^?mYAyoK2>{+(I4WA75q$>MV#9#=c&zGeRN z0ux@9XOrvP*M9Nb$gnjdwm$B6h~>*#_wpI*eJ|^1yS-cHRro^Z0IR{1SikR+o|YbX zu9mQ%f2YLpyggG*&uGZ**v0Eu(Q(X*#kus|-j361*Zg07YO<K~+dXY}d3)_;6DunQ zBc4^g^Gv?HTw|~Ads622!ryfzfoIGQR3+!FJ?$11uxkGdr7#o4YgJdi_gy>ql5d@> z#NvZt^LPYJ-@Q(Z=rH{{B}At7(S(NDNhwQa@`P>f^W$xPVbsrNmMJvN>Oi^N!xwM( zv!&u>{?4s7O1-RpS3Z$xm(oEa_TP(`(|wp^FCSLu{wb#WL2MQO@7N+s=HLx)v*K=R z9XoLOOUYZ)?6pacEtu3)=L(pHUt&KQ)840PS+!5~iEeOoJ-^rz@9L9xiY`}gbx!zy z@z;}m^93)SUtV>6uas!b+pT`D_OUEAuG#c(a$R1>gDtFyUbBCk(A$tDx?-xEZ*eXQ zn``K@HMcJMoO>y8B_QVZj3;+RL$}^dJ6CA#r`~vccQw2FuANCN?pOB~|Kj+gs8D5} za6@{^lFxeDH#L~{T{%|W`t{YC^tsii(|)|zvY+#W{rO&HE&1KT@>4%PJfl7%?f5_M z567kdtY>*X`Q5+&e<uBm-!sX-H)!tqc;Uz24_r^MGF_Mb_;>CC#s3R7v7TPL@o(jZ zwXP0#H4WQ7-nKY2z47C!l#RQjru$xbf2G&=I`5B+CD&{@tbRP{KJ0#fPu`M?@drdo z6rN|u+~qLN{lwmN^F;IJXoK2@`@Z|jjXqtuvCmV;T0wtHHGAmtH7&gn3(73N&NzB+ zU+kQP^0Ds0^FOX;|G$GxRD5-^@i)gz>p4wd??l-5oL*MaeB1QN`P2#TZhij7_u8{4 zby~u$E8aQ0ZMWX<5B;C_>f*u0rg|$4cv_W><j?-t#rAr;SA=S+vTvX2^Ns4Cqypx? zVLD-7e`!NzeDllwruXg}eP6k8>yhJJ&)=WBP;08xR3*{RbY1=~_Y%){w*G9cUn9B| z=6}t3wpjgW>QRNHxeI6Zrud%ysrWK*t3sQLoT-JCQ_$=}PQz1z9o8k0j#;a$nST1^ z>}BWJ_3VBLXT;>rbdz0)Yt{ZKT#Gf0<+vA8ytV$-{k6eo=AZfJ$HMUMB(sC<asTNK z7g>JYe|vU6pZ@FQxA#`;;A5?S#s1>v%!SUEthR0si(SNXx76Iz?m@}pgLwzcQ>vee z%{u<MGErT0?=|xmb9R?mADmWd(OvhjNLtr%b?=mzb%#&h@ax@Xm3nol$-G6<@n5{} zrOdf*7F%Q8>z)~t*Xpl(A~oT*@$VSV$(!FeOpWZ+^A+uWw=3m%T25{8ZaLoQFUJfj zJQ><9u*O-hn!h^WPDrU^oz0dV`qy3lT`_-j?*r4<f>TUaj@+Bf?3Zk?-*nnCO@q01 z6>~)7#d%*m6Ipz?PN-wEjzIigbGIt}wVW&rqN`^-@;w!`GspJ~Ur!iI(H!^3Z+-v& z+rItCq{MxvBmc+rKIXE^WDZ@Bmh5A+a_8~~=L`Oo2A143aXNi&F>C)yL%s<aJolyM z^J~2Kn>$xk^76vxyYBYhX1*lFbMZ-%jpgwtQ%?R^K6SNsZS}4>*}Bs&Dc^7tbrjq6 zpfhh>@YRN9u7xSH)=b~`Pq$*Gy6bZ8u0v~lU&-FMxWrzgolEy|rP&efPaFAbR#<B6 z3|_&%B-+H(*grSdtkJEJZ|&Z!v%ZT1)iY%O#>w&S?%ws{x?N$+ZpP*1<=HLIt_!|e zu;TbrWs7#>$4AoMxO-f`^>SjLp^59stE)<lRiB^e4ZGrU&f@nKi>z{=yCpaJ=Dyqc zepW!rbiI9Ina9?2RMpPl+iUYGXzR&1wTiU|k1H9U$!yv9`mV;J2z%utO%rq$mqmrf z^PJ!NV%f@TCZWf6K3eW|hSmOU#H7nLMoYDFsuyiJ5+{6oV#M~w<9iF={3^e5mFI@N z<*mt8e_{h!&PDuE?DNhxWBDx5CB}1f`AuEpH4HoJ<3bN*ifp|lef~$rHs9deCWmay zB6@3!eI-_3NK@VLg<C=LU&D^f^Jj&BM4Xfs@YCkxJFY9ty7Q#?;;qXLT@l_|eQ$Nd z)z53ce0^Pec;>g@mv1&M&x|nHaCe1j>E0cMb4Bid+qhce`?5Emrc97;GBx9#b~7P( z^R1X_gIp%%mzSN&mFK!}`+Gi!c4o+VH9h(5^sKBsa!Yp4y72r~re1<J-(1$>OY?5O z+B{?8_oHFEZ%)nZ_v3RG7JlHdOI*Wol~L7a<0m&oZ(p&s*dvwM^fghZTdle{Xz|<0 zU*2w&d>+8OUu3TS=LIXSns|k67Ok-9`MR*PeAd?d6y2np7j~QCYT5&SP5-vLOn=_R z=8sBQPd2XbuymVoUh7fT)%!=U2t2>j&armBFP~Z4ferJRV`pF7m6;d2+r`sj21mO~ zzEb_G4fD5T`}WOCpF63psQEI}_Sn}ST9<xXx#O$#o5*e#(bQdXT~42a|MO_Pd-FB_ z`{twB^=W+WoQ<ciW&UYDa5VdsQHR#vH(^eNxtlxXULOpUdhOhs(&U$Wt;K5A#$2{? z)6bfUw_X;X{(jK=HBZ}Rl?my$Q#mBsm#u!h=5JEol~vYOd)zJ89m{OrD;>K<Ai%v+ zt!BkSy}x`XT@O4pIUPCcMfIxYv!yTgN&e;gT(@P*x`*<cmKfhwyli{F=lk-Tsrg0i zJdY!vm%Lr~VT!`kcZ?+&i(b`A&0~-I66V~yM)jmec~iURZfV8q)ny)k=V{3vD1J~9 zHg9|6o+OU%YTr)9Jh-Fz+q>-%Q{gw>ON^E&8{8+w-H1C>e>Lpd)9|#Y-M?3rTd2%E zd*Q6);TbUuA(bzTq^g<DUR<iO_TV<@-^`u~zxPj;J(vDd!*#iQb-K{3Oy6Z<JknPL z`^+Cp^d@f&_x;Zz*|Be5(Er1J>HW+>Q$tQ~x)vDG@l~XA*3@OjQ}QfiSN&ak>~zcK zq&MAPt}A4|*tGlG0l6Cr3duio!knd?gDwUJwT66|r+au``YE9+XDzvOOlNF6wfy3W zn=9WRJihx9!<&LdYPYPHtU2@b_pBZK=YFm~WZ7i6z;42xk{0*eJJXK!%d_9!WEie& zbMcwaw<E02-%d!sQR^|us_wv+MOV5McdWPCe{P-WZhfYovp5+tT@P>H^vS4w&ZLGX z*Cd+~nQVeNtGjGEpxgNL=B?KZQV`Qx=2{(Qzy%xlHizWUsM_u=%y+E>doKfYwr zWnKH_U;c!8|5rsfa>ZYm^t_sUD(0u-<KON|`bojd*DcIv-1$x7h~<y|S2h3dNyx3T zY`f^O`JJ2guJy<3_<NYW3QmZciSF^1sCRpOdvU_m8RyUad@|{J%z=9^IJPD}<l(eC zbhH1|SLU|-si%+L+}x(P&&2QKhs_h+uYTX{{6@B=Tdg4b`ezThnDcIS*6#7Ui(5qw z&P%<-|LxNot=+%krBgcMo$De^u5LZPWOusO7hA=h-qtTprtNKT{Pc}OA)3AZs`-if zCojKV`u*Ws@eHAoZ}Q)g-X1u=?EXBF`gw=z-X1;2u)&Z2h5Z-*FO4tk1!Co;FKD;U zx1U)pdh1Z95}U(Yy>_uho>#7=%nD{IG8f936&LmH{(_ZCh1V0`{k55U?B0Qt#|~4y zTJ&Cpv~o;eb$a`^v?}{4vDQ7ic=~yAi>B$R*j8UJt5~#4D&n=qyK83~`WWq&9ozrT zU|p+Q(yh6tZ*J^X6W?8`mHhVd;XC|S?)BJj6j~hoa##4F%?_R`4t#B%?*0C<dxO{% zp_)5O&;Ct0_uyE3Smd)~`!r`=*j2aVTe{KI2fJAB8@^h0-t^0y=exAK)W5owSt;}% zo7B|*?2g=r%IixrUf%rj+MCC}ccJuZ>E*6!(nsfNTw<QLtNP=emv*;TH2({6*(kZo zMCHZhd4a5%Oi_IA@)^}jCWdCLE|j=&zxUN$o2S_Yk<!1P=uF=1W-v{`Ecvcf*sM(* z+DqJ%SM^$2_gj9>Sf?4UAM%Y&JUb;p+sW4W<EaawAD5?pyrNirzr^#6jOdiT-R4(W zj8vRv?`h68ipriFH_yuVeuZU({l=}=uAljQf8)Bpc6_-L7q4X4xbHkeka5s<M!j|A zbI+JWN<ER=C3q(&)hIdZT+AG&r!NjT7AbDJ`efDXh5Uhj2ZegIBM&%CGz^wudN3~` zcD3Wp)|Oe$tNeVkjs(vSoB!*5yz+_A^HoP~MirFIy7+s_2A1flY;R0<@I~yhlQ-mD za_mCoWrKH#6I|b)i~N|-%Qwv?@m$?9m;A8#zd!u6y~DzBHaOKzcFAc!ThSSOq83*( z+An7%*$cUQzNt>D<+&rz{QB{NhjTZHp5R|3-F&HgjpN6>?9z=4i!N6M8!U6<=}qS8 zI~>8cyso@%r{k<O@;}bmbc*G!RlXKly<0>w{%r9CwZ|Vno=FX7G?J__SuWGJSo8We z)~^N2A~%)_UdZzlId=A=X~(o1(-P`m$VhK8j%RDzJlU$((xFq)Ht~@4?4y(aMK3ge z>HqEYYQ~E$TidwiD#k86oCI47&>nN8`pYGY%uoL8wR>Mo->PH&bm6N>S#mP>c%OW0 z;97oDa+$)j3(vT!@5=ihj(o2plPJNotbNJ(k0l54?=AnqTg3fLOU*l^VpsjUi_35P zwe$A>P_UHw=^{>f{-+H6YHQz|?XkTmJGFG9I`_Ns<k&A8_0yB*Fwbsg{kd_EsOhYB z>7IgltP^f5Tyb}=#Ql6f%LgSdA2crH*dQ(YWa@q&k+<dV<#)|IQ?8k{?mkam$Hwr< z_rBKzJ>G9y!Z+7{(v7WJze;3IEjd3~>a>}YtkXPgH38+m`CC3upS+W8>Zz&qam)YP ze5_~ko;z1y;raV!i`Uj(N?w(*$DD7ixQp(R>+^kPJq^0bvc!?WTQi~hfyT5oUrn<z ziuNwFwruseCg<ST_w4zzAFDFI^esDaobUO?rC&`0!>a#q%qzL~?3~hV?KhF%<s%np z{j-U`Dp5McX+hU&&n2gIIcl%}?_Xv9dSbHYCKLO>(CC^@j!ECs!a~n|vGHO2{J;L} z9@7gFCE=lIpNcvQ%A-prR$648yDhG8BE^m6?%gvXE`4*J+N@rFYjyA{L)X~Xyfdr& zLKl3vc<d@eV%Xdb3wF5(G%N2qBlUQV2*dY#>v!1BeKYr*jn1U}X}2B=cGs{(1)l0n zO-(U3=RL`h;Jw%(`mpMI!}RFXcQs3HKDop@-+J-c**6r}|L!Y$dHdiFpSw>=Z(b=_ zUiVFFs;8-9+>vup@&@Z0)0nPAiR>_*DZ$n}d)t9#ho-c9%0j8Ps(yG^{AB$x`)`u? z(@THNVrJK7v$?(zo~X7&Gw%Dk{qM~GzH<=m-I4m0tMOg*#s4*(#}*%NWBr|4B@tv_ zy!le#BJ0}>sRpNX%F^$e9;mo%Yw7oC(k5n&{3PEtEla<QSBq`S>^p>>EZ)#$dn82L z^U~c(SI@K0ndaj&aWDURLA#(OGY@Q6blfGeKA%Zy`-1c8Om>!Yc85=szHLzOy3=#* zL9;`uW^q9wa}?ZaPufg6?5~<rQ?>TSn;h>4i`m|B9#Z)HGOFjcl;`(0-rh~--}Y|2 ze#**BuQXwf@>h`$A{&A#d8fuGn|F7a=%0(8#`)Q*OyJ{{o8DJXu9iBvxcuJYLOs98 zxzj{d?and!Ct2|aEAt<lH23nN)_VpE6R(7B-fVfB?Q7Z=h2&=)#vv8GuP&Ph``%*z zapgSwD&ad7Gv~}-$I|{}ulmi>z0rkQy_%;!+WQzi+Q#@UJ$cW;AB&mQpLK=$_68Ro z+Wn;A^s2StTuiGbfB#uGVS5ONk<5JdrS+Bp*E?qOwBBF)u~=)*J7wXn*?ytvSH48u zOq;9xS~sZfz%1GAD@r=}pNAZ*O1VF6&dg&1TkfopI3m~i>i8x1t=q4h65x~XIUqEr zv}MOmp>UtGHQ83vPaPKhXuU$8n|(&xzI|+0_gS5?*^t7RtZL3CUVP>7!^-7<Y+u{D zbF{TDYuR*b{_*CS6+EBUHkYm2ysUJ+owWo5JI95(N^TiBhBO(T24-3NjN^Z2?^Wiz z_mb`J{k6XQn=aq&S^ao!SIRm!^}btcBCgr5ixA*FT6ulLg{;RW?lW24E*f5&U7U66 z&NBturzRG;JvMy1e2S*cHr#s3;(%3#_Ef8ki#(@P9ZLN)mT9{FxWOEg+LUy#;=jSM z`V}2pvjQHLwjF2PwszyC8~1y@e?D+OuXRi4v79~Y+FWJpmRirtbDf>zukmT+<){32 zC6*oXn7T5eqa?3FUdnpy=C*hf&G;=p<5z#a9XiW!pVjq~8u2~z7j8OV1!_p$-df6G zpHOFdFTIibar<UfOaH7B7k#Z&OyebY%$@u6zrh>+4D%V2531X`d{dOomPrvSn%`UN zF{f*e%W?f<KlRW3nYL2$-v5ao*2^+T^_V#q1kTFmKe}M<o{yhiT{-yVgnUn8$)P2` zHTXBom709`^lE35d&NpMjra3<pS0;`O*-E#d{63OzNmb{e)nnX8$ZsUSs!br$F_Ce zj&gp^eg~sNtGQBYH9{Ae>^<L9uIYLIk(lfx-IX6VUeK)L74<C7+4An$%4gd}OalyG zUMRc#P^#<itxcr@Cl&;E_p^l^cGc*5w32h%0;PLCX@-Uw(T`sUY+kq5$2q@j55Gpa za#YG3>D$@K`>hfSm$@fIOe)HsEM<MZi9uDq@DSg0fynz>rlx_vx>B^gS0_1^Fg*O- z{`thK3+)Tu-m#Q2wS0ZeV(rB1svqpkUfp@H%0gOyYj%b7wFIS)`z)gK&n#bgyk?!z zcA2|3+!eQ7;R{h&T)Ow&3xQ1nUk~&CHVEhOPiwP3*pM77d&scG`uf6xd0{!XM5k_6 z-{V?z@xz=l*MB*dpCW|&qmzD4Sg9fAS-hy{ZahO^_wj`*S1;M5nr?0Gx+2VzuWhAK zpQyC7sa3zs&Y5#6_1|AQeYvMFU~@=!pnO-(YTkE|MypS&uz!zYjy5`$oh+}FU3yEo z>*1C5xt|(Ji=B+)c;d{TKYsToqIUz!v$YR*Zqk|heSL4O;MQN4mmhekYFJ<N=*^p@ zf%#nva(rj6x+1voisQv3y~U?5n9I*?n>*X=q~^*WPt)$mJCyKlja?isbLw94%+*qp zw>sUPn|VDTMA%DkhRK2WIK`L;6X&?g3q4;Kx$bU=aVe+A>RVSFzBhNwjotWap53`G zS9o@3@0MUXGSBbxizz=3n|$!#JQ;fS{f(P~(w|s84th%ZUHu@Qd$hKBgZZcaW4i2z z684;N>*|&KkhG?G@_8nXJ*yPWpWJxUeNjwNFEPaG)Q?N-{h@|C`gvcxWO=MI&EL9h zG0$!O=X)%duiiK#>%-}@J7jg{sN8QTZ2SG_&E~Xg*KbA&?a{Zo@{Hs2ov+<|YufBf z9L!Rt+*qaQb}?Yd#I&GqXIFHe3u>GsRbnWvTJom(j;2Q4+C#q<y6GM?7CJj?-TQ~j z?t0bdrawKn{_4#4$DV7s9a;ERPIk?1{o^dJSNPgH@;z&t)Sgv%DC5Y%6}k`jpB{Ja zFXTG+$3V`$C+dm<-~25{yNV~zSuU|n`tkC)W~SeSH2Ym{9r@%vgY9tO#))fB8f5L} z_K{ED;5m=?xk^HP^wVa>q^E+R_FP>%ynUnVmIpsw&vf?B!i8^ZTEFYLd&;tC)>fAr z)K21jvgYe_my+CHyLy}rp1qTQ`0&Da>D%|7M!DYJ(tY_ccj_(CwC9hnWPZsr=vbP; z|6J;7n67NjZic7MY}=BXerNDFC&*oSuCsXF@$AOaDK}Pcp0|6=#_NBw4A`$$oP5dm zA#A?uo!%K+8+HEftqwW=;`Mxne+vD4#!vSyUy@#b_QBqLmlE#C=n0&wRlZTpy8BBp z`%Hc#8MbqK{bxVfIJxOp`zrzSBRv)li<Z6j_Pn0wtZBB*F@n{tn%(%@mF;^%cfMy@ ztn#*}`H_I7BJ;sm+iP``cK_TZ{q)@w=^spr;g!NZj%stWuI~z;)ZqTQXKPUDJhNZh zN^_Q+pK4*2G;zPb*^Tc9yt7(za=HWSCDMGCRm^snvHiM(mqF!&UF<<^8{PJ`9n!V@ zFD6~T^^CyW_nIG!U(C$@uY2Hd#hoKBcD}LRUZ3*m6_4|ir^QK?vn384m|oxfY5J+_ zJCa@Zxm0qmk#AgTc4_rFi>~0X$4^COsHM-CYh`H{{?0qOs(-_bNjt;Ds~^hjh+)or zC8z1zAndzR@9UjvkMei5um9|F*6y`6UnU@Ff3V=H>COKQ*WYj0V?M3!+TOpc*Ca*f zF_>9=RhwH~knC}6WoFsUIN3Ex7W3UC-yS_WWBZYpi+)W#ACPt;^rYc!|HoT76!-0S z_G$bWtP<NiNqg4j{jbl+o###av5{?EoaNPH8=OBn%+Y$S{AtJ6kmdWo?p(mN<HNI_ zn>+tx9J%<T<J@+h(#t<B=O+A!epK7OeTm$1RoA84AAHF8ad?HPf%{Q4BX6k)>r2w> z7rni8X@>and0)=tOY?B^EZbT3=I6Tpoz)z@b8R9*uD@QAx?X(4?q7Gh9&%=hC>Pw2 zzR3L5VMg_u%tfc~y1$RBuu0Bc%jq$7V?O(@DEo$8h0DvQ#Jp<Umt$USbmgyqsoCE} z%rDx1EbPs7;^H}aS;qd$g0pPGMS;67XWjXA?Q%)*(l=6nmL0qNY~DOyxwYKOk4SLb zToFBab8b%8vX@pzE^IF;6kfW|#k9h^WL;j*Y?;vM&w5;~PF>avSi|qjuda9Q!@U`L zyQV*r;W%0GK4$Cr?<Wi-azo-CFFp8O(Bg2WiJi@df4WKA9ipxGKF&_IYn<O}ddl|a z_I3aDIkN(a6?Sdsvo;s`*l7D$z9^89!?FF3T#3eg@$?@VEq5z-XL$#4^EmRf^eka0 zExYxmW_S3}Ydz<ZC#8McDk0zex!_{B{@D+kw>ZYyEjqL>qCY|8b&_<#k2hx)zu0`6 z;bZr@^ZQOpEBY?lG<B8IH#5uY8-vOp?_<5^yd>_3%8oO=m!GVWTk*be{%YgA-s=IC zn&+zJo)p-w&OE0&QQpx_VrkK=o)Y7%H|FyWu4Rh~{21qVY~{iC*ECcM&Nu#ct~vSe zf0v0+Y4(jrKF(9i%uap0!B&xSbW^1O)9;9-duJSTn62`$gJb8mzBTTbFO>2aZ9I8! za^UTbrZZ~C+j<hMR6pF%X#J=CuTx3Z=l%W3vvxMiPB^oxa)H{l3xf5(FPrAnel}=% zp41a#%}^R3cils(XLtC_f2Pk>UHsDSBqgu)i)1eDjcF>J&E=hy6P;40vdlC3Np15l z*+r~v2R8=JzuRRpW9td)M2naA?{ZJkm|j_JzDzM8U47n`r&VwKZnFG3vP3t!`+(zo z^XuPAuH3xz)9==V9fq?Cy;kKLzEZJ1xAlU#+uV<*99e#Ru5XhvF0Q@iT(XR3`TNFC z$Is--pR9hhk9SwXHOAIkOt155?o2VQ&e3<~^SSIWgTG+?X;-eE?HtL<-`C!kNZ{!0 zbUU-bR_H;F<%yX$5^GyO_4&+`TGH?EQrgdt*R{gaEy4Hby<Z<5l`FTNu&|In`Qzil z@7Cx0_F6^f83me(PX05$(?sjh+rMmw{nH~&ww#UU(Q7ndea7~<Ty%G;K*h=<q8qY! zWdC$>bZFH!<moNYE#r#js@>c_Z~4}fJF<9^v~GUN?pU++I$O!R=Sy@0N^5!2uFdV~ z{m5kZ(k9pSQ}Z6HU~d28wM_mDt2cjm!5u7mugOfgKJC+&-x|Ip;f1+Zo_uubR|-`L zdh@G7_;2H!hc*XZhx&dC;xUsDH@)^<_EhZIUrhzvQfN79hHa{jXe7Ki#9&ImU* zyttjWCue`&$CdmhD-ZhlpN*JP*i^RddGW=V!&S1qwN1Bm+L)ySzV6hYeR#LAZ`X#| zTrKYY^L9FT*!FF5sLEXQi~adT=9hUbd-G*)uUE|USatDudQ|j&eJ$Hb+h?zsHEV-V z>ah$@w}{-UzrV+Rcd%=myIV5q`oirOA|(QyS3a((yU1ox*7dEbaNFL}-tzRhU(TL= z_}fTgiuZk&q&2L0yR&}f>@Am4*?ePj+cHH58|$OeYts|dne;tteZ2UJQ{|->T3%nd zN#%#5YRx^-^jXZQoh`aq8TV5b?G|Tj&TP5Xd;CRD!<FqVFPF@Fb7AuJlP8_oALP%K zy;|M)i*cvNY%AW9o&N0Wm36*I1&5q=6Bn4dIL`Z}slhkn9li}a?>wAbJS$b_=9%g@ zi)RQgdLk{*cZp9{LBHXx!$i(Pi<hQPl+@;x|2+Kc+?#Wp5zU5iYpg$auT0dRoBM*v z{+3Y1_fuuf0X^PaKO)~(-alC8>2vtblDq3|%&QGE6c$Iam%rR|v+n<{lKaishxdII z;qtEHU3yS5@R^}!!8E>gD$i#wGhp=yKaqZQU(m&*^tW}~j$hZO-n|`seU|mEa@*|e z89v^|@;{!=y(sSA_wSyXZMcf~?Zv0(E?d=`q}P@D_0606R<D<2RL5FJZwu9Rd=_<6 zU3S$*{arR?{mmb=&lN?^eS58fbLRbJb1T>UDYn?ScH$lu!wlh;RqrFqZZsFK?KN=p zb-UeD7<zZcdEfW-oIG|D&NY6!bYi*NJ)y_tjHkQJf415P^`~vwZ1&`Sc0x4s^OTsj zBbj|${0piYUwiI7S#{0w%lZB4a`%<9*#qzEF)4o2$_(*2mYLCY<7npno~^uZEH{K1 zHa?o|$lY^s#^j_W)89m8ZB=l7c5~y4HM0Z5AE&s@opZFmgzKy2Vfk|}`FxHQ@#*aR z`0wt)Irrn3)*rC<XY$;uUhp?vu=+_=V9(v(O!LKl)S7)-?$LSfx;@ij-|tyH$Fj}x z^3VNi*x{h_pxLJ|-!iMQ?eq<6_Mg3`Uk~aY)U-IfuEXAH_NIGRkMK1o$xWBJk)>dg zULjGrzC~n4n#XiEv*&+rH`HpZ`%sfxQ_bDNrthfmyNY*72q(+LwOI<gCbu83v;Lar zQ$F+Yt&}^-Pm&AU?o^ze<-a|x#kL@B&Yz^5wHv3YtqkB<vMeeh-9vH1bT_?(n>(xe zxn+)?Tgi8Q+4C)FC;2XCY}xr;bnZls2g}mS3Jjm}-Jg)QZs!gQ=aBj0XMXu4v@BS< z?eJxnImtKP`!Mjcb0nPC_t@X|f8RxZn^>l`uNz+IotwnCg29@7(}&fHoBkcnwigQ) zWeQF*XFHS7T$;Q8K!Zfflqaj+zId%-JK4N6_45M$)cc9`8hpuett#(Jc3tH&W3lO) z<X5(c-H_{!#BAegg*&?@hBz-%vbeqa<2LhU8CRBYEKe+4HaVj@vFYd14?mvd$ba}T zQ$oIN|Ka6J4d3}mFPwA8_))>D*-`#~@_og8EidKSoGs0=U*LOwb<a1MYfp3*PcBOS z$N5;(pfC3Pp2M7vb2+X|PA*=2u638R$>GI?>H+nq7*y0c);rZFUnvRU+H%(OrlxL( zmC%7SkLI}au0=OO+rKS*n_*>nTHJI>+l0+Qy$iLBo_su8QQ!VH@TZaEFWHk?Vu}$* z7w)zAs`a<J)<W^r$1O7)`*KznM>ETRcdHBer|U3x(Z8b$vSWSDUYH^ElIQE>je3p0 z;xElPpZxgCP0PKOTV3tsI^W7!^!jac$nBDlNq)TdbvIkfuDfR?%Pw!oWZKyl_ow^o z+ezN9!vcgQoQ0=Wh(AcK-LYb=`G3(&!`%}@*6qzSn%-O>Z(*aXej)H|G<W^7@>e%4 z>&jkVN&j_iRif=PuPs*nm)4)sSrV+6|7){r$MpE<mW3>*ZroV!t9Qg)`A&1s%0=4h zFD`yf4CT#R?d0t|MNu^^B4bj&Nr(AK`@Xfm^Y}RZ6a_X-xO=!`eW}*v3+MYMB*?fd z)>+qfFEBWK725|3S!p(w5H?fEYwSBD{@$Eh`Z&VX=v&&gz1{Po{?|>`^wx2^$@b2^ z=g-~9_l;q(3>PkB7?wP15GXs@H%GCwj5En6_ITrK5s$-$lfD)gnCq|~J6K(#v?=xd ztp}z3PeK!38(4f^YPi>Q-+LxMeaE9I@yf}~j5E8R7B3BXypQEo-kjp&aTEJ)rMeuf zD6-I;#eTU~AUOH_vGcP(ZkBw``t9z?{$o2b7wn(Y^O<`}_>Ojm11I@E%s-c4;Il~V zd0qzBF$ve^ywxjS8s5^c%CTp^eb0QW>{fokOKX;0-(<E{?AM2jTi4Ebb^3zu+niUL zvh5~In$v$SOS4oBG#1a_bLGatr~i7A?sj}~IPo>7>f-*&84Hg7+iCr&fJ0U!L)OMh zCA)o^RoR9M%;#rGOfI&v{Cr`_XO#`JH`+-pO+O^uQxYck{o$l@4?Z#7n6uK;tJIiL zq50+Cw~K?*-)ksG<Zcm~aYysw$;tcPnH;(%yEB^IFj?%fhOa=pY0cd_si(`{&M)n} zb*E=x$^0ITow8pmczbPbPyTrE&JCp}7db=E)|h;VT)+NVT(cFsVU)dcvUxf0eu<8g zp|g2*9bB?*b<6EV$^Pjl)E~#O?&@2SdFt-e8i@mO($6Og6?|J${luy<_Nc&(&2g{8 z4sMT6FL#;sCFN4@?~^zEWOZJBS(K5aqq{rn?vyzNc{lDPtP#n!*;M%3QtRBSpby2V zGo@5b-(@d(av~*RvQXSMg)e42evwM2rB2MgY{pw?$|WE%+eSg><-WcZX_k|^Ie3hs zTI5$3XLddL>UnzdrdJBQ65Do{d~QBCQ7@3?hE9js{6z<5-c>dIa4Y-Ciu6pAxuKS2 zCj;JmnzSI%!mV_bt)l2628nOyE?G<yKD$xt*Z&LIC+An6GgDBoe6dEl(cmP*u8Ybc zd*@%?+FUtXEc)!MC$^%W)HoB@Rq>_0pZV5t+3A(;%5sJEVWnzvaenSxu13#gLN<R} z)mYENbi(HAQvdz-J1;-Z6n#D0N+E3VfrbK$r~FdqKCcW^v)x>2zU}Ue#l?2!+XA~c z*1h3M$of^ffp>S2*Iu`&@&_$W{MS(7Sh;eaea|PpeP$<$qRY*{J-Yk9Rqy!5I=N4$ z6VA-#<X9|xuB|_6+mb82Qzq&>TrO!SwLJUT)7)fz&ihQa<s!{by2YLAoz|QC)}-pX z<;3n88+8hLS0!J2zu5Nl41=1>H|3ODL?Y#^PWw+b-fLCA-}F^^2LJMF$EM9Sb9rQG z;6Jg1FJ>Lz{HvSaR4@6veACO*{S9vo+||!ES~}mIQ(GLAy=QOM$LaT(U%%6tU3~6S zxRkm@Y>Dq)(=5I<+IQ+ga$MKFmwoUvS0p-Nztw4mZx4CwtM+yttKizg_(>^1OLVKC zH}kzWk<7R4XH7abtL?2O%b^Q1(hO5=4*flQvwZUQvwYh#Y7YP4RkxQBdo0pZ*qp!a z;Af#Dt0L8ZXc(k@)%m@+&`?)9_<KY4R_3m~<<g6szi*H_e(Gh&jVy)jc^=VR-`8u` z=NiZFlUT2QI4k*PN{H>%V-269dOocTR7=0xTVsAnX=hGuug8){H}upZWK=Il7~iN) zu5qwFXy(4ne}it-zxEYhCe)hWxH@0&pe6f8DHHjV&l6qGY<%;|HY&SkwxNhC!?uOh zcXz5dtA@uFE&p$BWgBmw+++2l=I!CC2QM|%nCrd@SQ!1wnY**gmiOpy$A2c@zBBVa z_^{{K)qb^qU+x>TKFE|QFgf?@*@f#Fj2Dm3v)_^}(&TNQdHk3($5GFdCk~!eH2A{5 za#wTbtUy6q6P3V?-y}{vym8NS`*!71)4wL#?c5Y<+;!aZSg^KW?8eB{wyH_*);x*l z^*FTQ4bS37FK?y%bvm&2;D$pXtV%5pV)Tp(s^;|U_IAIz$oS5KPX)&=Nt{ozX|Ofl zaBa52``LPr4Ke~0->hQJowuqhXSEbZjfiWubfbLl^^7@g!sdo6CE{%YHg8)Vy(-IS zcHOjcE~UTAq^j6<n}z(cImK5zZFALzxFzgQyzb_!Xn%6Q@$Q(Z$vTriIW_Yq+}?Ux z<ioduL-G^sOA@YM`|*VLHk15psp(U;o}H_guz4fzvE1e-y&J7<o-aDIEi_`WKxmm_ z_Ew9Kr_Y}mPAFHuup`IskJ6J58>I^KYnFYw`K2<?bkc7vjflmfvC}(Ne8{sgZ`{cJ z^_0Mez41%_MQ}WM6nR4AtE;)y=H~`-uQs|)neO^-e)XI9>KyJ_))z$&Pw{O}U)!}( z`oT=;7;6h*UK>ySa}TTPZ8Az+J+FS4JInU-zS52_Js0k|^fnv%v<FU=T62?`r`I+# zir2;bnS@nrj8$QFgXX@~yJl?;V1D*+<?nAx#IN*KtW99=@2$9W@bTaO)-iJrUs$;} zkUiDl?_Sr7rk@{r$+|48@{+Y;P!M+hH6`Ew+JVN2GXK;L_9yzpzur5Mvv&3SP`;br z%bV9X{@EJz&Tq}sYqutE3>5sj`V8}B5y@pIEK0U09<Xp*SN!Cb<L<?lT#mg74h^&T zPfXmcv9M9;^ZZidJ(82HryrDj$29**+Un}8v%NQ-Jh2Mn{joKx;nuObj65~*Ukm12 zi|lX-^!7G=lQ_p;AYI)&g87N|8t>%zYG%RSYy&;<%9=Gl!wp5(-sqfdxHhZfdmwKG z$FF}|t;7A-Ri9eJEbMqb;9K3_RoYzVuk3lUxY9RkN$37EBCB7v`LEmI@P3Qc`oG1w z8+2~X=>5BgXK!bDqTiBxC${}qZJ;%gagQ<YnX3v{Kd7fQypB4u@95@+CoV6Z%kyr{ zT3VOSxyF3;<vU-DH*I`>>A&7x0ev=($>$#4IIkfs^>WFHMH^n#9v9kmamDu&UMm)V zd3ozY=Hoaip0$R2Mmsk>*|Il#`S02--xV_pE;jC!s5TXAV(SbvRVm4<t>3NmG56P+ zwu4JAmh1}mDt}#mLN7B!YRlE-`E|v{x#hm!8x$GN{dzuIjraQ2`MWcx*!vgq?g+lV zaeD0aPg}Yhccku}w(%wV>ox7C6()2sm`d+FWm~<@$Y`~1{A?fTH^<j~H#V7fM%h{V z>kN~Owjaxj<rx?A-B|Hkf%Pu8*#YH4^Q7dre%QUT@9LU`N0SqD8)q%%IVqN&Ev46a zYt7z#uhxY23A@$IGPs|=n03o=Lgn}9tXr3=jIXXs%6S*VUfD5apQoN@(6Pl+B$>Ls zuGL;CoA;8(dHJ4WSIj@v3a0E;H(_zIPTEwtzVl>?Liv*`RqPLgE?n3xGF|=1wMfn{ zM?GKgw9h?v;CJd2Yu^XzjgOZyMkcuT&UJlmWOg`&yV!EhALdNAV~saGm+n4t<erPU z$5HF4`;RXOog04P^`@^$L6u$#Z5d0}&i7CA-|$%CopjQ#8QyszzYnFqnBROn{xk#E z4ZV|dRcEB9o_xRi%*j=qz9K)5uH(8EX&<|9;%1(u*{@B~75KWGY-)Of-V4`?M{K#X z(6%R$d&!-7D?Qg%Geu5kp8e58+1lnvRItedi&N{DoI7UMHPc(9;(tU>s>#1!(GQ=V z?(3a8-~Rj)+Y{jo=`yM>EAI0?6zC0bVa^Xth<#xj$mQ$Pc((KCO^Y_4N~JfxQMs!M z_ex!6`M=lV_u_(|H_vx+<`^uyID^eoblK92V(H#VKXv6B->zeA3^BDzU$#bM)}4}h zG1J^~C$5#Av^_wRPyM}gow3~43i($j^UhlCc4!nx=qflhafa&lTL0eL_bQ^9mM5Iq zoS6Rjp7N7VtE!iZ&JBIsz2wO2XFakC9n7^2CUJ|FT>Y~2YK_@6mcx9R;>O!%d`#@U z5wkBzPGW!A{EnNJ{z<3)yg4(;Yx>^UxtBdRwS9=0@PXyzGdIS?u(beD*FW=bes#<w z^jOG`UGr~xEqHQh8h8JuVp+c$zXIM*%~b*%iy5XdrfU_%?qcDIn0-JjUM4EUW|8#M zYd?$}_n2Jseqguyx!>QP7Q2Jbf0`jZJL8Wf%eQAep?_EVJ0@gJI;o~7HmCHyis5bP zzQFPgI`yp9rO6-P89rEMX*OfxLjIa4smKeP7JjL`_51yK*SIT__J(|wVqD63rS8+E zt$*Ks`0$#i;aUByKk~jjf8H}3c=+%Bnfd3M-X(0^Eh85nX0eLL@QeJkHQ9GeFSPja z`~R)yZ{9d7;LEm`U;1L*17p7YzL2?KqvhKL#v(88%xXL@u&8Z9$b*Y>n&gh1bP?S2 z%4c@5<kGh{^sjx+C=Kkp^Wue?@p7>z3U3!}y6c^MZ%(4|vqwEHZFhG}b?D_|&e<%i zf9^Z?llLE<zN@(@C7-;6WoB^2wdYrVeW(|)v`%3Rl)k6Tv?MH0WOnxKV*(n+YxY~( z??14=EO#-#n}qahfh8Mbd$*mMaYl{TV`)d4Wf|8*QDNTN7Zbf}h2w>;EQz@((Za#+ zXyqUHyHxneD&M})$A6TQ`W^n=30!YFLH^jMyd&$UdTTGanISHG<MY-=*G=qE>n{C$ zAE56xx92O<<*1MDhx2Y#g*J74NSP9xa=YhbqP}13+|O~Iky6Jugz3poy<h%V{`$nP zSv^;0L_hp=cV~TnQC8kLfh_r1vfRA<Su5H$YEDu)d9y@n(jo@#yD67`Z@%z8@Or8C z*?ALX6tkG?GtQn>EIID5amUu)1@hBa<{1Vr44&2fQf}eP_j|sj3wU^T@-7Un+*E0P zq@{za=w<vIE!)*m2clmb-t_%!e9xkE_V%r&Q7zYnW?XkDcpRN^Wo4mn*SFo#i&<RP zFU@;2ZQ|{ElfahK@2<FBj>&QJxD_YYBm8xv;}*^9wQ|3|*(*3anh;*`wso((g|*+? z>kn2Y773SbdCmJaBkuS51^t2P9WRR?`(LRww*T|s%9L-fqYb95N!+QrIF>glIfnPz zp$+M4vb4+lE}hGFv6Vl&@rp;VLafqt?*}Fs30EC;IKB3oWW9=Bth-5X*S5<`4l0VL zOG=3(AM!YR;=jSOZo_$syY`5QW&1c!_?gUiLyF@WPx^8FbKAM*+Z0Iknpth{mfBEk zc1kPLE&5?8_l-ACRGPPcJp0q~)juhoW5o%5y_c^hHt#yH)6`XWpQdGMtW0(It>XdA zcG?#e(nbFp%--fA%fZdgaI18yzobmoquQyCvv}B!3Utd_Tx?kMLvHmVx$Cjl-?AK0 zx<6$;_nxx9t4uo-3#tqkX8+4}4pVPenf_=~<_;@{nC`z@zx~j5E&uAc?0@|<lMef* z@++QM)-tE^+2%*qnVj3le(mfHxea-~&rhTnE$e04xyNGj$;pQ%ecoZ!FT2D2R`c@9 zKLoZ`>a4YPH=p-xf{)*6qc+=quQQeV4|-1wRM|ZF;%4)Z4M$hVAKO-vkjE02+7;1c zwsfUK#=W~oQny%}G@Bai3Uo7EoE3V>>1D6gLi5$#Y?I$Gi3d#*Ow`r8{xMdtZ24r9 z8I~E<CL+A6>`tvPUR1HUDCl$c?#J8t`q*-H9y1+|{C-Ygj^*h+Yf`SZ#LU?vvD|*w z`U5P<Ml&8>+j@OrGsBn9C$*N$uj<|Y@Wlfw=Ir+j7j&*U-C=&5^g}{onb!=hr(1*M z1pj+%QQffq?wt2aH}Y(F+Mzq~T7t|Gg%vA59WT#)9(1|Vj_1?MO!daqYga7Pwyt%) zoB5$xX4TPchB}>n{;cQ!9<ljd{8;3-fK+Ue&SL&2yKUUgU9>1wo2^_azBKr-xUKlL zhCki6q}VsQXsufPt|~9-#q4iF5u1EcmW!tK*#424lRZ6I=FG$>)*~^354MD6R*62( zZ1HVdP;Fe9zQEXRtNZ%=8@@(5lf^@4ZQ)rN8K<|u^_b=X_G7vHTlOw5;W@D4^W{x4 zd-=;!P3HEu?`Ny!@T%pVKfBJACFAFn--nmI@7=3*m5)v4!O01|(`^gND?+Yr%X}Ao zxAmOf)of|Dbg!y7ap8sy-<R|!P6+<}SZ8J2z1|&++FNut<W=b<8)bF1r1`&ZYB;cF zvHAD782<Mg7XLVw;ImTN<@+;pUR%rMZ1=c*rk}e1?{@F$)5p%IK6(FLSn<Uj4(2)P z>6;I<O-vWx{c_pcq5=uM#saP<TMHMJvQ4X6b68r%FDd-bXZtyq7aRFZOku2+*e&`` z!}=hTeqqWSrs@?wf@vlFOY_fdc=1m=kU@L??@3CB_gOr5ZChl=)+l>(Lwl9M(rpsY zC!fqtX{>C&Vq2Xxv2i{>+x(u={3Eh{YL&g|&r>fN|1`9cFHZfzb6rgItJQ(s-K@p; zdu$Kyv&<K)IB<<cY2O()14e1Pj=iQV=_~v+XD!#0{&U#+a(mvqd2^yOt?bh)zkX=X z_;Y>X$7yp~kNj=B!R@NE@BV+@caww54VAqv7eDiy@-4_J!P?9(SebRX?y>&rq{szN z+?GC?&%A#9#Lo|SmVKH1Nv-*N;dJx%ROK3DwkNKKQ*7AMl{gJnX+(WYQPC<c-Ny7< z_0qnKZ64*1_c+VWnZvZxG{^kZs#$XB=`*e--#>nA%lD&?_!1{y%$>RAWxw-*vyncw z*Dj=_RTY1TJze;fyHQzg*SF{Du3uLyUG?qK!GmQwr)HfiS|2q_c$eqL`5FHT8YX7V z>vg_X&-3|s^XmUq3H;~vkJY=fotS!W;cNZgW~<fAjwODQ4BM9ZTEFw*d(7AGcx&24 z=ECsA8=F1}xSO<0pSt|_wpKmug2UV2ZMw7g)uc@0D?DCr7C5{-TW54`<wNnuA1Azf zv;F&-Zgn~S#q$odpPI#dt>;nG-pPlbzS_Y$P4uO4n_DgCt&UlSy627`U-07K#g662 zs!HS7pMSi5>~XpBJ?4-5uk7H772bTkPSMv@$Hn%`7d3Oqiu+t!)~VWP+!tGNvPX@p z>}U4l<GioJpVzb(hdMd>eG-TWw-q_8chgDsz`1j;dH#Pmc8mK+G*^u-6JyEWlEuA? zO_o#_mp-m`|F*jA#==8C^tCwd+w=V2UHF&tc8-l%`d(9+^!nE9R&TB&njik|{rFNb zd2<Qh8s`Tod{;Z|Q!bVMeey@4;I@q2oZ`$g&Z_<sO{5;nbm({S6)R;M=4Gd@>fOVh zBe1~uwqKQsU9DfseW8A_pU?lFSTg@^pIN4HuEwDyV&b=E^}H0BpH^k`aPl&?&FMCC z6d(6W?7kRZ&QdmgNs5W7<-a9Tt2kt4{bxJhTmEW))64^m*9Dv}*g8C!>F_}I>h@J` z%3=$rR9_C$P|1zm%emv@3O8kwnJ0PJRj*9wez|6$cDlxDHV2^}OMaW`3uHa{^k~i` zw)tCM?5oLBjgek(H)PJKdlBL4BAMIWxO>Ew=)d`Ha&5cCTtNZ1>5{$K#$T`0FM9U; zf@RsFhFPwc6+>cQteWLMH^#qf|NoaSUb8<je6hXR(9u3%Epzw1#`b?a&mw(YtXXeG zA29cfT34-d^TZ6P#1gjkIr4!=-={CGdRnq-PaPM}^&_WQoR@!!%HY{(q^5XayUdRD z6aOkFcqd4GJ>-4$uTWa<j7{GBd&Mh$8az6i!4j0sBffDN-{mFljm0f5*R`ph_p@EO zgRl0%?Q?#A7pB{&te7vmis6dHR^Irs!~TAiEB$x<RehxvXU4m3n{{IA>%%wPo~LK6 zIr$@~YF|NE%<6QDSSCBJjFb0jxqq4R2j0H;%<bNSb-#)wp6oPSs3euH&K~$FsO;H` zD~Guk$A6qvV!zf~A%9o<o1F8TEi9K@ij44-dSkh2b8JjoQ*`OMb-V(9_gPAqEzLjW zb6V%8<+s_}cFyCCIlRm@m+|x^&Bq%zGsH+wFEzCjdtAqSf6nKv?nbMEPU~pAsO#mA z{eJ&G*ZpG$&j0ZKC+1t)9xA<WxnX_?bClbT`w6=azGQwQ^F#U2j+K(O`2uZr8@}(_ zV4A+VfcKnCkJXojDz7bb0ym~)H%|7{p40H?)U^KDrK|QC9oO}8x9ee2l(%{%@?E^g z(6V2H!8o63Vjcg7q+WN^cd8rG7O(RVuNIT2j6T|t5qkb?P{RI$Uynwp?chIF+ID%# zQ^(w6b<^kjmGQb(PJVu5tHt{H3H@H*Hp<U66k>HaBdTZogfmY%=Y7Gx@5NazhtsCY zI~W-%-(cQ(P?amf`aI))mN|#|-4FfmI8uJ&dt2y^8sl3W{eiqjf``O1?4PcAn|!s{ zkdq-pu;yxjpF`fu<{FEdiD$C9j^$Nd+oXBf&h+wuI1_{Z70(3wU+j3d-pIl%`@oIn zx^vwxXYsF7bw2AR#jM@?{nn456s>D9f6q-Qx&Qs?REEZPnx>`B7gEhX#hU8(PvUQF zH<Z}Ie1q3^dbRV!&cAOYuFTscc4L!W+oZ35PtJL{q<Y)Cz0=s{ZJJea<!RtN)8#uq z%1QOJe3uG+@c!>%?pu0wTm`dwYBOqdWLL~PdZ@_$UbEfh$)yT<7rJM>IxDxOM$%N8 z`-l04HBV=K&wW{8aAT1~Xl3&Ue`P*D8_UlNj88AJTWo20c<V{m8ut68vhQRIB%Zlh zS!ZVbc(SLzVEch@9arQFR_>bq_~w&PQI@Q$NfB)uzqUHp@2v}P_2Fq0;NP&DdGEVd zzkQ>g&ryCYm$~rc|3AOW|2@?=m+PPT|JTPu^8ZagY!kWkW>V@KN9T(g348dC^{@Us z|NXK1MUPW6rWk&RW4>N@H+o86O;5p0CFu{j`87vQ?RS6vS>wyk{-ZbE%?w(7ZnfIm z?|)U3Y&Ra}3+}z8VXoWsuZZ`?{hpH6)?>B#ExU~?QuLXebB*kh9&F-RGrMq^;J)78 zeEEVp^Jlg%WL(c5xSdkaWUqJbrt&=IrB)x$-kjd>-@xypWj)su@wv|v8!N&Kby&;# zkF1`!FC$Xu+6CLCPlD|GK3QdWW>4(zKb38`?Zuj_8_HE{U4$Q8mOIxU{cyW^#qZf- zRrUWJa@JQrUhn<1xagDVMZW{C&$HKjSikbq|EdS~dW!jcj;dT<yZ3&{^QTdg{(Jq_ zG~Sxt@j6Iz?Igd(?fd8K*vD36I&JqKxqn}`AN$6%oBflmz&pm@AtJUr-H+Yn41YY4 zr~ZJ$<4-3w)-$a+%=SD(XLB+?W89PjJHqt@_qm=G)nS_GAGX8n@x;I*_a(n^p7OnP zWco_YRPN)p4@AGEU5S;mU-<oh>U0@}-c{RmtK$=1zS+7$ZE?xXixa1$E&F_KmT`na zSo->3Ro;%Di%f0H0~wajJ~`!&0mB=ghV+tEvbw!D^88y5e7s(Nj+aN4<%50TP5xEu zOTBVeTWQ=Wl?a_4ymoCBySq)SmY>8+6H`MrtzQOhOFTL(4lV9D=gGLpXBCsw79}Uv z+Zi{OIIl9xT=Xj3mS?M_D%+1h3Af~k-Z?$0=KESSQZA)(iT>w{cs-HZsibJ-9N$}a zXUv(y{a8T3!ON&2qx`UalfX;1*C%(drJpZ|SIl3VU;oQ(*^6SIjr=X$!ujW(u1ZUl z{x!`?=~da+<!oiYrrjvZeR6j0bpG_Hxj&yw5q^`te45v}#)C_^KQqYNE3CII(__6R z@3>4bgW2G$QQB?u<XR8;a;{(Hd>0m(yj*MdpWUZflj%cBPqp&9yP{u2?=}30oPRNH z>EC~5theedJ_r45`TRrZWOc#|=hEze{X4%r@$G52JLitp%fL$BiAEecr&h;({`!b# zzvOq*kDr~RuYTs;#&5Co(AP&#q<#u2{olj4=bgb_?#E%4tSb&5aL?Ugu6Iwuc7yJs zw;ffg%b#2o%6u?0aK3TN8?RX$i+YZG+BzNPxb`b8hW)@|%g^iB^}d~-RCmB^vHy>` zf1R&?{=q1AGk7U;?T2+)5?!yiRv16Ce30C4d{Z^Db6K1ByF+ewToZkoFYz7Xn!&~6 zD;?(Q_th~cE2p}3zQMo4GtO9?KUTJJ-qv@r6E-Zb-gtmpc}}87qe+R@<kDvs6d4T~ zs}(y6lMZTrdp%dK!TnX=hgy-K;O8D)R~S#+Vr*^Rb=T0-kXax?V9^@xJ<2N&PMI9@ za-vpjf7%b>7M6sN%hBnzeG6YoO&3Zna!Z!b+HU&EmgU{zCGOeHihY0VG`D{%Eo$2s zwA_uS_mSUirSJVmcDZ?(-jO=Ia^m&_MaGBHdQNWOev_Qc(Y58*PyM@RN+z#&k7S;{ zsN>2d^TNv;4YM0(CFV&vZP%-{dg{>G`+GrgnvdVCxmzW2d8hE3e#uWyo;CN^(!}{@ zmqLE-a=j!k9M(GP{^r7a2^A~YmT2@(s(6_e?|8*}z0vnOi#LnZyM2^lo3=1G&->!B z^J*I>Oi@|9KGMj?zG|Ti>!IFj7X0UoI)gln+pe78OXaw-Hs0FjS%B?wYqy=t`h%5u zlNQ~1-}vXE{o;LFtM3KumkX^rdn8z%r<+ZnI?K!I#J%2)T`%{|{k1k;N~GtuZje~+ zo5P&P&O82k<M&whqU~yn1%A0@%j>*v?Fu)&^?YZuz3bMGM%Lehmq)#G+hP5<J=pod zJ(Y5)d)l8hZ9cdEeK*7Uv*wC-756WEd8i|zu45HEB`fJ}$(5P+Lgcr{-hA|2Y1!#r zR{d)ydM9%o`yeLTdt=w+Pb|Ohu%A0oyrSUCnWc<LQ!*d^TFh^^?DxSg!92&1%O^#8 zw^|np2gs@^uQy0}UQ*^aKlMVieaez7+th<G4<cvvyk@z6eroQ7HxD<OpJG~5Ap4+3 zs9{32k>lzIi#IM}nRVsMty?RMGv`G0domX-Pu^v?&h4(yY5&R#d*tPqS36w!6S$Er zUp>8|(MHQ{>#nLc<4>z*T5)IRdc;eyS{Z(MQ`&5_%kGBnKly8pIeRwi2>UBohNNy; z|Kk29y=DomHG0LX1HP>3yL<BP^?6N+wz?T+udc2PIq^v$^Da+`%!^MZhL`;u72;#J zurAfOdSH+7LADk1S*FOkt!wj<zkN?qf3vW9?!#~VJAX!(KGOKPa^}3hTf8_!H@^xo zVeGD+l3Zq@%)jdA?e7=<vP-ER>i^CXX_)hqHLLt3|FbK1D@~q%)tT~P!fqeO^s|Ad zb6P7!7+7pSCb3n2TyCkk?ySZ??geGR^ZrQYey(l%oib;QVSiHWldPP3chB!`oX<M< z`|ouNZ5K-YFe|yd*|A5SQM%y%oH^Rh4L_z9NGN{q`IeaT>gk2&*M2Q}C?Pk``G3U` zM(;;y3oq`GW-(*@nr$pstq}F_{{O1S>+`u^|DO5({rm8L&+B=vte;t&x#!)~FI=Zh zH@@+l=fJv$D`H<A({~TOMHlSt4t`&MY<iT1d-`^d(`5-}0=<|2OBQ(R@Sm_}+Rp4U zOX*0X0K25RT7|7P-^atu-|s$UxzD4-bM)t5HgDc3fyW;9Z$Bje|Mbc4ZY*(W7PZqt zD)yTHXvn<kv?0%{*3x{VivINj2AO<X|1ZyY<}r0$(`ALrd+I}!)7#Ig{*<+DW}Bg& zZf9Ly9u;`yYsE^hJwGK^x*oWoY#P@+EhJksI8Rke$%gaD$&)`y%Iv~2`rU3w@Bg2+ zXJ4mp@b+Ui2fx*q3#{epInQq!-Y$RX)v@#cy?9s*Rh4|2C#OZs4it_#^Rr~-n`Xgd zKHrZ0u6=O(#hpAqg-=gYm;K!uWH`;WvtY61$NJD^!H1VSyxaWjdDxEQN6x>q{rYsd z#Jb#umqI(vOzpoT>6*OY-MRkt0(BvA26~%~=Oo&M*7-P|*(hEySF1l^&wrC!zCNEH z3UO=>zP}~mX0bwuXa32lfo%y#x~H|DE&Y2*(r>w&^j!C;$9qzfd6;-tv7cQ$w=q6u z?_o<Rp0(1AU0a>sa0dp)XL|BPpE}60fd7A$-~7OaxtSOKOTCa|@PAwX|L;s;kLzE` zs~ov&qs4!vU8ys*Tl@9BIq!_04l+K6>s)VJ1u~|tVXK-bwzW{!!0Bag{Ux)@zh4?} zQ48Mn!d5Qe6SH~hw)cX$oIIBj)~s;s3SPYQL|AXhEB4&$PFDoC%`RM*p&{E_&aPf! zwJ3Od*YgvncM2^#a<@0i^{eHYMD4k!E@moLUknIcW&Bm=jKPVY*Bv4!%-*D>ueM={ z$_IsHPCgflk4vI=v#;`8zPVib?dNrgs_f$5zXmN`o0o8Q$4s_{%LzWlYn(4LOm6Y& zTg>&@)|z|SqiH4!`2ITFe{n1>^49_h*SCA0p4uuA++@?asOlcG>Px93jMq5-{j~h_ zZS%)4>FL#v->U|OKbMkvF4-2jsdMkHj4cwk<s_mW>uLxp32(_<{~)$_SMISm>B2T6 zmu+(-8ali7Iy<*NeXILXqxbdRPpR5JQvUoE(QLk<a9JSZ<cW5>W74{(qZ7F1c8T^_ zMeMJSWllD4vGO_nB4l=y_1X9Sv#w7uX_>OG_q?yi{!*)w%v;Y`D)Qv|Pd@%2$FWRJ zXPcdgYsc=cWZr*w;;QA@YA?85i861tG-+}b*)}U=3%~i7!}SMN2b>UlkaH}iH*@+w z^Erz1=9pP#U!J|<<^q-^jwLF-)93tP&5&txWS<+AR$bM7NxSTO!IxWwcjup1KKa#j zw)d%|t97n{Uze%KNjTYGd2{`en_KeUkKB&eA6u~ORqx5*_`1*c+V#-uW_zNiCj33W zv}2Kc_r_-@>ZY}K%v_PDdCKy~(<|Fg^Sx;kH2Ls;;&CyJNZ&m^Vu_{d=QsW6aD9+@ z@>_}b{Bs-lyV6XiZ~nGIIEuHnAm_o$^Fgz}d}N=kvcpU$%vpZV7R{Ax_OTB0QzC0$ z@00#0xI%N|+hdOc1t&z#Ub@yR`hDyrBiES|dYKpfbKm>*LjUc<Urby@U7O#{y_o)% zfhQq(zn`OXp7V2g<5R+JCErCJK1p)SJ-bqR!wb8$fy@Eg7rM5EwVyw3a^UM7iS$Od z(`kQBNF7PL{Ppv}`JJ+55`N!W754YlrcV1_J>{RN+|)+h!xkGnB|jzx_}(zsRwp+j zbGN8_wb}o;ufKbih|aip;rU$g8{rqFk~3m{o!4S@E01dqR!`<$R(*8tHj7}>qVmuD zM|X;Bh%7lDR`OQueGu2>*F3cz%D;^RlO#&k$seeYsQC4{qA<t#V_5f#C(k+k*1K7h z{;h7@=DFIQ@74q!Pic)tsb4?MUhcYY#<=pV)aMmn7`HQXOn-m$)h7dqKjO1<Z_c$m zlzqkWTVV<lTkQM<qc_(6Zq<zspPaFcJm4F0;prouqa7K-vD`Lg%Ip9B@%q4VOm5Cj z`*_*t=l_?#+B-|edy>vs|Eq6=1imXo-n?mRth8BQ`S-T}|Bt`XnK*aSyLG1)@I5dx zzFcd;*1t-GvvU>C6845{m#;4r>t=B6(EE9d?}M06D0hZ*Ow@;ErIsa9ALjKIhO<1* zm}<lN`hi!o;=Sw7ubjQtrz3Fq!cH-3o!Ds?7yWk3srv8#UQ*!0bBndrJ1efujO~8$ z-em68H{VpsCr>h*Tl)Qd`$m1HkWJh@eQ8rxK96hv7T_rm{UJ(t<?IJn)zV^aR(|ie zx%K4zv&xI#FTVAwxU_nH)J>MdD>koNn&2H3ef0N+rSm_3c>RutCGYfe&+jEp>vM1G zZ&>@~`9v%6|Iahdm`X%{2wE!HCuN)Hbotpd>)Y$^o3H&p_ibcG`x5OI21ovjQ+2Dl z9NvBpWapmmk-VVRBIWJw!xz-v&R?B3X=YZ_4c<B00WPflv0pDu2)V!8^w_G*4@qt} z=LSWYdk2SPyj!Cza6&ND^zG&?{Tt5h;jl4ZGe7h20`{xFLT*PXXLwaue6hQ3dh+JK zk`Kps1piNd^t%4cpFh(y+aHQ=Rkvgf=HgrZ#?v&G?=I^--<91jy**sd{_58()avD5 z9Z{J#>&q@}ryqwst1~J&N-SfR-MY+q$9S#kF%h2dx!H+P!n37+FWOrr_j~^C!1oWz zk6yMrw`fjrW>+%L47sWKs|({3BAQQHT|OK-op*Da*2^{TOYbJin(XmdXl;=wV{Te} z^{Vn-o^!dE3LaS`SUspQe|J6M&jpXj>SqyE!4@l)S<c#c=a<!oa{@b9`e(oUsmPPI z_k6x{Kz!5c!^ipktXSIv9Q}l+cphFKB-F2#Rekfpl%|EoC-0r;`tj!bTZ1mghj+!3 zJbI@zDVi7My*c{REA3=K4A1eSd|W@Pp5~>UQE_-_s_<)<s`DM;v||=*U$<_QVKU$3 zC}Wi0zt?acBlosRE0!MYe%GYvtu(PL^V{m|+TPiP{s$l5TrO8oX1jTJ`=on8@^#hg zEqCvi{_pTSzqw)m#onzRO(hi?iEF-}RK4=wmVJwuqH{Pm+vF$PQyWh@f3e&9UFOTL zQvr^DOrDt3xiYNM`}h2xTy+(LjVa^*4@rO5tlP?4yW)lDT;ccYR*PNOW!&|ZvwNq8 z^-l5gqP{*s!m&Hw*(UGx?DuJV;%8#Hk?W!vpZk?JJUf3{SIJ(?@J(psS=#bUPF<9p zX<=_=n?%o2iLV8Lj2Ba_b}V9<&iP02al4^u+vLp=1v#^HDy}ZF<xL2S-0o7jVxz?Q zqKj(}Z1h;XWnC4+^VJ`96@}a5II112mstD!-F-&8r@Fw$ZI<HfInEo^r-mGhsTN}> zIu$Ft^RURJRXLHtYk%IkF-uMK@kEW_0QRF^K9aAN?%f^v{9c0Y>SE?w5<DGIpVrl` zud4g0)I52wf7l+D@5{cwjW&4eYqBHSL2U2t-YEOqb3815t~IE+&3So?J#VkK#y$13 zMgMYKr`)ve^uM@cS)1tN=weeLR|W^mC)Zx@y*Vp>?kx6KmsZ3#|E-?j_4KLv<Krx^ zRg+EJ?tgrEAXv@M@0FaGrRBxB1>3f6e6#DMzwV4f5r;b$TJLEWRPC@mu{6<lqFmyv zq-~3Ir=*$kB%7c8w4}|EEksL9IO|fBd}_6R+?3xxbvRnMqFx<6wE2c<#_kFG6{X)E z+1<Ufbo0^~DMn9^-c!HX_ULMX@Fn?QKJJrQmX*y7+Rb)6@=7pYZC|(ZEa`sl$JHj6 zE?78yEOu5ocE{x>i|OvGEyv`qoxOi0@wM%%GahQ?FE;#p_J-5r)4%@c3sLt!UzMzS zSNOjw#qJjOpYKyz?gd<3RD8;M>X*zn&mt8Te?R=oa$;M2FrVqlSy@YD9$Z?azgy5e z-CH2tw9fy1e<p|C@?(`@Qit|^z4PncJekCd>h=}ed9OV?a^XgNbF$eo>m~ChIY>CS zzAj=*h=8pHNT_kX$2fU)M*ls7OYi4MX)T%m{L6)>;*D|MmqRpswLF4Y0(+iL5WHpZ zdXJ{N!M&c((=_9SR99czC(p>Ad}E7W_e-H~l6vVMR?c=ROE^CH+O>V9xq2OqfzEDg z{{GI}%TTw;;7;h1?dgtlo6D}2TjrgpIoY()V)0?G4civv9*dbXO(Z-rrsQ@^ND#l| zIpIC$dd*s1JUyVxetET_x#5Z^{UfO%EB3s6a_pY|Sq{_V*WNo=tuW<lJlp$Jz@nU2 zI3X<c+4PuAeNUhGL{5&`xaQZC;sD0&?+YA@It@&hdB0s*<N5urK*6e#SNq<*`+Tv& zMyT|{^LxfqI6sLU(Wt82D{)<9%0UfRsVAq`oR^ec6MX1I@h7%xcm4bw{a?NKG>2>J zsu$YH1v$Uoe`mRzvL|kC%~h9cbKmg_#H?blG<BN9a;46_Z|=t+og4bc47Z<KS5#zC zovu*9%B9u7#^|z1nTwD6oY)*Gn>sJCM|)S^*<JZm<k(jcjm?}<{fmvRXIpA7eRv}= zzUP}7!(zLeg|&CD3NBmbbjq7OVfQ_&Uk*!Dk`2}_-WdFCHfwdq%IE6B+3L*h1y)~v z%Q)s9eDwE@-rl$s57-Od&fh8Bux%MjlVkU%y_~Z1*;CiwW;5|T{^W2<?7SW22}@dg z{%1|keyS+pZqe_y<BxmRWEEZc34AA3C$8ITezt9{N$P#}qepvv@B5mHzW=>W?T*i< z!;0RQ@3DzKIND^?F?T|R+1yo~L6?g2LZ9EZ;`}r3b@j_zg7@m?SFCql{qCMdRQ)w8 zj{BOI$^>`Rez|UEmyuB%)%5b-j!6-d&V5vT?Q`!}R4v;%k<y>LvKMDR)qelRbk#Yw z+w%;!-ST#y^z3#tM<q|PU3P~9%bFzlE8nv7r*SR6b2+o?o3X2>m@~Ud@FfAywl!{R z0%jG9q}Ot=%uS!m*mh29i|~!|->UuHeA}uGdK|4xEzJ8Ka?Z1_W}Du#u<WsM@wda3 zIp==v`TTOvWb^0i|Gz#||4+2fwqkF{pYJL!Rn^+=-U}9<l{JO2@$}lRj}oD8CVIEd zSAQ<p`7=<mPwnkr#ezbv9XcPLC*BD+4PAb5M~u+xC0Ew(I{e&|XWBL1O?OM(-p%iM z7_jN^&m5Vnk=#?(8s3rCpFMFM)9!DFJE9AIRwv(mB51lRYfk2sDRcP@V*Rt?zGuDB ze4zYaC3%hLHYMSrtER`U{+j2-boSfb6WyPURy{N5`Tgom`SX&@BQiN@Z&pv<G{fBg zgIRCyY{}==XZ+PNnB6{f8}=M~;a0d}@4ls)eFkEUKBpP;yU+dQzd2)7L(lP)D<Wrv z=cKJjdtz(R+iR6^@j9=X)IRIivv%rsE<T~I)Gpz9eRuJbIz82&``%0rET0~jm31Uz zPcEnaF;n(blYJ2yyEd?;wjbwr-QDk=@a)0CuUR+LPx@>-`eC-iV#D&2(vuAOnm0dB zn608IHF3*<>Zso5>)si@{#b4FeTno>%}lS?)0xi*<wY%?nA&!?>azT`zn=3v-Bw0t zPdjke^u_DLR_}{!=P4ZcyyNvh8JpKLzCW8^p8UW58^e$GdH-jIf1fAavE{F3MY(<d zy(KFujJ?Xw<!(Kx&@<0J<GlIh1G~Hvjb1IRIed-xNZXoahHGA1c}?I8bWeJ*B2#G6 zq9m8f_NC&CaZlo``+4WPDy~1d(Nk*W_PY^$%ikJ^zn*z?)(hX{50AO>g`eafTrT_X zZSd3jS~1@=tDeo4k6EwHK4_l)S7;6QlC>XxG2U{2etXJ~Pt2FTHy3ipu{~B*m)mdM zvuJVAbjjeAyEsHMQ*7iqco|%Rl%L76E}1QMPWa9-C*P?SOGImz-0QJVu$VLbXyr}m z+agBMO9~JDuyl%KikH%tyHl*x$LF%<+$M{Qvt`x@wg;Y#xc(sIflc<Wv!0uJ{-#}7 zf5GpVEz>=ze;j(d&92SZx^ucvj=j|S|C2g5e|-LC$@*i<1wY9b`R1Q?{8#niq5ipk ze`fnLKYqrZTQxs+^1d?hRkt_2n738=$5)PLf_1Z-?%Q{1ez0Y`CS}ByGxaB9ywZwv z^}o|T8VdKbMJLZtoZnpQTd<x-P-b4m>Y3Gi%dSZTKW^Ew_TKI_L8T{u3#IVSH1gG2 z)VJ^BvWpt&J9b}NGbeKC%iDXUPkm9F=V$MKZnw+=Gf6qKT;8@Nrx$&h|D3nx@{{6% z$&A+*K077!-Yq3_LSPKH=<=Pf*DucsnB$hLevdozb;kcGF^{jM<gjmvD~a>%&5WGl zJa4UF@IpTJX<Wf!ANR-|+i0~-HPhnoLyxRGZ$1A%uYF{{#ICW>({Ryz(|OXp3*L6U zxf3kRyhyd^>cX#UKF?E2Ug^!ACHz8h+F|_z3(H;|aB$#ql~H^0Bui`EBIfu-##-W* zGgtKJ9)9GtI-^$Tq1fIJCd*b9&eMK;Bf_b2$3~0gXHSGWq-IaZxErJSkZ-#7n&8KV zY`fW)FFJkj_riJeT4(gds)=XacM9H}Y}%)K@3Q<nk(*2Z%t~2)j$_lhi)Jjh<n&g3 zzEb)tpFKvtK&x%`W4&3?x}j&*3!hQ1(6QRCr+(Ou^?q^l>`nFV{C$Q$b~=hMDmcGe zBN_a8M&&-vwY#sy79W?nA+qPIbzTYMobPLvRYWA-X)5Ij^6V1#p884ZO1sIuXP^F9 z*l4I-^Pbmy`O1tn8^eBH&Pf(tnkU4t_kG{mq=Xv`JhiJrtv6g*{4z_lBIB>#7Zu}+ z4`V8`3q+nT?Z4cY-V^s$c)plVp8x0gs1=^U^JTkE^Z52Ecbfg2#(Jr0zS1o1q>DxS zf9>9OzFc%a(_CIZtw(KkwVm_$E|$>h)B^cVu%#N1E*FWyj^#Ii*e#{=f57fZ^8) zBcJ*9yuG#u|1R3XP%OI7x%qMXwRaZW2KU#?GL)D$eR-K#I5*na)Nk&`gRX+9jCbA( zY=7sxAZm)KOZ|L(rkHH*ZM!9WO51lyY?J<c)oQC`lF=>C7Z0aM<#|c$j9#SECcbgs zy7gH;*8^%c+V^biIyEbZUB>vr^1Q7XcU^-grs@6FmCR|0n!Af7xAC&n8e<dgDF1sm zwT`^lk{1)6*L#1@#L4fb+zPp}Y4tNp(`27xdskju5aB-O>%JhdfI^jxMprVvb%u&Q zwX<Ey%oqK#_xp{rQ{=BTTJQ$8shsbSE(*0*TiO<5t=zw;sYs${bNAA%`~lAswz|bl z3Nqg#ZKrnk{k`w?ySlV$W;iG{OcS*>4+)GrUUz<)vyk{}pVn8lQ;#im)N4P$`u*SY z+7%n+qrM0K-^}*D^wmmF=l{t<s}pWd@hHmQu>RQB=nqBtSI+m%KlrSH@s-GtHD5&a zFWuYb;3+Lz5NY11;@{sO##F!9oKN#f@71jP-xU>}9W{AzlYjABrk3ai->CAVPh{*( zd0W4oW3n{!U6U%Z{FrJl)8YQBE2L$%7GAj~`%pOfYQoc#Hx7T9b6;9;I!nQ+gPH4i zmV2G)J+9-HT>D~PvGDB<)=PR}cWytr!eQqlz25oZ?YBq%m&^aS$fxK2__8lU_PpI| zu21o=tK*bQlrjj}VRiTT%EA=hM!);bulI+&GOeh#c)tE$ojaf2;`dMA`xb89Y`9PA z`Q**dj_eEHV-l5J^Wj0=<TdI(3Eo~4{!I`muPt7d@3td&*(ssk%FI94e;@d#_#>-J zek<40>VRv<Ue2nh^z{ihjcQ}~exo@v*G6yMuM<7fFYb(Qe#~)gch&6At`0Fb71mBF zJ{uh1mLV(?{*`<A*_r=^Jp$BMEPrt8`@d-3I-4f`yX}X4++S~Unr*V?bm*HUdtX>a zFvnXfryI{w&EjZ@>-W0T^jfQU_hOSv4|>vio@zF>+E`96PCj9@&UR_Sy58e=Z}5fB z`+Ma^cG7M3wZ1HCmKe0X*^_s!iffzYjqeF@&1vVNgr8rT@%-3DTk%(l$EMX9etQ<N zN~Fi5_wDA-iClg16Sf_z^!cITzuBF0TGkWUJr>E_St?~sTdkI>{XA!wl@#B&P2yfk zg~c;B<Hc`ZW%s|64bQsl@HT_T^J3%KBO<cw$Ab?4biJ(ansfKrUOCgN-<EonrT@KY z^4j@C`uw}QV&>P+`SX3&fx5l#YCqk7H2>G%KXVTKQLg<a`BG4ARp^1;mv{J_Wy)X2 z8B*f%NRn4bOK3@HxS+J6N@VMf7pu=EzF=P{^Wkbvz(W^<(k*XZcAd+(BVS<S!ax6C z(i(N$Pj5Lc&E`?K#QI0;?2-BPYBj=t7uAYvQa_xosP}WivaH<)%FMo9`jKFue{51u zlCQ`vuJ}5O<K_|j&F|ggTejDzp8r|?%x{^G-m4$4FJ{Z;VH3};i4(eS_W0kD^ShTF zm=-FrPq+8)>x1!X$uh#xDn}i^GOhf!V*8i0nDw1SD|42gy1t&dzHaTG_iGK#cUJeT z;otDz#IE+jmv8RbHG9&JP2PCr*!1Yf_y3(gWh32x%i`Oqtp|TTK5||2qsG*QCUI`h zpPxQp8@lY;4w3Y`#-&pyzuczv+j^(om4|aA+Ix1Uh`3Kx+nRFt|80l3g?0H$IM4k* zexxLHVNrc?ot>Lr{?zI7x#yp2eQdL#|6IGjkzkEY&-VQX|DK;~AN2T(;^uukHS%+Q z3;p@V_210&8SlUQ_U`ZM56x)$xZk<>`S1J9ma2CD`1b$jGqXOeTx@qz_|d+!d;555 zcF6F|&M3_-S=P;GuxOt<f7OZA3%1>Rp>FzhCs)Tw1%=hYyS^_vv})!u;aMSzolaJK zU(XP`<9z1xVy}${tG~?uo_W+b`^!q<Ick<&+g`Zo?@oMqou#<whW{=TZ#HWaM!6S9 zD??R$=9+xnmR@-Kd%A8><F|tn`cD50KP+o5j5Jz4LG$XLss{5sd*j=azI+Z^{KhJ! zZDS_abEbLAxF)j~X6o2(>wUqidCWVjXL@tA-k*rxr@DeiIiE<)ty=qf9g}NFWuWlK z<!cUoJQpXVbX$39TU<q0V7PjA2)Apm)AZUEKl%A37rr}oBiWmO!s)*&Cl)WiQfZJD z$bKvF%H12~>Ddp87xx%l?J?ab{=s+3=9LG3^7PN2xr^Ijw!NgG=eGcB?gLCZJ74`t z>oMOkZ&y!dgRc20%LlrJniIq&*E|zB;@SJO*7#GK(yTSXQx5<5vXEKh*Q*E3Tb?|Q zo%L4ZV3XA9&DPJeo>YIZZ7McvyZhmPz`~O(7kjoGUdk39tn6p|Z-vzFRkaGv8{!v; zzxexPna8|^q2DeZU6Y}8fM+q^L8%WvG{3(p;_&gXuw#klbSw9pY`E8K-G1?$yf=HZ zbB^9HS7*K+yfl{o+s;Wg5oYQC4HJ%^Xg_#WgCUpW)|&m^d~X;xtDUwyQc}R5!Nk9a zqoL{)>z|mNy2n1=&AdP5$pz7Zp2%g1+ogYGbrncSXI@h=c(<Qn<E==SyjflEW-nng zdT9F1cc0$&349i_diJ(4>IED0O?}E!FX#DM@8t4lxy9RD9pYuO5|&BoO+Qw^^-9FX zsAj+Ozr-`;k3&Q+Z(a0#?!+r+jbh?Ng)7$woHts#m1$pgY(iAM>8_T{%Tk-ybga9+ zY)Q-e=B}fQS7qjObeha~v1E?bjwqge?B3}|=Gece{<Ty3u(L_pJFCU(Hy17VE}J8| zqHu1*=0<0$(<iozB;RMcmY{R2hHG8Ag_^7R)kTMsW-Ps)WBsIk+3Dp!w$6`8$*TBL z8$DU=(KoR(lNn|uwn_IIzFd>Tus&+}??vZluvupM>%H_Xs?fQW?Jv;9c~03Y;nk;k zDF^G?ww#DqWftglT=<5{;YVw;-k;sfu<$tJHK+KKDOUp1-$a#|3(7W}bc`~&JDcsq z`U`dkzX`l}%HA`3b9>gQIZNNiJ0EcVVtZau&2eY8zt7^!&k{BUG#kAT4>gQQeR(oS za#}k>vGH2lT^Ci}w{Bpwi|*L?P%vhe+NNBiKFL=SI_x~=$veJQTo-(2e)3$Bk=*}D zGt5o9mKvX4!@sOdm}AP1)K}p)R<_5t_*I8Qe9L<fQNrf(y>o+_z-!AwdG@!HgG?OP zvV7ltM(eoRHIF$aD!czO+?P7pqig;1j^@5-gLl1mve(@{d$aD)zl<qjJ?Y63S7Y+? zC&<To%Vg<ndi`dD<QtKm>&GliCYc8QzJ4U(T-U}N&f7iH1A2G-;keX)YD3sE!yl*r zNBpRWvsC)L_skUg2e)tD*njA2T1`yTLbGGnT)r>=cu}igQ9Cw?{}1oWm8%_QKa|<? z$NS-zs2^r(`}k)5e#O%#;V1g;`-Ah<kGFcfn`xGjofxnEy#L(OatZy`#gfO>y1Yab z&+kwD@!kEyTkqsQi8V@wbF`A1OACIyXqdQfm0qNGYP?peiCw+Kj{?JI2P5UPraa$l zIOoA}i6#3@m&x}|_fE1^pVnUZbKSGMYP`j#6zx|UN$oa&74BiaW8U1CYc~J0J7{H< zpZ`JXp!~{@*Cz*;DQ`VyVfO7l-?VC_wVdy&*6S}%__JnLO7$rl-3T#taZg>o2dD2J z+~<5x+PUfF8yRDpEP?JtwaagwJlh%i{nyJidk@U6+CSZU@!5jkvpTb4^m_jYZCI(M zo!DZT*g7L&)|}H%RI+Q%wC+ED(CAdm7Za0rn~m4@ifbQvA>vjOwB*Nm=4V24+Wb!2 ztJ=-eww5xe*E#6D?#LUR?ETRhKaOVleocC{Y35%Jzfk8+$+^N;Qx3gtTcqoI;O6FX z*+~&a-}eSy3s_RVs)z6B+^oLq3hRwNoKBm2GHc3W!&#cHX>S-d{+(pMb(Ny<y8FyC z8@8{r?E3Zk%y0Eu_4;P>G#TGJ*H_&?WUs*FpWL{-O~GmLDY1o}P9<p$`HOz%J5Apt z!7TXeZ|6I^&+NKu(vQD>yF}&47O}s-Z?(+Y-F@lV+m)+JUR_k^Tvq(@@{UWto(df^ z;tZ5Lyy5H$#_c+<?uvAM`Tg?TN;9|MveF42p?Nbal<(Z!eqg(coYS$&6Y2>!RXiis zFB07MWMYP|pp<v2_c=Rto0A#&k<Gv7yKXsl(=*-n&)W+o_o6mjeehP}Pd2w+%EF}N zMZHx$)tB^RN-pMf&g!*4zu}*_;^MW>zdV~<=ri};x5?ivR>t(4?YW&$W6G%TJ7Y?q zTcZAIzPR^o!7C-7>sp)(@Qb?f_|^^g)Fi!yNhzy&t+~>T^`2ePndYk7n`p4C`=f>R zeQ(vbA9fvhpD$Ye`1ZUV`myK#6{c8mEtU-ba%P?2ma7qAkJ|$6ET7)6yy|AdHBmUT zsXy7^ZtvgaT%Ee?#$7A5B<`QJG<|&e?SrfQf39fUcBoU~>fEYwD=&mqaHDzduWXYV zp<BO8cIDsLeQ)O%UyJW*cjuoC?w2jRzH6@ktale)ZaOcR=U1})rrpmqe;>VX4VC>p zzkFAGwpENn@Mj?{y`tq)x9{7^>zg!>cWQXDRgAD`u<(nYHv_nieo4C2l^SbR$#d(* zjWvRShP&J<ChgA9^|PImzUBVSxyGGa*z0d=+wYS&Jk4VHk$F<po!@I-uy{T6xcKsq z*9DE{W%pFSSgM<|&3UP-nY51OwcM7yhVQf@_82$snQv>!dRSrd;#dChy?p`4E_<vs z)>`y<?lSLu4#juYlVZ;-jhAa)@x=O+w|uvw=!eMJhC3sK1%H*_6#05p=H1mFA3Y)p z+Z=r#C2DP}Wl%F+z2=yEyZq!EteaOiMtpmBH^J%3_NSS3OP{5Ce+UZjGx^0QCR`+w zyxefHr_cdIman06J}Ra-xlKLzj5AsJ#%c-O$A_PMesD~x>)34JJN^!rwya+JNlY^R zZR_3_N-}(JI};ZK*DSqm{{Eg2TXDqvKez2ST(tT$w@Hz;@OAc%;7yks7$z<<&g2c( ziCLa1Jol;5YbIGWU!M45$D;YR{mYTR`r)eR*I&vXi<-X8&ZygNyF=e`Rj>Hx@&={$ zFSnMiym=<Jt$2rF<OHXp)>7jeLTvA+Td=N?=x3G7HZV=TR~mjz>PhJNcLf=q)hRw& z_Z()u+Q4@vf$4qBmFK*sLJ212w<7K@HhwCvoIiD^r`&|_9ir*l=jQC@`?*kK!}68W zOlL0H+o$;btwEpb`)tcEk)Ics+B`Y->{j&B>hp8hca-e<o8~sRDfP8lzUQ&6)eccl zp9d~JUSnoaT_Br!BuZY^h0}NbYmVsW$CvSm@Ou6{|EB2ve6@>ji>KujlsD#mk51Sv zk-L2H-s2*9?JxH3-|A#-ZC?Dy;MTG^A303dKJM=MEA{Dr<*!JMg^un%qTiN3fAaT! zsNvf?SH6Ub@7+?iH~-uxwo?b@OwE_w`*Jgrw`ld@<9fziYqcLumw6buTXJsVCXY`- zJ2xlH+IKsb-{OkJ`R1-CpZ0xEc{5#DMr_Tx&W}rHZ#|-C->dN}X65^nW@dTMA55B? z-Q+!OO<G~b;(Niob*k%4Htc=>T7cWcMPO=9TIeP>wHv=v>gMc9S#;png)g(5x4bfB z-`+WI%aUD(gVQ@r=6=<5pB})LeQBqF;(`vQI`I#oQZltn@1$pFH$I(mB#YxgV9!Iw zO5S6W)v9u*Oj-AB^I2cvD^XkJi#Q76W4AVcce49c8~4j<R`-p}Uc0}})$6~$UvGJ3 z^_KfNzt+XAX<odn@h0azTbrQo44R<}-pBQ%21YqKhdfU#t59n&nd^D)U|L7{&jSyV ze)pQB&J@2|RraNE{>o>%(GU9N%HK5pzvi*?)5p}u`up`w%Jcds%JVN@Bg*#t2Ty<Z z$6Xedp@vg0{FdA9W&MOnKKsDB-#HQwOZblUAFOCCJOAds@ab1mbblo0*zinq4k<nN z>Aq))nwyc5_53qGEX?B8^)8)x?PTohnwaKa&I$d!59X^xKU{0bckbrG8HKyOpU<E4 zr>1Z6#brlqysb8GKNTcAaiU|naT3qJf0A}}rh3%{UB~RI<Jr$WFuJ}^xArWL)B_tk ziT|^Bt0x{mS9{&0N`hzp?+Gg<=4TnqncXvKqT;=OLLY+e)oQ&`iwu@(I2gfy_+C%g zTK}Fz?StpnPGpJ;G)X`DBd&DYa>lgcMVHT|URiTpFO+$i&xfd{-&sdAE#`9T%a`?O zYTP$|efH*RiPGQKEclOQ2IW@9_x>+pSufvoo2T?r>{hv?nQo=eE@cEK|6JDC&VFM? z#?twjE7I<09r5I8D>S_{y~2E}eASf?*N*7<%ze9?Y5m$v57}QfTc<yAHYp0tRa?L8 z1w)*N)#cO+OMkcSSj}g8<x6;o|Lx);|JTgSf9p?eKIy*ZhMs-S+T}Z1eofMl+BZGU z<K|^){R;D6weMfgUvO~q{_W-b4RKASy?;0FRDYo#c6q`3rRk;L<S(7)@-^@OcJIyd zxE&w<RDN82vQxn8k=l_(*WPhnaAf?|DB|k3MV0&H2F6P&Rt0u0bG<y@_1STV7))RH z++tp#zuT5$7h0xmW6RB*Yj*L(yPo6|vPMnEpKTF4!?;rF^u&m~gMmjg&!pd-@>w%D zs$f6sap^q_-eCu~i7bBG`#$^WWOF@D!S;<;UYw0`Xx+>9+BM{9Nyy8ohi+Ow66Wn= z%(}K@`Q4{NS=V;_OIuUD?9QA|6Ta=(8Q3q!X?&tw(acvc+UQ$<=fc-ZXRG!dyz$Op ztDC2r)R((+%T}nT%P+N`V}5aAIe%Eb&pRFW!%>f&O`mZU8f{~cPI)qk+sFHZX?9n^ z-NdTq2&qI*aXz<wYJCNdCKL)6U$@U)cldY88Sx$Z%7-5}tTlS`;kWv8nE<(CyQG$1 zxv~C1q?+yPS8p~i)BktvME@zrrMXitF5Pb9X1VfKg3Lm;RS^Y?l3bs)xG(>|{l%C6 z>B{rwxy{(GVH&t#$^y}g?D4aUef(=J-Uq)E+{kikv%@Q^n$3K2C0b>gOe&Ys_FlZQ zUTDwkNj5LH%zN?M<esGY$s=)<Ox$UEE#4lzahc<!)DlCF;0Me7gypn(rX~u!%FoNG zPKp=qcYk)HWJNFA;Yk*Go%8eA?eA+{=k@dLWI3#2)~YJ$73uN$z7uPBj^3^xS1dMl zt;jUG(fg@*!J5vDsk5|9=gnGLf6e@vNRP8Y@1+yw)pBJe(=#iiqFuALyfV7;@|F?z zVe{$o4X<ZD$$H{vA5xZ_tjl>jHA}^Jul9`v^LsDfuxORK`LrO9_Z<7JVm;xFxs9hi zSwEQ_PUfh~p6iyIW$;Q*cB$Nyb2kpN&f{snc4A&ruJI}6K3})u={G&ZeOIitf6rkm zF*Q%ixa{~VyMt@aerT84Wt;M&II^cO+;Eq&!K+6Gy`L7{=x<1hDKb|%%@kWU-Q`Fu zYh7ew!SUnk{<<<;Gp?Fgar{V1+^>`cp%!7KJ5TO@w#!>tD$A_gBsJq@_~yy6IbA0f zJ&)z}>n@DHRJ|tic27m|E!!P(2TKk9=zdH$;^V5$esaySVA=k|yS&S*?|Gl~aNWLK zy)o&y+I-2f#*D`zKLnXX-yhq?nIJh??`~gdVGGayS8F^jL|I4d(6oJGAW|5zcy`7s zTh;4(16~RHw9lIQC6V*f0`vW*KO1hWOE*?i_W!l7uj!9u*<5pLuXYRmW0uYG$HIDY zuR3MO&3LJIZsq;|v3ir;5-zA%xCWT5efs$38<n^HFGXs&=lbsBJfOknll8?tdxO^1 z=N489MvZe5T?4C~1)DWzUkjEx;wPoHV&Ud;?ue>Mex3(EEc$Mza`Ex?tSfi^>TsR; ze&{Znq_^p=IVUXokNxB^^A@f(kxaX`s8pafad!56m!RH{J|8n<xf0fK+O6=ct>U$D ze6Y}8PT3^Zk1_hynO}TT(bo^iyPjY7_4lL9s^z=g=c|`GpP!=0*4Y2h>Y6+Mp81Ry zQzP?!`9-&#Wie?veWB>~lF8?N|2aOfJ88B!uG;qccdyqc{r$t79$%Ne*(D+Gbo*;{ z(cExz@fU{I5?<xaKAhp>`eyf5sqL=slO2u~r}N)ao2j^L&HncqR`P#-&T~5d*}&EP zS)j<rT*lX$Jarja_pJ<Gww$@4w@W@txYW+TuYHf|vsK3$rrbFH;Y5~Lzwi8uv$E3q z7p&XAEbreMR;RCJYnf_3z5Ah7p!=Lp<!h;^nwZ0>g-hD9lJd<wLvAg3c%`6(wWGA3 zPla*w`~dO0vnv}O-#P!(GrNd?*YfFE`Je0b)%NngH`?)hZpi9IjH;?lRbS5E`?BA@ zM&rlvw!LC)#i@4Pmn#0-ef(=y7~Q)`LOt2$<ww|B0RJV%GUAQa(*=sxz3XZ@yR~T6 z+}t8L^^;BZ=MO&BVK~s9uwU}He|qf~j!TLX&guEwj3$pYUan~CH>#CROP|-%uW2EB ztp9LjwZ+$U#Vd0TeoKF7WA&4N`5uY;;mJ3iT)2OyBKz1~)?3vFR4sq9zELUIGA$vp zr}j#5J)h6t1}p3P>mQg`=pJ;>-!qprE0SF=I=z8!-Myz3FaO2Hek<Z(5;=aVI>}Gu zhqu<9NgG42HxwDvOggf0Tf$vdy+7YP_V6Sf`m@6A?<LhVHO}|@v^L#HSN2=9efi$z zV7^kbq8)lBmuJol-fuiROVg)e*86imqkfje&D7VfKPzl%d3A1d<NSW7NUrCX547{# zls>&e@k6HZwt{O}YwjO4xX-^_=Ad`Tv;JQB*_Q;<!i^Zt8eUma+<v8}X5A9bcO9*} z^j^uci+2R=X|AYN-mUa|*2<OJ+S^<|D?EN*e&Mx2hT{I6YmEPI3}1FJqq)uSccRZy z^ZT*yXYjn(_+(WW?=JPwEp`gobNBsU)4k}r|JLL2)A!}?W{-beyR$9&yz%q-?LYn7 z{!i9YU|8_~bBXAd<!1}83rOrg<FKUity;2M`FHau!HNYHvc96-_WXbT8U9|F@-KVW z)mdL$6KDMq&ZrXq^>e3P;MWA163I7LMHicU+>VI(*>Ur!X90sduV1LO@tqY*jZ~AZ zr5-Dbus*r;Xx=$LJIRT?so}|nGK{lLe%*d2(dD&j`KfQO?mF6cHcf7_m%H@u?u%t^ zc{202ZYXMgJfW^~$0^<IA}iV_K0C9?bX&Eu?7^oQGgkgQdvgYxDc5nu+}VuNJuC0` z-%SjDGVg6~PT$-fo7W9d(aHRxY?2qhir&4r`sN#*WCKO@$3eb<v7vmI=kzFR-qM`5 z;M%D`ruVnzpU{dDHi&#|p{~UJ=SICr8vinWx1AQpWq!%sUy?0T)o4{6a3Rg>;*M>n z&MOzc5_Gt{L}KoH6`Q7=p>0_;Jqo%TOau4&ZFMw!#WVZ$?^Ed;nWlWt*`*`Lx;;Ur zc?V0`Ro?0uEBbP;lsHyK+znX#JLXOG^?zy!TfY0=Y_+*!aMU#Kpo4+X9e4Fzb^96b zx%}=EDE<B7XhZ4r==ZE*zPFC<JvqZr+%)u}I-CFBor+iPRXcv1V^s0t(YH_BDjxUB zYxUipRIEy>*|dy>>HkvRZ969}Yg+EMk|}Fi>_x}0p36JExHhTh*$ZvYxBh+Y#`RMh z)BGk%*js)}T4eIjDE1Y{(=vz1-r|?bjDrKzE5oO-o#uc3?^(rU<{fjJOm=Pxne5Q{ z#Hf8{Tf(VcTXVj;${BCwKAYz#=o2h#yOqPCB=~S>dH9*DS61llUHkTvzK7V8?8LVo zFN1f-aXne|%DT5J((A<k2RC~5o^-s$uRQBab5wKiiJZ*s3DR5Zju~3rKDb5WhpDPp zWcF53-|20Ol1e-`L@o~5d%u63ZT9Y%8=p77EZFGy$Ky%Ln%LxZeD(>V$uA_DO})cy zb)vK%F6>Obsv72WcF%cRA)bX_?HpbotG#$cDx%y~YMYqTirHP$)j6(Ob*ucEdH<uf zS81d3+*kAZ70PDlIa+HT`Wo27X}UWzfHCB_-%4}ei<kIvPbPVpirSl&INZ)U<6aQu zl3ni2qule{t4iv+Yx=`2e*fip-hY~Ljm2-fR@d`7^R{LD1}zi&-L$9L&bjTI{>4J# zv1@D1l6BGZwv>6BPrl3lKrl!8$-CplQyQ2ug+#4)E?YF4TVmE;X`Zt1dvjcq*Lyxc zGB2UJ_|vr+n;$813cuaDh~r}2yNZ6htqtD<LhB+GZJP?kW~?rmT+y$7CUT!};kCK7 zcX~Hv%@SFtr^DZS^6H(?9*@ReSr1;{$*&l1-_0n$C;j$dQz5%`%(?fz?!`0CT}tFw zrsu!v?22x~C0ai(Ez{VQ$mb_7b=g(<rqr=-&$h_L|0pZB`@15c@oQSqoU3Q%%jo%@ znR|BEH(5s0#W$;~x_x9Gez<m!TjQ@xxy$n_IhXJGGHeZhB)+v+yg||6V#eYFvtQIn zK3?%T!ThJB%4?pfj^`_H|DLm~L0;?1XUV?)4`P=t{?aq}896;sOXDWX7yf3>16G;x z@}cf7epy;~UpCCQN&U3s@AXB;o8GQ_w*Tev<!eg24^FJwQ!M=ZsC96L#1yY!r(dPn zN$h?X)wj)Fw59Ldvsv?>?=@93-pIPkCNWlUsa>YPqMn@GwD;$?ef|EBt@8T))~~m& z^7tnS`syDHYJSQWQhV;vv5nlV_V=~iJ+$M`Z4kKg{?mq2b8Q2=9`VWk{XT8}vly)- z(O;5pNTp9rx%A7;zW&#QwX9DLSA0o3A7eCAG1|Y&=o*{;!sqAKt^B_$W0mdOgQZNf zAAEaN)ROP7cGq~-4)^3|?=;@;QQorkKw0^*OCkR1E0z`KMyJfM^f~x4`SE9Y>yNiq zEN|oY4Su}d*nYq7p1UfI+8S<V=_k^YtxwCp*_blZ^8GE{^^?yX`<j!(>v#9KD%YKR zJik}TJ+>&xpX;`G?WD!N%NsUt{=Qi^Ci|B58U3!_uWTQ6H`)n(4}GoMdaY*TvHxZ# z?tF^2h%fr^>!#)6_j*iMXHRZ3oPN=w|J=Vz8Cy5X9J|Cb>6)`_(_WUJddJTHy;Z?; zFuSq;d4qqJRKJ?S>DlkZS1;PX-1rUm4PS;g6}<QC%r5=<!X;Gw+2`?d+u*J?sr7d& z)~`8N*#1=R&mK{`=SMbJ|K|HH^d|f9*3IjtF~5?Uv%d4?8-oM6yvw2uc5n2Z)fU{8 z*s@&hGJC}Iees*jZf>)(eDF1+rbfm^=Ff+jW#W%ttu@>Co;7>Xo%pi3um3GPX`EY{ zQ}``SXZr)LD~E4hd$5W1`Ql0O%~hq0Rc8-A%@^c7^)SLjPy5EsLi>Z${ocy^zI2uI znq0kO(VsTu9cPlxAA5FXYa-k7oq=~*HNwJMYSRm46K$fBeW!XCx2<|u;#)QE;r<(Y zES-29uS8$?bzx6d#$~5w_Eo={;`9E!db`5c?G)qt-j0{gZEgQl7_nE`<`kX$dv$xl ze;x*w^O<SOA4;F#*dWg0>+A8U!I3?`RJSR!WbeLy)6a?i@e+qZR4Vvl|J90w{B94J z_<E7K^%mFQxgCBBZ%7~Js5DLrwR^rrEN<nKgPO%j-(6mnoU&oP?aKQhv-$1C57m#I z9%`Qpl78NI;KGA1&z=|_JUL_CF+29}yEpD<-R8WsNNVm&#xPNCqq$cO+!sH}S9?eL zapIDTqLSamfBc#5;@vBM|G^LG815Lp8*Y!kakX16KUuj)bl>{k(~AqYc@-{JF=eU~ zSJ=3`A%o|lg#5AZ|E+gybKCY{MeptNhxR``_2>41+s`}q^LFOGWh>acqHTM%!Ma8K z&&1~N1+M60OVyN#e!9{6dhC^F7kSTLl6~LrC6{Q?`RN(k%Q+J3{AMNOWCcu{ub6d_ zOP)i?^7VUzzkCyg?*E&%F_b;Y^U{Z#mu`G-lkYu!pR0#yVvv~f!rDw8<|o=m<dv(> zPT8OPC(P{F%@xUMkwTAcr$kyG{IPQ4`3?W%Cd{p!T~RYPBHW|ieny`4`h3<)C$?D^ z7CxF>95Z)*`SE`_H<TJqIJ8x^3mNLMn3!t#cg69UO0;_#Td+Kd<xP-%vp3UYUE74& zUGvK>$w}+)?KF(Yw_>Rg_*9);pygGxz`xY_v}4C2TWNJs|7){%uc#F==<>R?=(4l5 z!i4!64s9ZS`<$yR44tHmP0uD=x|4tJ$H!+m<}>;JePp!TllNzaRQ<cw_nJR`&(H7K z-t*Jp*9?iY>3TOpGj44D5T$DB$yWI8%g3`H%$4uYRZQqSc3!t)N`gn*R3B&IV?Xcw z<+z}@GGfQFD}s~bYHtc{b^l>=-i-g{Rr!T#C!MM*?#_wnU1)yRyXl1Q(c5V^-u2{L ziASY-_9Um4ddyC7mp|54`S`SLar~UG?VfLD`I>wyPW}_Ka=OB{Gan0XJ)X|ewRf|M z+mjaF4|X?sVsrF)t9s^%s~=nNM>T?fMfc}lysyqD#P>X$@bK9`$+9hB$|gU(RupQg zm0jTIv7Tf2D#K=7!2N`phI~h>DSZ>&)ZLEzo%^}ee~XS4$K{oamLDtJVH5j8c(=jK zS5qGRDR|kx`NjG-Up#Mpw(N8b-R&LLa_w!Uf!=)W`s$T`stfmBZ+y7B;mKvs(pT5E z&er^{cDwb2e7oA&n>{sc$5$^A`JH5QPb&W3-Un+xd@O$SYf{GkgMO*C#kbCO9DQKm zr|$7wVLl7foAPE~-`{o_Ml*c{w`_0USX1h!JwfVl22Wbdw`0%yd*7#r`xTlm@3H-` z@Z!1;kJmh}t~{{O?3<E8O4Whm^_<K23(kLt==r#~;rk}3+{Wn*!NHDuzItZ$Y}m_i z^5%Y)r}vvRB@Z9%klbf>bk5$mo;#A6-`kC@cu$S~YjEiJ<lyylKMES%yk%sRa=ZC* z`1H&u^UDR?dg+Y3+bj#s`?m6T^IS?PXtQ{EbH8ngd`vx?^ZYsqt9m8VWx<Q)_7qM_ zeERNKX~@C2_s43BU3u#aPbo34dY#VLtv{ddkMl$IW7qSQZ|^MpDPwRb{(a})|EG9Z z^^!OE^4)w=y|GFEU?t1CfcAuH&Trzr7oXSdOA!yKwGLG^T%&iZ=0wbya?$K&?k%er zpE7PdeK|oQ@imXQ`?)*cV-<GtMkzZBXWV+Bv++yLqQ%muPd$I})|zLvil}_sv3|ik z=fwU4eCfB@E-n1-$Yt4Oe_&s;e!)H0)?D5b$11okxz82<xxjs6W`69f8{A7hHwlQ> zrl*Q#RLH4hCW>f3=BT_Zv-q6`-{O0wsp(AnU+~-zKQX)O_9bDybLq;pSxIk0cl<4R zCC<3vDaXv*wB#zm$4g~m(;}RU_DnzWB5Hc-n+M(pLjKH66kK>rTlhno%``XFipo;G z`3Y-hy?8Ev?u%*1|K*>IB!8QJoYAwL!_M^O=5FclzLVCy-04?+ichkrtZieV53lso z<AK{%lrM{J6U}*By>#|2UgI<As{dtNGnw)ZY`ti=!g0^Lg6M~Z&D$FHN*wk)w&q?> za^b5LRtmdcEiK_{+xaND`CL*b-vd{cRK9Q58)Q%MKd!hOGMDq#oE`f@^y+i={Mjg! zf9%s&mtX$LI#X+X@9a~%#_p1B%e8Z2!)N6}E6ZFVgC8GyYFC^IR-8Zg?`~u9$4gmq z*DVn}<^TNcyFV4p_pdj<e3c{q{DfQ9)c4T_RgVwz<iFElwTqRmS<%J(=NZrarLpnl z&p!q~|M7+C<E6$&hb{hY54<P0+R*kviP4OQZx@y<*5u6jX{oXEiHyNM%jK_hvJ2KY zOnzq{svMtKomn%Nd7rfWf7Kl|Sq2$Oe<wB73UyCZS^n?%qb>Q&Ki$)+UijQHd}eM@ z-~4yViS;FiPr5Pg`=@)+N#T4ZpIzjK@XO`f{<S2pulX}4bMfcT-GTpjBBXY+-@Yel zHu>=LiE~opVjSyK_rKm_IYHgywr|?x;&j%Ki1?#LCu$D_v887uxgPoM@^gN=-*@5L z@spOEaNh7=n@2U#^x~??a#Qzjd9YUU_o~c4Pq!cYRn6?L)BW-3`6D0SD?hD&_vicn zTR;BY7yAFxaB|G1<ZQ<`#~x?IaBXons0}UIS#R=VMVw*(RIyL0x9@E9Oo;wlJz;j1 zp|#{;SI>}|l}yiyRC{MGG=1b-`=)~JckI?58?zE-vs-LBoxJ?jzu9*r7H#BR)w}5U z7rE;4zw5mkKHg)WwX%FeAWw_LypwU~6K(hSfAgtze5-IkSfpa#JI@d8%h?au?|C6_ z%JjcQVTMoDyiE<u*KxPhWdB-Wf4p~Z$F-hUd^!9<Z%w#+#NNg(zqKpffp2fWQAEGa z<taG@$Ab^=4dzl`n0I@k2WYXvl2d_KzPws`z)(7u@7qb&jeDdgAGF|6;Xe0l&19}= zA<dSOx7B97*mv@1;hKX#-|!?G_`1!Le!28D_hE~w;;lR<p2{e`daGMu>Ec`?vq<T- zn9ui9KMbCov}DV${ISjC)V&#NK1FG7J-AoJv?OiLWWmXsD;}qtUzJ`xVfC~o)u!E{ zN5Aitopb$x5r56*V{=+vwz5Q<?5z6k{cR)L$M2`Mg?!VBI%UH#SC&omx;yu+#YHl$ z!KTj?H`dAgnAUV&|5#?z@5DFpCbl;ltBlSiKe{0`pY7t*ZHIr9ZT>%hjd^yFHs~(G ztxxqB?s%r9q=lA-+xMLL|36UK=<?m2E)z=1ALwm+VI$LQ9IbUvNutI2-J)exUv%Dx ziUl{S9gyd|rnjI`r|aqKs|Ea36PR<lS6tq{{oF3m2<!L%CtB>j!Sz=}X|IZ1@}f)f zvcKJ*?<)J`I{V${9v7>A%gwUA`q2;1+rR&kda%F4mg%_ahrp@F_xz9$ifw(XIgvBD z_}0AjeGE3dPaMCWY1&q3_^0aF-DAfjeND@HJeGSpr`WiaOy`zdzqZ&$rrx3F<>lby z8-JWPod2=w*(Am<Z=584ub*LB+-Ces;)pwQ-ZHk8R`ZXgK0C}PtN6++GyC4EB_<Ca z`DkufcH+<Xsg@$I{vLc^U%mX#=7Q+`1$$HVvIANIQ<kV$xL<Fpo@?^Hb-|)zSzE4J zcGsQn_q}p!MnaX<RXy3fTW6j+8ozd|t}B1pX{ceZmKFZ^(~|jJzs!_)-ycgY)tjyt zRT=U*)!FQV#PzLN4z`Cn3~KWZ@UHON<Nj>v>6N!0{*ZfVzsaHPP0sq>&zB0XOMRPU zty%I<{g`{D*>$7--!B#^pO1_dIm+Do?97tut9^OhX1IjkUCs6-&ZW|LPBH6jp8W=| zww&4gPPIVh!YZkkqE`#f-zu`Zth>v3omari^&g(i{q^EV_4C&c_n4`#ePI5=T+-F` zb(NmCg1hqDB$X`(x%u>WtzY_LZ^!k*TRfRvG4sFfZn`0{_hY7=wk3DWG&d_AYoRo^ z-6j8ict6?Nd2KJ_@4T1^ZL;EfYwZ-y-7-r~-YrqWTW@xC-Eq?oS;wwhCM*x!cli9) zV0H1MmW;kSy_Kal%4ajCm~;o9t$qJk%58&b!9V`T&wp3QPu_ON(CX*eO3k^)v!*0$ zY3KQK=I9|yfz6ukj42!+(tF+3J*XGH{QNcR&fDx3YR}DfKZ@$!GAU$-Z_>q3bFE{^ z7pw2K+u4Ri=pEaY(H$>q7T)}+L+ZvPM;Qh08xnjsCutmAa5k;8z&?aom$C4|&GU=} zJPPVI^DWDtEjj;BLn`LG+S|%HUN57L2MhVnE-gIiHveb<$BLJ><rd!@ES|Q#)2=y_ z>>RJ~pK<-sADh@u*?hb!r0M!->BLhvHcUUz@3|%Gc2Cvy-RAMGM{BDOe4X#-XEZ&@ z@X}e2)%$*1nq9wq_=J4tcjjF-fvSR%pQJ0>Ia=PHnBKI&w_LXQj!}PhZqh%SXsuw) ztG~@xtg7T`+q$a#<3ra%om*%81K(`;(Y{e{<~9=>Yx}}WnLe%;TlyM$`)3=<yXoBe zq38QXNdG|l6EoLT?wUEtsTCzW_R}sr$$fH=?MHTt^@e`mGI4>~w+viu=Po^v>iDcy zgYkI#Kl{EHtEZH(eNhlN;y-t0so;&!**4m7`N!J3W1l#FPrE%gd&186^B?Ynyp2_O zACo%o#_t7j=8Q3WyLRo3o0BhYs2F{9bM5{UE;{?n*DWu;>vEEB{kNZWlILmyh2z<{ z4b38gpP%t^p2?=nV!mzuF1d}_jNzNst>!&dFl#~V5r;L(TocwMW|!IOn;!00E+|WA zJstl1Y4qZCMJMy~9r@muUb(?D=Ws}&ILF<l8F5{=rroRT>eDUQa^RtW-nmavtWNF~ zdu8_A;gjS0Umfom{p{DX8|$7gcemIaF-1^a*Rf{>=chXxPfzG>kkG1L@OPor>)16* zd29KcH_OKHR!tH~*U|dUd`o1<*{PQ0-`*WLxuaz9KF!_#_IBKy%-_81b<D2KeVfz! zlkV>^Niejt+Vi*MTYcFyj?+Rn&hEHB_wV7I>liovI=I>K$HMc0`>$!r&z*hnDbE*A zw{!98kNtUn@$bC0-ci%EzrUk&$5Frdxtp!s3zyyT$XxO<B{@2E-%p{VUY34enY_*I znx=(pE9;Yd_ulOXv(dT6%V&1hsc;;-{qBw4{)SAh8#?xjADol=vhRk67H4GP+;nE2 z|8IRR_%Z(NTT*oM$$ZCvvptjF<!B$<o4zf@=emPmlFx6=OvXx`tYvLS&&Bl|KRjbq z@yl~x4_g@7oLl$ZUix-D_a9yMf5qi>zn#}y|CRnD`pp$xfxDK%PZsxb1gbAPu<3AG z<Cf56FaEgnY^*GGYTIp{%NH|SI61uPLe8Ii50a;D`SHwc)!ZP{?aLGvl;2bO{%i;P zq)y%4y&C%`xP7UVIQ{LS_}6#yYhz^QalH&q`xCQ_JL7!pXPLv^3OsFlUH{6x+dt!v z*)N0l|BbHy7w2b~*S_Vm&01CV3;NHGIS7;_d_CvE@WFrYb7A)n7uW3I<+^sk>bs%I zQ5K#jR(#1V&zM;EoK|qOym|P*u_fvJfgvXrD=9Csyrh0nYmMja8<Q@#O@2IQi?46< z(tvfx9!|U;!|vMAxc0^SZ!Bl$gq1Q^NpI1+F81e^0;_BL(X21?52WnLpIc<HS@NUn zltcGaoPStYZ{IEOazf9n-tEu!%$u;y??(GQ<_P`9r|UVFo%r|A#?I<#Nl=H;0>iy5 zZF3Gr@}4$wJHvLp`{OrxVR?DR>g*rUhwJkGy!1Yl*BErQ<7vto@!XbeT=ssVCsN!_ zOw?rk#A3@kJ=5i|jq#VX7@lV`GpZKs)!MbDBzbps$9(=qmESt$XD2;0b*L$Rb^Jz~ zA5&ys`(t<Za2L0ECbHM1cC@aWpXuh1(@<r)P4?1a;d|ElvEMgFrKlIU?U-p6njR8Z zn{#Y?nvT1&i|o6}tXW)hrgxM-|5}@Ti$BM&Wmbo7fgYz?uD~Cb?0+v!WZLsKo951T z{$ZMNd`)h?`+J7mj1<ZG{7YtcVw-2&i4cgY%#estyD`my@!R6f_EOV@Je2R9<H<de zUYlp|a#QsyCZ%KP*R*bxuXYv_cvJjAehS;6l@AZ>a+sg)XUps}W74cXJJzmDZK1{2 zs`uMJ`1t?8x9^kRCNGYDdiy%}{@T3-yH#fLCe80;F5OW1CVrp0#EP_+i##g}YQm=F zSbV8I!Z58jlkdhAPG|L0zQQYW?@2x@XsqR~m>#^%*N9cevGmB^<nUmZpm(<ftd$RG zPGHx#XxOLR!I_#hiA!zO3&TAMe7W-d898TNZ0|CQPhJ=tnIL`Tdf%C=p9DMa-f&Ba zc(H4`s-p+9%qq9L?aZIoWLL;2yWi`L_!7J7;N!bnQ)l;97<PHe%PzVhw$<Xcb94+p zQ~MrEO|R+oY#Zx?uAkq&T=Q(^oVB0hq-`y)Pj9H5y!+GZvm197&rg{XKI`&!hnu~s zl2Z=UmEGd=4xfDCm4WB1UW3<`9d>LdJs$`(U%fQT`Qo>e7q%syn>)k$xAKK^3m88< zo06aPU}__8Z9{G%L(=lYMx{Svc-~LG`Gl=b;q0GJLJ|K`o}|j0ID4Xe$Id_2UMzaQ zWS@DSzZbYQ^WOqN2|<r_>6#&umr`9A|L>60PcBaPd{)%o?@(j$)8XgEs~TrF8U_4K zU)=rTw5De7aUmPI1I{Mb@;6?b%`@o~k6~$FR!;Pj8?3v0?rzlMbTM77!=&`B_KIA4 zxUhBO?qy%TxtKKX>zK(_EB#>c?qa!uJiW`OM03pgD);C!^KAXceI#>ndPlNEU6b9l zo+uWfqc3i7MNcWb`Sq5kdFI4^<rB=wVSg>!I3qPPJ_=m@6WKV8>8V<Q@oWjFhwXyR z3~ydvt(fCD`zhnJY3tN}NnYRPwlUSrq~ghf#1(J-el@&g{>1Aw>D-M&89nn&{ydy& z!2aT*-PwEd41M1*<>y%JKfK@uzkK83eyQ9=HBlEnNFFbK*W4$+tL<Qv;02Mnzpnfa zd%W@VW)<6>)N4*l+#c68y?^|kh0&N-ep&OPgVoIqOXO;&U)$L?OJ#$%z5Dy=_g)(v zID10)k66Xb)e|S3IUO~9-k+E36O7huE_93Co|mM4!(#cf7dqa_(bms3zg%CQ_~-W1 zL-WI)-aLNtru^f3)^lR-spzZ6@UIZI5xP>$AmGRlzv`1g*4v+R`kp5k>UB#!{k=?N z;+zF)j|*GBOg~Vg5&6(;$=cjdWBCh`yUZC?HMwNw%=`N+V#(LD7WbHb_n%watI{s| zYw}0+MvmaH{4nVp_Lj38hfA(bsyZvj61PNLef_yjCD&Gd-pgLcll9YEkkvAjS0PTK zEoIWKRr3QE2e3~zh*CaVbuU@$hQRSk)5|m7_w9B4mYlR&cpLkga-&9@9^G!uOD60U zwT71_2tQr%OKwr!o5-H(&L^u}82VrBuQyKKw`$oGqccXwi~rf!pA!i+wt4l_b_uur ze(nyBgERD<ZxuOMSZ(d%-89SLvGR*qahn7A4AbwMAJ0x#N+^H6CTVTl84hV>vuhob zi|-$0*<5(6Zcc%=-yNyop#62Vrf=Rmx=k0pqu1MZ@9AfgWl|!^7Us8fc2$%cS}l8W zq+6o>Zi2niG~egn7<Ws@3mDX!RIEOBJX&4sq{45J4W9S(m%f^LDm$Qw?fk>wWvi;M zSbv%_@!G^!)7T8s1+xlfE-(9^B6Uoo)9chH))yNuPo6iwiZi182-9?aw<8g8J?Uri z)*q`j?MrA`VfyFG-I@1#Z8NKvZWjFYzvIiQ^AU?bJ}#ddsc89AH0s@)wMBAnIuoOO zxHqY=J=y8Jx-q5TZIspYHBlz68+3lvuf5>iaCPP8jk4#e4AMjlAFP%9_G9|WTcY|l zzHR=odH;PACYvOj*KlZb3vMwGI<)Kc=b95++p6d6VQdnM*}vp~RetV<Nxr?$)psO( zkYxO!tu^7{O4SDsE*mh^WpXT$6quCoKP%zVk2B&tJ<Rs64&P?r4Z5)5{ll5*8nKrz zM;}-{Ct*HMi@>}zcV#a1j8x(FvPUJ0cWhSrp5^a&^F?h+$?^DjyVi9NS2%JwN}mv4 ze0^C8qqy$k+_^S+alIE-ODUZ8i`eq?QA17HB>`7o$LNNjD-E&537r$Iw#d2H&-%ME zV|vaTp1%=he++gqGb>8#n?L@f)cg4SqnetMtb(E!Px9uZFTeXV*3r(DfkA=6)5S65 z*5u7w{^(51Ep~bvbEo2DXD#0r)dcA+i$9m<$lPNR=rxrtHZp5>TdvPnZ>VQ$wA`R) z?vEPA`MV}bEsEd`y|UX|GHAl198oj#UtE>KscK>2XU?qIU!P-Du)h0RW&XM~k0TNb zBldH|-m89~QLxv1S$A;pg0=%f*1t^)?kT;uXZ~3I_}k`*%g%MiBsubKSg7+<S?VZL z@U%Zm7>;KySyXSopGEF^XMNkL{afAUY!UQZSseM`VON2-nygmfuGJFr+BflaK0kJ! zeXY%mJ5GDcbEn5RzY|GOx^!s4IakxFt)AXDch7n+x$yGVlR0loo{P1wyl64wQpTF3 zD+LZ>LD7{#-@oV-|446%;Hi-^-l{j{?k=g>5iHYeGac_vRL*~Y<dTK&`JGd{-m<?f z{B+!1{qK2(|1XN_{(jfK{#twe_L((-=T<85Z0)UAt6j4E#fjtnt7~>`JhmonP0B{k zJujS|FKE7PV^iv3BvCsn?d!t_e>h~?8&1n8@(9ln`+cIi?Ai5oTN*BIkaInpeXE&| zmBr(U-rrs4wKgr~_F3{dvqEH>Lw;ir>#wtg8w|9bR6j7&crL5qYiRj8b5H7WwxgD+ z?ok=x%E8_HPD>?9osV*KNGbmyXe_Q~Sidf?ecsH%5Ox0T$@0FBl6Sm3{?Pg1yGw7& z7p(65q{TM%rojZ4^U3{ve?4b6zBIaL`2NWX=1u-p%e@S&s^*_w$n&<Yqw8N!+iAzc zGo-Jq*>NuQ-4pNSPx^MB<M4Bp*x3J2p)~2$lw}LoUSHrb@AA#%dYn-b=YJba|6+F| z<8nu#O}*i@Nt~hi%har6dZ(`zoUW&Nl=+!&4u8|Ozdmy-0~2+YFFMiZeEadVD-UcY zs})sGDh}b!4Qv)ympAn&n*I8wsPe1@X{I}`vhS_lbK6jf&397D!dWrbn9pss7M{Ch zwdI|(*!7z|s|wv-JZlc>c=VUedF3L-^=^OH+<da`Uf;zx{PG<?l~$E?+8uDd{N8ep zPL$iOr-j$9u1VV{_F>uEPoI5$UKQXyp!q8O>%-!M6DC$j=*(uBzWUuo!5-rm)yH)V zwk4%p-ynSaK|znkPKkr-ZZ%EMli_#$-Nxr#@=4EN!Hn8ji?=C8&dm7{BJo4-r?}%j z+c~%HMV2nJ)=6bh>E2iUGC}&x>XOrn)|y$fU*!duYW!v}C}vV)?6dNgVXFv=ecog_ ze_6k2=56U+Z6__ZeNGo-UJ%YGYWDiy+}QKYqK&FAd5j`_s>HqrOa0K4(k(glq#`Ks z9P^6J!QWSy&6T|Q_T@?~-oHu;d$vyW`H<3Pbzy>L>IeVH2P|rYcP;k$t}xAokLj(1 z&YF9TvG>b2oh!<};+?K8kgn{OK7Xp*g~`Te4fMS@G|g%jxcv`4?)3N-(~0}B_m4|% z75}Q<U}NX=d|_!snzH1S*iuWk+Mmy)YJM1*99#Y;GOs;o+P0I42JdD$&bLy`4tN`z zetmQQilaBmULM}xa&T9Hu7lm)X1B-Z*ZnT!+n~kE8UBJPrz*53W0%!WE!}!usg&|L zwRtT<Gu-r5`dig2tk@jt&oS3*>aQ|h)~`4HU*sD`<C8I)O8@j+QFc1H<aF`Mv@0^4 z*EEl2Ec>qN8liS_nT&4aB~9V;QazV?bR}v_^{y$N+){Zk!s?B0-=DobvBzEnCz~8{ zZMam{U(n&TS7pb2)#B)M^)tuHgO3=leY|_~j*V(p-F(_MEp)yaqp;X<M`nUP`;=9i z6ZiFGANcSh;tA)s)SMIj3v?@29{YE3BiH?^l)}4{1$s?OuU-3D!D2P3ETCtlM0R-m z?Zv-@4$rimz;+>aj-up+W%qb;CRV23p8ILSy#IxV_E=BOPP`DdVz<MtEi8wW7~W}` zpX^SXZrrC>yyx?CyL0Ueq~v@JH`abhKA$vSz0$aK!Di*<eNX+$mvUU?`<gsQG;q`2 z+p0$E=iW=a-NWB>ZiSSE|53hMcV}Ev@Qi(>bFuQL(8n7$%pQMiFaGcTyr}freV%BU z=($#=eYOwFkC)qCQ9QkU$##un!PENtYhta<I?uk;ERf-IR|uJL{lLt*#W^q5=N*;_ zcl*SX7SkW~Z-=D!h02{fZC0IAVmS9(|JmNwi`&z5*UC0N7F@u^_U7AZjR_x29&L|z z{(Iw3ebx8Br=Pcfd_P}fuVz`;e+e5~hItAHCck^{@3L^E#uY_jgW%@xYrZdh8IrMV zc2@2ad+A$mTqQrxJiYeYjX5VL{ydSAJVS~-af9Put|^ahtZTj^W*NnHgd^iz`jgX@ zr|#NIEebrMmvVV&smJzZX@Bx=8K^DaBek%^z_kCkq=t1&UgI|=_mX}8_ioH-lh2wo zePQEv$xEv@`(>4x8Oz<h*`2iiQ#ae6{$<X;%1n2-%CUcG-xhc|eolc?eetQ?p9>un zFNLpgfBYx1z+CQkr{tbEq3xPM>yDYJ|5;r4^XAV_*KRH@W;+~j{Li#-x4GW#%j@~B zuVDJ!5F~A8d40Xx4<T1$<5IcfiF53GpI*3@<Ck?Hs#GpoUGAK?xYYLlB2iPtW^T#3 z`=NTV+}w`OxAP0mG?w#kdGzPoy$21)Rg3nx-P-PPyJz~>l=B}pdh!+i&iIq6KSi}L z-e~$egYs?Nh4Y!8%T)Z?|6#hl*4~gL4j=E7T^36@Q@qrE{dgLcP*^53`(VtR>{m<H zPu!mU=>PBU-1W7$XI33>TELQf_?%Yy-PEQli`#BG+UEM6FPG>&TTyFLVIo=fMNfD~ z;&jKXTYhi<e!d&rbkrcAYjY!i@I-b2Yq_UNuUHBeKAm^vLCd={-IMi`8!{F%KKR*h zHc9i<?;9CrzZPtZF3q{{`VXI(iltb}2Z?XZkM~`+D?9gArRCVidmr!1?vu7<`?cTK zr#|Y(uj}0R|0O5>&F_49b!GPAvvVtRb9jHbFUo1=`pt1<-MK@@AIwv`%AOlLr@FwV zyK{0@LTbR&RVzh5`JI-^E1G=!$6|>bqx+i{t(amdnaCxx@$ux%>prATT$#A?*yAZb z{he1--r$uh%B_vHKJ7cHwLf<Dv^`e3r+s(nZm8EtTVclAzTHB_vRU!N?AcqEg$fof zw3@E+`S|fiA<}GB>*h!PzVR;hc>Q}OwUg_9T}#b7#dbN(XMLlIWL)nrXQ>~e%5&zH zttiwC6?`rhdfJ9#Z+`RDMQr{L<Qz`5-JO%k6|;}+(e-1y#HM-bto_Si-xDBnUwJ9p zxs+9g{LlB4bM?%y&gEV1DJQY>RSn1L;+<yeu6ykheOLUr=UkoJj`UB;4>wQZ_@r6; z{kL*~+@kA#e9zr~q?(vyH{_`+=kYCb75Vpg-Rny^CXd;dXo%RKWxDW8<y-j6W0ogl z%;sb<u(x^UH1^jw@$dR~ac-qi#l_Fr%c`$0F19(qXM6s&Quwc;_TTM1JEtx4&E}fG zu2tU>7_28SO>l08)Spia?#Q=4++P|vTRX?T=eqgxUkuX@%yvDMIA8jTfKS4Umqilq zjZRki3&bB-q%@<V{M9o9A+@w-OU?ti-5JwuU(~#3GnKZ}tXgCG^9jcf(F;+2jC>0_ z*OrG|O?GE~X)<f^^KF^)6k<Z;XIbl1UC%MUWxuHBPg=)%Cc{~d(F@PMip<D5^}gL? zmiXnFIp!7C%%#TbjMrQ<w5sKf*>}LuTGi&Dac!PW>3Mn4ZHGNy@Z@yd71WQi%2{4) z$)b^?zQxx!)b#OIr}&3+zAo(#exJK4i9J$?;owT&9lRUf%lueo>dJCUxZ<TjsYUqF z`elnE9!yBEpZoU00wMq0ZPzL#82P7v@ZZ_Xy!^%L%vLLJwk>QP>kH-|Il^>z_ipET z?m9C(C;z(>Q`&4P{dv*D4JC{sA3Y!IUod-KWU*a)O2UQSkcPyDnPPjh)0+#-kG7TB z+CN{|W<P&!$@Id{uX+B>p1fc3PEWt6Tz2|Q)+OKWR@7fN+hcO|^b3JB<#R^;uXiR# zs>PW#B=MgUEA9RKL|Ho4j%VTN^9yp-_OB}a(G{{mFZs-*ErIVu^Z0dhD~=hd&v@=u zDfzXS|3~{vsc##vmNu?@Ih#k~to2(Cqgm2DEcufJk9^!SVWDnPyvuLZ>@3;5LW6p~ z#q*B+mJ=<nUTw3_?4BLd<>)qZ&n2H$=H|*U7vy%m^~vxka^{|Wmh)am+9GN8rRuFx z8m5VRjh~;3Vk&Fi;o#fFyKb{sDdW{U(arPKWp*ESE}H!H+E0n-u1uzS-Xk|YT)Aoc z;iFu{f5mB@rAv8AF9+y!b`*QgJ>2u&cEaq<-_FG_)%&>3v&wGDnEQV6BE{1M3-``D z7GurN(`}?(x5x7ML!aplds%LUZa#l=L8OXgM0bUl!AzesE&oCjB402ae-y6!@7}vl z*LGMgd2>Zv+5P{Q#+&z)O(ef>Wzn^|o_56c)YSW_3*H`m@t#x8@5S8H^XHadzG*J4 z6E9_dpXqn|#`^MC&d(orPL{bAYk1GJ<Kk?ezF)^zvMe(_+%mcCVEk#Gm)jn36dUl& zeShU)vuV`k944nrDvz)C&9J*3;~AWqKXI*VpWKfAr2&3XMtdx3BBgY#^Ru7WvDcU{ z%aYl>(S7<KE!Iy7;yS`LhgY~id0$^r_h&s@{)hUf2ZB_&zu0~#>b$c!aN2<>TU}nU z&rvL3YxZ=QFTP-vyTR)tVmIy|<=e~{bDRCl>WAXXW0{}pd0xG|_5Yf=meObD&Rh81 zZqe^6|L2_i$#JZtEa-CNd^Kf1rn1bc`_U4A6T}w$W|?sOo@{>diF%_S?)r($A}{{w z*Z+%o$8IOS`@<K8in>QX=AW%oWdC-B=Rmp&<Hd}Qd&=9xD_IVF7B}g7{p|RwQ@_nV zcuN1N%eZVOeW@eH<zb#L^Q$R6^GyD1S+>wj<+|%BCob>6%lB5Tus*-itGRDuuCo3` zk>``ea$jg2i|+ENPPem;-+$<_Yiq_m*WW4E!q%2sBt87|{=*ICm$m}+CZDc(Mn7I( zZ??^Q$+|}Sy6X>bB`uGWzI-$C!nPHrqA$h6FaGa1CpR~r{m-|>pN~uZ+{g0Lny=Q5 zuex08gYKa(`JB7imT3yv7F}DGUFB_~ckbWbNm?;!9NSMMbNw+E|F^63*|RIv>T?_; zubteH_E=ToyCbvl(~E^O3R7f%6^qwSdXcmAva(L|q4@fIm+Aj9>pE*<de18ClXz(E z%GI`5c(zHBeD;IA<<lPRk#So2&C`f+wLtaqwgczwrEix$x+C?m<k{mRlZtQmzVu!e z+iM?I@q2P%q?(@dp$DQh)=O3WI>m%4i^Zg-?+n&=t2+6|-~8X_wFTB(dsP0-VE%2A z>G1x-tUIn-yDn}!oEvcXcw#QktBK6Xms1^k<5n{*%rW`0cXc3#>qIrfR(}iA8Jm6D z&i_(edf;cluf>nH3i<Z*PwB}l`jk=;_V~HQ{@S-&ME@~-Q#)+Sf9jQ~`J*+ByUY`K zelO)#nR)EHM#hYfn<sm<Z!Wgivaf&h<GuACn+4sb#&?B2>I;9X*FQ6zvwCJkUgsaF z4dFZLa(_I^S?S#VN3QbwxyUC>^;7&R-~ZX|e`>QIhpT+_jC&yo=TBNrJ2!31+TYiV zZeG#YcDF-!lV39T+b-^G_LkZ^%RNi3amsGE{H7(+xwoF>k$mUn9x3L&S?i3=tGJFx zu!yDQp8e%~dr@W62em0X)-uK3t6reS`{`{<nbe-%KTlQ{?&Wg4ziL}l_?3vW@7rQs zuiCD<Y`$e{H0uKudCkb(W+vORA1ALU)ZcIUd)*4x`z`Oj$ChsRdhYSPjb|%2I?R7F zxzCo}G;L{SaJ=-FODkQCdMl^dJD;9p7PHJ@kI9>`rSWA)KTb)yW3Tiyc3G6%gS7|$ zD&Ft0ku>AKd&{nEzfK#wRrb!K=S)}FUFe->oxgJ9@dIa-IEA-Xnm=nl=zPA=B)8&r z!Os5W-hLB&ejQ`TF4M8tFaP1V{llvd%UVCLD%YK{ZQe<?)V)2uf=OB;*MCnu?zUT$ z_wRmttDk32?w0wxe_itK=50%FmNwm!7brJW$cv3W+5i1qV8X0sv$?EFu@eJ!3oaHE zSKe>+@R5w?`7e{M-q<Jj;_`yKWtHMP+<&zf-j%*ND`Sza!TGke$L!X9w=_9)S?BYu zw=X}%FBA>0$qvdrfAhrTB-7$6#S>>|^ekOb-{JY7oTGr}*G~DYm|gr*zt=o_TF4{* z^J4WEp4TkLzpR=6%h<lr;=tddH_cYqFWm3E>fH3D55;y=|5)O@og>%i+^RXh7hC_- zk_?l({rIowtN4X7je8i+?x-!jrDO2TV$MpIJ9C7N%$c#;?8C>MAG0S}@0nq?<u~uW z$%Xah(}ce{OMS^U`X$a-^-^T=vl#(zrK4Xy`OwAo%xK=-QlYiG)Ojy{nj_Hr_p(g! zjFWRCH5ne3tZQFVbNk(@?U6aNO&D6ANu^XjnA~}c;mo4bhfmD2ouO&IS2W}94L;K; z{?8)hxBNDGSIBjM=QdlWJhT5FS9kruO;a>q)Y`Y%ERf|Bjf-b_HOJUSpmpC{qm_r} z*!J^An(ShoW%)nMI^Lh-y%Bqz?y;X-rLSso3if$BIUCRNd}W|o@mHy<G)^nJp}0Td zMH0Ko-tJ1r+0DzIA8V2bUduPF%W`_&m*XA2K9{C_XG;z4<?cRkY^l}f*i40QT<`TH z-Hg+nGxfzcH&(0`-=T7N*@E7^-Jx6UzoeH~%)0Dfv2xO#C!YI))0!;<O&O}hFYK~8 z_;2GwZ_ahL7mA+$yYFB3Z)IRz%DVRxU*C;5cK@r@u})5hOb$iPJr>toUN_rb>xm2P z|17T9x0dx#hZXN+o5Q;r<Bv8}dPy#_ZA@=`SSBiPxqR+II|)7g^yIown|HPr_W9?c zrZC<=zIe{!tibuKPc~?FF5-D`eD^`V&q@b2m#g3Fjczcvs%EO@l*yaYep;DZm2Z#u zjO28#xn569lIMlIKmBmZ;h9P4QCm0O<;!R<H1+Jb$?|M(&BcU!>)aye^xys2%`J2O zy4#7~--18trnlLBJ9unWl2Y5E?;p%E6GMJ6sHCT7&i!%Tz`=RPx^o}5AGpmf)6Y2V zT++H0fn%~4zH@Y+n`^jBaB|T0XD2&7ng59RuJp<^xU#4?&oMcnrMmg6t<dauM{Rhl z!le{#*%MB@e3H>v-T#L9%rA?%A#+wr>suB@N`1EdP>`HIaqj_{Ig^ekrT?h-v9y!- zw&01)mj7QH{Hr@)Yw`bQ^rO^QXMF#byqtLY{Fy0>XQW-!C^@-*QiMalLjE=jrFqMF zDuZ5K&0JM)=rwPr&V;n(zQ<-;M;lyQvSoYNoO?{c6UF|oNmkBpV9m*i^$N>!tkbxf zBRgf)C6<iY*2QLh7SBFfTx#z!zM6QZKPy%Ka1F<Qqc`8<Ki4GuaA}SITr1zh$jH#V z?P12}FMsC05tfm7@iBpeMcj7fPK}n5*g5L8cP_ZTdl=5xePYX!-yKs=J@zi?a6R{; z`ttdivrRUvWti`4cI2Ip>(S*Rdv#nCRsHujJ$IYdU1%m>7=Lby^hfzckGH>jb2p>? z^DqD9x_+IFlRvza4e;Y=FFrZ3t~B#q{p&gFk9}00^sij~|Ju)A8NXirkv`#GWn|AT ziS&ZHeUi`L2lVMpUNPT^<+F<Ol%|LG6aU`aXj&A*WIuWG{as&DCKt{)_%0@Y(WmKo zYf3(KE1i47BDtf!b5GBo+iy-?{=4r$_H@B3sjc_5&&+0PY+ze<J>iez^N-ge>r3{P z9v9EOC6mj3KJ4Yz$<8Wm2gG_lvt8f(S?b{4&)Zn58mAkcsS|lFFJEw5>U7SV;z!Az zH}(piKbMrT*>?58Z5KIo<9i-+->GML6#J~>_01i*e*49RroK-3b0YD{F801G8$R{7 z8@8O9Wc~5go>;Ya-#h-U6{>x{J$!lX%*qKbzVq47`tl&Vm1C>xtD7tMo+~z_&SX+- z_m}+}{9WX%d*1E|J1Xq9eoOoj<M6q`l=t7l-9FpBl$RO!*p$rwrI{OJD0xAo_?y=D zJ1HCFMeD6AB9-5&9@Y)Y&$4^J|Ml~h1<&@nELOUp+RGcwJ4<74SJBnjHq*8IzL_p+ zGXqQhdOi8^z4hCB;e)&OC|+}@Gkue_#qxpJj5O2PUCKpy*H6us{>pPDD{1o^$JsBQ zP05<StoYlNXXoZ8sD!yJjN5(DNnu&r-ZHJJ-#TOt_tutmR0mv%l#V*5mvyVObccoN zX%{t_hnIbpnm>Lk_rpvh>R`z1Jlz7lxn(amoLKU7&9USByyn}l%-pv_qx$R&zZ-s! zRm+z$^}KywUHD^V@2$7jPOkn~C~-UQ%<@^knr3a?>Ck^Hx^cgm^7#+fp1$~hmM5N< zEjK>$eZlPZY5S#bn>_JqZ(IH%c|(24ou`jpuaL7_d`e8=P4h(21L7}=vJU#3Et+Tb z{EnyQhAAFD+6(_F7ri-lW$E8*)07;Vj^DMsZ(UcmFIMTHX#o4)J&IhFatSkDuTUtT zaZmYYERU$#4K-OE)`}AK{_o5BgHNgNTv~m-(zLW<@5`E1M>*7E^v-Sa5|8YDmHfLq z`JKz=^S--yqt=!m=5O4+mUF`AkLkge81Hdkadf=nckz2%(Sy>)`|IZ3cTRXcDesHy zt2855tGO`>|JGFrH5W$r*qpX8*lqHE<*y01x>Jqn9rP|-FPvwm@aIB;Y3xyv8(kas zpSF0nOCp#nqExj%=6Lm9>&ux2KQj)9$V&Ts>bUjg&zE&+^-*qn?kC8Vn4dcy9RGSg z+cHaOGt0Lo+qAx2u;F?C>Vr)ryG1~_MHnwbZO+1C3Ffx`Tb9ojB;1nQDrRxt`aA#g zZxYQ*txw<doV_`9<K|!fN0+s#ez2RtoGEes>bk_wY3J(iNxj#<HDRvmq}3ZkDsF%M zzx7>CwfKY2ua1OQTscq~E`NpXwPCD+?<esfmDTfZMr~O!W7D>$>Z>+Zim%<7!rOCo z{wH<b{|6H)FK*Z`f3C=CrQ|~GzHLtrGI3pc@Sd;UN~L<o?$0lbu3PiBGd7%+T*rOn zr)Kw~$<OYwFOv<lNh_TDQFCRc^}Vet4jkJc@b!CEW6a#?FP=<4n5T8=(08LHvnqAk zj~%nM{G>BOWbM^kAM#%%x$TR2BA;@0io}!>J(-g;n<w+?lx<TjNL|7x_~S>%kyy7X z8=3m|d;TqcT;KLNDJOnT)eEa<YpR8Wm+UlVwf+8-=T?FJ%A&+Mo`)5-&SNSLz8rS0 zxox+d<>`XV>G6HP9=)BiCtYsJi`^%+l}t{QUv2!oWNqH|gL%CiXC-qEI3Aglem?P1 zYIvjCO3hW;E*jw+_e{5BM4mB83Vgk=Zui!W1yT<_PHd`rxyrb>F6Gcwi_MR>yVd6A zoW1dG;ul+iGSAdyESGP2R{r=dA~~m$f0Dp1;j=q+{pQSl*SMKQ*Q(}(@?wWuds&xC z_39SNcW($f=-!f1eD$K7>;C!6&V9Xg!*<hOj);kq>;ETx2xWMG^TGG~%=MKe&$8Ye zv?yCz_#>;rK(75y<+8QH!f&o>zMp%0_Qm}Yb)~0x`r9|QA26{z{ibHd!5kmCr&lje zV9dID$9c*e1J%l1EzZ}EBqdm}xRqbN^sH1a`pZF?t>PO!uI)5h>i728ciWG3QrkHS zLuK^Ua;=zu@Tn<m7Jr;}?(L(N*`NE}pIh|ac+&i(qWzYs!LJ-6QQjySTi*rCmVBRf zv0bhCbSO{ynaJX&-*$bTXC&Y6QrW*qLs7mVBWZo^!JFwbWu7TqyEIFB`|E@A9$pmQ z$+nDbH+yBVBLAfCiw*4`-0Hc`A0gjW!*|dla?@LrCr+vkzZNn6_<C#S<3FEem)Sq4 zSU>6N+P1%@!f`#H)qVQUSsng!D^u5_>|W2`b#`k0NlPrcV()Iw3d)-llUAN(<aBMT z&f3STf1M9uuA6Ru)8d>)>~pou3hg<~jn+2CQj3=tNPbUzpg-}Q-y5SJ!M;+`_0x}d z%gKEDwJNZCgM>+X`$hlX5tkl+dwFpA{WqCyYtR2)FUPR>ht2E*eP={|=zAPmV7dLF zn#7y`7o;NO-~IFLaCS1-=<RNxHMdsD*Onu5o%)fB2kad?Eck@YW&cg?T-VGg5^!vT zaMA@&nNk7!tvAx#w)CBM{B>U{LtQK3-Hy_u3siH{9}B)PJn?dqw)&0L#*1gic1>Jd z!d7l2KY8NWpZ#jTp5C-h6!R)CRB)@i_u#ioM)#~A95P3Dmh3pw7JtxaPi;fJ#lyA2 z>K7G~`4$^a(@TH-*nw+Ne47E+p*63=R$o?o+4E{)ujdQD6K?x?trCS;XDqbzzdFUW zGW_!wjU>MsZG+yJOnLt9W}ZDt%GI$MU-uoXvM3gx6ta1nyqS#Sd$AdNj6x$Ox83Gh zvv#t-tj;y&<C<N6Qs4dAruK_Pe)5a^nkAV9=T7}y9LV?FO7hRN(%xgI!}A;6Pb~=+ zxiH77y21Ta#2X#=r@!u1@Xl3s(=z(ILFz;QvWH8g_p;C0+Q=mJ+MsK5V#UkHfpuwH zzyC8i^|3MU^x;LWxdx9XaMiqe&^>w9yh!QhnLDLYjv89KzqxX9gTTqjg3AkEl$%~y ze^;~Hto^M>sZrWuTb4P7i=JFLv$7(zSj$e}*~68IRqG54#iIDG+%)JvqI!^No5P%? zJEOuA^4@IRynUjOLel<ALgySTQ<IA4xz%e(8M%lasA1h*5~Nqe&u=wD?z@Nd`Nh^7 zyrs=&3kNM{IeP8{PshSusj1Z_A({tG`rBA@g|bX#!xp=R&N-gBr_cB3@^`CFux!v{ zVsM)D`@_bvpfWwl9K&30Khf0Jzh>%kaDM0cex*|)ynJcq4vq6i|6DiQ>F94%xY&q~ zrP){7y!^z;2O_IixnE>_zU0$Qb_Ofo5BGNW7#;uiK_jDE#wX+-NASCfN!As*jvE7= zSEVNJZs+thn-ic|nwgb+@pr)Ll)$=@XIjlyD~jbr@5#;mmZ2k>XSQYY<T)jWRVpW( z+V{6>Q|Gyz(%(8_%98o!ewEsJXU^wUA#Ha{Y7e`fPl+#$*s2yk{mHr0qH=dFcC{_A zPmO&Z)oY}7dJj*-3J!+X&kgv`Ub;Ltl}E4fIp=pyzR>HES7Rlgq)rRbP2V|fa*2J` zM71f29uhI83rapXv;Q@*adDEBZoQfydwYY4kJJ3y6788e_UF0wNrugN>CD@?yUpo* zo4?og4bHs(Z9I#@T30Fuz}5mBpCGmChK}aR<|C){H|&$H_!PMKpFcybw%h*f)1r<& z>sSgsX3pZ3-PE6c<48+kBHyGNr9atQ5+|iU{(HCP$ZkG`S3mV4uFAg9lW*82we7{c z?`b#QwJ5a(YyPU6la&`F^!mv0TpnSc$;FE|+V<>qv&py|$7k_w)pO0mV%C>4WBmU1 z^}m=CxorO3tNgK(Btmm@PC5s>r2k*V^e<<7mg5_}>!lHAZXQ>7b#3L@6gRP>lQh`M zV*;10OKn{uc6iFxKHI*RIsBo_#ikW589%QZThH9cSFruZg7kjI%aYH-Ob!1vEqYZX za%1P*U!SKunXLGCmzX|hgdy+d*q%vMr<j$$JP$bNF>|B;D`SHd$CFZ9UANq=l-m1v zfxztrhuTjpcTC|r_V1SA<=<&He-s*DdVlQK;mrPXW%+9?u1jg`m%P9K(CyV(jvP#T zm)WQox9dgdzgqh!;!Dq8(dyQMtP4wf)AyZPub^^#G26e0uQz+_7Nl-8sb=*{)?c*w zIip^5;j>3qB<xb_6E9VNVmaz0(HtTCAWXWs>5##LvY>01I7|c{+^X~Aon@)o_tx;z z#reBq9tFR!vH4`e!hO)=e(ARL*UuH@-ndj*9VowP&a#kY3ic|;HB2>58UJN^ozt*V zv;W>Q$KI;+LkZ?>2kqAQ|N8vnF0aMxwvBU+`m9>_D=A~g`v!5|tp4_2|MKs>usoDC z=jM&OKX1;t-hOYhz=Oro@porxy*a_KyZ?lzJoBxcEBN=Do$QJ(xaE41XQj2}i8H&_ zOmZ&hdFs->@8xDaaohNQhVM+LHSMRoIOl$K>q+h>qG@xsC!e@H;mo<(2|C*j{1yE1 z@!b^n<T!VI+t*I>mwWRC*BV@7S$2e@+xy?;?#*#?w@Aq^-)R2T&Thg|10IV<E1aD# ze!eMfWz~Ldt2fgVzeSs;^;JKQdum@$D7+#$>6MFlP|2;-ikhBThRe_Cnt8qXB=Et- zQtA0L4duHz`5RjM)E{SUh&o{YxI&{g_hjz}(+kJ$2u>2-wAsAk=GQwlI_K=yyVXjp zJaql&jy+QUgetWCehD0?)84@Q;P)M?zZ3Mmm~PDoUv6~fTzi|{%(hRrOrN;Fp7fY4 zT=(Xe=bxWUxv6nC)g<Q?yZ2?8S%RPMxcC3x=^<0RZW`aO--lO5?VW9%m$c?VRGs={ zot^1tZ)X}X=+wOXz%Cef^mv<l!wdHPX8(IWADHka(dYlK^I|__UhRH;fBygK*XJ8u z`>r&r{^gYVq9?nzG*{U!mVN&G_JCi@CoFVbzT_fD|8k=R@m4!D`7eq*O$ax=-M>oB z=D5RymsT%DE{nMwQ$4qN**B4vQ{g9+Z=K(>dCjp@(=PU3>mp`dxe_q_l}@15Gz)1t zY2jlVC4bBP+!wyi{O_9!SLf*7W9Z<YthQP88_U<z4oA;g%H~PDUh?eyiF5MV2VUyj zxBlrYQg=<^*ZYg2rHRKj9hN$x_k!)AgInccA5}}4^z`@p&ot{zPTXuVrS|%PVwDY9 zI=*Xql3z1%hb{hlvf@qS)|Vk$E=C;DoS<Jb%Q$WV+vjB7CG-1olHhwkGmI~8*% zJ-K{uOL5`0lsnC4$}7#5U4A%avDVVfHV@9nZj4#ZpS)2Z!LaVlT=Q`E&r-eF9k*7Q zXLd}}pZM3RP*?DE=%uN_N>4VOi#WNYT6te+(3>YmJ63<Z$8_BJ!`w*WueX&xs~Vhj z%;a!AA0(p?UT8NrSvDiNp!Y@GcE&i-;KbUj*w+r6>2qE@eo)i(d3D#tIIX2(L0(HN zC&l&rkv@|B;Gfux`z8tBR_!=+ZL8vk%awb~*WI0=-}r0QLWAV2prYkx{35L?`F{v* zVLj%iGXLRA$?r;1`SVQ$p0D|y$v4Z-@BNnqCO##LQ(E7vrP@Ny?JKo-VzFO`F>Yaf z?hWtcdD@C4UZry1kHn>kwfvjb_h^!pPV(76Uz0~awG@^tetu<D1MBIz1}oM-HOTxd z|H<xy&X*~P?;-==mD+^-Tz0y^_<q7(iNCIzEa}X8e)C$prn?`S{4SAq@yUZ5)ZT{Y z7|nTXX0~SeHcQdmOC57BC+=s@Trhi^!pSeSSywO2*kpIytyuQr-V>7FV$(vy=5Cd? zcVxBXUliI>FttYAJwnf~F89sq&leM_*{iu@%w!cB>kp>Q4(>Y4SvJGx{i1!@{K?!Q ztQ~q5Z_e$ru6`-t+PGQx(Y=|I4rck7r>fp>t~);^VA)Q~?+d=Pe9Nn`ewZq(dR=%= z`SNS)(kiblyexBSrEkESDzW0Cx@!l_y0!kRTK%@Xk;q&#yY2A4{$;ngYgqeOzAtcT zm~n;YhXhBE%o_#)4&f^=+CvQ;U%Sq{d%vFFrmXSCS@+LY(vo|nw{mxEx|qQFWuE_J z!&rs$NzJyIw|Qq8eY<>O-LH=vjv~MI8rSaNaZO)*H=*|G-rMFE#loz1GDk)~dGRam z^rB;H&0Y6AHB=EO{hu6mmTUO|`SJ?;g?Cu5oU_y@m&<*!_s=bj=czf$yAP~2X<J-o z@pW%^VIA+1*=A3kSvglpBm@f2xW-+iQh%>MGiS}D2(9n3=ju&v#X2iSeqC*s^36J( zH$YYL^qZJ`sXVW@bLw3r7xD$Ko-bb@v+J36LvE248~+TmjPBz3tbSiq0?PTaR``o| ztIzy=JLu;Ru^*i$WnQoIF!VX>$g^vIrcgq-a!CH7neM+?G;d#eDIT7ZB>Uh&#j+2E z5$-#}b5~3|Y7u@T{_D9dSzW%V4Vt%iu&--vyK1<`jMwO%=y&V#55Wf#*)OfJ5?=Ig z-SmwQI+N_SzW?+o^WPfwbE!PaX75DbIVHrhC1`5TRq-{-=nmi8ef;lFoes(C{1N$D z9&0(L#Kz4|+U=uou>Yp!<jp&T`;P@$>EEo_%iS|i?Su53$te|#Cl-EYxaXZ@$5eJ` z*3;}Oiyy~2zq)1;@LAu1W%0`C>AjohPcT<iy&C!5nC++C8}%b^uOE6c*|YiF@8c53 zj#T_TDr3U-z<TvHD`tbUi%Pn6%~NDOd**I_y|<I^VJx$1ph9KFg+(7f90;-!d7hko zXVyE{j>b#O+0(+0lp5|Zv0E3g`0@0Q)+WdO7mFCG?P~Ow`k-SuEyOzNa&b)7g_&W! zkyC>kvNxaqxzJqxO~P}D2{&ctSX#;L{^Jt!{eecKeI0+xEtSrhy`s}Qqj_^K8{GW; zEN691Xp?pS)gAjB@3+ewNr-&try#R<TTS<sS4Wi6;=K9dt)Bi@e|>hAvNhy7JiUF4 zf;>j6ckQb3s&Y$t_W%FvO4*f5wT(U97(P7JOI!B2;EdxnpDu%w3LNc+*XyowKYwY? z@!5j23yXHlQ=Ps>?Sk)v{btt+8#N{Orzf8^5}VUy_@?Xa@60O#3;d4#mAbQzSN~Xw zUy<p#d2??c{_&Bo-(6MEhhI6qw4Q(Q<}C@)Qrk`*cyGY^R6$_xzQcd-TJ{{gUZ1x` z_|Mxb5q=xud2jbF^fWT%Nm{kU@o&uCwaoq(C)+elX8*o2Q2EBYwpjKvLc25hf6MSV zPu-Yt)z<uJ!r8fod0l6u+vgfK8A_SGyCYjy&2wix^KB*Pk9$MCOdc`J6V^Pq$)eTG zM(VL_o!rCg7d4m7Pp|e@t2X94?pDiL_b2Cy;^(yoPfHvT`6GAmYf^<_T;8#l?Hgr# zN>}F0PP{9>DsR!*#|QG3Y@N7kzVo4!s(b$omTgx|n096Xi_ErTh63D+%pW_OFVep^ zKhbQG`L;_l=lne$+PuxY%{M)Vb1wVjnJJ%d-k8MJ>U-|z+`GD#44&0j7W-@c(yRU# z@8xgV@a{@_{NMOnwY%6GJ|2H!GcT&qKATM-H!iBpZ?m#ppsl~viEMV}JH5-9b6%fN z7UPjUxI~LhDK+rv=Y;tI87*CR65roq&0pf${>)VJyVk4wFJvuW_FlQww5R;=l9jv9 z<U8ebap%seK3Fqz&f_Z|p53X>cw`^&HQ~?)N69VA1%!;}O!fU;*Zz99%n|<jiH_Hg zzwg@eyNc^y6z}fPzV8pFKeE{;x&M6CBj!swc25N|i(iS^EZVrQ>(<X*mh07@zklC) zJNoHXsd&B4*ZN&=XZg07m|uTr`R&iOT7m2bW+KZ{WZaWabXE#o`?QbcwtMQ1&}GGk z&hJvW#+t`};@zGe0rnmH4^=$AyyEPyy>%HE*c3N^6}(}6gXQ+cn|;SN9#n3cof&vG z)Zwh0)9+S&*6TS1ym8l$6|R_KwL$&mh4yNL|2HJgcOLhjdAIkgqQaBf))O;NuP)qa z(Vt@T&Qb4^=!_MA(u-EDOpG|Z<DS(2$Cn;V*}*^a`_;;LvuD4XFAF?zW|P;{V=-KQ zs<273cS+#(kDLB=W(9A_JkyhOmtl3Mi>!ah*0R`*l008d)(02fUf?_H%@eKohHp<4 zEZ+p~v^Tre&u%~eoJ_pYx3is-H`k@SVw))49%lLH){b7!hO2Tq*~!HgW)?OIJ3s&9 z%Dnzi?&gi-342BE?LQpDrZ>@Z{a=%gym^)-&p*%8OIWP;yX{U(rOFNA%Nl#9Pm<_~ zKA*bQIeF_LTdC=qlV=sq@`+<_4m@^jhW2mXdv&Gz{y&rPJzI6tx2R*u%g7lw%uA=Y zJT(YQ%Ck|5h<fB*)V8KL{cdkf>9^TRdviM8-C1WV;Cf!0_aJYu+m4ePf8Ss9@wD_D zIlo=%f${N8Q|2r*342gy>Zg3lRxXs|&FnyN-!GF6pI&;gZ|d4Zxu$)4e_Hp<+M>&n z&-;(l_y4L+EwjGfns;wnwUQmT9ay($0e@}h8`lIsudD-?pKsKU`d{(lsKuhY^&gMf zi2b|lvj6vq-jAzq@FW*L+%Q*mgO1zYQziQLJtb3Fj`F+B={bJ$X4>L4y;bdh*KQ1- zk#@Y#?d+w~y^6LUC$JiQay~mVo=LvBv>_sKzO<_3ZtKV8KX&Ck=|5F#{;&3I%sJ-c zn+q*iGFPl|{&2&!*rs*S!7Rb66C-tIZz~hKvd*(6@6rqR`FuZRu5?c;yJ^ik)o$&Z zDe=2B(^u9sJ*;lsX1!kBB3`SKXI=N_*XxdL{npmL>}1lZyUa_xEp2|?%eRu|Q<hPm z$-is$0$HEddPk8PVGDCE&0p^vpy#)WFZ=O>gQ;yFMRI0qti0K?$NK9k4r}Yxo_AI+ zJ9d8G8LNVP(Rq4L5A$^&+@!qsjhqh4_e(#73bH0-KQeq#z3AfP@*|freODJq^n6@U z^(0EVe{JDTR{Q9q{GCfxr=6AHwK%YtdC?A&$20k=L_NB>mi}a_Yx*AfT7T`-kSi=< zo6lcizwc~%^vRra$F46d{BUf2bMfsh;>Yg(*eD^--<Y-Xzz4AyJ~!J#?xvTd=7{g8 zZ_UkEBG~q(>*s5=9L>Wed~x+F*Dx-%%5F1bUDM_}_hX8cac%p;mwf)s61E|a@2O9i zE;)n6<hEA9{&lNTPgL!@z36j+pRHob1i_bUS$<!VnEhC9<+*^8bFPz?yx63DD@WgP zosqJf-lynW``9<KOxI_de36auVxy9F`?<I~t3Mq%y|?z&|L=TamqS8+Yo&R;WPNGT zWf{0SrL)rf)}$X955jkTVqT+o^UBF99rwd6LLT3CoYb|}^OUG{O?}RiYZm>-Qss8c zk<IVDD0TnZg10m8^RY^sPSBkF`Ng|erU!2<ug&z|VSd-JRw!)ucE4Lk)1)^!EVxo) zUuUu-=U_nMs$;VnJSOSBHQF+-czScm+nU1k*it{2R*hP%xGPtdpL;VqY=``OAKu1a zYZoNR8@BiD5;M6|w2=FE=&ZN7d3SVotnaehb}*9t#=GA4@>7#@&op1=+aND=d4cts z8i~Wog<gJtQkG2aJR~z=my3pa@|@<MccyF$I(n`1-T%ODhYMjUh9`HP)(rbOBjx?G ztqa%tE>9?yyul~dvotZJZg<+VY=iHgAO7EX=KsC0x>*VTErZpT*O)(wWj=QJpyjN? zH&(2@Xm;aHh5eU@@#&}Jxb8@|NFUDV;k+kw<lYSKm_s+!=GON&&yfFl*21>Owlg%1 zPkvo`^qmdS$#vZSKJos$?ph}<Z$87!V$K7TPR;Kd+5Ue^yK-OJ-n=rYqR21#u-n@2 z{2~4F>dSQxe){gF-Fv;ekeB1ALZDX9^$QG{uXK*`Oc$)%$0-s~XOyQub$iUrJm$w{ z6ZRPEy3OT`=Kf||oE5b^SIE0yfsusH(VrV<{xO@yW?`2ZWxM2<dt27E;F&7om2P`_ zcN)wM-&UOz!yZ@m<2&cSQrQBbiwQeTr)@uFV0JFug2(N2XKmAQe?MC({p`o-S~AV` zx}9I|?zCz8!nK+;UTlZS<NRiZi-&hk3NE<cq&P>qHGbloKl6o`T&sw<u&L1S=#OPg zpJk3He%#yjb#|74;>zobwQ>)}$R)4zf3e<jhgv1aneE34y|)-ovI|?vv*p_Nvgtpj z>3TFv>||Y0y;zSoe)k{!kCI1!e7Sd;BjlrwT9nD&`E5(GFCNkGn`K^7+50PP{i}X% zscrT%|IGiIG@UtR>V%Is7tH+sQQrO~`zgsSexj_axK>@dxa)b!6`ho#X92TT{Jmy* z?qaf6P>``BL-urLoBNK-lizq=G0m>}teTlMhsUxyJuu_iQo*JEd)N=F`8J<TJQ(5I zw`Q@kmE`T|31%nRyr$|T{OtDbj*LCST=HP6Zi42XXUD!DKd?(B&pY|+sT~KWPug*> z=}*J-lPPtkJEf8)JI4Jn_>_KZX0gq#N4wu`xF==#;I;p`<Jw!gV=OL<%IQ1G^j@E3 zQMD}f$6m8<^1X?i=QtnDxM96D%WGlt?@22>x7>Kl`({;Z&^NVJmpGQYKYo;T<X+Z> zZKn<jhxJrl7FjiGiS$16Th{_V$=4>$=rOW5eMv%=Z*ua<9rjJBt1s>Rp0l(d@LI9a ziE|Ab`#RsIFE5#S$VSrC^1JHc088De!6C0gpY>-Owk`h|67+b^J?>(oS92ox&wa}9 zvDb>%@4Xx;ee96O|KkTXi65)`xzE4z_w~lh_2sGOlVbFa{k5BPttr2?wmI>xq|Ro3 zFV+nLr8}lx2x(AXv6Rzd*`qZfYa?$n$4jZ2OwE+lJbiM8`}223`BK*wZ2dMfDskn> z#gCrPJUrp28SCq?AN|rk`_1C`I%^8<9Xhc;kH_+c&-~O#t;Hwj?hml2G5KdHl;7^N zcHNA*2QB2>w^c6nvtBEC(I{1Tsg=6vAKmN{3EMn<7MDv#Cizo5FSYNoSSfwTB;-a; zccW!xLu&q<Gm=pUW^eqXTb$MTQ|6Ct)BX31{1$ShhEs06JgoP>X|D~x-Hg?Rd#qnO zvo77e>|>$tl7`1uRs;tWA3iiAxL}T!Jm<CQMR)&Jep_krKQg0&GubNqRD9EIp(oZ$ zo;}%}*v)YM)|D$y*80!n`(VKm{@RY2^_*gU!&~Kzk}>6sAz!6r_>R?xd@cC1a-+?h zEmDhF%QENi$=a;d+GDos+yzy8i}MBY3w>sJB!0LjwY~qsYmpOICFSQXn|Wkj*Y3c7 zx`J0NWO_bI^VpkT6IZ<SyM5z+>*Hrt1togQ46i8~=k+=_YnGl`l<icSuO|MP=d<9q zn<i_ec&y7+-f$Xze^X@8mj3Q9$Mv(Gx-;4vybEkqPUS0q-1|uTPm#}@D(1UlzMqS; z4ZQVl9oq5Fqo@BtjhkUkVod%qMfUzBZ}Ro;nkR@H&5NJ&=br2_Lq7MXEc$G3xsI1N zI#q`yTShE@p>CM|qv6Xm6@G_(%G<JDJ^QlE$oAkl^|@Q`Hx}JioH;{a#vY?R=H6W= zuN+z9s-K{2<ti9=eggl&Su88~JkLy3zglemLxX9?an@%-9~Q2Ron>-S=TD~B{FE6I z7iUj)VDq<q{`bMT$4fWQUNzBn23w}#>&*=wi(X7)-=g%kEY4c=Chu?6;C}}<1WA;g z)QFlSyyxv)Th^|v#=Z-<3u0Bhs|}Oy^=vzM%c|i=XnNKwscW|{WqeP#(Zl$BLiNPj z=8EvM8%=){>YlmY_5PrJ{mdVKO+UVveC4upTZ5+LoSu}fk5R{tw6E^8)6v=>XYHd~ zaku%WvIqO&J+s^S0{X3#zsc79W_%lNA*<4V`|MY_{;YY6{pT!C>QY?8#=7a)v96cZ z3!Yh>Zddr)v7@N@_I;_q=ARj7V*fn|PPQ_YWBfk5?)&<iC!IIUH=TKIp=t5=2ZdL5 z{!eZHCi`uT<561{r#)w~s^oNk+<U*O`S64*0o!G>M7a-d7F>MoqK%W(!&_2i*S8qt z#VQ3>EuNe5#^!96!FJb%>8|@<+fTaTF53`s{g{d6H+{Fl$B(n-+%M(dJLOoa?w?fd zAC|>)g`*v!pNhpZ*~uB)X<o_kz)W2ApXF3;@dXq8W+g1YW*af<%pNaR`*OFYzb{u9 zs}viW&U`K9<Ju8z$T;!k0^^l!vzW{S?<<!sKGv=_=be=~_bz@ncb+|t>3%KeCSQ|^ zE_~+6;2PDVDEWJ%^s#LV%pTiW9=4bE=6tpLN&Ei^(%%o>IMlHueVSCyYPBz=2D83q z9CQ5Scsudey6+oz_xQYCS2BBB$%nP`y>qM<&*pqlcS>j8th^Tw-e?s+&`s!R2~|Jq zSjOwtw*Fk4dYjal`(G{pe?6Po|G*+F?)fR()O+iX-M;F1)Pi5_C5zSkYh3nqCd&ji z%!*}eUcR`{lu_bvzT>Z0pBc_=KSe%t2PHlUO*kU^&Giz~`~!Wjb}W<qwA)y|`R8=D z|C=|>`20<9&OP4SJr7qu{y#&ZGczRY@%Qq_AF@?vfByC8PP|YmN8RtdGwIJ?Z18Wa zOqN@6aTUwujRn7UZSMVW`&rE%%ju75VuW9=KlpV0!H@f`|7<_@sWf@5^=(tbu&a$5 zch;QHV=Y<Y8D?q1)tl=%Nik09W01jl+haR6zHQ6ze6#DGbnV_Y!!5_AXkQM9*w=qW zUfE{OiV3!bxdwSg-mygj_Y-VhN2auEYW@Ey@Hu^!jN0?}_Y?o^=holPVt?+OkyLwZ zU1YRrg~r-9MJ#5|zfJh~P?PoajE~L+|B?^i{HSK;%$s~uHU36)vW{1})TGZR{t6ge zZF3G=bg_<i<}W3GzM1#Ey#6JfOU#^ecPH<`#qnQ%diY-nvN4v}m-+X)jE-mX)UptH zL)B)z-Gap)Jkyq6l$TIlbiDST;TKQaMvbb4dGj~!{&sWw@%gj<`7f)t-(3~?X-%&y zZ|`%~|9{dh+iQ9)kgs~n-*x%(QTteq#k)(&>N3A19lK-Sy+~~CzWv|d*9R@hSmOB6 z^`5$DZa`eJN#Lzzb~F3lnB-ql*%{-W&HaLJn}2iLmH5-U<#xAjF6VWXYnl;Q_B-u{ zlI(3emTJy7YYp_yxxeh|Qqy`7;PbI!a>k35WmfqwicH%1n^QUYLN7`kzjnj;&h>=Y zrsM+;%NOew%s1(+(m7~jd6;$EtC|{?*ZEHVt38EhI%mAzYr1Xk#H`09#&7O@-Nf;> zUu??Si}Q}@Om_ZmzM?u{R#fo)ss5|}cw0KSPwKpOuUI2nSYz_H1#5dV6t%L=C;zG_ zscf~?54G(MbH41u&1QbglQrk^dX|2#Ep0Oozc`X|#V*ueFL?J_X8+4Ncc0$t`NSaS z8*=L6ig^_$eRs`0+TnXFaI4eJ<|ygJbEmhv*r{c4*5t-;<OPeV>OPsa^5y<T2hYr_ zI<s$K6#KFZt?66C`TyR$uBIh*_scQam+Y}7zqe$@zPnjs`7Y}6&BS?g4yzX1hZgBi zP;!xvS$--tyQezo^tq~&XU>YwOlg#rzI@}X?Bqws<J4j&Bo-a;KYr}%jTy__cBsv^ zVUq5-@<%u&^X``=Hz)tUoY~m;@6Do>;@J@!&sWS}o9QIrJL~SXgOeh5zl;brG}E_w zF+<yMwZ@v=Qg0S^-piA_(x=70xNdpG);xz<_k&!F&m8F3T(+go-}dvLXBAmR&tntr zBuXW`xph6G>;CLn-j{ny>q<7<V|}F>u4pV5GGVFgvVfe3l^i-RrPk*xI$1r5^Wm>s z8at&Aru-B<bG0HuW4^@{>AO-kc05_-Ec1KkF5vx@^N8*6t>uC1R^E9w>(>s+ZMzSI zv4lkmI&6O9wllqrCBAR(#I;$^)?cjXKb5=o&(qw5bya313g0#Py1Cwp{qQYP5n7XR z%2qXWzi!GIQ`O*Y<?c%shf6ftWjkNm$m`4O@7wD%v-$gG6@}8P-}$(gaC{4t{9w7e zCtv8wogJ+X`+9Czuhv|&u{GnnV9hMQ%KZY_ToS3*Eb<GYdMjA&t0#X<keVX%aPCxL z*_y6TbE;ndyq33Z*0BY$KlUVS{`+z7-(7!d_-*fceV<tB=5S%QfGJb%r7v4^-Qt># zFYdZ!FVP<R<+hn8S9thaYo6F&i|-u0%<wVb;JnrM(%H7fewr2Xq(EkGLpEdf%LCsz zWEPy6^~BeG@AF$uQXa)w{nEAbjQi`<czBB@o%gu;#k)VU_u}7oOLQfolkE=fetFJ# zm(CLJFr6=dlvp3Hp0%yiv3KIv&6?j=cC2JuDS67XXx+iyDW!RNyEorY*#A2Fd-IG2 z{oOa15AXfG=8WyeW52IlJ9<bmO!T!~hQ8jl8LJN%I4=l!W7PJ!?wj=7U-m0z-jKVs z+BwuE!fRFMGo{YJmA~d5XX4*wvZ$FM_=V-;2hIu3=^itb6xPpPam?9BZ|Cmh=WXp7 zx~bwbGSclH*F^XK+`Tr5ziXbzl*sgeY=_sAmaSRX@@45Uu@4eWrxh-rED-&?_Mj!F z%7-<arN)7w?OfG-w_JrEZj;P@@#g&V=Vz17M9xlH|0~Y?YQD(c<rQi-O1j=ySd})s zUimTkGP|j*(C1q-{>NF`%*hR?y*BIJ$Dr97dyiVQ89teC^W%z_(rOnhzdnx;u-5)+ zy+`G5s59S(i%o}9*03|mov)3z@~vE7^tk?)`5Cb-%^Q89wA&x{tDV|2d!OwS-Wf3~ z4JVoyp7G}`e9iDkB830jswm61QReTGn6D^`)Q27Ywo9gW>5Isitj9Gxu8S-u^xC|< z=VAH8d&<JzkD88^ZerK&?y8Gn-XAqD$U|asn{7nAcj)<;Blqt8IMKPro6+TOrQb5| z@2o55YPvRF7Pyg-GyBz)kfs?@c9NeHWORP~Gq0@S?FclqxKn=j^1UlJkI2aMRh?5U zVcT``|KhYA`V-za?lz7taC$cX`mN#z#}j5J&Xsy@@HEWrAZ#tbGEdWoyCjpZFFwzC zEVTC21GmB*vmRcxeCsyz>hCMdj=jw-y5?-~?$}bzRo{Q}Y!}~f^2e*LO|t3lKQ8DM ztlZP{a8j3QdOfey)Ypm~CnfSed_DZ*c=4m%2Xiyt6sP7-@`(~YVCnCBv98v4>5}4n z*H6nX&U*DGv_1OMu?Y$C#-a-{1d5#)1R1wUee;ld_IBOEN6#XPbxgfN{au?cJMy2t zAQfdEktw78yNCDR+k`(`q}OLFw>=2=e^TJ~B5;P{;o~g*t5f7t`Jc5L@*kY>RY$H` z>6eR*Q+AR5+{Ak~ZR46>uJDanJyEXLlC@hhy0q=y_Nui3vFXPwH=a58!QjTzhm$tH z3tY{_70vZ3&~#~Q+v|5p!3HXKuDb6qT@~5?cgy+Oqw{~g`lh2$<@zqRjB(Oy_CMlk z|CfLJU;OAl3*$V|y?+@QR@~~Y({TO&_;dT^RK}{aQNLUMMZSo1*SgStbCromV%Cfj z4vvRE=Jf3dTqB+{chL(mpT%8E3vA~sXLo!%u|YHC!i7cR(ajS!?p#@^?RvSIKiN+p zazFd-qB!Nhg%@8<2>Tc^>EnlW;_C!%MyxKbxA+$3*=%@z-JRo-({}THnzC@$<!uQW zvlg6=bu+B%*P4>KV!|}9TB{$u0%AGa50#WA`RFtkP2qR7T;k2UEqg+q;`IBA1t)u7 z{&k^Wv-ytda`%EY$LzfS-}DhbIjdA6y0zHLM0oCoH%V#{Vo7tq$4#s<FOcc6wZ57X zrz(D#Ej!`+F_S|Z{dZ4e`aa=ZiiGIgkkvj--<aZN_3Y+3c6Z~u2m9SO#AvS#?!0XH zaB<AzXu(@kHy_mTJZ6xQsyBP%)&tj$Sv1McE%RE!F|#OlgMLDO=#{S*lI;Bo_DQVW zHEXfEL5+UbPQ%4*4bt+W!9uDPT?q@M#dpqHy`n2<(vG0$OTS9=oMwklt~Je@f3-eT zuOel!%vIU9(aC(O8h<{ie!P8tQ9_*kgMW%_-hb7fe^cCiBC+}BqE$=7MEySpUcPwa z>Kxf;bt~P4TXUz)vu$&m+59^oGCDYMw$aYCDAS^nu97d0o>V?#nSbuM(Os@gHecT5 ztqmM%Q&#R<-N7^cib{LQhDyF$c}ohGE!@c08@-ar-K|lrT`{HXX1Bcj%bj0W@!d65 zyi;yr^0Q?_*7@ffjYXYI&Sgwuc~d>1>SOsV)2n;L)8l(jR<o6->%~r2Fk@`AboMSV zFwNX5QOLi8Yj0n(-Xe$IMT<`sN;jwSUDMQ9EvWjC@$#~?;`y$sXIF2$*YjF5$CyvD zjk`;;*p%zG*4jlew^+BS7)v}^IBCK~pVb$6RatkeIjbQ3S>u(QbWO}$(RBUR*Ly$g zGx3W~y3xDv>$6p}m$GhnYt)ooeL}K+Qn-t^!R&LFobKNi+_EHM)-}fkQ>J))yrVT^ z*}}D&O7HiuT^G5-w`@yq?1IO}Hye}~Zp4PX%IP&T&x>z*{iLT`ICOfz<^=6YX%XCQ zOO&>m9X+8nPj83y52c+xal6y%IXrgtf0NB&UY}&3aXs$2)9VKJZ4V42zDi74^EawI zL3qMPlh2#$jIBPJB(VL^>C;`(>38=@M(!e;=<GGs2CatDPpqGq-VnDFwka}Sc38AC za`UyvvlPFd`S#{P?V<Q)|KM1kFP|@&{&#=9EQIsaillUz5D7Q^57%NZS^0`@d4F2n zH_A6kK`SLBF>^BOX`Ph^d<?c8ONz|lyl%Ww??T4?rcK;)touKmulTTJVYz0|^2gV- zl=nxmxb(1Jw0y}H-7jk9y@r)<b1=V~=fO=)|K)Bhn{}|N*4RS!f{?EHdZWKq2?ow{ zoz!a1yRF}BwdTbf9oP8zzY8O0e{+;;R5M;-$SJcy;K51}mBxUz_U+fajq{IL94_F< zxg>W>+_U6btZ-FY@~o$Iwl!w0ZneRIw*C*q8QDUVzqaMBycK?N_F03*8M>tmt1@+; zEWUPTlhWi>p1YoKyzLY_SW)mv!O|mp)l;4F4d+=ttYH_u^V|8s-T1b)TF!5;u7p1S zbZ^1ZdkSWAtN&fN^7rJOES6*ob>YR&lez5p7Jm0?T3c9m-{ZaY&6u{xWq*B4io_;F zT$G(|c05h>qJhV(N4}bJujPEKd6xY?7E_(5?RH!BeMRAq6X)*n%59Hjo6PBZz4Jv# z%*LVx&76~8HPv3XJL&mm-6X3i61!eUy=~sO$W-Ku+wN6s*01RF|C=YZX@*_(YX`4O zax#Z1R62}V{ESZSP7=Ai#?|0U>FnSMYF9brch4x;xVo_FjgeSL^#Z9q+Y+Q)%g@i1 zi|=B~TKgfB!{Teo4F8*XqMH-tQVM?D=$*E;PRs37@98zalFBz2eo1;L;TPF^+&#IL z|I?M;%aa_M!dSOdUMrrPwy|hc=f#lSg3l*3-)$<LRHM1`+-a5qaqA?nUNec?8u=44 zCPi<Z(C@-GQ~5d1?=+irdOu%Zym^SzxUYJHephp@Xd3^i6q`D)8*JiDJ|6-X$S&x6 zrPyY0?q<aD1m8*5wsF1YpYD=6K_$0NGe`XKw^vWhAAjYIyC;16QBLsTe&4{(<QH;} zH1#iK2G4dZz1IHvO=05>`TUv3W7+RnNH~YZ8p$S{?Pcouc)Vcin`6IDu=u^)XY~5s z`LA0OW93qGD|G#iW=5{jik8-oUtN=A<*-lg;kQR~-W}ZGwNLP~@wKS)@1NfIaq-}c z8wU&Ic1PHKj!yP4GWar&B~|aiW|NJbXJx+2RnKm|+p{!t!_@0;hpmh~oHZTRtTvqZ z{MfT&?oE}Uu{OL+k!!Oyq(`b<nD{SY^R`vShn$YpUHkpa!Fkg)_M|S6>oXHQO~Z{J zyu5$q-|CI>96r}Ce*T~T%U+V9K8dM>pW)x??gighG_7-8AT7;t_j328Sibpv3lje( zz25RS{l3EC;#$L9(+*jE$&6HJU=-OY=<mG2^eJDm7E{n>|KuspOO}e|?n*QIzN&ih z!a2VUCQnPg-h6M;vevryQa1zVv4*toHMHxIXv!^_=6E!iX;tdJ^v55z8DDQZ+tz#T zw#c4X>C1e<Wl3R%Q`s4Lyc>613Y@Fv{+KB`ljp$GIUk!h^Y`B0J~w}L@rqpy;@p3- zj`UB+>v~{geKIz3=Lw(ntqzSwDRS2~$kgy&Z+hKbGo#17?3%5I_lK=s`P-Qdzhp=~ zn8zKQ9;Q<MZL3kZ#TkL)Yji#;MwmYilnQ3KU(mNAB5KtZQ|Gohp$axxlkFQN`|k9v zWn=c$d#cxV@He0SMT@WxzUMR73hWm9Z(@1)=1jd=3+&ciSa(oN>(28<GY-_gduB14 z$1kk-+TJ3KP~mSWF&upRS-&f8Y%AW+{w?~cX;|Cj$D3Cl<hjuuZ0$Pv#m2(T!izUY zFE@I(c6Nm3CY{;KULK8U%?y5c>z48A;G;#;k|pdUz9#5oCq-x-=V;5S@DkzwCl?U* z`1XVw`&qBAKlpcjZ+<=RzolaLo}Kw{)nZQX+Zmd^y{<+_{qA{BdiXT(-MZ~ZE%n^A z{VdI{iRf&5oYphVD)!=u-F(*XT_38SyO`4TNUeCg>8~j(9YvH2EPwFzp6Hsi+PCUa za_i*<O+R*>vdD-Mx_u{Nap8==mrbu12gvue8kSfkWGY_&vPA9sH-SY~rm{I(nZ<KX zZOe6@KPi7v$<GCz2LgH*AKc2dLyI-7_|po$%-E*w+aD~C6Il^BQE!9F4W*Dj>*lUB zF8Qo>`OE6bVl6u5z3*#{m&Ka=obr@o|9p|;l3MdWiEr-Sc)mgEc>leerF>pI2IdlX zss)+1r51(!iq&}OH+@dX>zsKh6GCHnwkyaTEHU}^Y)!f8t%~H?3sXer#98mozPe=D zwzvQ*+gO&+sqW$qNm(tIJ}jB0y(x$PgV*(}>{C~r=Fj%ud*SBS;$v!2sVb)1Rh=y* zR_@k+F1m+hY1Spnr~@lMZeMKZT4K0!+2@r~Tm1$1`rCMgHM<8LjP^TNHbHQX{-@b9 z(<>R?h`yU$a$w)8iknutl_hsA=eY{n@VZGh9apJu-)-6^x-4MYm(O`y1(;7?d>-)d z^JYKmExc_aIrmnqP|%wF?xAMPx>x*_E<e^)UyPlv>)iiWGitf$4L*U%hT^6YzrB_V zFX}Anzq$0=Z_CSzeO+14T{Qi9H{#qI%cU>>aqZ@k@tVLttLL5QA7_V|{$2IO?a6$v zF5c)@v--V=bMgGI-wjNsmzv92U$M1lpEK`1+eW2Z3bWGWCYHAy-o(0pt>bP@qwh8c zEZO@#eJ`gSJL@94pXJ8Mo&5)ov*l-hn6>m~-`2p@g*Ms?mwo##%;(PScX9SMVI9t6 zp=}2fC$OdeRSekcwqZ-cotX0J2k-3l|0cj-#m#x?=S6nqwWsQpnUcg08}Rz2SP1pV zU6Gk2YB^`#voy(L2WO^LZm;;>RACco!nl5M*B({Y65FznX2<l<9F7_;)6B{#CJT3c zyJI0$9&S^-x?oo9n>N=v*5Wd~_%+8Tv#xzn-7dK2cY=%$!zJaWt^e)f)s9NsJ1s9{ zKg;fUS5`wV@2mDUt)#jP{^vPfxr~068+&?Hnbx1%reY?vPh`=xchmI$&z{p;dE%4T zD#q&M9p)#wy9JLQnQ%2mCzN?!_iDjTEraBJCjxFgdoU$bUiYu$I$z$n%z}66+h(4z z3FSDv;{;3f`D44hA5EL3GH1p{d1mRROFgxr%p2~D7QR|Lf3ri?h4bQ912Qi^pQWyG za)*7%Ha<m#<+UXWtEvmO#=b7HZRPp)>*f`vqCB7WQ)UNqjVDR|T=zBPjD@T6*5@D2 zE1Z0s_G<n8NhLqB)7|=N9gM;@8h>AMFlbGIO~=a}cYCUek16l%&XVElEo%E7t&}cV zRn+kH-Hp39?kV0Y(es&nZtA9$(<Poi_;B^(;*I@nXZ?O|@PApP(h)g-;m%o6)|?8f zT^*uhQ{*gk{BkB`^SGz4?s7hI^iKr)<E834ca3AxPsktp^KOgI0|oW96OT*ru<qk^ zo10i^s+2inV%CAXlKr1f?X*w$bJb$qhW{$gho&_}o37dQC|r6E-@(&Ie;8_MzO_2g zE%}l8R&|ok%){BrwW0yOmt>Fd32#tkJZCfKclD#9j3+WRHavCZ*FsI#KHhTH;=IA% z<PVQSZWbqG3(bD9Akjs7?)tc&g6Gy+^&70~Klb?g+~AkB30!{perlipX5<LQ@cet4 z{dD`eDQ6TX-`ScfSMU8HZ_gG5z22u>pOfa4GurL<+x3~F(s;!&#{FiO;w<)S6xB+Y zOx%8F>ql*uOrM)4)V~^dbAHRYaplBr;n{{|ZL^-AYmpN%oynfO@z~cDRv%v)ZZ~Hv z6m$5#NjtXq{ubE`U5VLG7N>oi$rrF|&OQ@EwPXHalV&ijw(b4)`(L%u7u|mouFr0J zcyIqd7S4Zv?*Fg1VF+1ilR5d~%H95N9pCt0d2e}={n&Gs!*)*@OusDC$-H=7VAX5I z+6UJro(c<5dCr!y*!KbZ-krPteN0;{@6|G4@h-OHt4n4^TB)oOc(e7;MdnQ#XKfMO znpJdp+K(QaQ?iyT^=8#en_S$y+t9u#bz0urO&X6H=g+B^H~PORR4xBa^rO8_wXALu zK413zl`omFQPNE6wBW5}N4J<~9Nl2E;l50m#Jz@tGylDGSXp!-FFIMXcYa@I=_`>f z?Z$Z<+$Ox^-M=!S+w<~c5re*&-~2CBsd#*8+G@M#xR2x9>W!g|qBT>)YQ6mam|Tc) zYj-x>Hs@n@@|uIMC8o^pdCg=0?bu(DJ@b}q@6y$XW_?gmAiE~EXv5WnOY@d2d8g@M z;OqD9n8RtYDW1PPvlid$%J_cs<3fKiH;bnV*B*pDt+Ai6?3SV0Hqk%1>3{Zp+SZw8 zxntt;#{Po~GalJV<YXUSt!7x=_V&S)|F2KHO-|h-_9iMt?xY*<@yW(1kMm|aYsYv@ zFv>4ZlQpqDmz}&qt7;kNtZc7s=9S4Q|4dlF-1EqPkez%_DsIkf>+f8bul@M6|3E(T zeg1;Qg2@F1k3X5GOE<q)z7o&%U;Ut>sU>so2YGXK_LzMq6aW8BJfmtMEB*a$<!{}O z|DMUztJIvH!{7TWXs0ZfA@2kk@1kpYjB$IO&o`SUGR0N={)M~oxrWp3l|%(IPIpgU zJ?qc;$$~pK+DpA`FloFRna}j~)s>f5y&wHanzP@`@41`Vj~(epS>C$6xiqo1Qj=%- zDR*wWdp+O#AM8<`=AIfewQyei+`kD;p5mghl`Sth3i+NTH#<N5r(FEocJq3xE8m&k zD&JV|7}=z+Uh#9Mc?he<B}I0v4`m8{2C7T>ZFYU@ey1gq|H<h_7|Yh@aZ@55hfP*{ zdp6T~LrlWH7hx+ne5CL3YR`)Lv4-hKnX}F^#*I41)Pg-Ovy{G1&*3tCIPpgb$9=QK zYnSExs9kOnak}s6v8Qup>I?aqx5!-&u!*~6)xD&C$<(^Ma+g0R^9p|~IrnLSc~;le z$~}^G;tAW<X<gY@+jv|2B5(bE>Eqc3e2dPp8Km$1uav^<Q+<Q)V2E_P{DpTj<?TKB zBc3ftH8lI?dp6gr%iy*=ljbb$4>!#on@D7aJ>2d!OLOs2-z(95y-%;Kc<&eMGSg@C zjNs49UaXzM8_$!+$*;Wgku`5>llt?MS6&C(-YwVs&RI9<<o#~}$s6=H+`AGY-*>J` z@a)d8xu?}x4(zFGeRy?;?3bD6YK6A1y;LI~W-*VK@9vT{B?A68mOWuo(@N7#+8A^0 z#pe}FLPdtY9j}Ft2=rQAm@CJc`9u6@{90ih$y<_q)@K$wFtDwSj9;>NU%s2p2P4l@ z8`{-eUN1YgKf+-Df!D4%e5*CeV~%oMzBc!$@3M{gp^qOPek2q2qiXe;`oeXZ8>jiH z+hx7K5ik9QDZWekaW>QRKZ@p_`PW=~FBdjEu5bRmXjx@Nd&%YZ5v!MNm^bHpf8#Fe z%f(JNjBkqS=)b(<@LenN!1`a8jyq4<A!c;8xcC!KzdqCFpsOhvJ{rru>aFyi`QYKL z=E>6E#cuSUtJ1kUvpS%7@sC*w|6<SAavI(&x-|VvW4Dh{zBJGNL)Uemti9ZL{LAcF z_t};>DtJe-@*UMa<GlQ5d)pPe?$Uz$yBb5MN@o2%8{vJK#hx{%^Z0tEgP$6Lf?`aU z$o%LvGX1vm<1S0~U}xL2dOI6l>e=R>GYex>S?{=4;<Uf=<NL<H-It2KJ^ENN@Xm(< z-+OEx`pd3}ai_JH@O;u)ykD28{^I#aIVQ1oo%A2Sb=0PqCr9@lS6<Pd_pZ|D+xkTp z^SR%cORO?n-_^2t-nFFg<d>iL1UQOsC_HBJWNbT-Ucu8_)cpAH4wbnxzfJKxd(b`9 z_T#S?hHKa>&d*&seZj1Tl-pa`<_Dcyzr1blf!udnPi39qb7py&w`KLBjo)7|R4~;y z9zHo$Bse5^ZamAB%T_a5W_bKQnZR_LH(IJ)h=>2}%i6MU>nCWfd2hA7h}%!|!(@im z<h+`kW3!q<q<@-6$V)yuGAq%V?d|d-+uhUWwn$kwTu(L+jA1R>dUnS;y=&LScvzMi zs}>dUHNO&k{pR4?1Q8YHC^JL7XDt2BN!<$TWBZJEEwb6q{&wMveUCX`S-w0IDRo>( zX1~<-(BDSsFVF8}oxam>jug+q+sYev70M`{J$QU+q5Pcrb*+!%Wq;qT^fz+)_ajIn zUN!Nzk=eBW5+}}9ShDA@@2#KPlxY5HtD)KB*N=4eOCMfoSd;ri{Ak_&oW9+gP1AQu z_FMm{na=Xj>d<59KZjXful#tp`Sx9l{nnRx|IFGIANXt%Q=XqRvysiUGjDARcS~Q- zetNvWwf3gv+L@OXFUA?=merkVlx^C+Icvtl?Ji#D>^cta_?vMi?M~Uo;(ffg!te9; zwJ$qyy86*3mAbRN*(avIsjr!O=8cu=K3l2(Z>-->o6&wCeR&_#=l9DKqIw<+@!0od zm)}o!5Uk<6B)RDHo-E#1&(5@;yAq}7x+sOW(tDwI(!sko%dcjn=0C9VE;h^Id3Es0 zQS)$FnN^09ZD0O7IIk)BoBfiOx!>Z8-=DVEOpa~4mbxJE{J)?4Hydr2|M^?GX1?v; zrC;nf=l%K4!nNVNr_F!XzzOqIt*+h{*zz!K(a-N84F-~a39<Uoy)Ps)b$^)@US<@E zW&Rk}vg`7^s&mJloSU~>ZcE3rx$mdiSVoJ5E|;~geKa#n;X`ZJCAMQa6B1*aHlDJz zS5;K)&O9___QUAl7_Vt<DuEAYZ?<V#dFsSFixrlOI*P1JXUy_3`gY-c#I$2?4CV{H zySDPn2Qw}QPluG`m=J|+T2)uRD3#2faPi1Jsp+v9`FBGVs+R9}xt1o&esRwFr9tbb z7V`T!C;9)f33_RDeBHxb_Kd}kHXc)odf3Oc=j2s}HOnfd6|-E=PL5LaXH!qNx4M77 z_vQ7rsTY>MIc9n|NZNGPz2!R@7W=W5vrOBf^j9Ix$GM)(wNP5l!1Y7O{O4LH5B|$x zDN3?X+o&6}<?r#V9CPtc+e|LW_4tbHJ#M*qov)j`o>pG0^gh<-1%D>|h(1-p^|V7h zJ+?Q|D`|m<=)H$+`qs`N&l=plbfmY$_H;N4-3shhTm5^T_hA9k-#a<8Ustd7pZa#) zjV)7prwJ`J`4pWTHRticm79AuZ{uG(`7mRgzux6l_qM$0*7`g@u6Loww!*cKwr=Nt z{)=&Y_60M`E1TKwH2*wYSt&cCzq7E&chBUmnCwd>w;#M|=1Mo6z3WeL<txUQj~gbe zE)$x%o9EzJ?cX6ML#sD$Q@eTUk?nn{PdRhk9$%UB@ZQ$`zOG$+1<%eXe0J26_1mQ% z9|M2v2>oPbbZv=e_u+7<>j!r*dK>xOZBNWNw!^wzNXPv7dwIRbhnIM4S5=9QSmyTT z;C~CLmpTo}uLYwGzrD1GJ#B5W#(nixrC+c2I>sI_b3L$B@Y&{hkqoaFo!-Ce+P2%q zd>+CFpCnz>5ocU@^N3caTul2r&5Lty-R+$-M`G)`t~ayhGwA#4K4S|=-6FY8(^I=Q zv7oP5?QEx^?M>@l8D7Rps|~*2de8fswJJYve!{iS_qSfSlCx^j?q6#vF7+R@F!5b} z$@B7~D=FW0u-!?2e5bVLy!E5bZQJ>#FHhsq+`#E&A^$z$cl3v^-%lOC(_Ou5@kXyK z-;j;=Dmo><zAgBD^3><P=FE(_|9IrIw%DshtPx~apKaLl!A$H}`(|CgItBOld_Buq zF27h3IBDhbbvwjNo4)<Y7SD)V&DFN{<-Ay>8|=!yMkUIJ?_SyS`^6I(o@7<FB}?A~ zueijLkjwa6qwLI5$$eY}_p1Z%t<Si$>b|k1OrN7QcScm#4Y$MV7AaV%8ot=a&fmyc zDNqr&=rsR}jmwzduv=#CpK<0;o}Sc4&J~JjZM>7Z*O=d}{KC2W;@nk}&rG^@Ei!DY zxS?RqQf<>o2i&Y3XD^MtTm2{b-|Up=cS%gPb3dGx+Ms#Qymn&Rj)m5`rD{&EGliPj zOO55ar8q=AnVRk#E&IrJz2KHGL$+)R=iX`eT>nS;@2^l}`mu3yeAB+LDNRLQzQ<}- zo)+bFRa7=}HM+R4{e^GMH2LE*RNcEPHl5q@&buwTHTl5DE6ab!o^$kAHuLa?WP$&) zuU-7bp~@MuL$}H;`P#)K{uyeA)jiebbL#x|JAdxo`8E3Aq`b_PxC1VPm8_dx{9b2P zW`JzTddIs`mXga^>?HT^W&6x^T&tc}@=aIc<wd7IL`|~%B5;GT&gYnk%B@!$xRzM8 zP4t_f&Zum4xcb_k`CL!lUR-MGd1-yY2JyzpW*HqRzF)q*<|}(Gocwi{Ou6aSYQAX) zGurw7^-Oy2bGN3%-%})U`R|~U&P&()x^u?#=jzae@RvE;x?5+x{-@Knd(nqmtfw}5 z%bM-jA>n6QHQC70dwP2#!-<8a=iUd1KbK9vEwVYhD?2N)_cQ0c$qie2RM@O<={rwS z`TTN%yaK~cMqlRx)3!bnGk%je$9LkPCC7HDetWe=W{G}O{PLAXHJU#*ZZu1epY$mI zy35MW%;tDM#kGGFj$J)yyz+M@Z|yF7{<}H(*MEC<zdQHhOiyY1u5X*wJ5wh~|E&|} zezTGF+k{Sw(4ZsJFIHGfT)$-zzN4j~sej-7qSnW;3_trPyvh5fpznE4e(|f1_wzrL zX8+kEdWyMjf2!TR*iBjD!3A>`><g*eF}cn>mW}WEU5mJ;_~#Fl=fsC4&y>n7{`5%Z z@Q;a2ug~}Xxh1js<BG_M73n8q-<QAsxc*>R)9*#4clvsFY3+T^^d??f{{4gc>mqx2 z&$UY*Uc^=`v1OVNQ`&1ig%zgB>yI@*cs2F6qQrS-mo%xlA5(t3k?4J_@?mN3vF~YH z?tYvQej=KsT~G9+-nGcTiup4uSIjVd=ekwKGiXxHwGFLm#;1=f7w(nH<oDal9&Nnl z@3~dZkL_miTrO<mn-cZv*tahaeMDD8Ubwku?ZLi9OqU-_nii4%b*IFZRDr{H(@mdl z-5GJ=B+DKCxf}nf?{s)uo6pS~Sz^EHf1jVCN96ZJ=hE%F1FPe6HF6hxQlGHE|GRzg zzc20;Mi$kz3&bw`XJBsfV_w$ZD3H7C=4XS8zE^fxHb~mKItcGqHxkSUyt0n9{IbaZ zO3euFH5RH(wxzMf2exg``w}X_e!O2m{rNuD_M;M2D&D$_=3LcEFF(Dgc*?yL^_E-q zUtLvq-L5b{czgDl+9H-@qtxJC!Mp4J+Z;Ahe|6VmcZsF^_66%^9e9#bvtRn2)MdpA zo(~&C{waE1k5`J=_F(?B<&qOimR#JGwkAVxMrYEFvR}DgSy#5dIkLFkZ-&qBYY!S8 zo?W^*{((F5vv+#Z2a8rm*l(~E*<NH}rJ7mP*4cLKT1A`a1uN4Xi(Q;qblUDes4%#7 zb3^mzLLNE&Q~&2_FInW$R=VD0V&wS=DI7mK4Gu0p={=)Vn0wd5-p9=kFYfZwv}#>q zZtgq9#edO7-r)NuY+t9!JxST8=X<e%g}>O>-9W;$H1fOMNtU9_AG3d0<rXNVzns=( ztbXI}j`oeYOePBq*!HA6wv+vFPbzw)%(hc8O&feZs<0i_NZG41b<>vr(^r|_F4Xbd zrZc_c)l83BJKbIG?b;r2mG_JH|Nrm5WG}v8n&S2&LFN3CRhRgqGv%f>9GockEKP;E zbKYLqT7Z5&rRZ-B;jwHJMeaUdm@afxqVLw%qX#2JK5u32woLB`3+FR!KAdo-{qx_< znC#z6_+rIp$h*}%$-Bq#t>u&8o%d5~r|TSuXLIJg#27zovei-DRJ&eV;aMxH9vLsc z@z3q@whjK<)2bAIWNHNS+RrU6Id!8~Li@_IqR_QgPc})upKf>6ZqBZ6%zB=`cYcle zWXPIp{;l5fwOZ7!RN-9x*N0?+40xxedsSTee9v!YFE8I=#y6c|Le-&%cl#W)V6#7G zH#0Kf&!URMf3L`~&JDg;T4^PHRpS`r>#R5I^Zo9cp59XMs<3hTy5(`^!Fu{1EUvcj z@(DA|Jd@I9Qkiimv4~xM(c=Brj~y3oyE<e3u@}dRd?P}-%C(kj=N^3{zVvg6Xqw!j z=KOAr1(&CMSe?9iS#;$Do387XwhD(Ad9jyQZ@ksWF!y=XVH3OJ2Y&?`%w;EtS-2bS zndGfhs+U!jeOW3c>|^`uoo+AI<Xv>U_)cn`&pjje<qPF?BkEYLEBU?^wx~0icEz;3 zw*UBw(#(Zv%JB*Fszm&+KaH6bA+!6n%sEzzQvU^UbGE%QeJd&FX%fR%wPv>6?kOQV zd^f*4x;bO+5B&$R|9D*e?k=rPUm{RC-CuUqyx#^dv{emxiuk_0nsT*+-*ol8y+vN3 zie_i#=3hCuDlIGN?bbe@UAGKZ2I$TeER$iHvG-fgr*mNjyZSy)iJU7`o+4!3<M#Gq z(RATAQZ+FwEH|Bxmb`sl$E_^%#MAf7&TcokP>0>Arpa|Isix;9pI<T~MgMU^<B3lk z9P7f9Wu?wG{m!~Ezw?j1_S+So_MEsEdq+CG`Q)zEf0wRb&$s9qUm9=otgDxLz9#1E z*0^#no8`h4<MO-z!%ErC@s)C13yk`HFf=1-dP;?<hazvfnOjeh*_pU%zj?-Mtfv2A zI=xh@xrX`nqu{=aGAD{m_UkN~Iz`LjbXI+v>zVx$R(mDaYDzz-aQ!KFu%N*_nJamQ zigATl^4h;OvwmClpL?~@|7G+=hIEarWB%b`rMZ(Tera<u?`^x5t)K6<^4NJU!+raX zFUasUax8jz@id#^3Dw<K><-#B7hXA#QGQo2a<`0jm*>8FO|_YqUafbF?2T^yDRhG; z{rkcy#^|*kyJgeYC;KjIu`6}nQ}=Er_Yo~u9*Ol?LLPtrelz~QNm^PqC$g#dQucX& ziS89=FY+F2TiCo#wx;LS_Y4g`pNmztjmeij*Qq?dcXR9Mww^3~Cim@&j#c}#Ej_mC zQlIps13wiWD8G3A;&2B4#Rt;2_@A%zTr%~+Cide=GR;!G3riK$8<!t5>8vbmE461x zIS^%aW0uv2xxK|kJ!+>4FHV-9ejtD9=UW|?A2OcAtbAy*&82v8*z&3e+ZERJhF#$? zPx$^|xp`f5Or5IbjVSpkCoe{oS3C~>AM1N;>B=L^m-`i(76rcGd;RO);_o&)9s3@X znVfoY=YHH8J=0}h&5tT9Q$M49XPetRpR~2S#}-dI?sG4-VYk&E!^2-%eoc`{xo<kv zkF8nyGRI1b|I8YC^ILB(dTwpslW1&rX2T-IV~dU3Za<u)q5B~J)!n|J%HosV-_G8= zcI5Yp-(~l|TJDW){=N3&jhId$|Kv4NGnVm1^<Pcoy5(AZd-9WI5e4&X0~yzz-TZCg zBi3d2g?}!p&h)6#_m5Lsc`!!c^D@t0OT45dWyBb#ZI!sK=5}(%g15(tO<fo8owGT0 z;qNAsORRlYExiMl9oZ~(_|6WUsnh0cwOA~fc`c>RJL}f%n;V?l8l3-{dahU8{PbD~ zf3<wq^;Nc${SBAIE!*cT#1Ny~;pkiWW#8q75;k#`CsTROR_AK&{j+}A+#e>oTlm)f zT<!3C_O}0}d3z5qu-{7GeBa;t_2HTyQ+_*h-1+uzy8he$ujM2EFFba?&ht;NrbD^n z8~t0mrztvFtvmQaS+chN_3X44a*X<Kb4;42H`lzH_3x5MunGHfy(2}(R!Y|S@m+Ii zwVIvbmiS<=qe=48i%wrUr(6-Z9(y(;<@K+3eGzJJKbc4!mN7W_^!Lw_OM5>qJs7W7 z^><S@=ZDKyrh2bG|JI)Ke-8Ib>%DgFGj(~D*DT#A=Xh`KYu0zoo4-00<R84EGC4yx zLwe0>C8p`C4Rx|^cwc@vca}!|KGyxbSyNtL^f;Q>P$Rha!A7=z`L5*!+x;fCp1dLu z9^xSP_<7WU!%OyZOYAl_T9EVBHo_^*ezkPF`MK|Y%cB+h9^BAcnz4CF;6Bz5*;O9# z<`*Zf<!F>z>)w5G!^O@p*UX34kIt~2VpwM;)O&IP&pO_qP?g7io_?F#A~(GCyDPoT zVx_p^?OPdYt9C{UxF^p`nBmfxS6$$DOjRrJscAvV%f!PyF3I=!)ub)67EkqB+uG?S zleDs@JNWoK^IDd&FtH;J2Y!c$nfj+Q_kWwo8s*!b)R$oKTk7izHTy-kxAX6)|FCkd zjQZqvADGWo7sweMkLq{3$+diqUuc1nt;<{2(<M!B=gzzHeerI!4OL}YW_y)XN~S1= zzMOpei;>&M2QHV5?B~QhS+u{e)h%G{<$T_4j_toB3LKYtJx^S6`K0cGmLk8&T?X9` zc1oV#|0Jz$r`jj+<Xs01-1<W=rxva=`exLAT#`qkn{oNZbr;N(b+tIuFRMJb!E8OZ z&?~0>*tG{WE2OVgy7U{rJ-k_KOLeuyZ^8A&vqKVhl$|^%^CtPQvs#_PuGe>*D(~-A z^kcROpDSEEt?=%>p37G*L^f}HvEP2}qnjSdkED*hapP6rv#RmcW!rkuS1S~Z<94ju zoT@y_XkBec<GfAhJdADsU$4&fWqs$(HX+V_`^%r<E`_xlw;q~0dyfChSK`6RA#RNa zcZz><XYWyRJg0S{G|ho$Qs|rAC&QHvpLQ(YyLzUo!o8jqyMD+wJ1lk2yyG{W(|`Ix zSJ$FR0=qLacJ+0C=akoq`j$5TS=Bzt)XA6gzqsvNYjBS5W`ytL#j1xbqzzX^N~%Y! z<CRwRyzQ*hdnayzMV7@b@9JEu$=~m}yx6&N$61!sJe7fo(!Nr!7fbzqXw_f2QJ<ya zjOVd6`itXU|Knc&+$8FOve(~&jh>GJilxsj|CncK`tnRIudHG~)(1Vqm#samYG31) ze2sl~@G;Z*yAoz8>vsH^^+lTT8u$4N*Dowd&7JCR=DL!}#(8P;ECc3AJU5pu6!hfH zDE+YT<C$a1*2?FiO_l}wY~T=8JpAHJ_vzGKtoDJ$6B-45%lAsXHQDBT?!m>``^6_8 z{=bji>8tlE28R?C<`YJCDy!FNFxGU;n{PBlFw1n7^}MDhpUf?_r-T+RfA5_fsdaz0 z%z?W+w--0Bv%1~3=6Aw-O|8bdr#H`E6|77>)BQwk+p8KW_a}cZZ4q0($c14wQ|dW^ zqhDsYe6;7iwQ~K!_nR%O8|Ia!KlO}ybjf7t=DO|dR^d^T`cG%y_~aA&>~cGA8QbHO zDbsmMnCBh*+C6!CoQAmRy3Ywq9M_yRwu;^)Uv^mVkJ!Qe%M#8ie%=xJ)qh)@kNMxe zYqNQ{|8_d+%=Mh2ntV$jBFlRI<g>Th4W>=#cNJR9ak+Z+YN;keN9nC@eQVBV-Ct<y zdei*!-^ZLM*<R~2*#45U;oG1bF=@`r<1!KP^V8>_Iv=`!{WrNo)AyC{{+PL!<!!*_ zsbaph*}*mU_gO8K+UZ#?$EI4vvy!uB{_hQJ|5=ruIVPl>@_lwv)?|%qsd4*^X=%6S zSDF}>ev@lWJNVW6;kTzMwJYCjKUSQV<z_$U^SsFGM=oWv`4=5Y=c@Z7{B8L=lhXy; zkJ)eHF_!!ibxrNozJ<0o;%Yr6A53A?lUx?*;QO+?D!cJJ%c?m&=}guvGFG!b#BYCb zZ2x|Ti!Yh7`R0jQgnFOVtXL+;SZ?wrW65Djx5N30D?jn4@3#Ir<>k8B=R&fRl=c4` zT@sPe^oW1(R_(IWKd%kneqYl5%y(Ob`Quuax<gmzr1kMOp6~s5DWcx$yKbO)dfvhF z%LD!9a>nah-8irMW5uyA4PO$MsJi4EZk)r${pM1zZB&hs2=^<)L(RFSeZlFk3@k45 z-rDNvHNDA%rJDEJv>hQGx)J8jul1OCb6uOD@;pb);6sCZ^Y(_*3*=s;PnADwahjtf z>l5dKSH<gnC;u!q(TnuCRrX3}K8M7V6IYyCvwfuw@h-o#E2HT3b~)}fecP|^_H_;2 z!8Ym8+aopd6Gf)gxwA2yQjO$ST_W-|C;HNb-#JMsl_gbm`~O6-aQ@G^=UDFd*8aQb z*Y<X{co%=)pZ9<N_?7hH_<bA33$p*2MC|?te(CK0x?M;1-|Mx9yZaLU{;pFL`r@Q+ z7wG!n^Y2+-Gv#khsLK-GzF(5PPog?q=0`@4_|fW(hxZ)Za<Ghdn|ZV42i+C@$2M92 zTvZ>;yXT8$px9Z(O&d)`Ju6?lTa>Qxi$8YRX91ny4VG&>MW*dKH2r^_k<Wo8zM|QW zU%x;0k$>;^=luuP75wyV4e>hmqg|uLCbVE}{DbrP=l;B1dUn!forSG&cW<13V9|6s zBj)bG-mi)Y2gI8%{(5p~rTD@hVO5Q9rtU0Vo4|5^o}<r)=mVQ9-mdQIFPeVuljzfw zmEjXTyR%A@cb&L%#+mQId9Ab0ru4@2{%u_G$>f~iInNXSj+cM9ENR<0FDAYruw>N+ zN3)!1({kSjcf=gbI#D2WVDo_qaVFKvH*K-aI3GM)MasGCnD??Czm<+&oezD_J^p=d z#aYS!6Q9({7rZ-G*1XG1&plP4<FtcXaCEZ1=xN6-M|K_h8R)UJ;IEZYUEv~L8F}@Z z`;zngGpD#G?~qD1Iu#fBX2~v|wfo-pE;QM9uJiPxCnxQK_4i0O%U)GrKP~h`H8AK| zMVMss*XPOWT)MBC<l6NeGd1_J$bGLV$p2$s=%dFI0wYeeD_ZtUciH9jJa+aI{cH1& zPB3xZzC?3Q=}eAq+&ct+aqd%Mo+D!9{ObIbNe2}+uex=f>-dbWfG-kLHWi3n{yAy& zw-;$w^8N0nUN|IR6mch{LwB#jpP$Uf@&hIt)_eN=FL<?Ie219m4Bur<uayh?wC0_Q zt<I_9zcF|5foDdMQmYJWI&STkJ#fRLdn3bR+s}XV?zByi&TA}M6|wnXhoOb-jk7oW zcJLnCabT9z^YS0cJv9d&o3IJFhZ!5UEsM6dW0E&%^@*I^tbFo$QsDv#_rj<zp0Uk8 z3Qh?hGw;wp_|v^$-QEC(oRXwzDM>}?Gn%G+?YXwQWPS7NpVzW%w=VVeu-foN>D7#n zD}VN%SKG<F+*d6!kky0D>F3qiU(;+)-`KS6SU_{Rl)X}6+oM%)7G|cIeUNOsdBe{& z;NG+au}xbwq^<WJc)|1RV82vF<94q2drjY@*YNv#+Dae)&-mLv@WbaD=eKEP%~xK$ z_w|h*`x;HvzlU^vHh46l@@3$ahCN?Sx@YG^C*SGG_BP;VSS{{araPI7bJ>IK>sj}Q z+Lb-7E5BBd_qVvlbZc&K@f9lurC09rXY38A559A`By?kHWRBQxwQpW2AG#kZ&+)gt zJSTD2mlf*53|D>TpWV5_Kz7v`72DN6SNlFVwo@^|ioJTin*NvTuRZ!}E-smJc-MN* z4Yo&<W=vl8=$ksvf1_7NKUmJ#Wq$bcZo@T3ceB}!yPvpnnfLs$3r%lDv<-SMs2$ao znk2#-$va(%!}M#`e=VD^;3Myjt~9RcKlZl&h|i&O5AHOTIh@nl^IT_U<j?7|y7nBX z;60}K!^7*bhW*m#bB&MeK54N2Ma-_0|4Xcw^R1e{yX!(?`%#sZ1()SIozEUU&$gY{ zjd^xL@4E^29k(;RY3^C0C%8wR@qfv(oPyTB+H3q5+X)&QJlU7ac)OiD<%N#C(3K@u z`Z8Pf5A^E@)UW)Mu|n8{yX^9=*-pHPwXe47i#OkIcG)2ISjJ?lRoM;uFSDk*PG0x- zN~L(@fw+}f3!+^oKM6MCmcOm9_F`(?cJsytw*0&|yzf~1OeMZOxPSl2|APL6wFR<s zHDB^*E$4~OmpFX%Da-r?bt-M{YQ9sg#4bfhs-@RjJTG5vYc*RVlh-3p?R}GR_O5)_ z2fyZP_q1#5zjj1Sf-Q4PyJ!6|5u@HWrJs}~FSq%K%zoGXwZVMy_akW=%xCB)shCcF z`QW1Fi+cw*JQgTU`ez%VH)-h_`E&n*OK0^@SRd7Yy!l<S;x`Usmy0vc%h)V`AnVGw zoArF~l^3-_GdAtGcba>{rbkB<50sUtI$ZVpevbE;WAFV+siy^fd!vP{u0%RyWo4DE zIV7$U{`X&^j{L#>`s$CTPu_7VXY%rm|0F8!2%pdI{1&kIn{@AO`=;WSh|NhV&lC1H zOfsEw{6a>yvh5WYfAb$d*)F$tZcH(HrG3>TC1=;-wmQ4a533SS?2(Z6yM1upqz6`A zo<7YR!#~(Y{8OELQ8~d%`?GlplSF}Wx=f;Bquj%D{rP^kdkm$oXB+G>eZ_L$Tc|su z<^H;ZWx?;StlHPN-1y;>?Fl<Wf^y%a-O2CVtf88a%lAL_pU=%E<xsZ#nC*?*Buevi zCQsaUWIOXUp3~6<BI(l1dbJYYF8|n-Hm{!L`@D4@uU--EJh}YF$8UE}xcdH&Ox^X` z^Ld7(>75_@4%xM}t%;uS|Gt~l#F^h&PG8tyZt*-JwzvQ8kDrM?(T}$;NeoZfagMoK zs9D?R%q#t+ALl<iHoyDhU-@&>AH6Bp;7_hIn|67jL}k$<-v>uOr$6=9{uARqGgzue zQ^WqKns&3GXI${%(CRdQ$DP^tgBDgz&zp6zY}XTm4<|p$$VeBMEaNJDohdi>Y{8Uc z2}aA(N|aPux5ccSXyGM)g75D4W#4{Tb55y0c`JHy{<OV4%<;07=}b}SkG9*Dh`;!^ z{r&5$QD2_PE3oV59#}7*6<h3Z-QvPlwnfq$iCg@%1Kd>ZzKp!pET&O?vq!8qr)ZVz zuaKP=mv4(z3z+TDbkJw^xvM-piw$?ZX#2gy+}yVLwEv8IJo}~2cYiG8z9su_vHqNP z>*EV|^heG5bhtW;(YNxN?%`Q;j)zJ5-n=(i^7;Hlt9X@jp8fe8rFr#-mDlOQwubK0 z_cH#+ZxEF|@&EbN8Ff<UpIKbWzrXsU&BHZ(Yd<ENw;6ZbGLUjMYb#e*-!c8chlC3A zPe(O99)J5aBe>sD+jo~+@ecc@pPK#+2X@|7slHKFXz3q$bE4=od+Ac1eYT-IYR0~6 zC!I`{>=5kp<R~@SY4`s8gB|92HxqJAo;<7DFDcloX<2MmH>bChZ<%7^L#Me#`AODS z@5izQmQFF-pfk(nh~^Sot|glT{WCYl7m91n4)}CZGw;e?q3j3Ii80!CDxV&l5x?=z zXq&M_-?8g26Qm{wF=|a&^yf;U;UC??E5|l<A2K;-kd~f(Y@g-P9^PKlf2&O=9emcA zzj)%hV>`pwP4E0TYX<v|3;GEb+Rm2MN2WfmPg%C+<>H-R<~2_6Tx8hG#I~Y$6Z`Yc zfn^=HW>`g4^hG|4*&Cs`xOmP73#pCHmfBBq);v|oN;XWN$#(7LjP@3Nzgq7c^B*gE z6N4FN#+<wOY03o?DbKAXhL@M`eR_S%lnYbXb8C-kS{8I^Ua&gdxTMx(cW_kj!~4r` zYI0}ZEh^~iy)PDccv838*NIGW8*Gm5`th>&v~^A7o5^AG-p`bfx_zNS#;r!>&%B#u zfo{uXV(v*B9##%j+WEw(x$DJSgTU=-kIk&qi@y7dKFe0_?aiIu7&pyb>G2JVNpt3# zb1$?1BDdFn&$sopyFOp2J2ThMCgtM1ey-zdKbmnl+VhLn?!4VEZ!e>t#B^l0)YjbT z+JE96e2;arZfEVkmLg=e;zNGAKyb2@)Z+z$Z!4wFFPzjJJlohLurIrQZ<71X<>?31 zUtFI5`E`BT{2989oDvrTy;SBtUVp>7-1l$Xm6Gb6cXo3fe=NJt_JDbXb<=Gg`|4?1 z*RxeCRiEE%7P}}jVDT=-mt65NA|Lij-M@1~UDwh)x!(PmSMdjieg6wwHPn2+8d&&l z>RZ?~>-SsEx79~ugEmw**Rbr&=02<#U$tgUBfr(*nm55$Hg1a1&M$s=zW>bMf@{o2 z`)4g<abNyPb-8u->YHA7s}+Bx|2dUX_Fm9-HrJKk_ikn-@AtOVP`5dJAklL|)Q3VT z@hcPLH9r5fUH$P6bH$<G&i&hEy7Xi=Z+WSCrR2v}{xhr8W<E|@<GrD*E$WQ}r`Lgk zV8)6$1vL^YJ?&?$zF61waLd=vO6G6-_crc~&{!$%d05FHZO(yXa*a2Gr9QD2umxwm zIq+@q#=ns>i<NtYe=a=e6f^f}?7KHSMp4>=0o9M?ZV5YIoww9!4O_V<uh;4+DNo8p z<F5zax>EY`%QL%$s!yKm|9|1$+7~{1ayQIY;&_~2$9kD3m5=eOb%3hj<~wIIUJA|f zeC8i`^+xr955B$0GiET&Q%$z%+VVHk=;fK&UzXowUGSzO(BO|`jQC@_KeHTE-}|)9 zD`Kju<4_i3-LG->#Z&fRCOO8JzR$O?UTMD<Z@BmW9qF6d8Z(kz8U9xXw%nOm!nbc{ zvUh<=^7(^iO!uV^yHD5lbK7+=U-?fl@4VeFZeCYRynFbO#=$z1e~F#jHB&UUpANaK zbw}*+pGh6sIrUn6MYb$^{!e_6{Khn~vF2OSPUAYI%(wX~66FePvU`t-%wKc<lgX|4 zlD#qd>tp2@n-4}b7iD$*zEgkF_PC?)i)#yP1XE-69iMACN{6J^O7@(55a|2di}P3@ z+sSu}qP8#0{xbPmY+SQ3k6*G)$#d7M_v$Ov0!#Prh%@rO_}=b!xFKV)T$J!p7O@FW zC&@=2GB*^>%}7dUd$sehsi{2Mhj{`Y806v=)jX;Te&>tsH=F1E?68~NwV7Xe^r}@O z54f^*Ki+;Ua_-xf^?^ShpZ!r6tQ^g;j(N`Z2OAH5YI)esCX}A8t+M!dSN7afITtEs z-+s=Xw=UgYWbZel1<q$gy>D3+Y+c`J!?OOzo?2r&y9cjrfBbr<^FOU8KdUBq`oTH8 z-=t-{3pSoob*##mdyn^&G!M)5HRr!elyb_Xf3W|au#5er-m*IuVduU#9?#3!eX@5( z!~N#|<yG_S^$vcDm+p_+IALS*lDcna7Hxd*I<dL3@%B-T<jLP}E!(olmi72rPMaz< zJ$sqgYmV$axM5erd+jOT-BzuAePOQdoZ7a}l6U5-AK(08tJHtX^nJSwS+AU})OMS( z`R#`aw%3uCWsfzMHQsPN6SMzN{7&PuOv|E|=5<!7Ju=wl`>aJX{1QVy({p?7|374J zUA<|X6aV1%_cP~BFLwFFUC*(p3u~(`kUp^g&}ZMRhu$Sk^qG9_Xi=7teOe<!`%JZ; zt~yEj$1XnIv6209rcdpQt-BmPh+KN+e!b)x)5h+T)2rqN3(Fio9q)LrtRnqb>9Hzj z+eDMOOC?n5D!;m>GYjqiRq@*3!1CY!(<{?8Hf|MfUVr5Cw@3N4e$TA;9;oxxkGr)& zT#1iE=S4{ClwE?3?=BynaItf{U#6Mws^FI)zx@0??m8G;=6$ee_Tjw~PMBX@FxlDq z&1K7PHSM1{f|{#3{8F|Gih5=K{mNyVcm7u9^0l+`JCD^}dk`W0c*czBE;FYH8T?OA z-^XEDYd5Fc(X%M<SW7}Y+lux%4>b>dXjmM&$7Gt|F>`e>-)Vh*|7Co2S|2ZTDxBBz zG0A6fqx41j7)QN}x$P?&<pXA)Io;-Yl%+X>rPuGFT#x4JmpW{v=8xKKM2+s&tgvWz zyeqZs)q9DhSJ#BjPhWd!@2{v0YbSXX$o6!n|NE)OyzaT&oao?`GueyYeDh@9@^4m9 zzLw=xmcF@0na=5ba}KO(R%EPm+uzcp=o~p`ZeyvpkHqIVPr*wv&jX}fjG~HWB%Jdt zIUhRzXU7wU(=rBGRU2)4DpxE?d!xPP{DQ5km<og5+%FVc#%~&yTJY`m3D4A1Mfdub zo&Rsh`(ba;d+X-8e~$0>-Ljr}$7b2yhZ#MS4SUv|?Y#GV<Lr6o#is0?<Rx1BZAy08 zCb!HYf!>QNJ?+n5^I9`?o2Z5K=|@M54E$$S79A@;zOHJXrt_@c=Q5YB&C@%6>C*Sq z`5s%Bq>Jhqd@yCr3(dZkWxnu@)tRu?Z>!lR{p?&SUZr`*!0&gCigM<9dEfKdJ6=_1 zPb^z6`^uzW=C01U9p{eS>1|q+eenD8k7e>3T`fP^hduta*nI2Vij=5Qi?=Hadw5r^ z*unPWPD0z;l5>0I+dMrPF9%s>_1}>`!j#awr_A=vf%I(!j;>2glVzH%I0H5Y>^c8A zF=my|J|*_kH}oeu+i4l^I&t`k$2<0#wNo{F<X1@YntaSmPpDsc(YDw?b*`|<1`(d^ z3j9XOx~q%x*41QjE1BwOF8+6U&wBCtd(!^z(|>k%eExM=$?kGQT<^c`dtXn@UHZTF z)vlWyflblN7e!CLv&h!!YT+x7!?C_;FHLr}%n&*rJnQjB^Y7X7t#l^)ob;0T9qi#! zq!{>^wQXaT?%HGDL`<)~Nlj6k=~a@OzVcJSkIL{wi>nIL-_4l4>)E=mn~Prj|1a?L zcKf=sdqY2M4QPLG+j!%8&+jKgZXS2j4mhWxZ1-N|gY$WvnNnu{4no$drO!@A_I}R1 z5i9(xCq*G$OhRaNMwkA3vD;q@HkH3*$}+Hd8FSXPJiF(@rfc_RPH8dz)_LT|q{NH! zKVOjkt~C8qdwKhhnf^ch-&v+d`v=SjR1Vp-Y?|7I@)yTkj`MBfs5ug9-@&`c<6yzx zHJ?|S);?SCrg43j&}!3&?FszPb%o4S0xz=vyclD3A))2YUh#~`X&&i@rhk^dW3~>R zJ>~8Vx!xzowq(R#HE)dQtuyn}+Lpb1$u;Nsr)}6*ck3Fi`6N}Db@{}atR~&rFP1mI z+w{#SM{8EeJX_1enqb)vj}x^v%~HGjG{>cz?^4;>vgVY7r6z%A*Gf;z>wPJ=C23Ce zhV{MQWtZJl(7d&6%7qV!Z8qNf{W&s>g{u$FkNtJUJk`r_*NdJNcV{2y{<3>o$-Qka zUhjM<r{G+3^{+*b)UF4PpV*u|4qLH3JD6-VEz~#V-J0#ii;v4@C(e~P-~Xbpa{{}# zLM8vBdp9Tky)$>#Ba8m#^S)`XvKSZ?7(87ZLoys=F8iFmn^6*W_Ir)*ugNb>)o*ma zIG=k>a+1=Fbk9U4#?806HfBzmf9zZXmuuK`rNf6ZC)nK!dc23Nbcyr}t<2Qh3*JSE zKTi3<(jyzexq|<&)rF!o<^OqGWGW^tStwdJ_v~Ideb<b2OA3=@_G$dO_&Dh3E4~+1 zPc4>o=AYEK_IP{n{_D;TrWaLxb~^?>zBS?DirIBxevb2g$<AgeTe30HVxPkwu{G*C z{_1bt{+?Ft_q>$<`^x%hVlv4I{=O}>X4@83y?C`DHgRr`VdnmKi#I)J7v1xvD!qrV z!u!<o>C5Vt9;}l3$1#b0y6dsorOtJHeD2&DyDkTZDcAcSylyPvd~wtB(C4Q&T5>+0 z)XT`rA7^;#UF@S<?=NqbcpA|2>0)H13;SZZPq(rZAAFl%&-#C<XWBHwn(}4yH@xdz zEcM>Auw<T8eeK2HdsHg;8SBy<{Txpp+@9YV75j0$<%6}a<ZkiYUy^FY{O00o&hm47 z26x{d{Lr$UrEKcUduOHNi;v!y`u*~VTK>H0M;<-akqL~v*L%P2yvro{aLZ72zN0sU z*0{EHZ)JP=NN4(~r{2jG+^6nrxWgX6R&0Lw&qo6}|HW?#?n^DUzV3Q>dB4G}-Jea_ ze>)dVe370R>(l&j>&7`B3QNx|4a|Pr#1I^P^qT}*=8x<de~e|0Ud>~AG3o2A1uOS| zk~>_{r~k9_+>s}4=k^}w_3*9VKi}`B%2n2xzG303-^m87m7S6^zjXS6+utT}M9A;@ z?)Y+j)7#R5*XJub#pBNYU#+>AU$W}`-<Lu^Ue9*bHrVcO=};?LyT^p}m#zLOGeMqr zUA_<APprG^y&(I@-6ykd1Q=^PSZIB8`8|&rp7s@1X}-QoPui%T>&t4>SaVU`bnB~y zqWM0HGlaKtxpZhPK3HT`7q&^d@(TOb_q{ik_U%vG8SzZnu<FBYog>w2H@H2nEx7ox zTF_H?>67D`QD<C_9_%klN`Jb``n{RKeT73SY}xvQtNt&1VawAzna}rd*7bnBON5sy z#FnrGO6{EaCD*e(UGCv}=S>XxcR7|hioE1reEG(w8-Zn)pBSk7W~}ktZ5_6_SF2>3 zafbWiZ4c_q+Js_$i<JM1v$#{?b5797Z?fh@1^!tj^-`5z)tbc_f)zz$FGXJ$+@|7S ze26oA<E-L@^yG}*g=THRoV>rUR{AMF4UD{YYN_e6j4i9Uud5wr_x*QzbM2yJKZB`< zcDz=&*Im56vwpq0rewAEn%ygAy=0wda^q~M%Jgf+Hp2Z=L@aOE=j%iqj<lWFc51fy zzlq%TQIC{+_DaS(J?mATdcx1x_kmYt*UZ&!JL2j?7XJLo@iVdI5%=4IZ&Nf5+-mAt z=5(F0Zg=Xr?-NZ_pK(4jmt0x1;N<m)seyks9<byR^_y$-WzzeI`H#Y?eD1H7esTWz zY`#qkU(P(fJZ_~pm*N(a3#z}e0`_c{7iqt=|9;}D;7>26SKn@3^vsjDLw!f-*;wtl zR=1XH+?Csz*lJ=DmQpok@nsEu-?Bdqi6vfQs<ZgYBD&>VSMHy^Te<X`f|>8XY<5fS zSwC(s{A)P>(yeE~`Bpw^ktGFN%GP%WJ@CoeR@9Me7?v6zzU#PS?Mu_O)ygKOi|?0u z%$NNcm-cvLSC^f7@}5^rTQ9U4o2tL>t(|=O{ZErUFMKqcx!%s2J?rr$N3IgS{V$&D z&;7OB)926I{<_Q>CYHSqYGxk0)P4SX>?N%WyFOR%5BD;BrC2ZMHn;V-V${;~UEdp) zEisa~6jzdRZ)*Asx7z#3!F?6EHLr~ICnsH<*M2hQ<-+Sme3xE7=cwD)!|ThoBAqv> zt!(PUz}Vd`il+}=mw6VLsU66Yb3WOi$I)l%#@{wm&i=Hxq`tyv$E2vfofqs9@;Vo8 zR=Tx-`*z&+(izKc7BBYu)KFnpD!)uk>$OYy@^Vk9u1>ChMw>r>T9p4<Qf97~#W&km zU)-t%K8X4DCTAb3{KnFM{k(V8zMb}yIW|nM_lp;{l$>_e;@UOS6Ps)7vtFLxWZiLo z-LVB$NwXv8FDaMWw*SC#sX4PZzGLcc3;ei!dFS4Z>k?SA%6{k?s;cX|NnK6&o;|bi zg>c<Ql~)SEXKgj7O<#2Di1p%Cd~UNv47c~JHx-xhwEFzw%NsGK;8To(2Wu`~`P!+H zYii>8b;-+D6P6x5fAOq^^Vc({vmalbVcKljq?ls!TUq)t%f`={D_kchu85e%#2S2p z<?{)qv@UP`oZ9;7Ja3m(r<`;1Je6VYQeJ2Jr?!Vhaen9Zlsis3KC@XK^faF_<}OI{ zUHLbl=MndZ**bQSx;xE}r6r}_;NWreYh9ZmCAqNp!JN1UjrX#%jg);(MyTCzk1%g! zbPio>*zab%T!uIQ<IC#`_a&b0Iv&fr(}6>h^ZNBV&nz?k>m^@~p0n)US2TS^jT(E% z)qwQ3J<~ZZt++nvw^ir9b+7NgJGGHxhu!7%7Oy@FD5o29@E=n<{50fBgI;sPlFb>s z%aeSVZ*aF1G%Ea7P=0tl>eJ-&3&XaYyQRe_duCPaE}=hJuU=+f?)&kjf8ly=<HqgR ztTtS?l`G0i+R@6;Smt0QvRh)^-xp#}f*lsLo(X^MEwDY|Z0C>6DR(=C#jcptD?IbB zTD4yyI&~-8(@7Omj#RAT+m(|1F6U_S)SL->pU*dE+~>T1^_{QzvodqHGxZ;ykyWrU zq2t(MtEJusMPklZH`x`xf76(Japr{XiL?K-&scEBrB(id!YkH}OwBKzdPZ?e4o(W) zzIAc^g}-?%b{Q|@pD$ti_btwo+lKG>yHCMV`2{-<EN01<_xkxkyCTf_{XcC>7Gtxz zzyG_wz1r2uXdZfUO;XS$FU`Bbx{jZZz3M%k@n`uH8Osfh=RaL*`kZ;^@J;{ccY2Di zn^ftGx>f8}-B;&%N4KKx#GBeW$(mM)smDzv?ls?DYve!mm7CG^pWE9Vo^a-gFFjS` z{57-egKEY8P}lYD=Im#W?OYYMj8mfX)(1_CUm>4z+h1SRv^Cl)W7TiDX!Ep0S(d)O zyL12NMA@G{Epo_IK>F9e^~^_B*nPD)!ehX4Yg$~kySeF|e!CRuSvD+>O2xka+x;!+ z)0Gdg_hM=<UCPdTefa0}hw~3>iweB<`S*YA{O$4e`;-_zuRe77J>QbA^^$@m&5S0U z;m!BegZT7w8&jC7Ug{rzRB=(L>T5=y)V#DCnz_C_A79q|Nn&~OuFC70Q*S`?mqoXv zy2N-k$5%aeo<Gm`mw}g%sor@jpYuXD9!~K!d4DNng7rZQl}g4n3G92~6AHr1gA+L) ze-iw2$5ne$<D^UMI^UTVy=tzVb1;f&Ro7ZwQ=?z^zRT|_S)`S{iShi}z`kQ&A1!fY zUHSH6@B2md|EfM@I!P{7<oy(0{OsiJgNi&`H!54UhWm<TUt$Y7<ZvQ5QRujSlfQh! z38T22wU-yo=DW0&wJ>Z=SJBkAmf0^}7ur|mw|=>O;C%V=9=)trFHY^+5-0L4W6t%1 z*Z5*J>O9oVd$feksYrTCFH8vzENhZ=yLa%q+nTAFTz|43J+JqwxzqdWu7sSZcI!f} zJ(6mVKO8X@I(+Mc%J&CS26z4cWX@2XWx3kh{k>d7**V3+k9N6vr^5AL?A(61V{sze zd5@TAgI#+J&aKs&|7)6LeQ{ez<?@Z|dv~iZEE78-*khXEyl9t3z*^J7{7H7n(n6`z zcP777)1F}?RHSjdEJ7&N@LWOLoF!{dF-Lp37!_sh3A9xDk$5bs=Sxd;={8LZtG74U zecxmUe@u8P9(8xoeKFlF*L?l1wM|^5_Qh_+!49n}M&G^HhXjT#UU}h6bFExMpzCFC zzA)AFjP`48cdxeGon>6t_)v-`(#oqaHZZjGvWV^534XroPx01>XM9=|ahvn-vniaf zu2}f6Rz}Xfb=hp$Qsuu6d##Ua_icC)Ba?Q+Em@xR&C`ZIHHv$j>The5oj)zRU+ncg z*(iONg!V2GZqv=~T=V4qO!IMYx>UL8ZNUDO1*e-Qt~aRqke>JB=+2&F1;+oRdF>UG zd)fo-gr2|5aXp`BDA8@ar0uNZlVf#GbCzXX__pe^iD%cMMIWcW5SlOH@V#o`{F8e> z{!d~4;`Xz2{gq|U>|6E1H!`R^UOCxr|Mbt_Cw}>}=hTzcVKXIS{}mK8E(|`=oO1Hk z^re#3re@poyp|b1TDzh$YW5$sRqSzBZTv&4K5Sm`BSSG>;QWR?Co|qWUe2|6`(cTT zTWo!g?eSn=t1{_9QSOqRLF_Y&rv5%qd8$COS25smNgj93^~vtn_I)z;JpcWYe0xtq zaPK_^vw5uBE>Dq4betuaTHyS#-*fWX&rIk4{XEj$ILYVc!_Z|;iI?<?Fa9nmY1=a+ zQenbpiKpC;T#pql&7SNop8eD%jydbhmvl3aqc^QjH`}playXpW>tMCI$8GNlLus|U z-u3e*u+CaB|Gw$Z{tM|-cFlM6zHqPic!p2*cdi+(ujQ?${`;I^VCXT$JF|yB!T8jT zgF7EwK67T*lE)_|<olhvsQ%z!QI`F>8F${sFUzU^Z_C`%&ERdE&{S-2Y^yPw)!toe z4;q-fdN3!n+{38us`=bs*`mwZx4h&xkJ!>5RXdT<gmufrycO3Qk4o{(K6mMn(QRvY z%QMS)%(6e3wK1HP^3qJW_+imptK)}veObS!VdalARsQR4Wn1(vo-Kb}V1ZG}4l%~x z>8;tVCMS;M@F-uL`+KeZ@|}sC*Q(j2yANEmDEWVxkx{84ZAR?nS8LhabEmk*`h@KK zcbmiTv!%hNXG^BDA6)tU`zJFApZO0j3bWe$+FQapyXV^3zW&&=4rY~|OXOGsf0=A7 z^StxH>)6YLy;I|>cb|#XyM0i?@2(~jgNm~Cq|Ve?S6d>5S10j=KD#ZkW%U!ajhXUC zgMUvBj0-!((%!U@eTj3>9+oTO#jDF4Y`MQM^S*x5AkwuxXY#d8JmIVl_A*R8FL!XO zc>J=BmaNvt=7mn~_ji?z3)<k%#G7$!XJ)b9<iguaFWVosJbt7yaLThACDUuI=X~Y- zd@CiTQuOd=j_1imZ}wjDT3^`xvEcFX_QIXof{MFLlv;0;oK2X)v?^lS+S%Q5c|Dsa ze(DxY5V@Y9+<q-*=GSl07k?PXCPp`Xyq7&!?8@?pXr5VN>DT|ROsLrPatXuQP1ylE zVw&^S-|Xfw*n59*WuTLTv4`-P_q)EYpYApLLH#sGwtl&odo0WTe3w5kzbk6)=0BO= z?rvQ6Z|U5ks`!6v3;P^78E>AyT4B>%$={Zw!jdGjE{>r@|2D^4-_rP^lV{qxX9yQs zeA8zyKc{BD^ety;{*%Zx&tK1wnD19HvF5<mef?~65-cU^`9D<~#Bx1-x28VrntbO* zlU3%&1lQ$vvHVFdl~YSTY?C>|AYLom*XZV(1AljMXGm<aaXEFqA$_WN=(U^Q_nF^v zoo9Mnsq;cmYR2qMkJg_RwT|zyQT!yrv-#ZH#f<LLg}&`N?)G)+a__vC9d|EEnOwL0 zpQO5sQ%QB>*SNEJ@<%v!1iYWY@ix}<e#HLUsV~$G0-i6s7RW96@O0^aafz?L{>9gS zWMcUB{@;DI-(pT0Sre>XpI*JPKZd{Xw@peL!~4gxj;%kb?_sQ#UYP9f8)&h-XQP6h zbcVB=!S>~RH)cI~P}4T2>ZG5u%;YBrGo8ZLSkHSlFMa+d<Mxvi4yMf8w)KI~Ih(Lc zp;GUwQY_o~6Q&=TU_6=ie7jzqe_Qn9$M4?sKPW3q3VA5{-#70|{62}p;?Lvld-wkn zQmy7RJ@o#+Vc@@q1{TND-q<%itQQS3nZ%yWQtxx__M8-}8=CLmggW?KZQR4K)na1v zS?S(m9mXY_JO6S#TDfeIN=6=!uVIO9_ohe7Gv>(jUXtCf)7fdzzv#^I1#UK`7F|hU zNmDFumH6^FFA{zJZ^E$;_uG$^3MhTO{-Wo!ce?bf7u)oLSACI?&z%vHn(*vEkpz$0 z@_*VtqBAztD0CiA+mfEv|L(y3ru*Mdsj~h*pMUJ~oGU%2xr#M?vK6N*v?ZLKxg+)2 zs*u*Jz4NP|eSe$cckpY{9~t4@>B|;R>T{EuVjJBhus^Bl-t_#|gP|sU_fE`{%$M{& zxXtuj(jMR5kJ}mVxhXZt|F_Yw<_VtM_kCT(p_h+XjCyYx+`1>BE5UwJeZ>a8a}Q6Q zEPa^L)n_H5zT;0?jkNI3G@tOdN53+kbAQmDG0CRs&v~wAb55>&$5WpCZsr@i*AC}* zid%I0=jIq+yd52SIs5O0L)DDMFPh|~U7FHMG#k9TZ}mO65!&<Q0;_ZPJUNENMN>nj zD9!pO>AR-oyNg|~{Vcxy`-1}3Pc_jvdf=?Yv15W$cS&uO7N3*Z(64yId<Ng!`4*)w zla2{4I=8;O(O<L2hHd+kDOW4=F0F|RGJod9$hvI)v0R4V$`+H=Cdz1KXztP|HeP$% zYkBc^x0M!amrJQsNwFW>;q2qLleMB?jn<}OvwagE$ey|=!KAnRV1L5DRZp0iPMJS0 zD!x^{Sm4i(cQXG&j@<aleP#AJyW0=$%AD{0ed)(U=>#9kS~v5HbH8R*oqKszCTjkZ zDt4AzukAm~G<r}gzyF$>?ytyymadPCwdYFhUsRlx-();T{IK^1`-N*yY<Q&{p?){u zXUm_7J7QH^EqtHNT>5g&<b6`t_Qxc6ylVY<w8MPE!a|#cCFW()Kdx+#Pd7A^vzL}{ zw^7!c?0C7w&_7FPTSI2%oqK+H*AG1`h<ATweDH85^E$bl1A)>l#k1L`iTvr`xk1hK z#Ip_Oy|;%bex3Ys&gb3ErhLImUfzx_@H=>yxmqfpciEEDzkR&yXZX+EY4?TGK52Q* z-}L=^ElaOetzrDlT+uLh(Xys3yV^T-4a_9GH<U`{%P@VurZvs&^NYg92fHsa>)9>; z^)Rc-BGjbXZCUX`rxKl8(eIf4zDk_GZ0`Bk^{+1}EVDZ)<MWSgbFq%&uSL~&onLD` zkE@uutZv4NInViLo?L36xB22do;=6BraM@lul$|5!r<8i!Nq^8^p<+FMqOR7(5&K3 z?@o={<SaKEm&bk`U3*d^*fW+Jng<rtUrE^2-5ON=tLyukH6lsUPXZ4A*u(7aTmL%c z&Eh}(FAAI6md#qr+&V)-czx%Ek5j%o#feO|j&1sw{n+r($Mi#GhTLtl&uyp;erqPz zwM#a(E&VXhMvv`hW!D_HYWn81bzQG~?>E=2PAjX9-R8S|ud%c4Tfb;q?4%C&GP^pp zdGcN2pI<Qe$MZAay<5}PFZM(B&+>--heb9@-D|fAP5-*(MSzvRaPXVb@ZO@z{nC5F zMPFTc*IL-+Texvu$x8+|-wRbfOJ+;BD@;DJ_{E)7uFgHL6)zl7+grDKlF%Nbr~JX1 z-<kHmDBUbOYtDX|SN#|2wSCttRD8WpDz@RU<%>#r?I-V(%K5q*7AG29T6;2PQ%2B_ z()T>;8EiHL&JTSR@@m?z^vipB+UnfiyXyT~YrfsvUOaAD(t3__CRqueGQZ4t@FPiP zbFiJ%{|{~b$L95ZZCKnf*Ldr(KPEp;><Ul6G5Mp%xvd?VSB*YgmH6-f_}kVXv-Wza zm;R6c?!6TC;p1ZI!0if;Wi~Hid$wxwrfk`BzI`9Xj@6oOTcy&PI&J0LZws?p=D512 zi*7Io<JIvF<;luBR?2a!x?m6caW47$4}YHhv47J<y(+h*SuZT&9z5rek2d)0{dJrF zuQkWtCp~|oT+o!CB)n(ov43ef>z>Tmep1mi$NbaX6*nv6z8XIh{<Hkt=J)^2YkrF9 z_$$kIty4R=O>*O*`iRGG^Zsl-aGvv(gw2W&c59)_i81r0mc4&-?qr1e<H#fX&TO_Z z@JhdZcCOkl8P=Y4_nXUJ$=q7`=WF4oy0m>~&Ru<CDRA}U6_b_~$NFXe%>VE->(A|@ z7WyBaPdo8HyTMem_Ib;X%N6?%t+n_jyT{^lsLmv_l{25M*I7Sv`DQz<_u(7vH)rUb ze0B84^+z|_*}_$O`Wx!k_x=bt8}{r$;nlgJU9aVwOg{=vQaHvEFRtn>J2$PEFUtP8 zu;i0<i#|RNYzTOr{3&so;pcs){U2vB-9IlCkdiZd(n`&91#K$N;zE}PU47oRaz0<b zzh;ElZy%<tzdD^_wniJie_VL*?&$~iRgK>{8TL$I4E*;f_^?CJ<o}+^C)P_{uv@uD z<%x)#R!3#*hh-=G+g$$o&d`W7&2~z0b(3yWstXFLQ}bml__FfR1mDSP9DmLB-<7nS zFYUF|6s|IpV|fyvg;u1Qr&ij_ymLHk>6Pr|=CglJ_VwUdZ!{0yllrdvV7cD$Um8bj zC1n2{n&D;e-{8_JiIql@s+Pgr`+N+}o!joo|MuMh)^q=pmiV6dZqao1*kkvlc2C+j z2>wue`)fk%x{1xs<*9Si+q;)>J{9r0&-5+O^~;ksRo|bwuZw%;dDh=={upx6Pyb5a zr6-5tW1_T$yC1)B(|Kt-c~aqS7M~67hs*x|-&u9}>4`oS@6W-eySwu{9!y%ZZkpW8 z%Kyu=Bwwyvv(CpziJ^S|?3pkBSUl^P<0;5BS%JCWj;rt27m*T@3&R4B-`Nq%v)|11 zaEsZ3-=}?d+e@#n=9FsEVOq7#FF4zFnYzVYsqgnw|7^6K`|@RvcT&upJ?$pe@&&sN zY!CkMSo}w+)Rd`rUM=rS`*eV9F`v+-9+q#@D%W);=JK$_AAhi-^Z2s2zjQs#x3!jZ z+euV6{d#>MH^apI-Br)Csb*7qRfU$OoZEe-U>nnGp+DDU>+W(d*E)4u_VM<G2_E5J zBf7tQxqil=$~?Tw@A5QFg-|)6GA|JqUpxN^L67%ZeG~lQobj;G;igl2IQKi&Hw!a% z-nN|KcWc+#Sf)!_6~Sg3&n#`)%Cha{UA@q=`$B!I^)`e{PgChyzSHdQ)hjbnrr*3G zcxm3!d50c`DlGoqrY>gaJ4xD(P4)0U)sE-_zYjHLS<Ty-cO3YvCH`N?x0N?H_S>}# z3*&=-?|xXPzGiuX_OTn%PWKZtYF+0#uW4Blwdv}DH3oB<Y8um<-`<p7aqvcQf%KIV zq5N;u)^`?p@W0_b=V?_P*J?K9)kJB7%#MuqhBKG!f6sYn!eZF<=w8>$beTzRAtAT> z430I}x4D=mFKjkHDsgYFGHW&8H~XfAzn1?==e+pjjlm`J<NHq6)}Hz2scpTAt^32d zcP~!tao>O4a}wXL1OFGz+xh*{s~RtsMZpJ^OA1_H%Y<A`j4Qudwfy<ZvZ^ZOBRyVj zdn~J)jX#*33{G6>b=6{RR*Lua53|4adQbZI?WgvVJRvvZWv<O9EV>IzeZE=kInjJ0 z^fce;`YzQnTg#tX*El`AW5m*9di0AwJUxBR#I*0xn(DOM!qxek-bmh%ni6~d&rh*G zWx6#vtI9MF7p$A#yKk{nWSH_hzdDKS&eGktRX<G5`u;B<>Ws~+U)z)d()$jit<ck- z`Nk;Y6uZqeFWaVgcS*In`@OqL&o{^F{ZD4kI&-!7%DclwA{U+7_udb2DU{p9)}XF$ zwfoi22_`0$)7~VyR(;VdcTk*pXOi`bZPVu2*OvsJ@sItKeduars_u!!hW8cn4p!-1 zQN9r#E}Su8bBfv8(^03SK8P?Yx87S=^YZ=Og%MXbB-n=UGv{T?(?~1i_;z^e;=R`V z&Ckm(rbI8d-G0G%mb<U7{AxDu?`rEOpR+qP<KAq?GkaeIcC;O6JH2Mjk5tBJ>FtM4 zgqm*MA$QS`MPtf2gHt=N_r{*z7W#PK;hz^S{P<M<;om!d7W4ciVt*dDXIvBKel}t9 z|6OH|_wO~fpY-vYYbO8Emm6CT7Uiu;i`lfNzfJRqNzKKjv)g8yus>$tE~q-;pZaP| z_qCE<_A4s;<uA^h?0BztW!J)u*A%WFi!uGNEYfY`SH*@5xn4u|(hFZREN5&glzElP z7UIvud!y`y@ws%*mD7Bqzntdi-^qV_afI2`E35aUEUhhD)@t_Qv{cNbS5Hr?C+F|_ zryCN!xTBYK?!*i63m4ATjq3M~;k|V4;5C^glb6ipv^{-%-Sf9|7W5d2uRhvwP-Fi~ z9Szfpb&h}2lYM?UCLXhptTtZ8(U$i?M=bZtth`SS8n1fq>~2}^optuho|&(+KjjHY zv$+T6DW3ZKEAdKy!Yu8|Nj=JShVSGP-ZOb^(~3M{vcE2D!kUc_pHwGYR7qXYxyN)} zaKYT>&jLKNKd!aZwcgGWzwH=5%MU%x8`Brqn99uCEt7YXIa(@Ta|ZhYtKa5Vuf9Gi zalhx~oev9xq-$z+{JN?BX7hnlds#kn?N7U*cW|Cmp@ex!nC*l=dHbE_Oys;Pe9Ux5 z-z3{l%ei$<9^4-M^t7{Kxus;ZM7(l@Tg19o*3SZ)@7+8SVl&BbX<KUL=?`aTt~T7m zdfZcJS;(C2?VD9C(*El38Omn3W%kaIF3!vGPFi*BOUvH#F7p!CPA#+lVBZ|<JH@&7 z!+Y}|Z|e_im+rcKd(sVovxyh0OG7I5OP}7nTxRAp$;a;}$!)uP<Ny1FoP+uC3;*~s zoS#&>&i;8qM9=H^W2MF4%$L{k_N@$hKS}6)d~bZPa`cG>)!eUachoiC)_44^8*%JN z-GNzJsq6mOS#DIj7W(|n`naEElPw=^VtF03vm(vTJc)1GlPj;1E`O~kd+)YUQ&RWj zoNcLJ|My#8SsrM9^}0!kz_!h4ho1gFxGweA>Bp-|(oaqK5%XbIY5tTW>IcH?X3w6m zNB5WU)hC<3{d#^)+&u5D|I(G~!+C35|1WIWswe+L{OZ1EkHX!*crjNzW%>8|{^O+& z-_K6ob?j@ZNy0jQ)?Zbx@)l^8pSsLl`ND*~c)Dkg=Cw65zZfSQol;olsO$Tp{6vPz z!le5)5rs*?@5)VNPdW2lGnjL1PET#lmBXo3*UedVvrpGq#oS{%nY!;%&y|%kXG`k7 z*1FnIzSHEx*9q4?3pgA$k$!n);$DtpCrvB9n>Mv8aqHi2-hJ>h$G)(R)kRMiAH2=e z^Fg;sOtjkU)aJsXowxiKPj*k26prS<H;=bXCFDooZsCGv52mQ1j$6{Ae$9dIrmqCm z_TIR)z3ig&(-fc0QnQr5<{sCZyr9PDmS-K0^Q1J}NhXcYjy-<&#B@i6^12Ok9-7}) zg{=i>I<aWYdet9s4UgvV@t)ZkKktQqV%xf}Q-6wmUy$2zsh&H@?CG?4>8H22Zwt3A zpB%oyb<0C#$uiS3m;H@*9#)Oj@69Tj-oMD^t}V-z9>F<%$L7z~v+KWPmK&MCp|6nG zGAHQ#br+t=H=jy>T&S05BWbwAZ@uX^#g9LvdH8osP56>9+xU3g!<!mcKRk)?w_37P zKX=iE^z`q?%*@iH(#0dTissHbcTt1iAp2Ip)rL!%wR3Zu5BFX6NIDaK!nR^hsOwCb z_PFPBTH4HoOK))P)m-i!*pjt8Z^GwWE~-~<Oxt(0lzYXuOd}&dBPAn->Ye>sN_{VW z?O;3naEVfFVD8kXD`jq9w%pN|#MdgBn=$1IONh+5zj<3+{f;j^biDuA?YuLaC!Vui zw)&It^_p<z9eYeB@HtOa(WpB7O)Bg5*6StQuFg^VJFF|*clQhV{Qd3WeDib7?*FbE z+ukNj3sDZPId+iuKn!zyZ~s*PFWa{6ySv(vXVHRcp;OtS6|445QA@tCv8(i>QOD}D zPre4GzIw7Vzo)xo`A*BrCtU@LMOTS0{l4_C+2rs>=@~C~RG7BwKi($Z`zw{<hZ4KV z<>tZ`sjT;(Hr#Rv-n!)c?=CjpDk0XnMY9jGT{Yoep>5PHE3!9LPxBNv%c|Pd&(|q# zYspJ0YrMLa?W^Vz>)n6Ce{DPzXss0AWMcJLVec=^Z0|ok$Lvfa=B&SYqWiFOCztM= zDAsSeO9SVN{$E|h`tL1&rr2p=xq9<w+0RPK+D;|}>}BFzf8O`NU0wE{S4=#7JLN^M zvFB)CP?@U5VY6M#r@drD>8k_Y@<G#`i`o)j&3||yetpXHDJfjPx-^WYFPymT&Mgz` zNxx;=vzD2@R5*Ph^ZZGR3kr{pE&sDv)X<@-N%tBHS47~oiqpN5r0wnIY;SM#d41MP zQ;H*)ecmUH-2YQt5A$&Ub4)%Yv8cIt_dl71jQQ`K%j8(Pc;v3+xy_hma&0HuWv=s+ zOMfmjtg&NvySeL0PV4bYH(6!hOuFCl<w)W&>tidkzw7?GkZHi5^`z)hQsVKdIcwK- z%UAu2;`(#T*20Nn_SZO{FH%<n%Oxf*S(<jSN_j!r&!-Ji=Mx2XFOW$P^zly!Zrrrw zd>EI`Y88909HFPb%?@m3ZhD=#rS)B-aBZP*(lOIGufP+ItBqctk!`7tNR~bN=;H+K z?*R&HKW0kQ-j{m*qBkpD{OY0|j~VtzOT_sdo3_BO@%+K*`X|n>Y_=|)6!U6DQqhxZ zjFWy;zWuQ8tgoZ>>bzU8C0(oDC31(o|Ml(L&1<LDREp-7dnCC}x^iXzi;rt(S3OL+ z$+GL%+X_azTOQlfmc*V<b3Aj1g(r6Mei_GmDo0N)+f|$8rF5g(R=3@TscqG)0uznN zRWC|joSz%xP^o)jexmbA>%XyQEjQ#`I6rxX?3vd+7X`nb=CN0mT=3kkvgCtv)ob=i z4RfTHJbo&f_UYz}OP)e=mM`1Py7&0eCfkG$$1D!mNqo;bV*WfvdwP2EuRNKFA=$Gw zrZF-&2mZ}$snOT7&-Q<L{oFbOo+`=fvh&zuf+k0rop_Nu`DR9?R3+~@mg}CKM!8eo zAJV_L!gZg_#rL^Yrz(P^uRl=uQFvhMO0gS_D_(?pAJ^1wyKHpl+|-9lo=i)8J?Un) zGJjHsUEPTpA7Xm{UOKp+?Yrcw>kq0-js-IGNlsBI`}WW)C34n5t!pV>51un*f4cv2 zCF8Z{lPe3%n);(6))eiw%s;u~yHmNO)_*&*e^Klw6V6TLP5#OFF)_yctM}C{4r@hU z2|i)k&)2Ccbvx0=muG8q<Kw%L>5U0jQy1+}S?U!t@7zwS_tz$0{U%`iP^HbEx1vTO zyQ8gs-or^vwO4KP1fO^>zAH5$;@-k{=R&lXD_7VxnJ#csPMx7Y_2-ovG0*SCS!V>P z%KNrYOFsGgw^P8~NHb5q?5pqdeK%eTPS35pw0A}OzIndqpImJJY-lbqcP(4;+s#S# z&c)Z??BBEf4(qdh)85}R|G8Cj?t1O!-ThqiFRjgSQ`{nv`KwsBu8L_-($$UUTi<Z6 z4S6p2|I_(v{OiL*r_?*wND1uFytLX?za@6|eCKHUU)}e80z>oG`|i(s_0UMTXtLtm zbkV(8Y`$#`)h`m>#BMb+c5Qbv^2l(m=c%&1vg1_CnO_f6)^!}5bmfG~FR|5MpIvY{ zo#!bn<#l0EV4ACCjQPxGD|hmzm0NtwY)M)6{-jFn=S^%+t0#n;J}PZF>3g)eL1Bil zP1nY=$MV{Gi^}&dZRz*CzUrjo9ldoqZy#K4Ety?v@7M14<VElF?F-%%nBDL@c8&j@ zl?1!NLf(&sEF!V;=e3HCy58QOn)%s$<JJzQzSj(%QakRIKi<YZJ>!h~<N3~y3XZnQ zT>P>54Nvu<(<emVTTSbm^i|Pt=d813CN-gtANd+4Jm<a<Z7}EQ`+_A2b6pq9YRPzC zpHY5yuIh?+T^l)bTb~rHSFg%H_H*wljw*er-CO=&x_|gh@6vpQMeb^`)}eXvOG9OB zEFwSrWxlnyaIJ61?Sn^?Ug&ql3-LF<43t>C?z6i$kNd%xG^H{xn=ngf{<&e2H$OTy z2ON$N>nNX@&KJq?_E*T~drB5v8vn&6u&2K$xi+h(*6Y(kgG}4#z{RiH=S6Nl_v^)h z#>#TTb&J+k=gS0z1%Fs1+_{%o@b1%VR@p0p|7<R|ivK^qb=I@+$>}Tk_lmw?{eNS1 zgnjqteDfbgt7DeCZEV~qp(?#&R{K^q`HLUswF*@~4wU}<D5gvMc+IqvF|Vz%xjniw zmS}!eJ7M~SPu*_u>q%dytGr;FeXz<S{$;!4)$87^!LQb+Dr}p#;)9W4X>Rwe*Xg_4 zey=rQEM<Mu&h~WrGowvXuVqc=u74Y7!h873t=*w^e@)%Y(_Xg)IhOyQ8n^fBvgH*U zl#^#2{4Fr&MW_6)_p6v=<;}0eoqzn_oAK%eefF$b0&nVC_E@=^PFeT<yVaF~j*|ti z@A3cbpSg13;U9b4c+_USy?FoNk@UFViF23T@=cH4A8)x@(Z(sE=$&9lbnv2v@T=1{ zee!J77QN<tJ!_Urv5azswTZ?bW2xvM=3wun-`btN6DM3QHOexP3%eQg(8m1VjzjwK zOBnw=|9<47`W+9RhfnTqQ0WZL{`fM2&v9OJX5OVc;^~!Azk}c3n6vc#dWK~7OWHBz z5pK1AS4hcSTh&%?mmLv5e_3yB{q^NC6MpZ$XFNUnz`je#TwnFJ2Yg8hk*s`r*i~Du zr0(6a&v#e1{c#Y9+8ECADrwie-={s!GkN#E*Ir_MXO?mA+_JmvX68%h_AJgicjbT> zW03oL%cUPq#=Ux{X?1_oz1taXwoJDd>M@D(d@z-G=lF~7y8fqtjVVS^(MJ|7a=5*9 z=CLK|+Z~x_&(N20I4!m&v}lSZi$R7k-(k<#kd@2qZ#15}ZX7pz-Rl~$$0yt`etf*} zb*7rZVPEFt?|xHXZs^Q?>X|UBW+uy=-o+AL?c6DAR^O02-12J@A486Q|CBGQ7!?<v zcE0^Q?BPzf;`2ZH>bC9MQ*+=~<pRYMzJKFh|GoEalG>A1a_dc|6a{}N&MrSKt*#zl za(3R@g#lU5Elg_S!=9`yYWm1DUApEz)BUN9a_lzd&HvuKXP236=PzYCW6F{AuD0G) z`PKTN^Lu73Zoa19ajPWuyYdI$+ADJsXE$4P{_D&BVaYe8^`7JRTUMd_=QrAYRhe`> zzIR{F>-SM7erIYPjA^=A_svN8@2{`L$(oaPKD#R+VDK*eCr7~7``Vc&Z#b7KiF%%2 z^!;w~eUWJ!;_7#^yC0u3<&>gq#areT3)k~{3T7-lt#NImI&X=<Nv4P+>sAXVO(<hn zE%!jvW93Qj6`PwbEqO9acTRd!3IDpS6YY9Lr++D&vgP}6zMm^ju=8Af7|cH50^2W> z=K4_i&H2YRTfAndmljF<+x2a$b6WFO&s9b~yZSFqsS0KL%9B|*bBg-Xq$B?>?-6R+ z%W^)pL2Pf|EwzR-4G#q-m)IOE&G~WV$HT}{s~+!b`}ePZ6}nD)&h-So$F*iW%d0Nv zHC8J}y|UB0Ha+Cel-j8Zvc318H)u{&+h}Mn=Xo-7*{&;22_cpy%skD8|2}yIU%dHt zE~muo;(1JN6(Op6t*nzxpDoGwVk2?;-i`U9VLNorz3QFPbouOz`@0@K%zJWHBK?Qr zDwW?F$DaPo^vQlNy!ZOj;tyqkMaPqy_bc64{HfGzow(=qzQ0FT7%xk?k@F|w$%^wD z$)CR_esDHTx3fOH{@_=!3X@k8Z}LwsVP=eR|MKfbRqXwee;c*tsw-99ol>de%8>i| z{e`HblRm2`-10eGe(G(oQ|RNRFYCWXvW4y~DQSD~`rp16zt_vH4*NU*#Q{g%y%Rs3 zvv`qyb@e%yKd0{p{(YIjX!$7J_*+q7(3ar&7jB*3e>$br-`w&2>{_d!Iq@RVmnY1# zit>KPyNNSU^0)Igwky{}?8WbDH!N7-`{crs=ueK$<(5_*4~|`HvavGr$WPfVwe{M9 zH^)A5NOf^YPMXulDH_K1+s2|_OzOj;Oy&*WYu+vrPu^wm=iQp!JdB%7z09`B7u=E# zUjCy_N9%_^`^oZ_mbm$sR-YHoUHSTO#oN=jF5i%Mlbd72`ulp%U#SS`f;qX|)2bie zy7-}gGuQ9R)=K_cCzs5>+j}QA_-yN={OHHubx)jJ+02u)$6laPNTA?;bERQY=t3{? zT)Xd*YqCT8uPfG-c&SSje2;ZaH_1GA?tjDEvpdf_seE7i@o(+pE&O+sCQqtQvpb$0 z!BJ<mTU=S5H~W^u5q^umn!n`IKV)yXvt)Kvo5qCM|7%_>zI3$q)-kzShPsQhcrzv! zuRplKG-&0PYaSB$`+JW}$q4MMp1Q2?vV+C^gl~CzJ0;)rhBSZN%~LSzWaR%6`-nqV z-$Wg{Yo+m2=WOD7p6Z8zO{X8siM?oVKd<+<d%?N2(z`9%Rr5Aa);l)$LA~5T{pyF? zXBY33Wbe%Nu2{jTGuO-3^r-Y+2~T&8W0%gHSmwOz+Yih4tfzioGq1Yx%;1E`YQ;+5 zBD=?@&OF#4$A7ga<WcL-iPqK{zt~ix@7shiCZF7L@DZ!p7srn)7};&6ANr(mBX7>} z#`{GdW{W?&_9Kw(7@K?XwP`oH<rbCP(pY|~c;%9dk<X4LOZ==l5R*{J(w(V%Z`O<F zubum@{7k!Y@rHLY+cV)QGH)bymNc;BPAzK9KPu5}SSjzLR%x__msd(Jc*YL_hUvy< ziWluQ{U-H9^qj<7Ci}FDQ~HmpY!?VPKjWZUvgFl<UeDgRo6Vafp6~Qzj&JV2yW?A~ z!>bTyd1mL*5|2xh^7!6Pc$oDh;dZnBj+lwXU(P%~Fp2GARHLn7SZcO=>xx-1yLv*; zA6tE8e@~n*|Dn~pLWA#4lb#y){mCLW^~-KYex;wAe#|Ok_jR+_$&dA>KR4-)vzedr zU~^mB;>QL`tahxAb-ez&H*T_azG`joRN>w#wwq^Hyg#<RULxLVt@VY{*=djOggg&A zu;<{nc!AjrJDNTxd-up2xIHy``9}J9OXUW>sb8lbyZ?{<&nNGs|HA)%&j0ZC@Xy=p z{j8)XmYz7qc6zUoc>0{4s;PdJ1|QOsE7`s;chHmU?aZBG{Hwszt?l^b8Qurj&aY9N zAG_dtMDOQ?B2)kR_H-7VIGudJ!pY&+48^oYt=Zn+e<$se-M!J*XsWb#L1wR__2kZH zf4?LgwYZwsmU>rpXQX-E#mz>`5?=f4-y*ToDyBJCXlYs5WA<9<s<+4XO4OAsNMjdM zcAbzO9_6z_aCgLpoo(~q6j*f{ZeDxqU9a{0s6Q4gT2sX;GWXaD-M(2NRih(d@AAB6 ztJBRnl_8I#CkIX{+$E7|)W^Hcb<Gs<*=J{O`<p-6&^M_f*Ls74+|y*27k@3B^iQrm zv{EX&+1hBfRld=OyA3<}?^{IVS(UGzrlNV$dZo$T<2#QBOjQ#oJo;0k;Fbt?#h(3K zrdvEOt&=gB(`&Kv-x`13`+?HlnLX{sXD5jrc^$Xo+)>3XE4OccVjcLU#&`0@=*NM* zmsf=>coijfqx!(T8TzaKE*JQ$aPHt|HH8-zPgn!pa}Nj?$UZcY+IFJRo-agw*T%R< zM-v32Gt5-gLM~4$;h&++GrQ`d?$_rwCry4vq;6U{Bl4%;Rp&K~(mrvnEZd_Wf9#$l z*2i@G*^#uK_U_sX3AQW-HFH@`$Z*Q}pVa5jU3-de`IX{h6D^aw52XG6;+45u$v=DR zygm_|;KS<a91>ln4^C#}x5XX_ik?4d>DKE7ciW$eJL^m5RDb_8>xaybQ;cS8E5CET z4ak4SVes8k>e*I}#rr}U9oC;X_Ts^%jR&sZk}zJfd87Za&o8AmO*Z+Foi5XM%iM@* z;k^HHJp9T33fiilZfLR<e#~Zl@PAxW{C(~jlda#rC^0-HeZzJ3qtBiVcLk3H%}F<V zBsNKH+k!XeqUM(H_u0-+-!aG9dr^Mw;^sN0jlbUWJZ<{gQ|<VwI#HG#Tjgwb+t1x4 z5#RP8<KxLmcCCel7P_xWFLBhf?lF~^?sB{NJMX-$6Ti!ua@0(5vG!T1Qk=Xi^qmLW z)b8%7)~mMVa#YNI-mGuD<>pDwd9y!%SN(W@b<HxHp0^Cu`8wW-yAG_c_pbSQcct!* zInr;hM9lsu|KHGXiHqOCO`4U<{dynwD`@bD?Xc|oTq9?*+x%vwp`Q8kU#dU8PCxe4 z`>B1wEq;r&_s&X5%LE*%46B%S?5hk<_({_{soTtFiRItt{v$qBF?8RQBc-NZ9&(r5 z5;C7Gzqsv4eEY}KAs=r>mQ_q^dCSiESo@f+rMmr%d%~|TuT*`wa-zF>P_n#gu~E6? z`>@6D-U=T{6XKrbXqpzw8!uh?Hps6$=|w~G{N?R3UMW^neoTnr`Qm2&)b`h*#jQM> zgiXRHi+=gH$9u`y61Ir%sRmCDPnlGD?AiHB+qkngv)8>(V37TA=Krov&R@%(x&C*T z-hVBw{zYp9$Hk1h3|i3v#pX|5=dIYe_{h5?9+yiD2C7y|{qNsDKey{zi9_{r#aj!U zHm{#>UG2!xElam*M(~^Ne4Mi;_`}3G4+U?i{c_#0rK*(w&tfB9Hu1}Bn=i8|JGH*Z z*uv_STl9L(qO?^0dwk83Nn6f;X<)J0f8f*Mir?3EtnGb0y}|pDMbEZX4~}v6-Q1Bn zv-oc*`@L4Cn+Z1BHc<=zMoQe7v99ye?A13aE-Xvf-Dtbu-_;rO+$4Levw5-$*7f-o z>F0_+w(459iT%y`7e`jTt=%JVi>>Va-zuivmJ_c!Jl9;Y_@hS`v*+xIyJvrkO0?M` zxn|)F$8`c0w-b4~jqT=cl#pLr6tA_lT-)yA_S5Sf9j`xMacO0O(N=}*YV(-6GbU}T zZGSAirQYn4z1Gbmmk!KT>@IVjBwd=-nBQBKVLfAVU1qVzyB&wkRJF1sj;Hys?4NS# zvgr9RyQV6UW5tKgRS7<RY$~gg#lHMikVWcYz0PNy|Nrha)MGWbm@oZx(hv2SiVeX@ z^XL3pv*>*v+u5HLCe!+-{+#o(Dv;;u$BQcp1O8v>x+A=WbJ|Ty{$Am8yHme)XNcro zYL<=svfAd0Z}H^7vj#7#LwNWM(-&pF_M9#^<<jT#)q;h;%reb#N?fJBUTK>nAglLP zaTSMx$K1Wa&LKaiTW{mvBc|=N(72)~D@(?=_sXu&Z9-Qrp4@Ew?1-lP8TaHE>3a*@ zf_xrz%cUO7oSPZX_vU`ttB{I6E1vx4diUOVx%;ylDSRa<xv#v0AN@JKz_Cu=h1=KJ zz1rLUiTj5&y$1^|wy8bacv0=IpELKiTX!#R-op^F^-Z;0qbP6U_7t1_r)3JbXOzv5 zGq^7!?fN;nVb{go3cOb?_t}NFnXnm}{?YE)`7x&FJHKhn;ROqmWfXXO3%R~=-Ol=P z`J~_*F`M}dO?ZthGOg`Qc#YO(Rcx3Xv%G)d#kK`9oc1y8LCa5HtJ@#{<^QK$>%Upq z|LB?0QWqi-@x7~}(eGxnP57s!lk#18-P_h$Je`;+-)ShMF7;Sp`Wxm1<3%rQ<(?&2 zXbK+nJ^v*t(IWK3uKwi<3;y0d^uOlN?|R=WxsRkBt$MbY1s%A3bLU?^!&aI5-5>W@ zzpoFADqLo17%wy}aW>1b8&SX6j-Ftiv)|(K`VU{Z|9rLm__2J2|Bt_Cch-5nS@`Db zUY7pq$3Iu>No8z#b1O%G_Q$vDU4AZ<IB|P+@to4UGapW_>2!8>^qf?+l=T>A-<2Q5 z**)(MRu-+}o4zt}@y8Pzd>vzZzfGC8d6&<oPh9=y{(Z1pvPJE_@M)tRzRl<MJ<dzI zVDd6ke*dA*jBl%z*CxGoZQ8_=$sfcn`rOmu$-`rDbGI`cj-35#@#~)F<{u`vJ$}Aw z?c0cjcckxVmxa{*uTA*rnl2Y?z~_7WVAmwwLz%8d9Nt-Ko71oPI`~_c#D9v)_%3?f z<7DCl&kxaMZEG5{E8om9vy0T5Ui|2a(8jC_K794n#k|t(4AU~)Vi(j1OIV#th<~zL zpf>xn(}ic7Z?GKadK&#-cG8!(TkQVKwsHLAyk@tlO7Dh^o6X89=L9Ug`&7~CM1u}* zfZC4anm-(Ei%fX!70P-4WllKrXl7IC^_dYbHnsCiOuhH)MNH=1Ejp{(?%Ft1XJzC| zFG;GgJowvpV&=1BSJpqgtGFqsz^|Nf!*gw);0<?sD+{lA*2d3E{H2u{Wc}o|(CUwO zw(eNTers20Wn1Y1)4h&o_TGP+;CD&ejq_?bA8*0ob&NK=Q591>XWvd1{W1TrMA}|< z#|g!c_iy|xuew=$FTZNar|W$QF~03S9lq0wzDyBmHm~^8ut!^|@Q-i$l9Ijib*&^N z&&f*fnVMiF#V_P8xcckcw48j$nyEKqG=I&#cdRW|>-3c$*#!!Pb}xIj^X++b@M7_O zZ}u0@G&!c%hrY^W-zxQbl~r+wp_2dIFCPtbS7n{Q-mO;8@|vf^#Q8VZ`NK2BCCohp z--IXEc3l+o-<YBQJYin*Qnh#IeRf;_|9AZ0$LPoZ#6FZizkNUP=lb4<n*M7n({qaa zCSTlVbz8slw64T`uH$QTSBfr>%r>;Mxv}SySnccH;(0w)P4y|sE()h-^!{FEd2H6S zn3E5ZTmH^>jFM6}e|9orlTTc<#N`=3K6Ovb>s@<jJAd-8v^n<~`9E>`g?DIfl<)oh ze_H?9T)uhnM@qarADsHh_ItnP+ZP|1k5zxj&aT<tW$NAdygv0>{-+s|>gf`_wT)3% zxNkEQp1X3ZgJ0R_*uy_;-`frUtemp6u<3cY#6OO@ztK;pub(<gt1jj1<nGOD{5Bpj zG3WDXIL|R%-*?%yt2^{NA3wAat1O)<`MKV>Ejsn+)66Z>)88A+nfpER!J8k4f7F`& z`?L1bKC>k5e>0lx>sH=5KeJx$SQY=XdX}ZB(++F0d_FnjU+t4R|1<r^mYTfDez-nX z(`H}i+tR%UqK(3&&L6x{*LwN(4afJ#W}Yf6-}m44VY?y!)S@CurShtJ6I~Z2OLnjD z4ENwHw!0U0o;p%(8PZ*ptzy1z@*i2R=|_46KfR6k{b<q2^DP^_o%#=SA1EtV@z0;N z_~os?1}B9z4&F#z*eY)E=hGYRjP()uzo$&udSQ;={XhR>e(kqmu-kv5y>`35z=Np^ z<>tEmwGw!|)Uf0Fg>_A`o^7=XSvi@F4=s##FH#n{xc#G_e1ek3i8XBoj|6x(mKpa? zvEHj$a)aGt{*Qp<+K3I&_h<DKNQ%^lIWu3c<j5-O>g>x8-7+!BkuzMb%sk-ZGHF9T zsXlGlI|Z_Aua}({7tX1-xO{C#Yli&#GY`X>wp(VTFHAq5U$90`zFFwX){A`&cUGi7 ze$wfEF2}cO;x@KsN9i7Z?pHj^^KKPiNifM(xhu$=bR{vI&y-!P>PBB)knsB7cg!`` zvMC?id8l-qPxBV-w-YVr&XGE`&{wdB?W?a^?K%HbQ^PObo+tf-eg5nCmn(QDY2;nY z+`lro`bEjitj4W=dpFMiwf*$YiFMgJ`Mvqde<J4ma6eRMQTcMqoMmrf+^tqmdw9aH z`0<8-J%Q}oI6kcEx%GU?3dx`sGw*mCi0*tnJxgcWjJ8uYPLfMXf5$an4x1T#bn?do z7Ryw&9oLh3pLI+>IO)U$^&6Qw)sOj|)~$M1BjU>AmYw7Np*CBl`a^x4?TpVS+#W?L zTx;GH9{BIBg!to<LO;2bSq<jQ-dQ|%7Mz_sEB|6~M6Z$b^E+Fk);3q(eRKMkDQC~M zmv#C-S+AM%95q>xW;^*yTXN2&lWVs&vmZF=5*j}t+IZQGrMKi+b#^VBz?Ea&^EV?W zdhyz=)uj@jCs>>{;yWGYx%H&P`jbz0UaPaedm@zilEAsDo0WO?8P$)<c=i}hTJ~Z~ z+D4UcDj{VjvdXewMm^M-KT+(~H-A}^Un`7QyaauGKc*%cE!|z;5_UIFW}(&fvfL?a z_;>E}TvRmc_p^cknY$PG+jFm8dt>4}`(a$uF1G!qxqFg0f-e33F7e>!n>X#n53XN( z`StGKs=`Y`MS6M1$}$e9$K868Q1JZpg`0e)H_QS*pS$|>>4dpcq|7>=7T)0I5L>;# z_|gN>lTtOW_Q%h@Je~78_lnAke}kLuICA+PoFUSl`Tp3i+yswF(ze=r_M88!F7%sz zswB(ij%NF2m-F9qC)w)C$9|vFlhk%mV$-~fZ>Ij#@cEzp^l#puAM;MUXTCP4$n@69 znTK|$Jl?~8eyib`WyTML_E=9jd-9>x7j6-Au{mqaj@{yTJ+alkXP4E}_jl`6BoBx0 z-Tj;S+Sb5p3*Ipbo>_jxL^|25EM)mS3A6N>%XgZ6$}~C_$X5UNN87wvffv4=mwMuR z{<SiD-DJc2C!2o?1pLYMlSzCND*bW&$r*mU-nH5FFV65J*!O58nW?^>@<l82Owdt< z9akP~%HaN=bMRvONlWY5j(a<{8k(InJ#|fDmgefpFfZpWyD!%soK>BBQ@(2HA=Y0a z?Y|d1>D_+x$6MPS(HGVovr!Ja_$zpk(6z09LZ`e<eDP*l_p6J6bB<qLai48jwQBAp zi@h@q|L7X`7`>~p(SE*q;wC8(`3E&+(-tghoCRA8aPh~B!_RL%yz?MgTw2em`N%}Z z>6)2E7cZS&*nGm)uC}G(OK)lVf!^4*bTwt;{p`!TQ~ax0qk9i-xvS?X{psO!H@RJT z^_L$U6P$C_v(|yP{jH8eYP90p0zT!rDzcmMPV5lPoy7NkW5<aNZ@%jNzEvyM*KqEU zOq|c|gBqUEpBElTE!`$~YQ?e5U;g!6{4k~9!E5Ol^}vho+j}PF*B*SVcJjb2-#L5d z#~VpxGReih5%iyQIYOfN{I!2mrn}xZSnhY$*5rx%`lm8~zq>!UURN^fJBvH_r`VIM z*P}l?jk4sO>awV{p6}Jp%+vSV>iC}NWo9n=c3p{6LT<_IR}XHnESqO_^}6+HrLG!{ zMXcw!K35Ab)>rL&Qxn_NzvSPaqcs-wE9X4xdb&*F#QLd4D|y;CukGA+>dE$&hy_<m zYWG~;)6ccEwDZb6#^}p!mt&1K&5>5^sTEY%GILtU$rQWox}P@B<gbj^S$5*i#**d# zF8!D{H@&D$_W|=Uc~NiPn2i$-^E_^U%%5!gpuU!W-~X+~;uX?H!A8f53x2LGJag{L z*1)>_Ex`u8Q}6cvo@OzxbN%Ylu9}4Sqj|T()NL2;VgEY2(Dv|$(7q4fMbF9Qs3+SW z(RrvG!MFIyv7c-AOSjM1^qF;@-m?4G&uTa)na?b{rhhQm?40$S;>COi+bwq={%)BV zX1QC;^7dZMXZh`43)uLlX;$oisbCvE<JZn$gI5wc`&p+4tk;QLm-#{eSjMrM&?65& z^ZhnH!5y>g-`06{rCT59n%|P2T5`2$>ASx7oi|LE9B160cJaq`hl__q&&hM%j_qzc zYAKei+57yOhjh>TbNS|yDrVj17)tfJKkFV$4!v^k|3=H>?jJm+RyE%e`g*u?_q?}T z4=t9OzP#?drgTr|9xcWv72KXe*^8n!M5UH&Oky+dlfP*CeFOieIh!}zo!^(mX6+aC z#Ye(<WzWsZedoT;I}sW-S2kCq`NnJ^X_fiL9d5Ia#`t^kEV*QE_iUDT)Qjg^4Gzs- zV$CPA_==a~OS{i2LgtF?`d4^D{qQD}zq&7T{PhH;>FJ+PQ*(UH!#Mr-zvnXk^B>16 z9Ncfj`04z)CjZ_8>a`F4|8KW?<Z$HtS-ZOe3lGnjca^s)o#TkNUVvhG0K*HmW`WSC zw=z=KvMZKHb-0~Mn7`|QSWVj2zRd@{nYZt4i+<@E<bJ+iH)YY))j4Zpoi6P9*!QwP zL+?pP^ZY7a@xPkwf!`L09*{~qcF8wRZTinJ*||^G9V_+-*z`|o*2eV*H?88FkT|1l z#`!tV=9%A|^-y<5?lJ!GGq-9=Y>Ujgy4TH?exk$HXsTR(AnCt&?i22yxN^z86;3;k ztowcW&(nD_TdEJwkDb%D>6X8`?1S7FUy|C3E(w&2Y>0I$3M);p4b%AkAjZm9?V!!= z<#yULdG^K4e(<lOHm&P<%6vBu%}~ANhhA<mzAN?m?2psEzxDn8Otq|)-=XK}Gx=Y7 zy9%45spu(X)<TcNq8GQ+W*TLG>hQPZl1*6Ia>t(c+MAxOllXUDo;D}KUvJlssD&n* ztWB%$yRoc&VLmf$vd&U_>r#VPftI!<6OK)}v1zk@@8PD>A{*YAc3H1P)5VpK-d(DV z?AY|(?9luD;cbjr#TF(xpF4M+uy;1hkxh6lz30W;0EGm#Sq>6U_hxrwUz1+WXTcRw zanZ)P@@Oo(xA~P%f4}~FZO6k}b8$lN$`68BK|FT7TdqvKG`F{TYZz0ZZTp-V%a2r= z9edZ#xJc>UZnL)+x91z}<_ao2R=R|jiF4cHjXO6@GOn3*<e>lAgx9<?G9%A4NF93h zcc#{{Zx5NYR&6<Wc-{QUmW^V(UYd=w4@}lQ?r-K@zb|^KNm7Q9<LAJ>^CrpbFFEva z9=kZ@$n-5g>v?NlFI!mcx54M&ClLngQm<!min0gtm|XeoK3_fCbm{X^-OrJi^)`Qf z(x&E+!V$DXW^?xpqm?He)|*|edRY0(Hr{8E__6f7zgw^E-E@7!s<^rHLpCS)74_Wn zxp`rmWoGfMhdn!ux9!;|UocO5`)#MaX7hU1yjRY4%UP=WAlkuj*~(xu-v>d??a8Z; z?UVXlu56Qd^5o>gol<o|FRreV`to*V`ome$b#2E}3Jf=yH<qqW?(W`c#Qr<)$1;mk z$=O$AKV>E8z5T_T^ycTY?yTIG-_3U$&x!e3C~#Sg_wN~t$n#H^{r34F>HEC)MWv+c zwkxGCWqCaqmv5d}_tI#Gv%}91x)$@Fdepl-FfsDfWRg2&HIGMTo9~pO>|b({rqh<X z)Ni|z^Xhkd&t11Ed*75?PjRXDVdA}ZRf9i0$AC8}aLr$h3|RyDSmvyabz!O{{^dsn z^Wx_emONWk;V(ByHR75j&#h(Qm$#mae1FEKk+(OQ!>jO>;<0ne>bD|a+Gf6g@bp2} zmg2=RF-CfOo*($$!u3Slfah-FUUk(I?Ta>d8BJL-@7Qj}h2M|1M6&N&e1HBT#WQ!d ze9YhAzF4NWm{;#=g<5)XJKrpy+R5>oq@p$_tY5?+ZuNN8O8+d^WxEoyX4PK0V$oK} z#ap9q{=dNP^WEH6e{a6t!}ql<`o-Vs#yitYeA*|ZU!8h|_p{TL-<P%&-1xmH$%OIS z^x5YcONBQWM85C0>fLiCJa5+}j#=3g>So67<zZdC@?$RVOkX*VX9;_Gxom@%mL7iL zVCPqou<QlT`lZdU=5E_xD*NH=L)|9x?4H0*-vuAG&8#}`<(2XmKeu!Zk6SB#@6A6r zeR2<Xxy!+88!pUm)cWbgtFXH6_{|$;?enI5zVz#v{G?sa0;TU~YaHJ@&E?yJ627`6 z4+4*z+o2~l@7C+*JJ*%EZd{#u*+^sIbA$8`ic^%PZV{cXxS?v_i}dZYdGc?wRBNoS zu{bhs!-ePG&if;0pX*&~*`M|#mSNSoCkZmEYkJ>xwdL^M>z0U|u0OM|#BcgB{rx&J z@pGRQ%xdudFry)B%d0mIbEVSfEYALF%fy|&GKqal?DgMfEdN5Jj#oA8d0e8OT{10{ zcUh#*JT9C01-F}a&MsK5>#^I=zIU3l?d_B)lmD>#h1Lbm(^j=yZF!sTdDuy18=rS? znRoGj=07Vmap74e-JI*2m9DKethsn|+gpP*b2DvMeU~VD{4BQ5;_$oPk}r&glF{a3 zbIdLD4gMGh&i9iPdU$Nx@8vzWC+!jJTmJf9_V#vh^|xMgZkolOms)h@d4TTD++*7v zO_#d{@E;Z{Fg+I1zDa7I#b?e>p=ahF{k8kDZ188%dCC#}9&*f=*ru<J;D~NKZhrCQ z;fFK6G%S}ovfyZv->>h@>}Id4)^oNwKbxIf{^vs5zG>IKewox#@$%TFi!(PmPhkHV zc=7qulog6*U*|t{aBE#y_4cpSh3U`kwST*2(w+2adO>*A)X47(xEmkmeaqyyv8%97 z`_`M?rH9Y0s*0^%|Miz;<GaY$Xa0rjf46+T`p%y<pY<2-6?ZzI9&{n|r+$BfolW%p z4bkP&K6BSS`1^ayh4xKpTcmi}*-ZWI1-o+di<r#}%4_ZazqGn{;izIs<MmYwU%V;m zw2u;49d@ZWsD!8a<DG{F7k^AX`Q%|oLUglsE%OXPnfX1n(=!A56w>}LiCOl}=c<=7 z<4LL95~XZr`w-Fg?~8JdXI^H@^LL9}prdCS@NV6i*x>({()>B+t=xFs&9Z5`#~pWB z2azS#=L%9JtDZcWlQ!M#W5Yr>`C|`mJidJNTFi=nGFclADNN#<JZVX&Wy8}9oBfRb zxed!#1_e*h_uI`VE_zAE(c7qGQM$SMm)|<GdjdX*%|Cx|r_^NCODo#UT;>1RJr!TH za{IO9N1I9~OSs(CWq-+Dv!?U%(TW<&iWu(K*WLaWKH6jTHTA*e#{MYPza2N9_Qi^< z6n8(onrm%%?%u5BKW;QU(O#jMaiCFn>%{BJd@n~Y<Lmq`@3v1o&v(ih`Ls8#QU9{J z&P~4X|JD@=-_0A%p6?1@cQ2yOyN3VqL%*K3)Z^_gl_3#QTNde7c|FPdW_q^Q{@>nD z-|9_I8E&u>$}MJ+-L`eJ;-`g-3ro7n{MaUEG=;@C&#cXw|G(5j^~aY#9(rv4?1D?% zw<pZp`qI+p#FFo7YMZhgbtj0Mwjb9x{-mudp{#bB@|A+RTU|>MvPI<+3)1HZE!Qlx zW50Z3vKHUMPtoU<-EDP3c;^Q8R!F%VyUbv|e9lwHiPz)g`5s1pUU2r<#b2h3Grx(R z6i=F<`LggpRrp`;NcON>zt6vQ{#U`2CTq0z)QXOq2d?~a|1Kc0izo9&v$j;!DZLV# z*wDw18g{*A@Yu|@>Q_MXtlthZ#2*VzSZ$bp?8bw?7aX6h-CVS4TR?KZrAn(=#x?%; zDLic^%hstiZ@9N*Wm&}u??q-WPe!jeS#h*duu5*x=BiyvK3`6Yb1>{lDqLirbFxWO zYI)GljG1o_&wO`o3&&J>^`HJdn~Q6+YyLicP!(0-Gga68AI}QYWYdX!689c<pIoyx zXP5r7-c6D#C6B-R^TX`JpW`zx>v#SsO|Y_zPfNG_x>ojJ@#Kj&!kcGj=Kd0#dHdvy zI^8?PsW%&*ABdQHspomp6nQ@BoR#hgv+g}F_D_zG(%H3V$;Brs(^xm~@Lj&(v6z8D z^4`k>nO9fHzTmq2TT@}>|KH0R*X`VLZ2hy8GaqhS2JR2(W45#7xpw5w-5K@|N;u~g z3p~qO#y8U|vdxNJp53NvGXKf&xbM5ZmYdD`^z!nO-iKjVzxOaMW#%}3v9~6@cA4@P z&Ftnv+b8|TytNjupWEzxd0KYGsb#q-i%;vyeA3-`zbE(V%naQPOZi*Yr|+I$Y3Ti} zL`szT_1%DC>#EQES5|MFFZ5=TgO9YWQN%{?$Cd{*$_}P{I&>p^Z~U`g`I8P`Grkbb zzW3Oo^TCsz@HN(5e<I6W&6t$7MbWA@HvV+UDUC~Oi$#-jpFe-URlY#;VCCe<Cusqz zy4|9_=0v=@udL!d!F<xmg#1^f740=1y8`&9a>iZHo}^j$F~GKS{@K*2f1*};?VZ>! zHUE-t`QlRMBO1Hv-y{{eg~gktq;@aA7!j6iD*5LbpU#ye+n>(O2QDmWU-xrs>zmUv z|5XQ>UI`1<k(Zud+IhV=ktxf@`J9xP*X5n^9_wSvb03_!*mQ(RuWJ1|%^BO-b|=~O z+bvn9^M9GY;%-l&06vL02B}F?<_blaep^(YW%J+XhlK8o^o`GLeof0a+jdE_^zOnx zzb{$n8ugvFjF>#Jeoxn0F~#euKjvx4`)ia}KCGGBG$YY>E~CVxifOh9jUg;nPXgy# zw%UdBWpt<LZgrR^?OnKY$?PXQUmorV`Ecp{3#QLI4d*r6N}qnU#ku)xSnsT!=ykI! zq<%<k`F`s6-a^e<gPG0x`=#Um8|ZC6_H^5)r>`gfKYmW8-FVuu0G_C%YPF?0Pu$K- zHPzPo9-*k)Sv4bKmFkI=-Vd~Xm>>Nq+Wc7an%v}#{2O>*O@FS#`)^*t-j#Jv)mFYL zZb|3;m$9mp-6-mtf$F6NcYfZS#jxw(QvQ5jqZd2#Wo9+p4CAdXZ!?s5_Mp1>*lwSW zTCOhDHl=M56%*2U7v#CklXlKp!u4ADr23Of9d~Yc2Z)~xFL!5ae}63hzoo&s&LYv@ zdDbG`^YjD!561QU{(j`+|4m<)ot~)bIqlx^tTOX*c7d6Zp?9wu+bTP4(yaM^{DJg@ zdW}QRHtb%lWz5{5Uv6mpv_H9Tg;-+85|<PO28(sK7gc@Hnf)i_&62&Bubq3f^3_)! zLy6l$6<Iuyo|;TIdycC)AG4JHDl^6K$6GlW^W?bAH7R<%?dIF^-dQetaQkLOe2Dh* zynVJj2XDuG6xox1E??V+uafK5o1{7N26MC~#(ej&xYrcS<;8W)F-O2Scz&vzUhi+M z%Ma)9tY785iZxltTKQ{dT}b2V^NJp3U$?K_aVGq)=6=ChPuO(-r@!6H^D5T#zQ*Mj zFYbjUy4B9|E-#xLU2?eO=fujA^7=)_iywI(%fD;=z;es~SMTRL*FIhyboy`3AOF0@ zUrBTSef_?u@wtgdb%<+|r*c>MPKV&jh9SS5vS!=r|DG_TxLQfzU}1<~voY_#rz%;T zk}6BoR3^EZJTI`c?f;^*^-yA`yO?UO-AUme8?~&S2)2IAi!f=snEJplTQI%ci?=WO z@S#?=-h-ExJAG|<objYdYr_)GtaDD>e`g2IF8s^)@#2rm-U;H%A6;^7H>s{RVUq0a zO}w*vi{k8M>$b9N%w&>k4tTor&|+y9+g|>~OrBfzNXiE7cCKdmspxykI7;o}^2Et{ zC;pUFnKt)raAm7Ey=5=;e!ulw>pAZmx2iGE+M0AWa{aNjP49aP&ED{QcV%x7)wpYL zVzQ_4yx%j!nln#7F`PUrJ4lqtevOBH+KLz6Kij8Srf-lsl7H^w%$4(v?OP51dw;P1 zSNVAT>4Q}V=6|2eH<#tB@So}ePQ_D(PCmObBz&z7InTPH9wZ*xUTT&aXn&S(rcAwb zXV^v|p0g7D$3&kOo|++f`fq}ilxezLa+21h89iZ<-T`L5%l0iz`2V?q_gvCJfAz=P zgCBiXF4QZKoO}M}&)5Gq8_2WAXcyW>%nF>|Xrfm4OYG0-`Qi8Ki~ilOePpM0NiOI5 zk=ooVZAv2LqF#2|9}h|C2<FHtPEX!HgYh2srCTjF&-eAebe`YyMCYQWYvyF>?`BTL z8yRJMx9hHEu%09{dF|_k5<WrQOPY79dNO+jO?1xaeY23Ie~w7CrEd|#`MI+K3^Vz~ zO>@>dyqR?`^4bz5wuKiSS03;?w(sEY^j3cLGTAc8<d}oI@7)WUe&&nX>D`^_rw^9$ ze%oqz?$TCS*^-=gxeGQKv%cBBv{<b;>vrZt?iD_HJjEN<O%?sAzN9_yUg(^-IMdiW z(i^^W%J79B{d$$><r1gw7Cl8*k1YT8@?DLoM5#&ji$k4)%Z`S8VBX0&^LyVLX{{g6 z#b-==kautwYxLxEcP`x8;d8K@#lmg*oND&KHRV6<WlzsjI~!i)^FOs#(UfJIi*W>R zz4<q#tO}6@Ej;1TiH9nGr~Uc#{FF)PkMiVS(I0;CTmS!c-g^G=69us|E}i(Y`Qvlr znz}<D1-IzcHzY_ry<hl0HQ{eOTk4JWNB7Rj3s^rf*ATzqe=ye|uB^HJV%>GgpKo)n zC?|_Qwh;fZ-uilc@89cZK2AI-zoC9Tk9hjO$;Nwj^~kOdkT2Oi=Yhn*@}(vQQonD^ z{-(3Rcz2;x^TVeN26EqBZU)=GpLn@ydBwF@-k>i`e>bk2IN#r3Us>3hSWOLi-(%aK zw@<8FJtzIfKFhD-Gn;m@?{vD;TUC6GDLb=gX`t6DhlO#<-3;prC!E_OvO@oEGt*t~ zhnJc*Gq2wALwCyNI-MkoE0=yRS?K@EeeUt^XD!$7T79D`nDfs2-bw>M^&4Ut`Lj~4 z-L<f5dKx_WbjB|8W!xXwBaYii#vNSOsZkXfm}u8id2zvleJ0m}1L`k_WM|Z7iMv@I z%xe69Ps09aSW)}u*^hD-b3NJMnbV<FXByo0M|VZ~&;Lin3UWUwIq__)xn#W7dHQeL z19H2%pBdjcs*(3*e!%s8?_<s$`^Mq--e4xfJ<<Q4GB(|r{W#F*$lazy!)1a=0eU;7 z@1$?=Z`7=Gm}esF<D4+}?u3~0yGldu%vz$sn^F78TqPp?sxM1HhQ_77g!Kn+MV32@ z3RwAVnDgM%wFvvUrjmufK5mRMwbcFVV=WY~w)*7n+P)jhzRkHZ_sNOaE{%6TIbY1m z;x<~dvRZuxn?NqB+XhcN@8g`8<V`1hT;=g%$`i(9&tKoS9X!6jFK0iu&rJPeC51UG z<^NCpx8rCN|MevPb!DaKg7P&{=FeTLOO5A#obG6};kDw2q=G4Y47SgLnYW%_QeQrc zX?D~1M}Pj!{=6;RHz>a6?ZYW&Z$v9E_IQ@bK6}>`{mccM*=*7Rzv=IISIolVF6{6` z&$g<X|Jd51nGX*e^L%3Uyn1Axuk4x<L+4l8H{_Q1GdlMd^tq?<yuEC4xaMNQ+rrZ| z|7}11%y_eQ()B|EOve9z+;93>|GUNhjY|HN)gM33ydp2MIG6c&a>Cw~nzM^9Ogpko za`#F#%eDovy_Kz(FWg+@o3?-P$~wL5f-T1~x5dr2c$;!Z&GJP5{btqXzXxyJ@7dv1 zSL$`}x%|;@OH8-9KdvZ`vwK*?)wtB+@m|e?2b*m;raY1J=}zH29NilH;ks$DO^Vue zyE)(eD|VaSTjmxsXMgXppO-xq`RBakiJoSE?2_Zo_p^)tmp@-?>Q`^HuHI`;dh*`e z(|eNsv)#XMv_86Eq2Seu7~$i3Wfwzwdyg<bo^>Q|=A^c%h6lc~{cdLqIla1Y{@kBO zPZl5D>ve4IoV^nA?+xzt3LSgRy=3}>>oGs)CP)}N8&4DK+5X^L^y7`*r%Zc4Y*KsI z{JEfUmwx^O`_MOuckUbS-+wrL;-6oWgtafIJ@%M-{jg=<g4WILD$5_MO(@dcuvTwn zpSIS&h`H<s|2&&wc|+>W^{)Fp7o|@x_?NSK!#!4?XCh3c`(D><VZ4;oGr7(0wzG3; zc5mUvd2N@~znt7)X{8*UGoy65`RBdr@3*Fi6*dVaIaI#87a#g{L%G|(;HtY;9IpAl z>Q$Z|+1&fS_0Io(_J*js-~L-#pFf%J=e{B9%B_6@0(Ugdum9zursMH(iRkP1*;f_k zuTtB1Qla;p&B+^{lE;7j+-vGLnd_?ifi2%OH?sF9Jqi61?%u818}LnKSDooo<8yA3 z&AH}n?vHKM-Yj{Uq3LvC|M`RSt=5*!7M|aqpm%B7Rm;HLfj1{i;S$(-`Sky56*;{Y zP19NK8`bQWTpO0UyYJZI<C~xAczu2Bc>RL*uC;Q#Cq)(;rX|aie7N%Iv4Y*NSrW&N z>{#*eme+)LufAn3PvCQ3KIiSN8ObdBN?yfZ-m>iN!CmH)B-iW7UQf^56TO(%Pik(- zi<xiTm2J67s*>mR{AAeexjpXAlI`nzH4bJL_)4fJOG{bL^3z#de=+LVHT7#BM7=*P zsp*qTG1>TkNAHpE$M&%bif%r${r~CA_uOy$r{0g(I(*(*`{47#nG+=@t*$Wk=vaAS zmQ>GThpdA)qpw$T?XldNu&j_@-6v#c<}|l=8@;n8t>#&mmcQgl*Oghl`6~<eO5C22 z!RDS>v&Z^-^x}2B8%^u><r!$oeMoLD(*0B8_hDLR&XwwfwE;!T{$1>xzohn7)tWP# zB=pxG%(VXT_rHxH&jZaJVUPc^Z5LXym|1f2MxDFcnM4oVY$|<k`Ff%0gyQ{cta<nC znz#RJ@p8`YMSt(Iyxv)NY?ae41@k*g{liuEUbtTROT@C|<gx(AZzhXsj;T()X3-TS zAEd8w>}15Wgcz>8sc+w{>36BM_^h%0^WA3l-WrzW6K2=)T9`dP>n<0!^KJW?b+1mO z`V?8qvF=#P;kzvKy3>K@jL(-nkKp@JV{&e>Ohz!*&CvNKAG=p|R^NTdazsdG^Q`4n zm#?I1B<*=4_~xvH+wn<-*$3`v-ef<rRsL4{z3Xi&R*9SI3ERv%(6H_0qmv5{UG$4m z&lR4%G{i!@Li%glQLWtc>~j`u+izKvRd7D8nfCtp<KW;8Z4t61Gf%x-V*91%OV+i0 zOT?{qS53b7`S^YxN$bxY`{qZ#3$*MI-7H^}x~}@zsuj!37QZ+nc15{DTFSe%zrOYS z`Nlt$&r)rFeEuI;@u&D{y}Wk+ia(o7p1ryA{#?2tpNZp{hd&~JPZxObYH^^NZ|HTQ zntF-nNj~9E7fx4E-gNch<tsAc#(#`0>WtT<KASSb@59614wqF$ch`3pnmzu)Q1qd$ z>A2*c&67mbxwoyj_~{Ev_ZIg(tdAM(WjEZL)9-t!W8q6lzm@(a%0Dc6Qm-${y?Aie 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%0A3|zI|e{dBl{zF=cBz6E7_J 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⋘14%=+1*ogR<Ap!d6cXf4=YF->?nUkM~%m8{eCE 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\SA{cHG}W~2k$!4DE8foCPX3II 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%0D&s=9dB_vme=|%M~v(O}@3@f8LMf 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�I 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±$=;tS zvN7+Or!LGsdO9#c`la*y=XK$WEyX(`FF)V=VwaBTjMY+!=8_Fj8J|oR{mm{8G~+cq zzNUF|_55GWUDp<#{?X_0^sx9b=d&?f^ThP6=O3PMMOt~6i;mmISU%>RL8eEoXH1kz zC=s~1YftW*r6G1*-t#oQH-21_@_s3E?qsXxj9RA%6M=_%haF`uW!#uE&v3EXETsq2 z8ccWOc^2`9H+8PhdZxyGEs*d3d)>)qzK8VYHhs9~V;X7nN_F%1lF3&jOV+Xm|Fz-I z<^QzkSMKTu(n|{Nos+CSJ!$0{EB<HUi)$u7tG(UYYNyv(da<S4C!v^qlGxEXQSsuz zGtNwFyeXBb^&_JqT|2dX&$rAJ`8ze0ERXs6KHq58_Z8vE|HM%_`zhbPJ9GDb?1`|h zX?!s`)N049tD845<}5Rv5X!9nI_=u-W%EC!Okzo6-<D(W`i$4RDP1Xxi_^-|_ppBE zyX|>C=vMQ#ug8vDx%1Z7_wYWc=kMF*?^aR!`u*n9MwOF=(^fsN$hh@h>O<Y?J7UvI z%v28vS)QDHKxRdi*&_d6?7^4ae$}Ko@SmJ`%%p@tLBROr_JmuHXU;K^nfyPJc|xlA z>W8H!Z94axbe~As_jMKqoZp!H>3~Gq%fH{%HYC4V^T_4<JcAvKZyB$#^gZ8LUoU97 zFKNl*IE5A21^1g0FW<ak#FP^?A$D)ae4b~2QuuCOm~TCKd7t^l{8K#MZPDz$Y_I2O zUVC3}wC6pe)R&Jv!98|MtZ!U*oW4vhXJOV6sUOxeteu<8*v?-5Ja36B$BM;&75Lqa zSMELg`+~`&8)sI&cWjKa-hJ(yVdy<G&!aIn^ip4};SA1qdz&CEa8knQrFW)ZPV8^f zcLD1T>Z*E4NUF~iEPghT{aC@iYsc2AzFX!PnQ*7=$P33;{{*HaRJ4A)`!R3D&Nm11 z`7Q1~j1qe7eQdvq?<2!&t1s8FiLcI?e&#C6re_V?1&WotF73+baLw7P?|V#lPH<rS z9`PIJC;gvTEfx259#50QKam{e7^epjI~t#=Pe^ibv|ZTHa881=v3TRxg~bc9ul&CA z;_s`A>z!?E|L|2FTz{sa{u5t?(eM9PnIBA-uabJV@M;D-SIGq~AN?Yi;!3~sIjPRA zw~e_rTo#z8^CEeZ{Kq|9X0HOyc&3T5od3>v%cI}rkiq|)YrImsG?wn@(e{~qHZf<( z6PvKdf2UQv>9xv!>^<$|$zLr$85|FIT&kFI?~gmj5f6t+hby^F%Y!p{j;^eJ_E+Bc zwr=32&)+r$pI6>mqI-$yn}Ofi8~24WU3TqkI6kX`r?|r{i}T&I6?b1OZvA-C(q(<f zKE0{+zYRb4n|zqR?W5iMJ7tHz9r>Dg!`2{wkIzA6m!NFF@-}`un;*Fx=Z;F6@6fwv z&Yl~0G9-q_bMl(Cp5fDMW^6LsX;u~$@#^g6lOhH2bBaCs?fh0+t7!XQZs@-#v0iUg z+45lD?GLyQCY#A=el#{J<8DieWfs3tTOZWlQoy!+`jJ|XE#7IfuW0;Q%pVvl{pZdS z)=&ScD*YDmwLUmDjbC@0z}dB3r{bLK*zRpzyMyQAF+bbnhL4kW?3M~Jow6)5uS?z5 zq}YJFVi{LY@$x_4olDMm<=^m`a_h1}?w3#8f755o$@GeO&o<j|M^bJUbM$1T-+q02 zSsrF>%5t6P=-{F>>2a|0Ki1BT7MEW<adh=8mR+^)`{i90x3_HG_a<h|hu_!d>QA5g zKdbkD-psjPpC>My9g~{iZ2j_v`L?&S3`1VLV_YfqneAuVd8MpE*&WP(ca>CS<<9DR zeso5a;$}T9J&|mU3r`Xxr#hbPFrByMp40L!(+;(7+`Ao`5(7RO+Z@>!VPsUA)3M0I z;Czx<%<PMk4(!?D9H*N8(@3J!<PXyv(T~%4mw9YZedp`C)%AhvW$F5iejANRl?~U! zmv1|gd~x%aHoIi*<l92I=e26g|N59dKEM9h|EQ*ea}>+fPP6o%Ype1+IDNX?E|&T? zMh8wUTl7NxLA1g22Tysfs|uGtw$bYUe*El-)t^7LDLqqKVQ#UW&2mZpnR5|>vzPdL z%B}v^b2^gY=J)o`g=PDAJ7>DsBt*{rJEN;Kw_wJ`Z-4K9v+Fg;l-YaYPkz~qIAQ0B z7k2z@_jU^v@}Btc=@SQDJ@HHnZG+qo`SIM(!<Q%3#2DXMvh~hxz5PocL^Vx5EGcXd zGG~*-ZQCCaAv27WniuCOxm)N9o+(c*e|+)fjB4+g^=<z-E<LKLE#4OV;qu(4M=Mt{ zFIP02u~Gbi$Q`+Z=SBVc{p{x?tmk8Ve)DEZ&Y^7%cVw#%<mVggKcSo+e<fv3e7D0* z0ozFzSMVDyXk&adXMyLhsp)~a|8GA%VbkB4sKIh<W!kyjXDsupH?)4%eIofGE^(*i zdSCMmZ#s9dPn;@i*Tkh#e)s#Lt>$UzCuYibe_5qEbIU|A9?yI76&u1tcl5sy{v<1t zyx03usGI1u-ImG0im~nUrr&iju6y;FpY8toUw`7iB|l#9{`>#Wk@sviALy^QyK}HN z&UndlZ-=0Zw|}*qwaWeeW0!n=)x`N$#!97kOHXWm^-?^*=lAb}yWT|0WnTHNv-hH( z;N2GQ2ku51yXP(4_`yW`PR!k?I1?U=q&qq#+s-p@IB;Q(#8!DD?=JI}!_KZR6F#Vy zvBTB^c<%aV*g5xx<=MRX;^%)=e|z!kMr^14#q7rL_Y)%-1A8uK?3pw7n#<Sw(me03 z1l*nUrbD`PRpzYs&4p6-j5EV}Q;knK%c)Kbji36gXY$67w=bRB-g-a!bve_Vcj>1U zX-mt_{+ZEpu(xcwqT;fZo2TA;p<MRB#$on@iJ{4|XD?3+xKr3~^(A)e2C=qjuB-I+ z7QW+sxaLaB@4FWH2P;dqT|W}{)XA^)rQZC--&huG(YrQJ&XD)mW1hg?FE6qc%QstG zH`yeX;oGaPzIXqfg!1QsN3UoFhuM@GdMdpT`SxPdg}ezlFC%{M=L!5}+7dULeS_S4 z>l>Tx(wo$C?L!R@X~i;4dvK@zeiqa1)dxA7S3Q5UBm8D_VOx=xOH*p&9&fHSOE^TX zzsP#f{c=~XvygB$=f#!Qm&EkuFP>tz)Ge=S+i|V^JlaOtUsV1J{PAE3G~W3>>1bbu z)t47J472UN^ZXDk2+4nZ?_kS5QPat99uz$6PxgMjv8lARjK8LEW`Wv_w8tf{?lFCx zys>0vbBs`PrgM?GlI#0clO<P8MU{i*#l3p1VDLP%O+t2qO^;mvlPLk2%9$l$#)4mb z*Pd3j@#Kp!PoFn8CgJ;$ZL&SBU%mvL{H~V2Fi-A<wT~D}XHZk3h;hdL!*#`t<+XuN zxeh<*QGaa2F7LT)>u<J|mPa2LS;z-JnwVlVGxj7`bo}Sna&yY=_B?qo`!qlE*VNtY zs>}cBoDg2l_NMxAkI8=(-bu%Tj|KPZ_uhNH&Fxc*Yk*bqvXTq;iwpR5=N#PqN5yXT zpXJ;Biwiusx%^w*?}QKaQa}G6VtMiZr@S1)|N3`LZ2SLgNc^|*;&G8e<%cUX)K0qW zx4PG}JIuYr<hb?SvmB>V{Fx^l7IxVAqTMcf_p?UT6LS>piUl@{6$gE1&-i5fHS<!f zZ_OGlr4uLiu<ni9=A3sxJ?N64;jhNKAEgX=eo0?se6VDZ+iur1o!-wkP8^-#yey{d zmDOUE+`E+qNkNOZgv#bUPLb$3nyve=dE)s8uIx{L&yYO6Xr-A!JxhMdze3L~g75Ut zeRYo7n{>>_z_gt$`s9y<oY0B3xz`R)o-8C;(`Zr?<i(*_Q+)liiSb?jB^#xAr>$Y0 z8FwJzgiXPOKJ}S0tCxrSYQ9><{{CXm?PU^tiVrRoPG4>OuG3c9{B*=r=haIS@)zxz zCNjnFakJUOg<Ur<c9ou8<M(VzDM##k&UMnI`6@!6=ge5P=+B3^?GeJSBCTy}*Lz%V z?NZtH;<D7mRc92#((lZ@uDJ2&fqQ~?ub7vtxomgYk+nyCQ8draM*icHD|@fTzP1pb z@%&xoMgGezAB|?s*>ikB%$$?1H>-8r?oN4HId9>drf0poW_R&5RTkZPvF4`dvnxC| zdop>JZA?_XVXMj3?^1ZQ@YDe}*S{vx&l%gYlcJk$a~WEkHD&eS+x90&Q@z7rr%Cz- z#SejO0sXU+<`<cr((t;n%c@xAnBX%{!D8uIZ+a7bb_Z_mI{C!t@utNG`p>6Z^zA!S z@$9Oaj7`<F4ex3TJ$7G|>v|)3#&WO3?-k4LhO4K}5L>Z$9-}{-dWYt&=Z;B!3fFe{ zh1#>!WgnXTZBk-c&2`3Y<{Jx-?eksA@?7}Ci;uH*GqeQtCVH;P2+C(X%v1iJQ^$GH zxdeUQeiz$@)oYma{SKN~Oz$r4)>*u7k<BfhH_axCrgP|3KiXfOtT)O3NY<a9hkty} z=vlmR$`OC#Jh?fm542f%1V`Lj$SP92?An9VuE8_*O3k+XID5tXQo&ho*%!^@b=p|h z(zWh@%hq#NQ;sP{>~_4F8nW=-or?WZ{qKA4-<$LIY(&?J(`FJ&xg<8cXzP^wQ+8b? z`*=kD%*%%h?Z4bVXkhiWrOtg)+?6{Kc?YX5%av96z6nl}_)@bv<Bg|<^%3?tZ3%xb zJytz@BkEBp?<M(jCMO$;?A3$3w(utLw)tK;EqZi5XOq~08u<y+kFXdXh>Ep5r24@0 z$LV}dKc+f)Q;8U<3$|PQf+p%8DlH6R(f3SSxqWx>sYSl;oeOMtpPMts@OR1iXNgyQ zg%1`^3)Jmyc;aEucWkTp&81SQmzMm}5GXEp?fbK`b$#`Rju)2qXE7{Y@|WR?K}eIP z>NmxzkEJHxj4sS_iAwTjvh8Y4f4h3?<#^7yzC}U*<}7Kg_bYh$)U(+1+sgmWzn3nk zeV4hHbHkFqmw)Yd{j&K;rJvjGJA1EdotJbgZ)J;;*Q*Gh{dKd`Qt$QdRvGITcBxH& zb-cuGOI<H>a<+iyKTb>THGNC6u53%V^Q3%Z_(rbm$D4mH-^^jftY|9nE#b7=+{qbh zYJa_yVE$BTY4q-Lu>*@)iSx~4o1-(;%$Ck>bF!3nc8Co%f0lH{b^Y#pl|i>wbGv9Y zCo1o?yllGN(`TaM>USIRgkF{>ADhwLU}|o<`}eaeyllp&PVNwW?BBeJ{V-qgrsev~ zo#{5otC@t_7@tMnPgYx?RmD6->Wx^1&;toyAtwD@e9l*YS6o}af-&Rn+r25aZ!#N> zOW3H{{;${U>piC{nVrsiLHhq;1+nm+L=_K9!>I|@FJG5(OA5Tt(h;hXE6$IJX6F9; zK8tDMHpU<?pJcWE<Cib|UtPXzW&Hdrf<~_^UI^aw7G1pT+v}T74SnWU-<JJw{bE{s zMRH%p#3>uiPgWaP-7%i@bEZW4z3X$;|4KTsZOUvg<#d>pH9zLJdb9c@saHY<?~-P{ zsSTPx*`e1VT{OeN!KkMDx!nY|d21N$BkWl#RYQKJz5K^D!?Vv}`;s3IuKbn>cpqF| z(qDB;Z0YxtACFuO@sssPW!HMW&USmQ)#EiUe`?&EVessq^^5D8>5nf>w(Quq{L6O% zwGXEk`ERg(F{`?^=0^mB|K>eYwx*W|u{+lMS}L-&@k?pvNtU|%F<&Fti?5~3sa8wm zU940;=}zs=ZL)Uv=FV*M?VL8*;jM~;`uD$^qs;fc`JVY^L8#w36E#omGRg1jLf@Cp zFp4lp4{vfhw?<JiDXZ(xouB~q8@u06dEaNwtEwX@?aN?&VcWaM0X?kgsut#rS2bCu zxOlqxvOV*!tXB4Tcgx4D-t7BMmXl9f6}Cs&cKhpZWairxZ#FGn;*Zg+-gv$h=OliF zTQdBA!uY}av;1-X@>>TB!@fOx;c(?__2o0qodV(#m*;=GAMEV$rSXjUbrFf{TOvAE znavcFo%{amUt^&U78&#AN2(XST76+Mm!Z<v8QRU?k8D$$=F9gY^F^EO-kqYV7j}70 z(3>P*!nNz6|D}b~9^Ke-<%i$o;#pd{hi&=S>`$*-e=jg$af$ecX}!5Exk6I5CAJHn zCU7sDb@<8xi_>{;<U3OetgLU}@U77KY?Zc6ce0qTpuXrngAFx>+rl5`GcHxrOHRu0 z%j@;#yu>LdA>C=pe%N)(`Mt^)W=np|*kb$PnZ(_{Hqxr<Stos5+ca;6$e6s>`#QZ( zY1XpsxhB)9mEL}s)jWOUM&3^8W3}R{pUtF;g_q{*A9MHWxqhmk{8EBW^PI-ze<$}H znK5Is@fnZRrk}6WYK5CESz776L~>fz9_IJ=AC|1vDl2}rg)PjedQ#*hR|iq6_kTB> zP|SL0=QZ1^ti^2kyH$6Zf-R=M`m>=YGU$oSK_RP>d6(bX&hQnk)z7-%r}%h3TgByP zFLX6j(&l8g^Lv+sTWn$#H<~u*@1q~x8aMZ;i}9!%?)>Q1Bywjm*QA)HL=L~=#}iY! zJh;Wm_brMzc2T%=`s}w|4<|}wEwdFmy<3TEx%V@pv?TvK|Ekk=n|WpO-1k}cZ3o}t z(6j7I7cW$t>GN{-pLxxytgqK86+J3=#Xs%j&YXa6M{<ruB{)iNC{5m1@#S#Vh5IF4 zsd81K(gJEbJ-lw^N2LdB`8LxbNG;Ij_PRaa|F(b5-&*u<V#Ki~{?1!V=Jsp1Xv!v6 zO$>LM!?H+6)K$jJ_t|SM)sq&v>x~}HT4dOAU`1~D(vZy(YS)hZn{oEXWB$ql9?Kc$ z7fsQ-u5xOP<IK4$?WHwO3n$7nCvr_=`|f(aIrrA(W8TTLN?2m*#qK;|p3wD9c(L&F zWBa6E>rON{m){uv_;35XtA%Cfvej%RvL&DAJ$){ON9kh+OSHa|)d^Fdf|)*j-}P+G z*B|?O_-0<gJ>kna0aqMyqpvS~cWy@S&zv6dWO-5DBWW(hHU}-#W*z>T_vSlG_M`f{ z((hFR{Wr`FRkZBPZQar#)W!b!{=t6>JC<u~Sp5BkZ^F4ftbeY>{@MKPSE_f-`o67t zvKFHI`VGz*72RQDJpcM|#UGQ31AiLAAH2U-yzV^Pyp8gXkq@I)+PoK?>3qNSqFnE3 z-5oB6>b-wVh&XTLGpj4`ev{EEkBsg~%oT5EzFz)7HFe+p-hK|b<{rk%jQyIE`#$uy z+c<SerWfDK@BMxDXLstk)f?wc*}eC?hVboF9Z}A@n(|NQkF`E16;pWneVw$8>L-P3 zr}M0?`(-BBo8D5(eg9MSvYHF$v52t6Yw!BjZirjN;iI?ozh2YfX4OfHwyjw;!*8>L z!o-hGJO`GXIKR-TXT#Hk8a|zhf3+qWWd?k|vsb9Symahd4Cjugn(QwaS&hD1b13Zh z+q=hp`QEVG*4_yoZgMGE%l@9s_`Bw$qJm<iO=MDu^TEYxt3_ArRXAUpYqv=K#)`~- z$Bk1(EZS$yOuTfZa5wwUXM4V6te*8`-h0ov0d33ISx9y5;#!dTO2xPDqSDJ4Z_n!W zuNkaYoMiLot#~c3P%7DSd3MRJJj?7&Zm$(Ka4xA{b8H{W(%B;KBIai_ozGI)t~=3L zA(LsvvCM)t!yAUYYR{Aw-{8qMoA&I^fB$CQxb`DcjHD0VKWr&DN9qj!#mQ4&EUDTu z<I;>aPoJ4a-#Bw8*%WYlE_~+d(`}{H9Q!N%oWSCBu5HT~MjKt-v0K_X^iK56D>EiF z^`E@KW}CdU({iI?!R5{Sj%No<4=_5EP&HSnAyv;&HnFhs@)OmJ@)=BiCpDZm^ePtY z<I3SM&MK<$OR7*w-r#@uaLTT5FXNX-_mvyyzO=piBWGLpO2c9kiI|qJui|Dm>}s(+ zxG8JV*>rxj3Zq&3cs88(ytLVq;o63;)5{xOiX{%eyKz3jKS1|lR=~CjslcdLUo!<0 ze0g)O)^0c`!TvMpYM#qHWr-M1``eeEvTRP#T3Pa7!EYuW<~y=G*gs22iR?|e#Ie;g z%AoAR86mG<Csr*C7k_;ALUF=Ob?28Wf4)Ee%W&(ewWnRJS1;i0OmdS{>Aw2wZLObS zj!9eO)+>uoMtt(HvGnjtOp2fJ-R?MxgkZwlS|Qmpl3ni}GkREjseh2E)0e4`aCP3Z zN!}-y+^voh$Vun@#h2R~dx0&8^^}d)pTCU%^?NOw{<6HDP?~13#dlNcH#ZU2=4E#d z9#Pz}N8+2%6@lB!^?t2!-_^X_=bov{7R4Jy1*;3*)vlbIQnhEUkDR78%em+jIlX*_ zqV#0lbKB3AREQ)SUcHjGiZl9>z|NgLH;Vae=G5k^d@?>}z3P=<@q6ZypPOWON`F=U z{PX+fm+$MVZO-pntpEJ_LbLr<>@V1+Kc4<~wROUu%lhwqe@;$YaQV|^jScIU)CDZ# zxwiGoqDPVGjU{XjUy^Dru$k<bxGk^YGJjencTJY;yjgAMcoy7mS#Ws`(=7EMc0)P2 zQ{Ma=)^YRkf107GYX7qSU}2%Xz4?n;u{F&aY%jigSva@-jL~eq?6KqUC#L@XGam$> zT%GARb-@aQS-gG)bAOqretGgHQsj-{O3C`1na8I^<T?J*H@#Um&HHDZsP#0bWmStM zr`t|`-&xc2y4xpZnd!soWxEX5@=lWrpOj#Iu*2-xTo=ciOYPsE+hY39e%rmZo|EpJ zxb!E4arcgDmy|Ton`d9fO^m(y|9|_p!j$x7C(|}+86VOwV_fjLAVKcrJzYUBqj&Gp z3>?0`*crpK>||#?^YY2FX7934e^7X7N#T8y%vmwKF*6h9mz;m!z42X_Nwu=XKaP9% zt*5?Z`gp(O;`E~*%RjI`@xIR!_Hy-e&THN8mcF&w{Pr%F^EH>M>~m6DX<4k_67ET@ z@1HwMsQ=*4e`z^ppX&Fe-*d8D+j(pQn`!D9Q_(Gqf7jKmc(UwI^z1*9-%Y-sO!n$6 znY91luj-CR*RR)U{ax@mZUNgB<60%=o~ZWMvX71#&r(Z&8Jo)<omeIDI%7|rp~c~8 zTQB=RoDr^+aC1(PIhUjKRhv}fJr>znF4wNv&7QpN56j&w?JIouQYSN)v>5XC-p;d; zJNMz?8}lFk<|lkUv3`B$dhr{_57qyl`19@dBbmkf{AOOBJ?msH*DV%x?<IjJ_AM)Q zDtWqg!Lr-u8*4eEifdzfKdw!TJ-jbQ_+y>StyNmrJ<n^^O4Yq+Z;#8_exY<;9E+Ju z)Rs94vx1d6?0nBUSg~GLx^?~K*_}~p|C!&2?OAs0L;b-D!AY-KmZuz<mHK8!=exVV zTGlb;=3Lq7xqIKqC7Y@a&kD?2)cSO1;jE{3>gy$nuj>eHsO7xI?W0=Z=~$Ef=W5SK z`E$3^VuT8~<?=bL*}r-pj4zXuXFfei<KdRTd665<?kzHK|8TqX$;ZSw@gZ;4lpo%I z_~nx;;VYg$sBQbw5R!7Pe7DK6^$S<5)!x9CzF@DC+2yR9*@Dg=3^d+fkehX6&$%}L zfV2)NqpUykc3hil$^P84YNz|v#_2MDwAZXIF5EH4#5K<8o?xc%53`+@qL<w}a!229 zlTYoNGw-KXmcLqYSiLO8r0U|5wEI(^I9wOqKkq@BU+h;O^Xc_R=8J!je3fGpmK^!O z?x4xZiFfNvmQ6OiC-qt4%=!<%=j<pKe{19Q-)5cdW(&!lW4~1^EYnrhBbHCJd*GOA zYua}3r>W)P2R3etXY^>st69_<D}3&MA5eE7lg)nSqF$yvb4kv;FA^)6N*ndprM;f9 zrT%By8ty&yCwyLiF-?3oY1v-sc<*QO%MXP;k+D<v75Z-%_G$ZrwU+zeocnK3$u4kg z%fWyBa}(E15f{DxJM`>#JC>WW_j}$)AC2md)7_xHD{tR)UfmCQ9V?q$d0*}`ul&~& zu<U`)e3o+lS-TErm(^|eid4vD5_|2+deZUp_GR~@*P5TZ#vN;&)z&BfO=|f<sU!Ro z7(!27+Y)|xw#}~drwzASFH2jS;cv0&!e%)|SBI~*`+2i|^xS*#{rU|j-f5zt|JO2S zzr1kMFX_|O<Xu+|bY*Oq=o0_!)`z8mPI@mcXCJcmke=<(mD#k_*mTj6%aadQJBKay zKcpmKHDSx!Pew^q-|AQS$H-Tt^H*H6y;mKZx>Wq0r|*oNJuK~fR#R*fa$8RR+4z;I ztjr_-)AUH&DIymhh;*66gl&{w_L`C9<;>H~nx8f|YiINB<3Bflv*9eI$#0cAF5ZX} zv9>OG>GElw$OXn{J$rIF=Em;ypY>hk!e+TRhlL``P8{oB@^bfVL3ZWraO2FS@&6}p zoX>MRboUdX4GvLK)5DW%E?)Wn%iZ2uXj1Pt&VR|K+tg+iylY*f>Y2E0$*hw`Inx^) zUzhQ0OuxkS?ZHgp_|<XmAFtbN#as375+Bc^H`SMF*L*GBQOF>hT+&wl+K5p>PS)ad zlADP;+vIE4Z{4~dT+jAhZQJE;X&v9!My#3HJ-p8*2dB;4kh^a0p4Me^0w31#A6sgq z_V}&%<NnEC9xM-CHsN+cPpD6m?#uVQY?TvszOeAf+Hn8Kxfx|^Yt22se|j;;{c*~# z=%pQu4_LM}%}<<rb=F?9irJ#p+s&FoUn`5x-JC1RoUWf_BG=ZSdqiyIy_u$L$@Ot6 zo3DNq_jX-&@Eucql(59do`e$Rr*=G&)r<FKZV101(5NMLaH7wJ^xd`RUpwC|`{Kf0 zvFiHMxwVHr`t*PCh;0npdMIvc&J^d&@Uud^=^6)bG?|<}+~}_CHF^4l6<>qG=cfL9 z?xQN`oxI9mp32EJXID0FRR1a_R#n!{*mh?}%#<*}vpbd@>%Z<YyJDHuhOG0oHRZR$ zDr*g2tv~nnk<ax6Bf~q>uO>{}lH;8u^yF3nOPFvHoBsVLx)ZJ+knc6&*7$l(>{Rge zci;CNkjja^e8BQ$%&Uj_ubiEl4_Z!gyC{2d+v5X2DkuH_oH9R8C;LzE<$9jW|LtGa zl~pj5NPJ)LyZ+zlbi1PWB`sb@jSux(6y<GQIQuK}LittxQ|>Id@JsEq@Kf<63$Chf z@yWYdxaY?Y6A>E?kEpFqkJd;yn=JE;dS$S;Z?EKbrM2%&oOZrQTp>8+(!9JrS&oaZ zxA{+Kycbg?`c`k}y>h<~v&!%JX`i0A<F4?=(>MPZO2-JL_XM}_ZI^wM*z^8FnV(Lv z=v09jLGB*+H)kA}U3kB0Uu9#l=+d{xccxGN-tJ}SP_WAA`6sC(7k<<+-DZmKEp~mD zdT~a(OX1NOyel`FKK{%0()P=Ty=iTk2`6mho`qijxJyz#anHJgTV8(HtbZ&st7oy) zmOH#>>{flg%~WZ8E^!Id_SFX_eqLEPFR`Neq4&e6gq@b_R~LI8(=A>8c!Ig(EUD`$ zI!7~S8^7%eHEy!)S^6sKXW)s%HAiQJ`^MeoDlWP;-}wFV2b)a%o^}*xE_%1?g4c3G zo=I$Xwx8;^H~W`cF2P=xGV|qMp#p2~*LLX_-_}{HW`zk~_A%L>!v13^(+8WcU1kT$ zT^7Ija`5rY4Hrrd-ru6QX1B@J$F_y5x|B}`D|c<y-LT%xX3lY;J!c$$31!7Z9bWbL zti<mpnVS>hduxBsc@UCsHHY!_mDRt$H};nwmpfNkd~K~@d~<$$Py9dDe{cP@-*5f! zf1mG~|7Hb;B;5jal`}8xpR0XX;DMv=GL1v8rmXTj8CFso=g-8p-Bv?S_Q&g!Gmk&m zXnIe4uG2l9`&VmPPga`Cy6!v>-dMei>9{dZwfXE<zXg|h)<#tyiFhIK<CauS?w=n* zQ_k*Oa^zQb>guT*S>w~y)fe~8(x{0SDlM#g%QMrd{D5g?s*kXb`i``XxmmC8iyzx# zS$SnkQe@AbEUsYZU7vy*>noe<YhDXmG<i3DdOy{E*{NUsN1i_1Q}Os!TP{;+TiTzu z(>~5N&Re(lR^kqan{$8jM}#Z$_kMA>n4nuBYr53?YNwda@?*z$e)>02qU`bQD-v}# ze?|zWme-gbWB+3%@pRtRKieNnd3d+ky{*LT-klvj7fUZJIvBtG!24q+s-I@2i##lT zC9&cCE#~8a!e{qNoL=>Ov!8?EC$$9iPR`?9YI*zb_rza27M-5DR&xWRp68TPM_=YJ znF_I7>3ep)F5sMU&6&<HsrA-x_<!7H`Yn6x%@Q7NqvtbyE?+2GyQePX)6K|LD>_{s zm#yCuTCp?bjqBvY6^7G9|7aCo)9kz}z<4=hPMoo|r^&A)#kZdF-rBuU<i>kN_ovwf zQN5Ky0t;eZEy$ai%X`gsveT@}RVlv7OuzQ#OZpY7`Oadp5BYR*!-sWg$J|XFUn^V8 zm;EhfGwb8__Z#9BXKuduL!<Tg?_=@X8YP6k>mM^ROS*bRJG60OcJ7?$SI^6@JN-X0 zX%$~~_KiIM$y+@pq+e{6>^rv6+iF5)miNK1C)Qh9CuPQYCmHN;-5~xURys%b{H~Xo zNo5zJ4p#-o{XAp({^+#X-zMB*be+YuERE^P+ns7}B@HWlT>GnowfyxN_ojx%9&fS# zb>&LqG@jQX|2(REZ}zTaX2>@Fw)o*|(;p27-WoiPW3jk)Nn-Qlbk{7s-9BskB4qT9 zighBFm2O?RbGy*_;+GjMdxIA(-hV&ptDJjtu-VJ>m)F;_ed9Q3Iceq0jdgl*XF8P} z_OH3LB)#2Z(IU0?N4I&aO<4EqwpSVFG=pP)s_T^3TwKwAOvHd+ZTp97H@dqrO<9jU z6|bDHFI|wYvwDy6Cyn~9yCr|y53+vx^0}sHqkhuG-~KxV`4z*N@|vz|-bkD5Sj2Ku zO5Rf9Z0EB#FUo(e_&vMovJ3}Dl+)R-D_?iFv)-8U%)n|+oN3@1)rz|h!hD}~%1(&V z{vnlB*8ad&^0m@Smw6@+HVCtPYK)XWSjOGa-23~a!_3LqN?CvR$?~ROEYOp$W8Hhs z|K;+{+nSR(PG7KVnIVv3dYV_#c$&(A9|ny%cb{xjmAtLWueZ6dzvb<*Ehj?%vn`3; zbWbcQI9r~9r&;@Ldj6zOyje5OuWqw?HtWdo3>!bccSXAwI%+v`PtMFtkD7Asl69}& ztkC!z-gR5eKQH?(?a3L#-(ECrpY8Nz9=rba+*;?NTh17B^-B(a^U0iD*R@K%DczfS z_U|6!lE2&Il8qdtr-a*^+>PFlF7wjxpub5@`=*l)R_TW~{n~b`UE`UoK<Le{a}4CG zip#6?)BK;cDqVOi87XORIOC1_gHY!}-tuCulWD)|{4U+PAAHEmK=DE4S})T>z43QF zmEW9P8GYD3<<ie7iIz_`2dha0vzwjSabL=~cMnUlIn%o4jk^wJtl_+Nv@*r;#JOej zUVdMcn6S%yndl7Rt^AX-SJdrXD{8Kun!J62=lyFDvr3(vALsl_>FQ045VXG0ZR3&E zwD<eGYu8<zosFFy^v#?s{AuZ{(~lia96h!1`IG<Y&-N`$zx7M)s|nYa`ZNZa|EYEV z-an5oYhZZ$<8{q0Ua9$K>#u)tj^Fcl|KXJ7A1|Nh|Mm0AY_^!Ao6N)Q)_-kYV$5=e zufWN^T!L%Ych@<L**z@IT(>HA{4YDaeo42TSo%Kp__jv-OMbpgj8RMcH!omzw6yR) zXng*A=cZW`*BD*)uy4A3cxUX~J%?|5r|x&KJ@}~aZi~sq^~rurhI0Iw*V}GB$%^iI z&9|@XnDoN+g@K>vNEO{YyYQrPyM0p%!)diIC)T-bJhqABp-<kCm6y9GnZ1@OS!{K~ zZAHF8-oYut&ab39*l%zB7E_*j-A>J7>#@_CGwwCbNIg<0ar;W_fuqx!|14|WC7zt! z`Q+e))@%F!8Qfa7$m&i;vH7E@*=Fw@zu&s%B2~4pMCjArT(_znE9`FwH+cPBaDUV1 zj}4a=bDf{O>%$DG-PWn%zF$2ja_;)s`7Xb#!&pc7imJtYt<yPof-jVLSaNIT_T9aD zN4DndwU#Qi_aR!Z1A~v=FiZJ#Z}m$?*jj*#nd|dvvo4w6XMWk6cVo-Dssq8s#~y9y zoVN72Kdb8wlZTgg+B@%FG&`rfZOyAk2{&E7ycBmZbt_jqeJnV92Vd(asVCkKuFY8U z;cM#hy=KQEh2Q`G;s4{YoR8!(&BUG7YT>UnWwU-QKDf&%w#R!tLw5W0cAm#-wc@+C zgg)l@=CMJeEd6c^OR%DH!_yP8_B<t1%og>ooj)OppWRl_Lc{Lr!rm+&O#}YkI|+Nb zeucY>${Vg?xY4~)$H-r1_QtO}*8U1g;n=F~B`A6!__s}uSl|_1PM!pgb*3BaeOCNm z_w~c1(i5zWXAjP3W=+4*YxuG}uX_p0_Jx!7hgd}RE1P<T?Nk4>`^CFJ)j+RhcYe1^ z%10lX_F(F<<fc+z6K=od$6m7Do9$L|*m}>qfc*!o%ySI%PJS>gu2*^aDa|8#!n$L> z8a@RWS4lO$b@eSfS8HYa#rcei^Umm}bLL!p`_g4?sa~bO=H8z#1T9L#%l>RTXn9z< zGs@~p-nCnd`)v-?HNCbh+-bT;BJ;9IPTj<RMfVTL9kj?yk`i6BJK*xJ<(=%CCCiMC zb<4E{i8zJ@8?*~b>r_A95*By1az=5y;$5xB@{G&R%oD!4u&*;{)|{?xp5*(*kE?Qj zr1{J?zF-inl4xyhCiPpaXae8fW6DR<sx{WFFVml7GOKHi`{R(kmnS`4oe;U@|H~`t zH+LWSXwvm9GA3wGkktK@C5NOOrzEWM<8qaVJn_aT@l+<i=k_`k)6X;Ic7EgCR?m9K z!-MUq<&MCa&ay5ccD`%&{6GIh)UeD!fyeh}EZ=R*m6;C{I3uqAe?N<BX#itz)`>Ig z{O7huW~-P!c3(MV)sIbWfwR~+S2E8xP1#jq@>8((L4n8}*%M1;e`nato_+YktMoR9 z_0vrDE~{U=nWKM8qx0?Azb7nonIHExyZB9X+P|IWOO<1`S7a^a^ljneQh)LN-PUH_ zxqLP$!m{=Yz6G9tc%`m^FYMRv(~A->%P#N#yu!QHbf*`)cVFC(*OuGk<h|q;p6~tJ zlbvBSqncA)s&M_1Y@4m$&g<*_n)ChO2}fJD53b)IB-CGYl#nl(kb1o`klABaSEX2U zy0oidI{ziT14^@P82JRWX1_S7DSLgN`AgL$mS#VvZpjO<@|pFgitm;4`m0e1*CecY zcgjZnzqiEIoH5&ai|IV~(2@m3Tva^{%g#U6ICf6Z@Tb%wZTV%T%`YY8n3DK&_@4>p z-3@;5A=oo=&7v@q306`jmvaTA&807A+-k47yfE2%-g%c-=~=ID6=d$+edkzpapR2e zm9KB{{$#xJ>*t+>Dqhx-0@af%vnIx<wC<5K<5|_PG^WmMmGw8_Mjy?c^Dh2d)V|v$ zwQRC`$g6~dhG$|X&+A-VskK_K<>}+EU!IHaeZKI$bhND)-(Sg)DyPWk`A)B^rmX$` znR!ainhr%PnZ0i2N9EoW@0uO^rhDG1bu6q4mc6*AIsbS3`@c`tPMWVOkl_EUbam{h zE0M8jHtY&Z-@9J>z3Ihooxf%B%nzT~B(LLVSWtE##bECIt^akmn6Bhw;WMkqzOc&n zAmip`CaoDU(MiUWS89CxQn~V()P%AHOWVF}nzQR+u~C$H?3bML=~rXyysITLuh%(o z2W5pwU7mAd^OEfCH+O_9zh`=VX_?iYMO!C+J0>voZyAFslR;Q}aC6Mob<;1E9OG@{ zy|;HyiLh?%Da~tYyY_y)k@@S_)_X6mE%`2W{HXP>JOBR33fKOM3UjH=e^>wRwzcto z+x`DP$FKRn?{V^*{R|BDrvKS56)bpIb?WhF0Ta={cEP6G8z)$)uDGnhlesqd65~v( zQ@QJSH|{*6`p4pe)zc>lGA9_ntG{)ssbZes#FqRwKvF59F}qux>&_ng1=k;(J{+-6 zE$7nnY+<I9znUCZ+bZfAW_kKAuD<e=Ut-&#f7OpRrd$hky}LBTtMTijoOf%^p6phO ztb7r&f_IU{V~IIcn|G8Y&%1KJ*vU6g(rRy|Y3k0tMQ1c@9oK&iVKUo!VA^aGhqH=q zx@nWj<69cE7SCDX#FX50e7zp;UuVCITTPy6{<!$~T-%iy>d&XOoZG+j)Jf_4g{PLC zbk04u$*MoPJb7;Gw7cEQ4ljOb`(fd-3jXIsW{+G;9{zqe#nfWwoDgom5YtVSTr-xq z*XqnHF;1Q8Hi6CbA?L#G=%Tug+3u?h-Z$RuExN`Qc=qWBsY}h<wcaia^;m28XinVR zx8Bc^IqP(b?%#X<V4qaxWw$HW{APaJXX$=@O=#fK)Dw%JC*Gfvo9ScH<`}ha*Q>x! zey=wN_HDGjH1EFn#l!6%XUv#Y;-s*7lcGlPhgk<NrO%0c)As(HiOHp$DS>LKJd;>N zp0LzO{;K7UZ9XZrJimN~xlQ;aQ?+aZ^LKpqc{A_-H~YAKe_EDt+$O{D<$Y62C#Pj` zEpFMY%cOHncg5~vEj^Vg2VSoR-B}4s-Z4LvNG;u#=l7J)j`gDKs!6W{PA<0VTd-WK zM0j?xeb%g;?fcp*@1H-ku=iVz&GDF<voB9`xs~8IwNvfD=}9st%Aac=T=Dd{mFc(X zr!FnG=k;yj-<y{mAeMf^RnnGsS9v-2w-r3$mP?;IPTuZwK*DFa+q|aVwuwh2#C<>A zx0hMp`B3Oa^kSyd%7NjTuV1Hakv}(Q!PoRWnWk5rrRMKER{xtG5;<ves>kFW%e$c} z>rFqHR>W>u_nlGk{Mm|{^Iht`jy(sn3jRA!eo>V_=i9OAA|f%DS|gV&JgxUV$J4y& z?-dPUo@cXaq$Y$MFnc5^UUJg!=#KTLtjxKOrRkL1`j(Ki{*Bg`^UViW2ktxg)i%+7 z!M&~Nv9mtPo!UKr`-3}8(nXj2qC3vL&obKMzhA#PwPt0G?1?1@%}m-tAD`V6dTCej zw<C5b``R`3*54~@Tk?7@|FNf6H@rDj)z_Bmc9Xk5I=O32^_7qf^`4zquS|G;?ck|J z%4H|Cg6?}SwX2GWH#)bt(@4UR%Tz9vd4A93)rI>cmS0bZEM1>7*{sOe^w5lpMIVyX zwtrn#tJrR+`ud*iqUH14G<K_P)l%r~-}rH@<of2qD$kl4=@okWCwyJjR`mVY4CAd* zso`&~T4+};Ug(*&nQh`cxA699u^(fZM4nDu<fP8E;S<Yi{#XC*mF%0BmOf|UC5`Lr zlE24sw5oN#ihc9*bE13hA!DTvFUnK0FKZrS_x^D6!lx^{A7?G=w_5r2*mcHT!QT&> zH25DdkNR)<!d1zC!GjfB7ybT_U=^SAJ4I9Gxwp)hJGYkaaIpJ1`KiK9)!Ie>Eo0Ys zHa9eXo4+ZLJ>#8`z`3GBd0&fHJ-PNh_W$!nrmq<_EU(<nVvpF(v|V*8dH%W;k|#W? zCobOAmo`P$LvzNmgtvLO*S`7}z0`fiO3^~*({6KmZ*Bde+4Sh1>>cYJ@&}T1R@ay; z+xvR4x+lZqggIZnUojLu8PHYtU0}j2qvyfG(qB{?=RVkX_$%|V>SP|<*`HTDbSu2N z@+51JqyO!jM=up9q_-c;SRD9$S@vT!v$>LQFRpKVZB<#~*7GYsuKC@=ZA`3sx)J{8 zj98BTTCn)wF7q1`8T0y&Pk!V2J=^P;iT2b5U!O1d`n-Yf-o*;DX)C|IOe~*$`Il8z zs;-24{q9dce>xuuUp=E_p7n$TN6ke)uP053^(}QZS1JAGYiL?~ZTa45SAw@N3)HX_ z<}cBC&ye<;W#gLVT_GFw9fUSA3rMf^pZGgY&~yEL>wsNvlU7CcTM9KZsqXx;|KhAy zUz$BH#mwV5`c+Qp*Y~LX?6qs3@|kSeC(d%vGnX?u<3zbf5P!YUYvCX1_2qZWOP0BR z7wBB{e4&i_wOv=1+Hb$sI5#=p=0M|{10Q~t^Z#^wyH{fGx8A?P6F9s59Trw^c~es9 zk!gExuc6GchMQAW(wDW&e(WB5Kr1@l|Kx_v<?BV4He8VYuTlFW_^Ix8>6~{P%FMEO z7n%7zPgvtOd+xM3?cVoRUQs_9GP(N8;+;MJXI;yCRb5);c|~?j^`YFG77MRzo|YmN z(S6SL<&V@fS&vPp*FCS4>b?4Jr{{XV_xWGvY&q<Et!~zb*#SELS9bn?zOeTHminqU z7bFdiFkY(Fn>PQ$;>ADzrL!Gqywxhp!Q{XFgnv|{-8W{Dg4ZT27cZYJsZtA`m>~OU zn)3#S2B}NaoX;ED@J*dyrs=dRk*gw9-C*axdttpl0tBV>iuYD$$Ar!Nzm|1dwCew@ zpHA;r`4(?vwz{$D#mpstd#kGV<?lVieD%VX^-~jW3q5^iA~U~b#x+~Ry7f0=e@=Ms zYVt?%iNMZT-sa}rUPsy9s#V=+klQlD)U;Fkho1AHNxS9FO?@3R`@$xJ6SWH`J~U%V zHedTu$7ENYmB^`c!h)LuLsmXnbVw&sIwEW87O{V-TJ`mFS3LY7_e01h`stTfKIRv* z90H3i*=L{Lko=!<`nz9yS}%S}xT9VDa?5=tO_yG~yTW&Rj4ZsfjM87OyKzs-F6*&r z@R^iC*$HQPRyUS=t>sq>?&XOKG&wDvu3-@Vc*?_zFLydA&D|Ded5G!F!2;bM8q@Eu zpZxgt0qcX)*A}ko-D~-No@MElHDB33sm^-w{+hYWgKp=2ETz*J&y=<1ay?_SY)a*P zcl|*~g5TX4Z&SF=ywiKXee3SE;px_Dm3)Fm&o_E6uDNKuvCbm8u{PXzg85PPWyV*` z5Bp7RDcrhXY1>YtgL_q{o%Lk>R~l7WUHjqq>vOiOIc~K)cj`|6*>Uju`wx%JAKO@# z1tq?g?$P|1%&o^*d|<8SrGBmVEXx-7%{s?dyU690@af>oZMP22Sn6*nY;-Q`>b%x< z3zdo^=FF;AOmSM8eVr+(HpyJ3^_jZG0X2tw3)aVx$^Bao6<s^`eNuBGkDb!STtDpz z{!z-E30?=UJlK|!XRa(RIwPdx?Twhw9XgEq<|o3B_9Pwb-($S=L9|L-jl#7DHthej zn6JED_Wh{L6xZIrUt^CR(qDdNN|U?cw&+D=>t4-!@Q-c3UBbEEm#QC(|J)G1&6LUa z=}JU&Kz&L2hnyeJ)?9ayYgRS=rg_42!+y1AESHx)T>fAidt7tydOtbc9ZwVfNL>;4 zO<!g(O(!5xCY0yyz25jJgSm+{hJSdjPJMB)>||w*=^v3PnoIgkljT_b?)^GgVmVuB za+&GA%qv#kCq!PdJP@W_R4~8iTbcpe^w8%H7t}R5mn|(k-zh7)eR*8R&4-`vNImcO ziqgJ*VhyjK$vS8AOe2lOiSuS~ZoBg1_st6b&U*J-zf(l#KZtjK{Bd>h`Gb$8j>JFw z7?@~w%(zGWr{9$JYaYAUOGQpE3-w)a{HBEehwrvOay6dt?0@uwVg1<~`z=b1^7xZ~ zw;#Crc|w7?U!o8Hk3ebf*2>~-?eiF!pP4KFjZTYC_`BG8`S)Y*RIOiMxakyGa`QIx zN%1o?(wFZu)i}4s^7;R#JoZ8__p@#fe%xgkGq<M6ge^5+XM4ldicXi$$EsKBWE-f} zo2?f)@o-W{#p0<8bmt2n?$S84aRrC4Ymo3cv12cn%-7ZZ@#A8~edqNH-Q%`&Et?ft z&A(eJZjbrhsmuAk-!PW>u!`-~f`?A|cluBEw$CX4DjXqD>JVD;wsqgv`QEj=bZ&a* zud`B1TefVE>D+1;eXDBUphNQ%jt1|$y7T&0^N>WFulJI6b~YCD%v}8S`Yo5Ee2Y(K z@k!3U_^kP~fNa29U+??=*;l)5g@pOkW;fpu5___cng4H9#U<l=RiAJ8yf`Ub^YV>l zwpJ87zmQ`6RHa!v-hN6x#isaHt+HU*LC@NNN4psqo+aovw({7#UiWub>d`AzO`EOF zehAN&+`Pwq-gVE^txN3H^riDRsJim=aV}F?yz_s$q1@Jws*;me%WYu$$!Eq=_wJ0y z_22hb$LUATdU{7S*VOT}SH>yJ4X^Ix$0|)w{hcYh<K#_?m^(rK>JjQ!{q_5gy$+3f zX&ZfAi9P$`kqc_dvm<7#HD^v!Gk(Wsw)GP4mlvOSUr+wLYXASs8|GfITHGL)`|R(T zcd<)EuWIF9dcEfFzE$aA#Zs|pmoD7Wkev2xj`Uq&pL^l=UNgTwpTEQK+^)LcdH%U| zhb3c8-rC41%$l+AO2UgbCyqL=FMoBC??q+)#mI19-}sP?`QMn<n{IgKCHR6NzA7*{ z#%!jzn)$H_F$cRCx(+jJW}R}aHg#6jN+0&DGD9zk3Mth~-(Q%$o;6L&ZBFgCwhAE! zhsOb7tL?n@cJtdhyUq9e{`xp0&$l}5dDe4(ZAf9{?0WfFnRkuq;x}yCTNahh{Wakm z1NR-K&v`62zf``CS`d=BCv=l(+vIP_e|g0ZJoUZ2knx+V!o7s7q}ObktS6;-d9O}O z%GrKu!=aN}dsMQFZp~3KeOrHjv0)7N+pG)H@1CvFZ{vCP&!qFdY?;4-iC5;T+Xi}U z*ByJ3+>I8QcqHvGzu~1ii!CrI^z@INQRxr9?6V9{_P_W0OkLfVlXb7Z$G&j8{-OGS z|KGAB{<rG?>&t&Ho5#GuQ1+A8k-%hWS;JQh2MWDPTo_H?vqv|?t&xA>v-QQ6C;uMt z6+E~RxcI)#g4V~r(iN5amgjW@wC=j<$ep|TZo^v1o%#xFu4P-8pK4~+9B+uYnqeCz zSsoMg)I_T&`S-0K{rAiE{p0%_JKMo3ec!Yr|2#~}eOJv<7qz*t#O{r7Xz=^>nW0k@ zJnr0;cz$fc91pk7B|j#vH1auB%s=_s=DP>CznG|>#D8V)M9#KA;l&%RrSog6cHNi$ ze9uB%nO{%qzVf`l(v?|@WJH5_O@nm!X>;jB^gUTc}d+sNg7d-lFa?1@&r+hS*L zpu_rg_U3&lr+C|>EqvXi#glid<X+m&pk?_srrh%Kb*VekP96V!Zlz^%k?o$FnoA4i zdXqL>QLxog=TFmGt7>;g(|7i#uqNFmZ?>W&f2VV8GJEFqIwh?<^{dy^<NBfL#Rj#7 zw_aR%b7Owlzk3e~y+6#eXkC_>c#LUFd*FMwWdUb?YCO1pYX3fyAntDxn!7jpoU3j8 znD``Z&s>GMtS&jCWlf)N?bvbfMUMLOFTTf=c1q}Una4C{mTh>j@6gv+!3bxGH3xT? z`t1&EJM%C0z3E=bw<&k(CFH%AUORQ2=enilyh8J5M{oEYZ(HDbWA3T#PnaIo@&D*Q zroZ0t_vB)0>&KpMC1DRAzpB}KYW?%xkDH4B$Hzz5v*q!p@0b3)yKsN#yXwZ3AD{1+ zIK2Af!`8JS)7E~fl0Q*A_2jL26`YG>rTW+SCY%UZbI~mM&CdN7x({ZZO1>K!8Ipa3 zXRG8J19M@EB-x+qw5%?#bGkc8Cg}Q?JLX^4yenzgWWQbS$zPr`rWU#Zvy4+`oS(W{ z(th2C>GD|@E^+uM=5sVZeRyZT_3tDd(LIuzS5Jr+IACUydb!F-tlhz6b(Cph-Pe}C zJA-U?<W5b@{bObNuK!4__m5Y5_<DD<Ugtd(+y3hHg&FJEW<N6YZt9Otj%nJi*|A^Z zYy5+ptZUQmMsCZCFkuZYx>g{U|8LGNo!y^33~EmB<XcEzf3j!&DRw`8jrRwu`1O_= z#m<@0bC&g8Z~TK~4ms5wbq@E0*H4!Ec(wWX{HEX4%KN3K%O8y2=k#m8bp2lTQr|tI z&!_b2TYj{CTXUcLH`D(r+rZVcmQ|YV<2z@>8Y7jq=)tzhEB2J}?r6H(lce|fGN*<0 zckyKHslmZg2kkg~BxPsJ)zxmBQk{I~sENkCl{dm)K5bY0;SuXDKg;Y)@uB@{+g`UZ zPT!n7{fK;j<CpKpel9imzca8{>FTM+_7A`FAMZYF^3h6DuCSufUg*#F?5F<y$Mh$E zEGnzxuh2bsqx<LY_g3udq95xXe0}oAr}rQ7___tlA8%wi{p81!IqANKrkQ&DFYptO zD1Lf8;%C~qe@u1lmy`DVnf62O;9`&B8avB>>T{O{x1Bh)nC<%grcEb3vZUsEo1L3} zWbwiG{l~5g{rSDVVDk}E(??4S=9lZuyLtWCrjwk1YCPX~Kakf7>t;>g?DsirqY?WV zUOSrzpTdR3Mc<SdrU(RB@nu!WCi@+;QegZZYsX-(vt!P~BEKAFn_n%-M!uiBt2kZl zO|L4=t2BG2`(<OK`7>)C-M*8t`FU&V?E(V-%WRhCt)IU8z(tu_vuDv?mi=Au@VnZf zz{9m?r2CHjTJdyV%-I0r<XWcP-*+CJ5HiF4`U|<s|HD{SWVSq9d_|hCt0Mo@p4rQU zvVvY3Ep5&$-NNerZ+p3$OJ<e)z1f{HPre7O{?%jC(7)&$m;H<0`i_r<0o|7mZqdlP z@@<vL@@su@Ml%fZmZg6dI#}Uk%2<`Bw{@bqudMv)#Owyv&kHoJ=LXFRyq%cmc=Fdy zkqOu9(k{IByeM^WVd_Z_waGpUwmv9i{wKGA{keF$O?F{V+8rH<iTaLnOZvaXI@E^5 zuGTDFd6XfWCC6y7HE-47``y96Emy4Al5qO~dw6qD^R7c*UNpCCeiZrtx!j&ViznWl z>27FU^Gq|+bFu_W3qy&MuPO7Sinlh4WB1CQUb=q%yY5m3huDeQlkZApUD}+y_}xuK z=6wv;ZEpy^R`yM@$nC!N;lZwDl2thyCM{SYt7GjWTfE<X_dVxRzy4-_|NHS`#>tKE zu1|@*KY8=3X9qU=UjDN!YcF4{+Q$5<b?s}+x0xS(b}itp>@%L_@6MNIs|fS%Wm-P_ zNme%Zier+EP4DKXwJ%i<6RZkLZMmuWpjQ86^AgpUEalC&o8ReQ$*>gR%yH{%NczFH zuT#rEe;<F@m5UCun3L0e7r0%WeC^6apQoOex|`lrXLlst{hqGla(4avf1<Njt8Emr z?F*^b|5fW>xJG90vOA4p0u>(&PM$Slx)jx9X1SKFnRVu|-12K&%UA8VW58Q|{Mx*E zOxdP2x<8i0=^WaT<H)=Gt77q|gk2WjPuSRLz5MN_^y8D2*SV|<-{v_Oc^=E+b(OoW z=Wb;^uV-Upzhc<kRf?Y{97&4nZacEv^Pcunr&|I4rzZ5@YbkH2$mmOdU%i^4@S(-u zS#~df7f8ITe*cdD!h`v?ze^ZoYpedV)&8r9*j@51Vb;^dC;R`Mj{5Uofk*aXnce=n zCzkHE4h{P_7GHjRq4~-#wnJ+sPTDO0fXQA_T-Gr2;T0`|hFi1QdLwRZTX$5i%O`uT zRD|`Wn`#C!t9w^Un6du<eEvgnQ<?vqF5@1_;~zXjD&<*tWV-*Hh%EVCV}Ehc;;vgP zQQ1>+e!N&zp)zmF?>D|xyDy||R`+c_8?fxpy7ke`D_IvGd~q;f*FVi)ij`q%#Vrnv z+t{52@7gdF&-7dq%l|bfaqT(jgZ)=_sBW0GL+6&m+EW~<`^0waD9Q>?$eiPz+Vx(| z<<%_F#lg-;kL+ojKlkp#UDluXCau-*-)6RL?Z$WPlXRqli&8>9slGJe%$V#GbZo1Z zvGJ0*o{@R~3~Ls(EjoCLA%B+Z_j(=Kqo#{}j^%aQ^I8jc8Cyp`4dVLG_=m%H>N($C z2RL$fRGNKDTyRf1)&1Pv|Hm5?I}Ely*peN!dFJL;t}b)_vhr=KPM$GgtGU{jz0h}t zlewqRhv2e~OCH^P_oVI~ESqM3^s(TRtshI@-`dRaEVAmw_ho50GNQRBmMAUVA=7u8 zd71T<+QVg{@7`Y8p=W*jJ@0S1m}|#gubl92(#`t0H|tK`iJS9C!1vwqZ{K~i&;8DQ zwofIqHGBR7mGoUH&(`-|7EkvLt@<O9<D7bWoo2-4Mw5gqyUhyRC#(9fnyw7~XC^XL z!6E2a!|Yn4_E~0oGYe`0li6%|%lni}*ekX!moxv>IJIx@^6+zR24`Zq60=SP3ulzw z5;gx}cWC<Vq+8D#*3MoKTW|6EswRJEYo$oAL&B;pX=}~=Ja1lGD*pNOCEwnn=E+@6 z9}mx*WccKO{$0=d?dnBws~ed8C+uU>4fVZhZ4|dkxO?N0wyA1THs|CeZYN#oKUSt& zQF`xQ&mXR<N7y7}I*WYk6y>uYZ#`IPT=aHg%H9uI9>Keo9n)9$b$I36{(Z{AzlmL2 z6?d4=5VOqKyjo(`vV_{HpR4z={r`1%#ee0Gw=alvm#);&zH(nQ`KhPyoVBdK7d<MF zcycDc+h>xO)ru9D4x0U9Irns7k&oeqcYOcT_NXvkxE|~Jdc9tL_g&%YwiyS*9zQvl z$@eGa&kyB^S&vUIsP(pdl$3vV@j;&JPmVm|IV&Odxc_M7Z0-AdKK|m!yZLj+!N+>* z#pHW_FaA_&=*N0Y`p&NNCw{pqhy6ELclO6Esl!~VKR@$Go;zmI{p{U)zqJL?&9}}s zTUx(VTJ`E-&%5o%wy;j`-gx%>=Xu8^c(OmdJ$!=sNnp?h!%Ti{z4Ogs591PjdoLfA zbQ4vPzkaI5{F!-j-Q+cI0}u4S`FiumiAmfxvy`~kp4R!MvSGie=+R{R^4EpmnC^tu zpRkQ-{dY}!k>W2A)7e~~^jNp}9_^l~dGDoZ)wUfPAJ=~4ydPLtVefo<`I!sWtp6`K zx#xfDSKD>o>_dr<&($48K3%=)cke096MnMz2k+&|3W*tR?5g~>jiGa8>vE!($^Tke z_jrPQO<HyL#f0<6{;7XBc=d|h#%(2sqhCbbmAYh7o?vQqbSvY|%l_XtEcZXB*eft0 z(YDqhq(rEzm?txqmyv1f%jc82@5P4OsmJaO%dtKAU`O52wZBU`Y7HYc%(}OHmW83H z*TuiH44$ps7;0!xYog`1W|xO5H=|$Z(JzfBBg~FIYyDI4;>!Q#UuPIEY`G^R>mwK( zoEa*-Yw2m9b_2g<QCnToQ~mDVK9&$2S~7i=>Emll*<$Av#ArYJXI1r9;brfOSF?Ct zD|}&d?*CQ2L#k&b<8`;puGX{75;OLh1id`)HOIgsE;-{yn3j*)<J{Gg#6w?COlJ&s zf9vg-mfoK7?Wc?l``<}Rl_aNqm(pUZe4kUze%r^PZ|&ckrw?3^o_~*dNi%D5SD;>d zaBceH69?lnl_eXMcAWE*{-VQi=kk`%6>jCP8<N+{zd5<&rNcDmd0W)7zI2v`#uwb# z-c$Jg%KL>~w&H*1MR-U}njFCq==|xn62qdMuk5vV**z{XSnw#bYqnR%&0pLJd+)&3 z0$f<2qWU;BW6jDU^Bv;P&$F#PKKET-%j_8O?ECe<_Wfefw!Zw#z~4;#@?rK2XLjZ_ z_3Kx&8C<UxyK&?C|BG|3)p<Hi$~({g`oZTYc^>xn^A}%!xYxKhD_tRSvw!}Kf1A&m zEZL%!Q6RzN_Bz`)XVPAkq<o|OcblL1<xQFyeeFH#$r$gc;^(hOWlxfKu9cMFcr!&| z^}+RmOVpONL~!4le{HRizvHfkv*&(SPY(CuN_ukA=<fGrwoE5;BCLcrzL#CQMQ`E@ z)?DMD729kwe%c$Ke3Y={`=akZOCJYcuCHLQNqlrK{C~I_L#;=@tt8{c>uz>+VfXLU zzqmO^UVoW<mh95MOBBDbUfY`a)k5I$XWy3}I@SL^c<!<P@s&w(=YB8DE;?tvAU#Fy z#hxwww=}Nlnnbz>&rT|8Sbi{~X`|&&rr$>++@D`zyA#`9dB5eT`NjS7Cvp}z+*_M3 zqPwd(b9s71v)PFis_HA6Gc*N{6`5b#eNgT^^Zr>}7q2kME2t^YGRi%E$9!(wf(J%B z4{R;G7Tfnb_XSV)GS&rYXXZuCO*GcC*Q(~V<M<c$@P3}rWs3+Y;Vzk)<B<Zd?5j73 z>Yg!pY<S9CA!fD_@0*3KHTPw*J3GCK9v?T|ai44P!PB=}s)NLybNuA#-@G}Fxl8KM zw1qx?*-QO-dHnBfHr(nL<!;%gA{%OSapShUxX0^s&Q|$Jux2lc;=Mb=a8l8k^IIn# zI=N6|_BFxVrRBHMDss;_7u3D{@=C3F*+Pjz{%L!y@An<daEz_eYGI$QBH$Irw5ziH zck#z_S8go4;`aKOSEYcg?%59!O|~lqHnZhs8qMbP@Lu@tSZ34ZoEtMDjJM>e-4I$c z`Ad=gwBDa`F_VlZ{a7oSqdjMqVf*EE2dDqv7<9k)Z@=)rSvyK~|8BFq-aql%-c3^( z@~u=R@ojo}bYuA8eX4InLbB&a*=A2!8CYg(yi+oB^0PMy%!x%O?dLY%ZC=YIqsa8y z!Ru|SjvDX%Kpkr}UsoA9sS_`b_SJf{PWn{zwz5Ii^^;@&=YKg*mei(lTe!yehl@Ht zc`$DZyKUa0cdouQHZdie&$;dH(Q;|_^X)y*?zh@TW1XVpfd{>x7wq|Ao4v_s?ZF+{ zXYb3M+xK;mZK?UAo|wnyCr$kFcG{-wTa(YsxVL3_&e0j~-L#J#kL4}>qp>ILxvAt) zA@87=c&3P}DeI#TD@mMp+WS59#h2IK!GB^VA1kWjTqYi|j#tbg{qWhJg}hPaSGEi4 zgsy12d(~rKOQH0GGR|XnHcUEE?_KlLbVqIOl`B7PNbQpj>#6i8aGJmRoMoq2G{-g9 z`^8Ig0)DbM9FKG1U(`Kq-NbENk6pj7YzbnV#<qWo+o7%Rd=gS-Z!z<;?6|md@1fM} zIl4PUcJTV0?w!N>=~~hq9nYfBP>!oiDZwqz?L*Gkn1!3w8fBThT5;01`oM+*(Gs7< zlYcX9*N(|Mrpc&o^>tg}tU33k=BTIJ9lkYZ|3CFD?P3-4dVc2gI3J$0*>(EXEecTu zkq=7^uAQuOdAz05DMBstm%B<khxl!k>5G4cHSc}bn>A^QYm+;#*1^@5&$D`F3ta7Q z|Gd?6RzdEu``kUdU;I#=^22%Z<By3GrfxRuyL)z?pKkuaT`M(D%f7h0L1{{Jjm_ou zd;9EfyDPqyEtxl|CUsk=$R~pozw3QY9?x?!i*A*_ezWjf@WkJj|J$p5bieqt_H*Xm z2)k{&7CTrwG#}nCP*r?s_QS>3vi5$oVQ4?Bvo?RdKkti&bN>4~&swZtGWUG@J$r`( zj_c!}xG#A2WJPM!YhH){yRWJ0B{|Afuec!;k*=#E`Xu!?=aLuyh1jJX?$=A~-dbnR z!<%tx-S>(M=T^V|&G*XqMsQx@yRKVVzmm#ab65Vn?(4Jp)s8T}XH7Szo}D`Dp$A`t z5AUZNyBMQ0dVgn}udZ3M_*CF)&oZV-FGE=hmS6bt*<yE@x!h*Mmf}lB;cuR;TUJ$+ zZ2a<4@#XiHJ&*W|PlX+MA|Y(R9TU0w&acy5MF*U}pN?rO3!7>h?^Yq-bT;wEfn7Oj z{paf1Zm33|(A#_<%j;Ou;?oWlm)e7c6(+M8nwEt;=aXHsYT+)Ow|~E;SG!&Qx_BP* z$?nHdTl3=5kKOuVa{Jxuv=?uL>wd*M|H{mM#ko!Q!zI;Ce}6fapEvJ_J-ji~Y|Za? z4f85DSG;=ra6!rHhoyWBYvLC(OgeC`=?0U#%8EZ$UuGRCm~h@TckVs?S;qd!$Mzk6 zQ$1aV;q!}}$!YR4t|e=IN-%sKTp8eU*VnLk`NfLAw`MHfc>mYtt1Qo+Xs&RVc`9-D z{Hb|r&AjuX7@k{NKa?noy7a*DiE8yb?Rzh(O5e(^jhz07!^WoJz#Y@K7a4ak%WnAR z-j{ycdO{_`m*c#g=3bxt|1&jZ%&*hAYVtwK+IV55xfS2Z<h*A&p~w0gXXNzNrFp59 zIU8RKy>x%F=^}|R5#7^oCe@}c`DtF+?lLj($H8A2)yeq<ng=VJKODQ?czV^s19meU zW-PT;jg?%SYioO?;?xsnUZ1<a<ZL-sd}8+axBl$D|Cb+s;^h0{f8(=*h24K)j)Dy< zA3gW4H~W9Q+_{7C11Hm;&C4F#d}2S5WuEVUVNZ*Fad!9LG@7iK`EI`c!sUNvY>{6c z6<@%<DxPb}H=XCEFW0N7Sik=6{rS!eXY+ebe-CZrU^tOBCAwgz^l2Wu%)kmGkG1h{ z{#n^<$eFQq`Ra_-lcZ;?yigqC5ZdyjD!5RIC0O`Q%A&QkZ_XXRo7sQt#$-Oe_B$tz zy;Skde9f&Y|6=;_^uF}wO)MK<&gxeexgXf_=F}IT-VX~?b3`BUTjV;<ldkVRb-ngM zYC){Izt*Hx%M`MWj(N^L9I)$4qQSQ{C%uY9<_0G24yzGPlDRokT~Yb}%_VpDr&LG^ zKXH*unAiMJ<>-N}2e+_qe);cr&K8dg{Pz4aHcvbrcSVMK)yuupqB+jKyR4HvA<Dr_ zDQLQY!rA*wc01I#)_T1@mVWW#s*UdgW*7S<B`k?9_`C4ygkt6J8{(q2m3cktM|>(@ zSf1nyHvA+y&F*c-i=V63+HQWGZ5GyaN2=Jc?a>)V)q`6@qWCI|zZskgZH>|Pjartr zr}x-Ssi%oHV#`J5>Kx{H%k-Z4&k5dhQ>W)9#LfMibY#D!bIL8dPmhxyy!|fySiW`o z>vKlwa>=0!pLbRlpZf0g#`WmGB{iWo6~z{Nt=3AtUpsMgz_+lg1ydWgwiHb%SJwR& zGx;9x(@m>0qIMsY7kd+IkW;lxhrR6D<||bt^OBu{udiGBC9h97%TM{&lUEjR`<-nw zZ#|fswDN|ZA?u!6u>*ou9;Xj)(BdkY+jC1~|BP9O)r5Cs9o(UP>*<uadOySWZSGzu zxb=N%^CkB~O@^$WC61*0k$9-gdf4{I<+LA%f3DDSXn*de8-Dl7^1RuSud}YW9<zAO zm+xF4nJC%w`q_=Un$~x+Hl#?L`|!RvdDfiPgzOEe3GF+~u2nCddTe_5<I<cpc{WlT z*zeo?5Y&6M{@`};!)edAnJ>GtBjx$whxeo(PG@^A))T*4>YjU2L~n71mT7(AqwEjA znf?Bs{;5^dX`d1E-#q&LH5JdIH{bu>QT`MZde_#tJ2u9nW0GWQ)y41s6{>_X7tQpT z-1z(f!*1itcSEO6=P0+`k^YrI<xIoDb7A4(sc9}d{^#G5y1cTWZk6D#m*+}N=UtGv zn|d)P?yjb;O{3n$oNfW*i^WNt)jIE%x*s%Un9ef6>VkUu`g3K%uf(d48?ZD79kV%K zcJR6e*EXdqs{{X~3BEEu_WCqKn2F8BB{364^ve_Xinq-UJafq3;^>@r_vU_F^JZO+ z5YH{|#`8ftc#nOLOc1X#=bm$Ljj_OFvuQ_XYVc&UtorwCZv2s%=}YYne~>vJRo~5a zy5JUr*)hqAqNiIp*WZ;4U)ZO3cCU9tW}DpgebH-XPP$vL{loiyDV^81Y~48GS{}+| zFaFQANhC^h#rrw43}c;nmqcCI=&Z=J;Y{<>PYjjWRlT<Z&k9!;um2}8`T8c#6^mWm zCOF?`&iE)NciW0_WzqzeuPNOM=UQh736wfB{9xC3am3DW>HW*LQyk~L-eBEvbXNFB z_v5cKbEfMo>URkGxsa{+tS7@=`8PXX@GCfWFLRE0^ebXY=r4bvsPnU)F)+(9G`Qs! zOi5mQeBVRoAGNxwyWQ0q)GZQpC9PQ%rA)l1g+6p%q#gM93k%CJ!+n>h?JF&<Z>eRS zB>38~OJ%}j1!qqKMMtB}0dF;4zU`Oi4SO#?YZ?b*U#aAIch)TSmtu-JlMQ-5O1_ix zJ?!9f_eRVOpBZN#t<iE?Z}2W~!sCs{!@S$fUtd1ltf#tewrC}bZl0S)(WXsX=P_R4 znp4d3LT<l&Yv`2Iwi1uRm^&<wdAqbZi@bXj=s#8NF<bwGEq8@}`(16$F!;su!Hr@5 zQWxWtly!}+evC}d9d~jorh6~(km8Z*YPD5YoU*0iMB&Hkmd37SOis-yA9O!Y-qbg@ zqk5ebm-^Lyweu=B?k`*(mC(t4gKy>T=I74lRVE+yKDV3DyE6OTU0bHT{vR%$sfg)T zyngWBV$S(dLM6KM-z&~jWw$$ZQX#gFGvv3J!}$k^oK`s>qjOXja%t^MQ@x(tf5&jy zn){~5N_T&DxKPt=o0>0|V}H>gdYk>Uy)3)!IgT@H+?AT5nl=6T#h*&Y_6gi{uw5g( z*LiO$Z(ZZt4IbVmcltfUCzVch3qG}xeHoY2q?7K<8zxKnY&y{V<xX`&#_r`@OP>GI z-{@Frw%Kn&^2Y}*#`Qgg;?F0lKWsmv#dvzL{gy4#tyRYL+n&sOvM|gtByy8<+Nr(= z&C4!nG;9`3KlY*c;WqB_;1B0c3!GQAJ+Q^%^&BUy1zt=~7B7<YyYXrB=?M<6)2^_6 zmr^)<ley$)8N(r=1tRkj79EdNv;Cdoxpk?9bLclIufUTHcb%Vp;{W?&;e`Lk@BM4G z4!8UD<+x(um#6Ja502OWTW<f5oz+3Eq5X}#isZKcj2;Skl}hgRGA((>7s{FY2o)|n z?woj6zUSY^4Vj&@W4#pI&nCW6{3y6+#S1adOS!MtWG~-edTwi5z0-lP^jR&n>jeL7 zlKQ^e@E-T!;M6L;Ip-dl2lh_nKAtEMH`n5bj(MZ0ZQ~`oH+<~I7eWmT*?cv_Iu$nW zYyDF>d+K+socnY2^8@l_UmA#7#IjgwUJtynYD37u@EKPn*lrYE-g{r_>+Fv@r#=^R zYEC=awxuH=?D?g+l^v0<%0pKix-Pme=Hbnr*EcJxJC8hnbaF%9p}%)mq(A?%<b%+r z$h(KuZwsx6pS$wF<ks(HYrFpMEQpq=6rU%)_>13ttM!u)EuW~r`s1h4=H;hOPcEnu zoEG%s+q*sHhriF5YPEjubRnU`zr|)B3z@r#HQMCdxtCA&EWY#3Yq#WK(YiwtdZ)fC ztx@wiD|!Eq;HpQxDGa(dzd7x+xSY|!y<N3o>Ai<(fgLjJf4=%g%no`#_n_4Cofqu; zdD0)&Xw6w&oUQ7%bIGH_PZNG@UZHV-$A~lQ;2VDD2*E!}Q^FIgO5emw-JA3L{D(j3 zKmNEsy=}E2_Tas_b>hD?YSx`PIrnAS2JWvS8Bf#B{Z!jya<snf?SGlb<;V8_iIx1n z`P1i@Xa4s0{t^n>w_jKJk9z7K@#MePZtl;oFki)OU%zV3ex5(u<JsQqHH@*HHUH6` z%RfGUKezuoqkZq6=^HmyCQdmNBwe0AW&6W}TwfI@Jz6Sk)|S3_j!w<{`)u20+jJ#G zu~_vjHumrHwLS3aWWuW%7Wv<sYNRdlRgbj_y5^h@tU4YSzS=&mFq}8k?>w`5lb5i8 zg;V*Rg@>y2@02fPey-+Iyn#8J?Y7Nap8uK8e=BV<f4W87<6E3p3JcF+#j5U?Jaeq; z@3(x8O?n^n@E+Ii^$V_Q__z6ADDSO(m&TKHCjI&UztT0o%%6Yfy4?LC|33RRvCTKu zN-p30@wEPjcddWL$`+bgn;kA={2knBm|^kTcjtbs+p&q|?_}@Yw=R3VN8!)zz=`p5 z%@~V+?0+itN>lPdk>Ik-C%3Il?pt2Bc=5jb0Lx#Y#Xpyw{o!f#|10agRYw1x#oTMU z`Sb9~4R)OMzf*E9{oEAN_P+J5_4eH#FIyP+9m+M0tIxFwT&eD=(-0laoDg{S^C2hE z2hXnXCI3pzcNbI)%<vDLa6N$U>aWH{`N^DNaSwh<ZkxQJd`En;+sD&#><>#r^TN}s z-p*m`XLEjFbMVXLkKa@e>|J<d%B27Qp8Y6KtkL#4YdQVc%v162=jL`tK0a^uX|F|< zkza93@m!Tp9NW0}%qsq+W)na6W&Z|y&HDYCd-Fu5eD$5k8~1O4&EJbJn_Z`!yzX^d z_1k7yFX25B)jVx|O7(`%CO?#7oRAavz|VHZ<-(qo47n_^bM_rQ;iCKDlcmH))7po( zWb-z>3A{1q8AILvf6sjC?^^JloBrS6!zb65!H@IizUAA#)NqH<7NN&d<-AW@+!N;b zbn!Hu|Cb=Dd%fE8z+Uy>z2@#dGkj*a%rN=(CGVq^u|>6yL*%9x>c@lR!Z-paXzudA z|M<Ji*_nbzUo!r=&cf)kSZ|_SPRa`Q=DA#Iv2w0K7pFXsQvBF5q160P^&H-OO$Eum zDwTfumM+Om-Vg4Ek(Z~}_i!ppdU2FRcVFh$4pK{>&ZA`$r!F<Ok1>}&`axiEmi;xM zg<)41QuuDqox7NGruUyS^MX0ARHUqz37cEhQ0B7N#INw$Hn!ik>V-U<Gb&7)_p%vi zGcD`#zxbw=#lD$|{l^!Pzh5@FFShYI@ielhwsZD{pu!?M?Y}!Oq#5zvPwbwfnf4-B z<X0~5QU==)ejlc<4A+<zTvB}Zbgy=8xA8u{L)W?Tx1V5{#TBD}s>ocg{ILngWy@uL zQy(slG%EgP`|9>#HO1YVbNucn#rni^Nq?N#eo=9`!%Mlz-nZVZ$#xH$;l;#rU=ORY zjOSNIjR@vg`)?<oWp1=O#M%G+?>xH~LY0!=O|Niob=iD>S%mYegXgYAD*M_CYM*3V zSNiZ*Ucu)XHVXvroi5P$_h^?_6T>~@M~jZ_Dq__xuy?+jkRdq5oKHx2?zR`3+LS(M zPKmvy6u)o^NBuqim%l!KsJ6LYd#00<)h6wA+WUFeT5NV7_G2hx;ZxgSrXsMHYm26+ zNA;>Kj-xjxH$E3>vY6L&Mw%;vNg(!8TWFGu(X*T*CesAdi;{obKBvbj$-R}!nR{vR z-Gp}r5C6PQ$njnwu=|MAtdq5mc3e2=kR2C)X<k6fj4h@I?Aj(TSTgIj%Z~R8Ln5Mk z^yF;ZMZ1^ZGP*WXkRdUe^V5c^G`=Ts*X^f>GP1RQni-PDweXRoT7<6ig4vg+pUA$z zB3sV9`(RDsvF;7$rkWQ%(S6n8lrEB<(R=^YiBBv`HQ(l4a6G=DYp2`)m%8t~@ADdS zhZc#}l$0=8b3QLl6i$zwQq;XQ%Tm{K+l*^l)9gI2ZkV2L`SIBI3bQ>&Kd+Kf-qP;4 zWA(<$^hGvr!q_7#C%ol9`uF0O=aye1-W;j2{`FP<Vk3WI!xMSV6Mru6uh(FZGpaZ4 zoAOV&G+=Y)e?ggw8w_WRXDD3o6+ZuS2YZJ=`v%$W3!k0`D=PFl9QiIkf%B@vhw|lX zZTaTpneZ<wII;8VW5q!0<3DtKUL1Xqyl{WZ_8lRKbCT|KOiSQC!eqq#GpI*pv)KF{ z-y^P^<vc%?W!H}93tvU{d{KKLwE4ovirV|hM{ZRX-8z5h@8p2+rSCR!u8>f#I%86n zx;?@5Tj+~?LnY5E6IcECtQcszPVUUHOcvQh>6Y)Sjn+>*5$B#R_3&TNkAG)h#!rnm zTOK3ge{7rf8m&2YnG0sfi8XI!jfgp$sq3cExA!7v$@i4G`mFzo0`CQQY5!P%==N)= z6)yuWXwLlaXpw)cgm>C4edg;-r4v6a^u5UADiH8SW-a$(i^~EH7hm5`+-<7hWd3Dx zP}jw85?_sZn$CR`c<;Nx_6F1asejiRc749w{b5qnrP`m2xiXV0?GE3Ya$EKe@9I;f zMX&aL{<7=S(zh@CjrV45xRZAy=7#Mt&YRVX*U5g`AkjYOZ=Kc~F`jSx%D??Swp47F z=qwKZ{RjR@z7jq&IVt<$U$#_(Yv=vyh1zN#>^fZY+UL>?c8#bBwp}Z~FTMQ#-p?=M z$v?uMZlABUzIpTiy63Hjp5KgERh)b3<bz-P#kS4oKE1Z+{LY(cA8jtTJYV_YwfMug zug|^Yo8NZo+tLlui#tAk+52&F*fj4%87;FW-eaHk98}t}c9YJbU59pZFLzwgedI`M z)*jFPrl3a*S<mLUcWR3GzQ}J?GU)4?GsR9ayL8)f+1R<8#A+_fPfA%_w1O)x`MM3) zbq0}S-`y1=KDuvBS-7uQzj<}#IY&-pm}|Z15(|;TD)Sy*|F5@4|J;^xz2?W$PgVP} z#Li7Lc;}v2)&6l=k9w-6b#`;1E~C{-<FNiK*WWkAFZ?c{Z_IOSsr2c~4$RB)=gzM; z*1KQ6Pk7su&u{+J@!h<6{m$Ym5AP-Be5fhhR%{UW{^T2-^XIlo6-}Q|KA-Ec&YW|{ z_Le*gy$~1J*(qCJX|9)LGnaLC%WW}X?HH$Rt1bC9Xq-tF>A0`<@O13WIOi^No6>Dk zD=JDC*7JWo%k-zrG^P7v?fc~pyT9k3+a$5~V5ZKCcR6P_9F^St;nN(gS!p-k*<>yZ z?Gt?DdD&tA@j4sXNkI-~-A#TALU<WEHe{X*KVCmM;AO@MqvO*ibH&{7pSXXK?6He8 zpQS94wJWVCeg1dt=KTjP+$V1E_u4MiI#2rA6uW6(+N}5gxl-}-Nsiv0f6I6{Qrmfx z%@cQu=$);+RTkC0-`;<U`17~Fy(+b9UQM;nJM~AqM)Y|u<GtSaU7OCGi(TwFPv+Tt zF1<sgjc?_6gJhHLMr;yz_p<+N+vhs-WodKRX3R^RBcdzi>fLtuCC~P(6N}FHX0Yx5 zw@V>jdcV#&fB#b#xbNSaQmG%3yXR)#qA7_7F16e82u{#icJM=n$L?&g_ZjE>-?zkA zZf;m&WoB`B#gh+mtCmz9Sp3Xl?gGC+pRLc{ygRe*isCFM^&9eniJ5(0D#G}m9aH5_ zVRBg89$+-H%2Fb@f0=7g>l1fo$EsbQ-|uQ%Z*%BhpU8i?zpCytRaQowvQu#QId4tM zPmK-UX7a0!zwbG4(RS~#X4mF~4+&ede`-kWm7Z4ovVUR&{{<$w*qVP|?M=SAHrs}t zZ*Z~ybM9is&4qmyH*6K(PL)5Je*MF**YD0a+B<r>Iw-q+s$5|g(vsNq{eAl*Z>Og( zqkBHjJ+9DSCh8-yx__3%zVcty<x`uVq$!9*$sRP)KfowonPRu0Ix6*1`7HKozo>v+ zE{|8;?^$?k?@KKoi(=zE)3l!R(l!qdCah|Y@?G5L_V}}-fRFOIUWH|8;>V&}o?T_! zaroOa4|6Zy2`iS*eXZG4-*0d%xbfQ@#cJIvlS4c&=)Q`azT!Av<<w{f1N$Z`#uk+q zb5r6qk4s7)=t+rdc(VVq(Dkg%JKkHJNS@>$%JkxN^&{J<YnbegeEn*ARYs_NPRe5? zXN`Twgv40AqXP;hX1O+e5i9-CVvy@}nSn9oGe@5HA^t@(r)VB9`ZRC1is!`V+AC95 zs`kxt&g5b|HdUo^7F)o}AIU<;CqA6Gn|-bJ+8@j+mK|3bcU(K`^fBe`=g8um;vLqP z%tU6e9rd4@xN4!&!H?T#%rN9JoXFj2my&;Rg`C*D_N_*Y3ac6aWGNT1uj{+N*nN{) z|JVI94w(L$q+pZGD^upKel>Jw+nR<mpPE-$&TFoVIWKi^-a;$xhKu|GYpnm>T4@?$ zZL>yf;gk~LvdI?n=k?C!_$^j8BUi|aU-aF(Qx&gc)RKRTG``)R_3-D_8CN2AUoPvM zwNHb$Kl|Z9UEb!!tKJA{{&Uu9Fe@x+Vf4Oa-r#-qjFqQCxJ}4L-S5R-SGud;J67g% z+C-;h*&b6*Yk0D;UCzt+_rmvf?|v&YD_m@>Px$t~aoztP=O-$Dc>G#UlA-_E{p91; zhf;OsUtx~ucxGS!lHcdw!4nVvJxtf$s3|Lb=5ev7*<q=Jh7MsbHlF1PeUbL%?1tS3 z^ZIx0G4$UWu*^xY_Qb+HLYvocu3Y%2$NA(G?~^~*ZOmM8`ta?37VVqcGrDFSbu@lc zxVieP4Tmk$&NG+&d8`lZ(_AAcBbe->bn?rUmTCLu$2qSPRdjH=KWSr}XXX6OTRuGg z*6VO%e#>8()~^#!yb_4JoReY3zyG3QwV~#ou;+1(+YX%<Gd3&lc8zK@;$C)Yo50HH zwo95*KOA2nu6;oD(2kUbv%SCb-ClRSJ#<_423I!=Q}rzF=fR0*CYm{$vRNe;ck!L@ z{8%g!o6P&uFZ<B8)+Z-*0}A%H$LH-l`pn$(`6m^g^u()&X1QJp5mGc;D9FBhio^GN z+Aq}htoU%r>C=s0jfd2lyl-&kh`d|J81*)x_+gpYwd}|I-&_5|AKo@9czx)7>he=3 zwy)c>zx>(tsrM~KLVZ}bCAj>3_9g1Z(aPJ>xo>^e8iZNQefZtJ^qalp{d1>oO?k?@ zZ}!LK_cnHa=6(8)@4ViW`$un_-sZUb_u==I;?L`{d}e?C<NG1>A?vT{=S(EU#lJ<f zyzpVO)3mev>n(Dxw)^?ZeFrK<=W*4@CjM8s!l!jAHDnFP`}|`cUe)|sUHHHDVX0V@ z_KS!OCwEMp7g}qQu-sFEJ@NfZ`~Bi=D>wHT&Mz%n>esG*KhmbAvsgSu_*JZ=+wwWR zudi%88KGTRvF;(~dZ%+0eatOW{_j5W-D*;~>zp_zMP=J7(pu*(vCdDrYc71RT87L1 ze(!0Wf<UqGb?-O6JFXe@EZWdya`URRgoMt+$#+@zYtIi${3#=>TUXu9)A(6}-TVE; z1^V92)@Ouc+B_E5Sz2D_uCeB>X?-ZIaO|>hO;zLaV1wVf>I+56+YU-T*U8!S=+PQI zAC8`dZ4uATomTTnPv0l8{ALEz{e7a>wsQ#NoUIgpezV8Fn!$Phu7dk>pHD8Hb>PZE zN8`o!5~LEWxcA>v%J^U+eO~;B)R&TvUa++QySTTpz3xp=a$h*Ja8}Fn&7Z!mxpOV! zRruG0<6bp<n|G|gEV1(LcH4h?H=KeF>GPOM%~w5qw9ENz;fk55k2W8#SReGL=9Qnp zgVl@g?wBJ|$)*4HyW<OQn{c0lCA`*WrUwXbnfG%4^@Q{5x;Mu6`d6pcH9izsUUuL6 zNz9dm>-zo*#m_VQ+P=Lmuc$7br)StyxLT~YHT2j?i>v4CoFuJxOXsI1&(QXd(%AiI z|Feg>=lmibZgFqCcJ`+Ym;Q2&$SU)QS%GVp%&}dUsH~IYE^#}rK=`qZ)%<yhdk<WH zwdcOfyM-Jx*dCg2*WZ<1{;p@;o$}}V<Hi3)u)RusV#MX&eYm({Vd`cMXDj!@Y7ss5 z8S%C@%aRnHg@k6*ToHL?!g(Q%^XsuWj}^}<|5^R!SHfZ$iD;j_8^u_CB@ab?n-C_H z^J$*h;YE=PQhAF_u0^i5yYWN8zM|qte|*IR9r+&Le|H1FEStA~!qJ3Pa?0=B<jyQ! z{^nq?rR1bX{Z{8b+vX}1M?9E#EQK-U;lB@)e{IzF($d*{?Dfq9LSMhSYlNDqObdFd z?72tfrt+kHdA4@`8#3<JuXr7Fv>=63#<Bd{f<=!?%^Ifu*!R^V!Jp~r3Fm;5QTpA# z<UdQk>ki&FVaxSLYv%PnmvOvM@uVYziF=-7veuDET}HEr-x&^}$#bL4DyJnl$Gkej z+nH?lX1V*@-V|m9&HDCDmZ<^1G~aZ-YT6c}ytMSC#vjd<F*iGoHQeCN<~@4L<VgDM z*~Re(%bdO6e04lynQV5${gy4$@;9N=r81x1T2xl<UE^JBv-sJP6?^v0c5f5(d-k}7 z<)5P#qfkTBj(vNdmu^x>3fQ53*?NLQqgq7()0%AEh#K3J^GwyoZ0G;Zib&?-pI;G? z{MWGejE$Yc&C9dA8mgOx5BAI1{cV0|KkK#9l3f;WX1Jf2o3g&xMw^fEhe`b!$*Bn) z{H`08gg-c;c4^AG?;)(R3m2TVIc}Ktu1k)=Yu(Z>zjxHF@Um{Y*7SuztxYC9vg6*7 zj^extH{`RwxxY~S-Cz81<NIf|yi5Ii9^@V{^j(m9lUbu*aFLRslmC|&3qRE@zw}$7 zj{o8IRRt-tIpn$aoMT^6abrz2=hinH_nWq4NqxJ=7T1zk@Jry~_Ir<)iHPQyR<-@U zD%JIF!)c4NQ@`fT*>(BbIXkZU^=>m4yqlH~#wPU5BHrimvuP~ecOU(fch8V4$ZFp3 zV2WA<XTSj)BQLMs3q>AI8dICsTCZ)jT`?`ff7zjHPWwWG=GH1WJ+o0VtT1_fb5HvJ zwKvlz*Si?cKc8s!_5Yne#U}s%e5m{R-L&qT`}qUR5gc1R^6u0f2>W*MkNmvmgp$px zzwtO6Ff<Wdl=E%%12s!k1-Z$OH;Db@;D{+tj<&jWXtD6Za-o0kq<V8b?ij^hT5Qlg z(d=dCtwbG0wka13YHIQpeYo%^JzL0Q8N;KALaz#yzlT^z2%0?Z+_*+;LBo^@&no&~ zNNnY}{hI5HVQ?hh$xb(qvzrc=l~)<xs9Mq{w0Pn&!wK7d3$&lw#FlVD(TLIL?IqEg zp4MeTj(%;$>kkzO%?sQiKRdAMdOJ_*%0P|z9R^Dle$Zgq!u54YkF!bKci)P=l7Gcq zFTX30=e84D7HBbl>S@mv$xGJCFI2cUXVdXJcM8w-E^Pl&c6z~V+rYBx4h7Sz|3s?t z{ZKb_Yq_7Yz;{xMQ-zuG5?6;{COfOQI$x@L?n{{qo${4jc)Tt0tVC#nz^@gGwtL)F z6DAkQbL%htd}VQ<fu>05n|qmecb0NToi%l?eYE$BMuf?Qe@mSzC07K^bbD%JJ>Q+( z>b*#wP;&LP&4Hgj7`LyMh+oEGe7pSVF3#Jtyl?TW<P%@|U**SEgIyms9e0v#_@}i+ z_t^5Yn-?q-+3HZ<?s159`Pqr@4c@-={>3Abm>W=j(EI6L>!)&ypYOXfH{QLo@|Eth z8Lu)7&E8*;(B@J9ux?_}`a@gXGHyjB$5wHNOl1)-FWq)?<?cnk3%E-IyN)h9|0ba4 ztBB~w2vhg6V^QMvHnkIfy!zExQZ2VmH&@z~SNGiB?39W%Gxr-<eeeE!Df!)AX7j*l zOpi}m#B#K3|GAi>R5&aAl|cKQG{e=uKXU~K?|ZaIv*+jx-93M%Rlh8HC-|YFk2&xC zA#djDqHpmJeorp25`NYFT%vpX+e2UXwp1xT@35`*5!vy+%gj#bn7L=!p`EcZ=g$3n z;xk#1DLQ<g=M4d-7p33)<$Pzj+(<26vAEFAx|C;W8}sYD7fNTCW7wYmzwJ=<T=<;p z)cTtbVwi92tQNT<++{CWs*=7?d;7ZruZF9O9+W8-MVU--&t7)-x|G<Abw^%o4pDi- z8`j^vKW$?95vLMP`G+e$&U@E*Bbs0I%F>jK3^v2M=^vW=XYv<_ORP5b`6#ol+j!T- zFwbY_UfLgg61l`%B=5G|mvmi&@CvDe^JQFr{(H6OZyL|`WBUHA^XFc_7$G$!&qv(p zWl`%xw$iew%!1AZ%WFH2x!TN{np<*j_T%dj=S#Z^8|RDGiSF<}c4_WMwI1CAN!o?I zYupRpT}|w;^;X>!ac9mpiQigRbk7~~OpJ2UG)T`aT>kl6%AZP&6?{7+{cE3pU-f6U z$$=Rm8tP1`CvG0zCVSL%)1i4mao;&YzGgJ-vNEa@nOM?!u|dv$v+%-|?hG3lYejGA zHs45doZsC0sd=v2>^nMf{B5UfpB#R4Gvxn`H|Z;j3~s$!x$5k*i8){Xa_l+9v|9M} zMjrMH^X(_M#$U_%C>9xSJFDK#p}X0pGwt7EG3z(erkz@`xKBrJ{^bz6D@?~<%k}(m z|0rkcv@g7Duj1kV8?;k6XOzmW+~D<XvwUgrpY18Sg;Of{&uRR3Z&}04Ji)ZTVLeCA zl;htICB3@b9~pd?NoPjLqccUx=Cu{aqgV01deJZN_+H;4n^)#85oeVHF7X{u3Rw`{ zALXsHZfkn;BGq%pV*A*1i}^hcD7{Un?$)c4YudW)kDTJy=?n~6P1}U-@0Pv3MLlxr zci%fRZ5W#N9xiLpk-Mq%F7Q5|rB=E`vdhC~3(8kGM^sw*`Ln)LG}b#(`)cOh3srOS zm;KanJu0{4YU2xm^KUP9Oiq~UdF7H#$ErD(E<S#qrTQv`aeF|~w&W-C*cT*7-Y8#k zQ2w>T?@cTxAK7p!7=Q1R+a@Gv<YBe`E~A8}kD0^gJ5w^QY&oH<y+T-V>Ex%D?=PO7 z;a=CO(jl;L^Tn2Oe*uO4?>Fx2xB9%}+N|{G{|DogrEHy7%KvWizVeIlQ0g<6*0P|K z?R&lz8m?-4wZ*d`vzg24(}a`%4@aGL^S4R)Zfnl@_Tu8mUen@;!oC{8&pW2GZg6Z$ zIGujrOZ)Fd8;xa>|92gmcfFte*k5PaCya3mHlADQzM`^0C9ZXy)GFidx(yL6F=f4H zU2W}Nm-Po6igKE3oApE|<EqbN{V7K!qOUlLq)y%-pmA=7B%fiEX@{(!yLu;s$ATHg zUpCyG=9m%DBb0yfwCs}#-Fav0Crq-{J#bB@fxCOxYO#aaTDQ4xzJK}nOhW~q+}U0K zZ)|yf|No8U#ar(G7ta50ugOx!!v62$`7QTq6nN|#7>~@Jo)T#vH{Gn^aj<&Kw+W&$ z?L|_rY*TAn``c~y=l*yk^ikWi>uajvy6wG}S{I5PllteY-`=49YuBvz-g?_43@3AE z@N2%hbErFLmHm<ufvy%OotCqYmxZ@D%G&=<cJVMjv^c4yB!)RKzjD$|i8I@H`|dcb zZ>w1LP21qeo5&84*xN0s{U6q@w!FR7u<q^;okLHTK8k1iqZ)WbDrj@4P;WfbO&wQ_ zV6jD&4Y&B-&XT^Wb3@_Ix^pkzyV+_Vwrsk|#(%R$UPL~bS=agnUmSDf8r3DgHXW`L z&RhLKKmF;^7Vq<xpO<UgS{7+BcTOc=Sgps*+eO-YV!55m?R*UnX-1?c?q^$kO=sx@ zP48IW2nO-TK`lQukG<uMR;kZh+*VWj`S?MdnQxxRU0>dJ$gD;7h}hz36TSyeStpng zy36?KjVaZqzQ1F8EVZy<4)=EZm<jRaUgCa>H=R82Z?7`f<DCJ1%%`pARNr}RbkxJ9 zN<({zWw54Cy~IYTOREeYmF)Z@d#?DQnb^0B7tWt6)m?L6<o*Jmb2W_j=iXjab3fT+ zwn+MIso>`MuTFe9e(EdF+VWKvsq3$pKm3*T#&^e=4=c5PYjvbfDyot`uKDCbHTSlC zyNb>+y{_{(@NUC`E8<7pAMdf)Umx`C;E(E;C#oMBg`GMo;Xko6v6|)N*NY!-?x=K+ zYj-&|cdx|eECY7GiUfCWH^1UP+=<yc!`kjnxLG0HTWWCZr2L7U3`^b89Dkfn>hf55 z@k*J$bQ9|jjiksK+ST36M}u_>tPj7IS$x;eI!60N`V75uCT&v>a8B6pz9se~i>#A; zhF@COfj{e~1}XpD8{hLfyj50D$!5OH&+mSJb9h1{?zL{;uk}mY#(e4DlrQspzw#Tt zS}|k8ohi5XUW!>@k=rL-YIyv9YqpryWXr><AwEfmY%KnAzS>zFG+~*}?oD^Ozsu&7 z96Kn%`pkRIh3(r9{avl3{pZj7!^<}1p31#Gqu|1!=T=<->yGWe*Yp3V^n7cc?WZ0w z>x;cEUcX@Sr$0QWePWi2E^$4$bmo!w)dn|9MP4oF(E2VKXYS1Y(B>G&>a`A%ix)(# z+pzDbvB}b=1GevaLlSzN3@%NT^;hLsY|ztc#Cdx5;`?)daUIr~5-h^DHsw}PuU_%Z z2iwZx@}&3jJk<WT@_;^L+b6Xj<&EVU*&>#gMJ|1+EPpb46L0JOz3=zjFZ*Zy@{hIl zoA8J6WgDaxF8#G?&tJ0*f4DyL)&IHQ8t=cs*KhT)I2n7+druA5z4@InMb%-_^7N-A zU2mr4i{8r7Sz5fG+utszdWBX^!%}y?0})P|MmCbQ;@iqotNEu!*&cnaWqM=j+pI5X zSLQh1Q=9QWWQFTZvmNnsKVSXva;@>1wsV3??0ucA8#Y+Kel*8bS<vpP^Sg6Z-3EHP zhMWnaD?%?$bZ5-ZZa6XT&C7M?HnjUxg;$7ItE9%yGRTz@PS9ys8f4!j#DCr(R_<Y` z>iJ6Dg+4Fu76&!hM0iZMxg8w&>;uQs+Mcb}2O1AoP5dpTnL3^Q@?2I!mTupDX8*JQ zI(I6_9liB&*5X8~fBRJ@M|@rUvVWC{{gMWe$`iAyZ^<29RFMDkcgUiQZxcf@Tx!cr zTxRjM7MLVC#Hp_|=s6dr@@j6V#gZ!%m&w`N`vfLO@~hpmasQL5=Wv@@<CEC*z^j>) z7AL9KimZ3;bd%|33-i9g=Jk%%&tqQx?&4d?=eIiU{NCSVbJFP2Hl9hslL9`n@3vK7 z{Ks=qU}bhod+7?-<Rwyymg!xkOO;Q|IRAZ0!kPZ_7sOVbk3D=n?wQls>?{4uMxl%u z3|ysQ-|lX#R#02+s2O}=?`MhcUw6B%+JA@n!qhdLx(5|R6Q!6s3OJv(J}sBDl=}B$ z@6B@C6AKr=voe^a)Uwv!ZkAh=R)^`erxt7%6VFC&X9%wCcl#spbB!MV?9i5&<L}oy zulTO?T=NZ&tL?1gQfJnRda8D+1U$Jo|3*9e-b#a;hc$W@UvgRDZITsz?S`?<pVYKW z_U^?k4>?3dKIn#8&E&mQ?DNp@UvWU?goL~H9$LO1-Y(QJ++^RCzPz+EljY`d85K{# zrO%4DSbq^cHSc*etE9|a<||tcPn+^P@;zh8l$hs>IN7$&$tWzlrkIm&cIt6;#6Qcb zJIUwy|8C&5mFvj3=PN8@^~<?)@8L4Jg-_d)R!+OIxTj*h-p5*QKktN83!QngU6Qej zmx-6p;=HY?7xi_A8uJm3%erbRTVpS<zPYuMYkr)_%*Q$Qp&Fq(m${!VTkerQk2Ukd zuH*lVXC2l(7xrvMPvL#(U0R2=R%k`d5q7NjqBgNp;o{*fVhSm?nyF_JPS=!G*=Y2$ zKJ)u_v+%FdmTwuq9$UHJpOaGk?p=G-I|l9_3-ixUf6nx8q5bm>oJZ=j_C1lG{Xb_F z-?M0bfd@aH%g?C);I8%N;DhQ@|JW;fw!MDVA?u!Y;$=67kwmG$x3oL!=f1yheoS$X z-qvXq_me-L|E{k(VY>3!jbZ8H>G8}nC7)TmXbU{_J@WDU-NFe+M06%~UNBqk?^L+B zLTAQ372zt=C;!F%t=q`uY*<ouZ+XUxP~|15)`$Ov%vjf3nZHNkM)cA3jaPmO2yHTQ ztPOi3{=Dnc-&%+NT7O<XvxzU?w(&z$mdgEQ{-yTL@(G(fOumb0%#2o8kSjjT^w_bL zT-P7f>^>5){r>a`X}@{Oi?>A^s4qKYcVuDhZmX}+&zGG0vAk=q)^_vfb=(?dcG|xu zU+{63W9cz<+OB5mmi^=1n)24w8}@RpH-BhU)+JieKmVmr`x397Yqwk~cDr$iGx>Pc z2eFmT^S4fJT&t<0(CsRm!k;8R*+o<Ko|)@@&Ceo<UEZ%_!uVg7Z)He+)?_bQW&Gyd z#GZW?b{sthXAG*2i(K=cdMTOj{dUzYrOSo5>z#MT&pGehAf4U*+uCNWnDIRJ3M=mY zJ_+smTctA6Be`z}O;~F1-YedEeg1}fO@bAhG|sILPrW;5ZTYoJKRva!-_JBiKKt`- zes3+`O1szu#=Q>zYi*J*E9BU!$^0-CF`RyI@r@4-uD0$S7e)7K`zqP~o|)jZo$of& zF6-CQHhT}s*K7Tl|M2#F^DO?GV(Xc|$6na$wj!)MBuU@RKGka#r*q-4i<Pl+_PM^e zZKB1~m-z7O9n)jV(=>`|G<nKh^^Tbwi!jqX7h!D_X%KqkU_jr@*<$P=>RsF~ANVqT zV6c#!w^(GYrE}q*<pIy$l)vcyY;q_-g!P_v0r%Iwd_U30r`2EhA6m<~rr;hc+w-^P z8rcuK557Hlvrc?*`nRJW&i=4J@<aPj(ds|He0T2Stlwd!&vB3Ibj*$A76tq2O8;2D zxFzY&)od{TU|L1K)6d--^a|p6Ue5jh<LHmu&l^{3|MivF&$WDEK>K0&>0L`DcN{P{ zeyhULRp43QC6jMEo-ewy?o`$EcBYj!tQtY9iu3*cCspX*2)z*c^Y8g{Nr!%ak0{^& zd#>@BQ>Ff2YTv{>oBMuy-#)$*LeI}?S$Y+*8$aH4ENX@7H|xEJGP^Q4PK%j|`ToA1 z+2!;oPchTx{lY^=n>cS6zsX`@J8r(gdds2{&o#2#7e#y(^Sx-ov0Ll)q}EgFKgyc) zxqI|}m><kPwAJO6`BBaJiyU{=2A7<DuhdkrBy9eEj<@|&%{1zNo<H{Xf1b^G(Z8QN z_8$12f9l)nhwppSd+h(IKi+RAdMo(oW$wFCbCTapY~5V`{Lkj1eJ&Q4>-syD4zIZK zYKF;=$(u`)Z+YLi{LI5FfA-?p2NuQntX%xbO#GeHrI=iU`N{8Z>FUT{_FNGv>GiNu z=+}HJw{+9PdFOub*P8!NK6ydGzmSUmi%vYaaWe9HK+F_Hku3M-<ti0rpC(jBh3GjO z_3vxTxuN2ge~m}T*yhk4nUv1-rM?OO&ne%?<>vo(<KZ*D)dn4ljPD%3V?3$z;G)V; z8s;lF?%BABiY-$7#Nc-KacR4%>m2uQF7FwYI?^7_Nl3Ns`j<0_KkZM#Ie7&pc?Re0 zixVF^$Ia{fCGdY8$CpnBo8&Hizgwxn-goSG!tQL|oj=_E^vybOT<^im!UeLws{hDo zeylpi@aB+!>{+(TZ(j2bZ?%4IEAgN_*vE-;G1vEbo40Zn-0ZA+GhuJnvg_eV{dQ6w zlTNJSddjoCNaSoHuP*DoYZZQJ#pgC}s4$uJcbd<Co+&c2&yR(DH9UVuch;0iIf>en zBAFhBF0cQRa&%E&c4W+T!@POhGZra^_-#F4BK?%*FUxHPJBuq9`romgu0EMk>sUR( zTi0>sKBn@{=eOppWV0xIUvPhJA>XH^=MF7ld{xQ+^mKs3e+KPCn_MQ`n(Q>2DPzKv zkNMnRRPDBF{!qPkXyFmjp9>eBslLE1-}&z6t;CLB%f$~pe*ZwuQnr<4_co5{an~~( zO^U5_W`|A;P<rRJ$|8x^Yf`sue0hY%ktQDFPEXx!?&>Rcc336k@rPC4clHdoIq+kj z^i+;7ubVGqP15<krQG8Udnrfja_JwBJdC9jPhO9auGX>*VeZg-np|rwpZ(*6xMhgD zK-SS@m1Ww38X6ycrf(_cS=`#?k@)`9F4qgmnHTrW_4lhT+b7s^?uJrJV3^YT$15gB zd%SZ!=(lmd?@6KUT5E)!C)tYFYCf%xuz8RuY$xJ<ysq>Hv%);*V$ZKG?^;cNZB#A_ z=_ov;dj9UR4Q7s$9*8i`+MM$s+CBStcHi}*miC8zr!LLB5yrkkBG%b*+2T)jOvwjl z7hV$*7Sp=<C7MBx>8lEly6f4O+a=CstV_IIAaV8Py`acAZaa33WZN}5DQks)h6J83 z5pUCUuog)X&%1UbeEB;$`+AK=xh1=7H!+0p&2D<~Xmaw=!Y}9NZQ91)dWHYqzxtpr z>}DVA&vSXK>EgfXAXij)L$-s7pGE24_x1<-oBO=?_y(O5S`c{RqwYkG^AnlU6hG^k z9$J0v?vA^?uP?1kZt3lH_WbW}W8z+Ls&Iu`j^HJU{*+g22Y+b$C{HmInqaGXaP9FG zE217PxG6MO&dvEsq%PN@eM`3V&PmnrTlq7+y|Vb0<hJ6&tB<C>emFhGY+<ZuZD`(h zhpAa@GFNBKzWI!Y)vx(eS<`lVt>xy+V|pL1Hq2=D%$$6wh=oVBYIZZP#k5J9{RL|> zJE}K^XH5TK|4l7tb?_|X@aJ#WY|*XBY<4j$*5$hT^NMu+uKYi#^CDQTxty>IKe+Em z>;0$--Qx!(pG~m3XYP7WDdzC>9ekx+l53ORL@_P&wST{_a)S@oU!i$(F9l^;aa}%n zG4O@jn!Otq$tU0ck@2VB{nFeC0&|nDixf(H6}(Z=Q#kYcjfz|I5+j-qXvFvh-r+N@ zD7_c6vG=%!n?0wQuyLg+-_4b5S-clQZ^pNzzW(v-VQYO~Z=ltgvokpU|NNI7!!DX^ zSP{>=SBhCsDcmhFy4i8ct0`Mr_UyGj%=OrH!udnnrFptH^A^0l5a0X%$E}%lV*5G^ z?u$k~y0`y*!2N~mkKMlY!&Uj_o-1=S|F3!Bxxw(lhg!zHt+9`H3G(Lsay}pagMYuK zy{+g!Bgy>k#qSI5aUEXq=4gb9+Z><SMzby-OE9c%{}%P)M{?Mk9h#{IdydVJGf)2@ zv`u8I#rMKjBH3vg=PXQ5UAQ^*gxiEEm$M&l6Z5m(6Utvbp(!v!^1LnYF{Ojkv=iRl z313=uCgppv(pK|E+lbwpTk7Mw4aFZDS=`qR+L+U3=Q{29-z7WkWaFA$?}uKvG;^Ny zCe45O%(vI&Sby2PStK!vb>FeiwqiHj9^T$+s595TbJ4Ord##_Uoe5r&QlDFJe(#f~ zt~2H*Pr3Z;&|a5=LF@f)G98ia-t>5n&FRD3w_Fk}4@}TWn^m;?=;p!}{je7Q<kSfk zKm5*0Joh+NUz+;n)cgEn^|M9(%A7r6;Z}G<N7qA3M0-u@Qqkm9Qzu{HU{I2hjGCk0 zZhpm<Yuzp9b6I+lQkoN=UOc>SfzlUEC-&nyNqq(1IyEHvpLubt&-l*qqUw^z({1mr za7{Pfqx_>dr7gxSalY37Z{iQ1W?fNT!}C~Vrr2Q?rE{}6w=cT0J9zrJqdk{bZkYKg zQ~!n1p1foKx305!du)%H-Zn*jX5XSUk)h9?<<uAJZEt!r^>XmRBa(Mk7T5T%+{ixt z%g4N#Zwq%f{k<mX{`}L<p!gF9bh|fbwg1lQ*}bTGL+Me|E?0lce^2ggJ14(4sQTgA zxw|Ff&v7}MC>DwC`;+VRtU~S<@3p%>qpWmJJ&&E~{qXOVo9%x3eSU7fn=7;n&$G8E z)-LpYv^mR2soJP7lvQ$WZNV1RVAd^Crw%Ef$UjjV$F@*BUGv<Y_O~k^^7u-u_sYN6 z^YY@I>;1oubACHz%av9eA|>y--b3t@{fXam6KbwJ5m2*p`g^8N&AfYijedFM8ME_N zx{{Al7X3Xu`F!C0DLGy$%|faXHy*e5r`?*Ic)Y(<pzi#uru2f@8WVfoxjPHbUljc( zR?*H`@m0U8bCRB|^w9<D>~t7hrn&F_JY$RVrX@2AMOpLsKRnWq?RN_O7U4ec%sa=B z%vDlv6x%!Y=d*3HzRedAA$7WXd8ypO+R%rQrf%E6@%XN@QR9fr+P2zFk7*LmT$PMT zTI`!SWQ@HRtZ=cc>+uuqd~b5q;`?gn$j6a#=g)=By_@XwaF=^WcA)#QA6~WH2i{EU z4c7G9d0?O9wS_qodyQ<C*6e9H%gLE`F{+`g**ev9+nUPVY{piq9VttMmN#y>;oX06 zMZZnQ;%#S^ZB^OrTUUR2#ivycw?3{>yKv9hu=&Z>mj{Hj^!YZZ=Y`+eyD9y|cjL|+ zf!7oBA9>nkb?#lcyvo(;McxY5gp?&lKQ`og*ck6^`BePMG3ASt?{?wy(Wd;7JD2v) zab73e;FEdrPwUnhTdY0@l=v{c{kWzoLb0g#wEM|l0Ro=)HY>l4)qQo+NbSZlM!Ss8 zd)ZeK-ic4-Syuc_bJn+q0cClKjGb1el?AH%x7t0sC;VWU&9#{GX<KvpwpEzj6?T|3 z;p2A}^QkfGIb&qRcuzi)KfCpc>QqBdChs?o-PgWTc`*HJV2W|go7U2v*ZFekjH+r& zr`}6$l3pmY?!M0FV-6usmd;nIoo^laX81-bYvVeXOSdwd3>RPPdN5~`{?4}>?&>nk zkXmp$?ZL_#=`01yutP;#x)biscrfvAfyU%JJ)5<w`(NMMy;SMm#+U5Bcm8%>r)vM| z*XH|Y`+l{j+0FjTEb`&;*W(92D*mtE^7{C_UmFA`EO6YTu<=~|H$E8;7XFntH=6#@ zP`)5<_oja_hn&#_oqK)G?<;->B`s#ZA^y0m{GIm_mA+z=|E~6C_mvJFkzZ)E=#$6& zevR`L6<gUpSzOV$@^u9Rdq&obX+JD4@8S68aBJ7|gXv5DYhO6WWyrLwqQXXOxz2|x zbN?RQIi2H)aPW~P)3?4Ktbe@v+2C-~dEcI;Z+OeO6d62xRbguZ6sOP1yl~PcXLaEH z-j_OCmY?F~eLqv}SJ{~j?-UJ<k`$-hS<}v@9y-Ax_P4IeJ8|>2zzEyJN4`y{`&x4# zMa0iLz2I?Z%WuyKg8R;#GUHm$)qN=V6o>!hhs~SI8l{YPM{g3DB-a1RP*Q2%CgYHb z?+NnH-n~%BQSv!DGrQ_0*M+3T_jNBF`2F#LTzf~2&6OoujZ%#otJoi9C<?DxSn)w; zN;gOIflQHao|Ak(Ixt?JGDr1_rqujQ!K0sBM0lqKzOfKUw$(kk@5Lh@C7$k!Zc9Dx zyx*#Qe?Rx5xq%O3AJo1)<NZ8!&6(y)-z+Y49seA(N+~o#@9jdTz~<dtcX}7P2LGul z$}xQQ{!r@bH_0u9Ki}Qp_`SSBY*y>HHTf6BF68}rbL{nkH^ocl-rE{{pL?@bmDn%O zn??mWAv5l?{?%uGA8++`<>q*)GNWC+8*hpncT10Djh#~2ZRpf}#A0fu(Vk;74iswl zm@mEV@ive1i;d0cs~VCsb@`TZUtZ+Vyjyc`Yk$_NzUzMH4}1H(SQhfwQ1n3B;(5F= zO2!NltC}UguM%0iLhP2@`ObHTrtq9GvHGri>5;ebymuF;C@o~N64AZQvq^CA%}))> zWajy#Mrz%jlvsG={N2Wl+;?Q6=WMn-KfmR5cXE8vnT*|y{*eae3)dE|xE;(QTDQw$ zFW2qrTOtf|RX1sbtdQi7Yv{J#cjVS3r5sh2Nk8AciS*%OGL_g{Xa3AwU`lCeTj-Cw z{u}l8EVMCC{Bw1O&#^i-wS&_&zI!d3{8m?ocSTUT#{9>(-bW|jWw~kcZKKVvJI$f_ z^Xl^Z7R<AdIsUh~RMxA<Xp?2?%u1QHyyw0Ju6QGKX0g5^vv|_noyV=@P1hZjW<8f_ z`LSu|r+*@>hhD1P&^sg4D;)i!sQc*7?c58wR-DriOf$bbb+72U&>jCmGR1#<(d#jP zSki9S$bZVqWWr&N`TD0`u2fKey3Nx6<U$j{XO5BWEFL!JT7Bo#pI!7WxbghtBHP1j zk4MDp)yicQPTxAg@|wwn>9bsm#XMh2R0<WH*EBl&b5Bcc%5h28neV;cOWynS?oOQZ zyswu%D=!|(3@mBd{wn9_i&y;y>t=|3DV)#zpf_pH*Bk#`Irgt{S(xLLQnjRf2hRrY zhAp>RE_HO<YwWey&AORe$WqZo+{&cV#QONmSx?VCj<Q=-{`|50ri~U-6}|U91~%{f zWLWiqf$h`ZnEvmd<m;x}%=quV&`sk>j3>XQrv9`!O9XU^TDnsU>w3Nm$t^xFBloIa z{E+h8Cnud<71#sBB0c#JH0^kIu_E0g|1{errY#!war5P0U7WTc(Zq0Ldw%q_MK>*s z|MWMUDty~&asB^BIlr4<Ct9pe`K)VreP4smMS=C%*QOo*fBxETQ_D$DB4)`i$P&Nw zQf}h(T|WN(C)TVvaq85+|ND*dck>%t?+uO(ohkV6oyyxqTyK~YO4h&go496$$MVT; z#-SPo1qFU(pEhf}k+Oe3>ssT?W{JojvaYdAW+~!-ibcaOWghXqvUTmzeGd}qIHp`( zWT57D@z|pmx^DAQ_zGXV>%01+pzz@A4^_p-OuspP>@U1-m$5^s;==UX5=U3PH<<ck z-d;xAZ<|bS#50S`O+R>k!$Y3yH;iNL+@$#yo;b+-B=6_mzMDB`(+fFl*laBuA_}^G zH|u84|Fm!tgTrf^EB|z}n~ra)ymNcW+h_)Zx{@P`njc%tdSn*O4czl>UW5C84VSIQ zjPrKeU)!Ep@?-g9$*&CB8V9!>sOVS}b@EvaXG7}8j2}CNuhk}RNItdPG`cs(;24w8 zLq+~inJ*U{kK4#l5t5w3+FP3H%pk0^@%~!D$3@XE&U5%VOUBIb3(z;PIezd(XT;3Z zbsMCXYF`dqkly%azS$h+-)bksk|w2ch_$B$zSZMYc=mpWz0Sk_22Dw3+wT)=SABlO z%|7?;q>YOG(n8O7D9c+(A37X#!DvNSgRj#^p<O&LSrnpsgc>$qFA!Bs-d)iw^mQ@s zscXH?vG<F8SBX#AAS<#+a_3vdRUMYh8>dwZuA9Zj@$QVv+b!??UW-jF=-kLJuC#B* zMOTS48ghEf7grQzT})Zi^!|UF<NU8@E?%^MmGL{|%j>}9pI=7&x^waWm522*YX7Gx zet7Bs<bEc@ALZHy7k{4rpZwqP<9`R4Ck!%AHl|ha|N5gS(=j>B=%ea4-L(JHt`-Cy zTWQee{`~*t-=~jHw_{;>+|cv=4R2SLM*K97A0PSmhn4b|rYlW&7tM0ButdY}^+i`s z-+dJq!jvS!`(0Kl=j>KqeIe{&=G&a^4g9U4CN2795$_ZCAF=KF|G-LB>i(SC?v~7W z>)h8pe3#ceTp87RcJA+2Hrvmw<m^Z^D$@VCg^g47u1?=aju%=R9bXDAIi@R?x>;m# z#)kMrnI0pT=>cKOW38JH{1B2|du__Yv?&`8Og?s}dQrpmM{iWGT<*3AewoAi&7nkM zV|&u_@`a_m^)IK+kXP;cbH8g-ujB7awq_lCOBfclKl<@)qDWS+<h^^z&002BQe`Ve z9{RCdjY>WiVzPIc`;E{{wKvv0)e4K7x$KT5UMh3nrlVofv~c2rt|QNqI~Z<qm=@kv z(wNz}Yonm-`CZn_Rd;n7N#<>M@3=Is@La^DJFRDXH(C`J>b<-3{lzPJC7tHOYrQMN zr!O!$#pSbb(!VQnb~e}_u4CG%`B-UA%nsgT3g;@C=EZ$q9$d07zMlE#vzoQ%K3}=% z-}*WxLVM5I-bV)A27N-)rgj^q8sv9x_~ZX@xw*#wqm}<Z_nkG&kJ%>FnQS;sa}H12 z+Li}Vtyg>3+X`GRH;rQ4Eq=t*Ri)R;^-|@6A0g@DH_8$tM9P+mCFhI27wWqA=#2An z`|mRXw|$V_E@!+qidUW|G<~=0HG967eG88nNryMAd*gkiMe#Uq+n0U!vKBP0wY+@R zsn9~$yTg!0`N(Q7ZpZVPB@(?#PT5mmhusLe<Mr_2tHSjOrbaE@lKKwSVsZM1UdK+z z&Tx)sEN%Ry7o&GU-{72~d3kiww%q)S7p2k@YlVJ!m;Al4sN05T;+|hZoGS!Q?($1$ zF3vZQ-@HKX)b+KcuY5P2P3o&Q|EKfedVJ#i2iFqnn;)K?`7TjCf<0Ax;+~n@r{CSV zpI{Z*HhF=%f$6U+k?)$ONf|#oUYX}~`HR#!6-QOBp4#GNrjyi++~>|xC@%9dR@-Ky zA5z?N=F#43Vh(40ROV_K_-pEXV+)=7(=zGIwbn9Tu?s;R6E|5a^6Yf<S11km@W|1B zU5ne1X^&RSR*v4Wde5K2l>f^Q-M%|vKj-=KN)?~nmRh|t&JRDWnNr-auDc~eD)NP0 zWQlO>qhl6|J>|1|^qJ!QPX&wqD>c2x8+Tv!Z{8Kxne&weBRSuF59s7$pSU+HSYk@4 zx<tS<hR@NzV*L*lbfrXzC*Gd3ed*@4bAPgwYV>IAI`lL)bBcRYwTXy}-LAK~&p&4W zDl-3bu*f>?!_CbLMC7!t3p|J{UtYIqyLPq?$Mpr#-RvFu&6l$|?tf#h@!<P4adXN# zY2OC-f3JVuI+5SEZf{h>?f&?)kA9vwEBF6raA3fn$E<udEi4^vo+^he4^86yeld57 z&V|31H5yX73K`;fg;soH7yc|U-Lh`Jf9s4VUuFL;V^3J{(|T&pPtG-}1<J>Fq(3&C z#BQkP#5wh6g7a}Xo0d72yWY=jkC>g7cwM3Uk$-E_GxIlv#r?+wgp!xseQ0u|Bl*1T zx}6qP=ba2qxuTv0xGJ6B+{2xELh$Gud;YWR^><{>RxeC8T5dD-&E^Dq3C)Tl#RuhI zuT0^YyDC_}&;D?3$ex@WbN4*OhU)!?yo1@M@;e-NI(({4Bf-tn!9?`Sb3rlw<r-(V zZV_47X;5OZ_F!3st*f1A$?p@~{L4D3j%~Cp`rNVn;=!pg*2ixheq5)0^T&&y>wh}G zc*{`uNQK*Ajk+@HW5cLFFYeB;zxLm7zn&1QxlrNr6JPtB0{PS$+=R8ytuHY<@or7} zyoezCh2`$we&jEfd9CYuB6z>@H|LU!-*VL(JPjs<JpNpD-geG{*1A_4<frAyx4wI> zFyZ^LKa2}RdEIo9*PLyBaH(tq>nW~pYCrBa9SogYsAW^%cv<GkkJ~)atKVcN-ao8X zyr1>O+X+nd|0Fy)*c=RAZu84%c<96QTczJP=ltJAVm>P#NB%y3z4QOiBWGNhEEd+Z zm~Ljc&1ZJCu}5R2{ltSBZq`QUo^6$L-FziQ`Avf8EDh#^O8I^p*i`Q@uCaDD{IlfF zmgT*fySi4mIWJaSz2(>8i9U=omCC-Q^_-NrGhgIVV0OU<-5D2`%<G!ooLM9Cuq(5H z@8}`b1>A~p^UYT#FI@jvj^}$%zu=E28{PjMEPY>5Z#VBC`>jub)4OY`jy4MY2%KKO z?_7mv?Sk#+mM8s7p4N~z(Wdf}j&VlY^3+A;H5~O8eDhpGh4(~WdZhElw}XA#d&k`| zyO;Lwad|#Jz_%`fb(MNhiB6ncnQiQo#%p481Y7e?EWFei@cqT4Q;$watUCAXkb)!k zuKSF=F88@(RvYGiHQcs9`-<wma^r(#&+k0=RL8=XD#bjp`u)rKy$1H|On1$fzkRTB zNo{n`_uI$*?z*`B9Ou(LJZGFcymnacW%1n=BfY$IvDxGI`od}t(>6rraGYl86=N!! zbm7Ux28r_qu?g~XQ^ohyuRgQAAS~lRDW7?>y>gB0BIP=1t>66{(u@VSDe4?N$8B@I zFJ@7&_T7(XZ`Ossdw*_&8JlqwS1eEP!WzjPvkLAyygN3zWZ7BExmv$PjxM|R*vh}y zz+6X`DZ}fnVv2FcWszCOOl6a#9YaqoxgfjU&*C!YWy2<gKHb6@US)E*dOE9(W9Dv> zDC6>WoMdYh8sUBCaV`7aqcQQ4bM|_0`DuFdSF2oRa9v}W%Mqw>=4RRAJ>M1to4UX6 zT^^iT$G7z3J=<sd=5cEo=Er@uT=)Il=XX6E>w^<_xQE|nyRf;?iql^2(AQXv@QR&> zfA$~x+r8;7YwRP*lPYtJB6s(mx-R~-`lXKg<4^2QKPko3a}){B(^>O&U*d<Y$N%Mh z`1kD3%bkmtpWCGQe!qC#9*h4!^KAZ?KP{8}`OW`W|8t3@lGTYWH_lnV4t`!GZSj6; zV9WNqFV-th7P&Qfb5HL!PXD#fI5=$PCe`Veyl2^-pteWfsXo|myGFoS?<4cX+7AbZ zri5P;yyu(1uXsWuhiwU~#rCzQex95$e{O1#nr6)Lb7!0MJc`e0`2>s1|L(f+eN$iG z+@7Z*M?YU^`nT62=03~cdzzXeM-^gr6=e0D*|74%KJ8@xU-4XNWxT8R>Ye*7`Gx6! zi}B3QPphAP^ZofcZO@xtZ{0mwcSQ8+1@_Ie`gQfg$sM{*yLn^$H-sf;6}&QBr8L>z z#dR&``~BSeT)wYLE@=L&$=9+q-Dc_r_dT(RdnG?lE;#(M`nl4vpW%;RPkvDR@Y|D^ z`ocG>a`rn{i|g(FaCznD-G@INmW)c2Son|Y`R1S{2WDSr>x)VF*rwHUTVV4`xw}`^ zH7(~ax$kVDy+%NJqO7`H+5E?HIrGy3IYZlj3VBB6FO=Qz^~Pge$BCJ}O-XAGF8LU` z<NlP3bC+Me>HaXbrL_2%oX@m6&Syt&n^#owhfVcwtu4>HAJq^TT=HqVt=qYho_E{I z9-fYWJZt~l-u(YZf22RC(_ZsEV*UB^O<9ezH^t6fE1BBYu>HG+QQWTLYO|XDb^G)g zH}I$@{)$|{c{@MgU(k)cpSP7B)BBUDvx576_VZJG)_)F(uol`n$UpxUy}aCYwV{sz z-=W)VrTlYSKfb#maNtMn?Z~QR8}8}z-S!+mv$SM+&Y{a|FQnagwj<oiVx8FB(`O}} zShaSy3dLTt)N?nUY}j~k(S(9dm7Dh&eV1L(JhuDQyw+XpyIT!+cT2f8h1gwL75qnM z(&v6P)_Dv;yjmM3cl|h(toBRe0e``&bjKw>t?WOoKmXR@Cxg@<4Jl*y>XLg;7ccn3 z;QdHW#J4S$X|c1fTC?!a>8=MCIj3B>);OtWm(6^Y<1s#cS`*wCbJ*FvU-0VGv@>&K z<+R>9i?z)@!EDoP(Y&_iNb>80t0rrmm~gbZ?)&52Vx3Aqclge`dO6T%8(ZCm^G1f( z9w%M?=+Vxw->mtirNh#U7cIAbu37lMNMyRwLj|QHJMDTtmfucxDe-YwQ9b8za&NI` zxBJA>@^8AIJRUBdA$HbjNxIcL$FuR}4_{wc`LO-u?}(rO<H~RGC-2e>Ue8m!u;);O z>KBho{&f@jEkABMTx1#(bULy8TlfS|r;dsaw}W+hUrc8SJiq%gJ+Z#){pyx;=l{Js zBfavyXl2P!=N+G2UL-wT^DpuDcGL5vf{zZKzME<8{3_7-$+8n+8)d$pTpsn5p}%SE zqe6|P5()1&KI>vTA(eE8lR@Rj@}E+H8zM7`RT?*0=iFR+?jxTf>mw7lSKAb2cDLP` zqixs~A>(E5ur;D$Z@XKhr0OGvk9+p2otS=xA+$c{eUgnE%Y_xo<#IxvAB+lfa$bEU z!SJi%5sqAbhn4w^H+Xnsrk>?0ZJi%e@l$I~SMjfRQ^K1kf7+`xyQTc^CFhWzE47`> zRQS@4eazW3b7gE(RKCGFd0ut-g}sTEv3=_&pAVa(tZ_W*`~lI@nerXEQK8RnT}sLQ z=;+ID)^E=s{C#n!IJfE-$CiUi+vLKgmiF*w-A!(3?znt9D@Qh^eg4@OX;T(e@ES%I zb1QXQ#<lKbIkDC3c*u&Ak20=ihHhM2{4TNabj%H5hgaSu&z5nOhJ_VI1?OyS-|@O& zmCkO%JG^^Kj|Dc(eevM#qRskk(<WuRFQ~q?$;~lO?r|>vvAycd4fQO{9?$+db3b5U z>@$9K|H|k8am)^OX6iB=M?OCK(Kx%lfuU-J?XjeyM+$2zIV>F?au@EZJ7Dv$e8!a1 zKfIcfdqNY1Qn*ZN-#g{X{hM}je)oCb)oh(-+mHB6uUKIDYeu-mF}9?(U7ZE-3-S(S za{M;F&avz_|BdyD!e+dQkt+7wF;dm~Uyk17kXo|tQ{wNix!=P+9F<U=u=D%-Ltmx3 z-~3#($LG-7^oL!W<62+(O2qt(v$p5C!+rjF<4==-BIT`jFQ%PY*|xVd@kQ_Y_1s3> z_H7e)PhVilXZZWQ&|Tio9(JqRj_;WF;AQt=5wFeO-IDMB`fhCH&z`ehbgk6)TTM;1 z)j>yEH#@9N%rw*gP{SX1RKB=G`e$I}|95-#A3tAf=w^OS*v8g9{eLX`8m(U;5wkY` z+ZMRrI)1(l%g<#2Yu1}iy1nh#nRW3~wprIcv{<`YS@0HH`+@H20O9-Q7t9~W%>BIC zc<$qZdt!<4$}eXew<w6}cQBj&V%5I;j$!FXEa%RN<zDOhQNR6!N1y5mx#I1QCAUSc zjBc>r?RI=&-@*;Mmsvc%yyAu!lWxVs%$qa69ec)D+ACW3b8EprA&zZt{qDEUZt42* z;n{|gd(+Pa2hY>`^Ce}Czn9?CeMkTPdiv(X?hpUiu5b6d+iQQe^{Z-=0mpguhf6iz zUfQtp@S79sV$>hLjlHqI*(`C6)@9=!b$9*VUrP(M9?I@EtC&CMAN%wD|6?Wp$3OmL z-(&yR{GtE<-5-AKw_NW(_w1CNS3k^_o!k1NVc+^=-4f5&@#ME|e{*G8aL?h2#;<zv za)%!M2ugalO7eEXo6QCLv$*)&6s9P>DNp}1Z=-jxVi>FIOWPKs_vX)yEc`bIyWhxO zxZ8-g^`+8>H+S?CQ!dXg*w6V_>gc14z$53LpW_eQHv53mo4b{J%b)E1?B87UQ>ysZ zvvXT+IWK=)`|`wlr<bQz7{tywt>0H;y6w@L?u+Xltp2o5tnUA^nEP`*=h*)VF0nd( z@#kUj$3MlBz4IUB>et+#(q%B8=XVxk#;yyq9__xAe<APO-&Z#8kC||O_V2Sb|Mx!p z@k{+f)5BBcrsl5knOuB4^81ed=g}fEkLPp8$M?kVd-tbw=FYvLr?PK6)SY~3UZQQQ z-O+t6Nf&|>KAUKqe|#X@u*|ez;TH+Ui#rpq?#Mp#p-;`Dd&iC48*=6gwJ1(Ha9QRT z-)*^*PhvQpemL_dr0L~m-3MnSukN(*RQWCYOCiVg(pAN01=~fZv9e|R-23SJ!YDv? zp8L|2J9m9<)Hgnz8IT(Hu>D|F+vf#yo&~7HcP}WPVB6LEk$cL?A4XQor=ROzZ~cFl z<?q{PEJ{vYsEnR+J6@~o^bXV3$*1on=xg$%ozv(0@BjLW>yJ(1=Yk)uEx-5wsO0?? zZ{cUfeTKZJUas*`@2w0Mepg&l{qIVGjjPcvljr-&PI;fv^H$?nuF3d@H_v{~!`a6B z*<TjV<JD`u?ETb+`}@7c+*@0d&%TT-(mC?@%=8Nzc6dGCX7=j#fejfE$EA3L*0lI0 zecR?CqI}ngEq&3wtggeVJGP2)_vaq^=dX3bA)?W9O?%Ly4b?ZEtM0Y@U-888?xdzW zO4CyM+CC^wDl0i4ceJ?o`jp3iKlf-I7tpbBd2jQ1it@*`Kdr>=VmSNWWtWNXer}rH z9?kr`vSVfFB7+=DJM|?K<~_-XdiMX8om<icjf|=?qyC+ZhfP;5e-MB5Ms|Oe`tEb7 z7B8;b95df$Z8&|-_s<ebON74UwTMoyv$=flQLSrp;s*)$2|Bw%5{%nec$pXq->AfV z_E|5~)8c%kFg$|ymG1tmb1&C@w>i)M`yPku!mpDz9;}Xu*63;P3!az|t9O%k-M52N zE^OKUcBQq7SW-^JiYv1%Z<i<k_D;S#w=_FL_llN}smNdFrFQFlxeN|nWBRcrN9E$& z<>C_pf0XgB?T%#9DEK(Tw`_TK&-Q6*J?jl@x&QK%&)FWm{9Mz*gA-mqF;x>j_1I3N z`_Y!_hNIP5_r9l`lH(Ie^>^^KXPCAj@lQgY=U)j%3#khJZ9Zbtr=4Gv(U&?k=5VCO z_B+yhpVr%dQ~mj8)e_mcHES~a4I5LpuX(%K@5W-`Hz_eI5>$`w7hbYnb)Nmj3r`Q6 zQCN31drugD!Fz@un{KR|+Rn{f>EEZe%%e$mcDk+bn=8&24yatyU#t+Xb(DK@)2zhx z=Prrd)Y@ffZ)^Q&bHIMCZ&!Y(^)8<sG&`Vb*V@PibHinVrJ+YQ>{#F&QgUGOMycyp zgsyDqah~PVUs3S$_0z}i-E~TPudMOB(`@_LPxYVQrUnZ)W|N48>@yUkHtx1hDr#VI zzQn8}&78;AyP-|K`D)=_w|{0~oVtd+etW9feEBz2<ZH&*KjBC*XKV45oiDof-wJP^ zrjwgI8y+53kq=vJdc*x_()k;A1=?FLc&zSLT&A<~w4#MGZ}BhpLj6fB43&3$ewWYv ze?E%ACa%0et%fP$lek^if0y}B8M%&d+nF%*iT{mW@}NR0ZQ%uv5+fVI5RR7Z<?g#K zlzYFLYWu7y#5D8vp~s(lzQngA36-o8Vid7sxx;tA`pyKoYeKW;dn>6K31t1RY>+ee z-)++(kyV~nTvJfRIsg4Mu^^{2lGhw1E=zp~om1NuH20~_hdhzsRqa!cZPk7%lE50x z)i%fE-eRli-_KR@aGkuZX?EzkY+lwLt)BB!=SxVoJH2*Pm;bilkxz1om}YBUYi%aa zYQt@E)3ll$#IG@nPJR<M#bSaRYv#ERS~;<eA6nzjJ`8)5aE>KGkJHTLxcTAh9?xbA z$TrJAoVH<2!N0^a``LSa-BLAA{o?t}vq`&5`^q)VJP-39`+~a-!j@*2c&(foEZF4| zer`2;#R9{o#;1F>99ZV4$hXVSP3&Z;ddp!J2f<qr32pjEE2V6^3WBGFFx33`b?<TY zb*aaSmmcrR>U0W;7SWq{lF`(v;+p8~#R`&KJi0ZF<<FDjN;yv1h)(0$t@-$w3HO6c zJI%(;<#(88{`u)yQQ0Z{@!LC{^2a%czN|6P&DmXCSn+@7kv*~93O0JO`mDOA0vyDC zd`#P-b|p|Ved+rJ>n*ziSl^%9aNue6Li={x^ZDzU-WTj;`xFyv;XC!RoKvHra(u@3 zi0^xkKfEC2Gr8cuYDnMd^5_45%>Gy!_V4NRL-(IqoK4lgs2a0yZ`3&j_o6FN4AsxO z4LnvH*mbn#Ux~)g>JDyRQNQAddw1Fxw%jXEer0(01mFHz^M6;YKCk)V-B`Tf(QW>N z_Z@eA{-Uzr&@PToX>;0Mcop$YG&}OL_`)w|2|bq6OIjX%TB-Sz>%Dozc7}^vEdHLn zdE7%ReqPVtrNwK#;vHi)Ufr2@EbW-R{~-(4M$^Z8bPHk^dp~`3L*~mK`R0xG-1}o% z;_D6TuFEkTk(qbxeQf6HOF=)&*C*b!)C*jp$M)J+a@!lZw}mJECYsFicaogD+WPwB zz<-fD-!yG2nE%1{*<Hy4YKc;d66De>_*r-IZCU$im*&^AGqxYokDvNCBr-IDJ4ScX zx67)#qV678=M<|I8@++Q;d4Y}^wO1^&6dwL3|j2)!9!>JV&*BGiC%MDHW^r+aeTh` z<l%KI(v8%L=e4^<u)dwRWxAor%I%C@mTwM)CFhmNsNRYFbmo$fQ)Mdi?t}Migf=-U z^LeZ|JAXdcbM=#kV$Q3J!V}|}ul%x#xWTnn^#A-rKkTPQH|vW#r$5a)^u1i8Jo!ZB z!`kAu{E1a=6Q{AhGGDP-Vey0DKRMzR(sNH2cdW{5Ua*MgsM7+SNcG(Ips5d4-E>zS zpLfstO5l&L>Zuk7cS&uZ-4d~!d$;887d-Zkm0{;hr~LG0bX^&~Fmk#1b0d!U^XInb zy_g-i?&HiT(R+*Lrbt|0Tlg~h$VMs7uH2W`=VqOJx8a)r<C=M~g1uKxZ1>0uIk?Jr ziPZPPW3qZq9%|RcPX3>0-YFM*E@8cA(Gp$mx|4^lJXLP&@zJxl&)hKUf3jHmvx$59 z{(aOwzT;q^h70Q>P8S)^S0B@k|8~1Kb?+1b|H%vz{H<RehgWUVR%Df(E5iL{$@ycJ z3hz9`P6s)^UjEf%$5o}}21*zE&WU=QR<d$G=q1K`Jg0QJz<p!>{37Wmk8^A;uov;& zf4p0sr(pWx34U(=Ouzfzg%s9Y>35szc(?Z(+qK2pBeFPd>9Y9V`(rWv^Tp*S=Bby| z|ADOq;5rj}Lzw54bmo20>?52HJ<h+@Q+4-`X6Shr_-Cf0uT}NQrHLnHY-R<<vP3GM zT%lXkc(r$9*s+~P^Vya;&UEW7JgPINv@q+m%^B4d$4qZ*3~h?sAfCFz<+9s#i`&ly z@3Ezq_Dg<KJEJ!xn&FJ!J@MYcB}Q%=!#MIQH@^6`YT`TZ!rgyQNP73Z5cv=&cct#f zg+Pm4TieTSESz2V<{<k;H;ZR3leS7{yG%Tuvvb+M#y20ikAI!KexuF``7qv}c4_|- z9)7thf2dRGpg?BzhIev{-E6PjbNt{q>DPRR*qpy}PTSe7Z^?G)P&vi?L*Sv|<+_kC zcO8o?h0`CyPRE?8+91b$Fk_<Q1{Pb>tNYs@nQ$7^hb7y!+Fi3bbXg{0`rhMmK9Zs) zvp2JQcZwXB2@d!4&XACG{n?zFJMT(u<(>ZHpOwG;aSZ$)(%rVLQ6{I0$4gbh^4m(a zC7%oYEoFjrtp7i9?C0m5A|i7&p~jr~Zr?`!gpNB4*0;?H>e@JW%0lVKQxuwH_*9z8 zyHhX8hGbUH3C)_wzvZq3Tk4D+L-r?YJvPj<b-2K}Fz4g{YICiX{tGh;-yH1NzR1Mz z$k)K*yWAG*fAhW*ZENNs_WXE-t<=|JhI|6Ic;sd40)O<U{kFII_y6E|dqa+v^HK~2 zF1LGj{(P?fYk!5tp<`+j`5l{Fm~*#(IGNM9jngl1X@=Yh&(6%s1rrpSa{fiI%rbFN z<TpE;&}idgeWq87>FQy2WB%&X*JWoh+uEk>ZsI?5(z*9z75{3s4<VEMOx8(0^?k8D zVB_|i7d>w*>l06X)i%2zw&hZbV>8?P)sI~*<{xxRz2EzH>*qaE)2E;M780?#*mTGH zxnXlRhPW(hy&sgZ+^^BXx46RiH0Lbwd-tb)n|<-UqQf#>qjQf}US(>w*v;k}!>>~4 z+bF@`dL~xpc5fly{qt*&yj~;Qr0e)|o>zok?(WtH#{`sGZVUa}88358f1%r}Vv(HN z?|!)66ieM%y5rrAyBe30r|mkXGc88zu|UVWIN`5fJ<^tNShZG!y%&<s;h7brE3YhX z$oEM8;0hM*MRT<u>9X_+X>N-tzm{azmDjVm?ST(}pw?9(S)N0$YwtF^J7Zkvuxx$d z`;W7d0>q!M+bHhEX|gMujj8kNw*4I6%bi!*)J(c9_c?^g$2qa4D=9br@V*S~4^KYW zupIr=W?=gG>7pF2)3aP-v*kIB3t}Cn>rC-)ihXeW)tu>j{43|zGVg7dGE?4@-?T5X z!&=mF)dv&J#{!<${)z1p*jxI|*GYGu^;*gQFU2c<H-Grcf9QUF^Z(a+d-iay531NJ z@@*meq}g|W&n{n*7I?Y2$dtce)kRrbzLwPXT@JbIQZj}~uRb|c=8K8!tL$3xbDPBa zyg$>`ldX>WteD>-|8C9EnX5jO3N6z=l-<2f(6{2<xyfxa=4OlhNe{o~Q^f4W_qIDw z>BrXS9WFE6lwwt_qJDX^<(NKGOtW2IeT2(ASva}gY}sTZAF1pl;c4=L3VxFV=JTpm z+@154>G6X-dt78>vN=qDF54o1=-$+Q*=P8?MNWCQf1Gw|hmeT**(FmS^*ryGzF2CP zL;RFN0h3(2T+YA)(fn8bm^9CAlG>%B+q?C{KQY<Q0#l8)-TkrL{IM_hcf$iG^KENx znXWARes-qp9~lknOOn~?GF;i*f?<p)20VwO8aBrsQvP9~Z*uTnZFfuQ36})NLznc= zUp}+3>DKy!c-D7<_R9{>w!SI(Xy${ek~hyHi$!$#UfpfIJ?qMMRjc0Tnz_lU+{?R- z&z>qMaW$5_mo36{l<CRW-5=_Lx0Qcj?UI<j{#=yP@*{U7kDq(6!7Tk|&uKBw^!xpv zuf1IT@w5J^I-weoZ!-3eo!+Fj{I=yvur2D+-L>_Z;*)Z%Ls2|C**#PbT=ulgR_XTU zzFKdVn0GOEyXOS&8*kjiRowPp+g%)&tee&QXl~w`d|sYs8yBee>V20><~yvgX6r*$ z>uFNH4g1`g<XU$m>mG3Lo9Nsm7+iH^u?0KJF`XNmHs|V!HBVDkd}MfjmC9m$Zh3!( z2OjI}UVNW<T5QpTZ4BDn8}BPm<*1!?JpF+@>$!=t>T$BInMdpu53+kU{HplcX#7NK zT1jx1;OQOAWelAB^S0Wzyp;?2XOlf4X9LGUj?+q^Z#}-XK7H}x6ti~c&gXZ0*nd1> z5AbhbI=+?tv7?4_*~iY$FE7Y{(0Qe^UVFb+#@i_`X2`u`UCSQ5;K|>@-mPh8odd1w zCf<AO>*Z<n;ka(k`R`ZOUYHU8ep=UmmIDG`9`#GF)tcZG%g-y7q@Pn=ak2YI)C86! zA@hzyPMqF02VxD*His{6ex2o^dFJtfl2ty%3$NrjTzw(2ZHdw8cm0QgxTbhUgx+|^ zmd&Ac-SB4nQRfe3{ed%e&v)fEs3-Ant-iB5v*%I$ngz*6>`%WsSERE{rF+Tp{@(!! zds32}`ySa8?Q%Y0<jiyLQJvWT<In3Da_2FeJAUj}1h>1mt@;zWY{P4F>`ip~s{Vhz zZF4Q$?)>A;<xQa}k=`c$r)oQ$zBzC$sc&Fg^=Zc6^KnO<Px$xs&hc?RKR>hX*uuh3 zAHQBw^W$ew`nGcNg4c<is|4e-^_ETRInkUL!cykcS@$NuRBG0j1isU9KVKTub!cUa zTWN~C3k+Fx<krV4TP6wJSLQk;^ZMMx4w3!!AwTD)SR8ad{J7%V@f+tpp5N$iku*_z zE$h^OD=y0Y656@UraQ*SPd<uo)yDTa_G@=6-`2i)>IVH|a}F*RRC3ign)GMebp8WM zl26-H<Fy(2dM4fXPBy%zSJ1m`d!nLT=Et5?{<5XAo7$bkzHh9r{>k9C<e0_w{6hKc zV-FTTtADU)XWe4Uc?u5q&hY#0^FR9k<70nUTa^jT_I)kQfgj$pFnpf>tMc)`X6}Z1 zCpndUa}-uYu8^IyB6d~Hwlu+>^6pB(;<klH+^QD%Ok%g-_uf6PV?srQh0MV|pA#Vm zo(kMJ)qTyOwax3?JN83KEO(cBsB~6ax>QYh=C@KxNmBbl&(DC;(&Mud#WD=6ZS0x% zi%eVp(DLT-ANQ(@^EA}Ob9&FJHb#C}a%{Hcdfl!ym+zPB)xZC7z486|srSnt{!32R zIQ4RgN3Y)`fz1y}1KJ+VNl&*izr`u08}q!;y!6Rz<9l;wnOL2CplosY)t5;n`K>{% z50mb+ZTXb7@${+5#{G_Ot3;n~;}-Wn67bld?jBR^?Wh|jXN59SRu?+Nu%(MU*88w5 zvO&brufX-A?v<JREL*A;<R^<-XkX5F!Q)e4%-cAbF{Nn9v8t$iugM;2O#hTu27b)x zchx?^^H3u(@XEL5UGl;nha)3hBZ|u2KRFhmv@oiC#p=RYo4S`VN_~-f|9gq!`rTrQ z(v!k6&)sm0F4<QjGQ;`yqVEg`SGgDMIde$%;UWY63t1LMIo%G;f=6dRs@B-?d-EeH zxnuFc-yfJA;`no`<^H)1V$Yu${15P3r=uHiJao=-{Zlb>E<af#`p?K}xxV79<u{*Z z2z_sqWfQ(O`GR|*&vurThf-PgTbz!)5vR&GL;ZPOYwARXE|$7^%~E?}xbDZ#+5dO_ zq3QC+eoF7jIn^IrQkPruE91oZ-o%FAz8g{#UYuIl_Q6L|Mw^jm&t2Bt*7387S3TJL zX`5vo?`eINuKKKi>9IZeSq74ygWufWci^)2pQCeK6aHz<dETKv+o4{_D|DXu<I_*> zsHe|Pj#)Ub$9nEI&eUKnDdRgrQt})%l8aB=j5@~cFs~)f`ZwF-ML(A9iET~)E}$km zXZdqKP0_*|<xlrn-TyD9Y!H9^P>j-yn(*W2&!zIQH@)A_?<2S3&u!UL-z{`b33zS` zd%&~4dGlJn?hjiJygez$e!!x||Jyc>-<LGQ6W=q(pYNKnl)p5CZO{CNt2y-59|)=c z-NunBJS}vC>&|-PWt`t`-qds2D?R;a<>AWL=W^fwdCs><<lUp3ygx4&{rM)Ex7hiu zkLVri)6zHA%~@Sk*OZ(8P-(+-c1iX{9d<$+Ll1q*k8qq-u$D0-;&jWzCHvo>%PP2= z#Jq>+=Ect)f7b<Gku7<>k}c!%`__9-(JA+3f|suCdvnYo;Ip;muiytypKIjh7OGtL zd>zOU&1ufCo9nXav#I$Fey65;uIw(nzexG}=ks&_uH0N-eoa-^*#FeM#P<_lRF|$e zCV&1=u27wJfo_|LMX#6cp<KbbJ?;B{nmGoyi<#vFHBU5HQ*fVmzjN-X0M@%x9<IL_ zm?d;F`~11vAuWk4$1e0lR%PhDd9>!J#q<P6-rybXf4)XP|CKdo*(nRrveP@?ac$*r z<-RR*FxDnbX>CKF=ACWr4_2vL6rSPVoxbU*;-4y&>#YffmCUa%z7$uCV2@;xllvyL zHSWciv`@biSSlJg*hS|qo}hBATRnND{LyCjpbC{DcO$h{{?xkP9+RFj^8Gm6f6w-~ zwx!VP$A9_KnEGe_cNZ#Oq4=!2q%*x+J>jmfg0i%^)bkzR-h@1y^6pFYhV?G0Ig_em z4kiDa=HJj{FSWo%hF!<*{lgm<9{*zM>9oAPApiHm?j99}Bsty%PETZRPcwO+QZM5= zBU0pTyIWJI%On4+FB6!~<QW<nx1@EfDO|so#XE>KXLI|G)E>u*F3qYYT|+mal7|^> zI^HH~Aq$@Dsa<=}!8Srt&vW+mInwGGCw_Zg4E?y)m|^+n0~JASGR_)O%9(RtJm})O zl_V=Kdoj52H^X~dnSgVV0>4!fA8Vg`n|4C#+N@lmUozPVnHvO|R-aFI)Vo+>#n86b zYTwg}6#j%0Hs@}>I>%`tXtrs4#T%a^wy!j!W(4m$@sF`*!u{nbhMGrSyi2!b`?N20 z<tL33rw^VvdFcIyyc&c3pP2g&-QUgby|_7}Pxtxf88+({M>cpoV?Q)ON1&foO-b{G z_@b$^KEB_mS{!?PEBj^kpFe&tY**xrk;~~y?AURw*q^g~pQ};qq^(~VHtjN&FgW@m zPi02n{2Qv0_2G%X&qjnF-xJ85S|_HbFRJ`yj>++&Ut+&~C#Nn-IkzA%-t$?4^-Gtn zuCZb5JJ=;xD#<N7(3Ilr_viCHONJBu>ng7I|GsWwwrknGqm0XBW@)rD)NpK4w^op@ zdNg0gzJqPOj^Em2MlL=2cMC)3$SE9qm06q>c;2h&a@Gt@JF7h{rf)Vp*XYRJkeU~; zME;0SiN?c%rw3IWgtkbsL}fg!WMx}uTKz&jpk=MpWN)KKl_EbsaeSWNRWY%B!-K`Q z>=WL**XGH));6iFl2>Sueg8O8@gKVn<Ai3$1IK4SpKmzZ;a`!Gu;kmNm0fd>q-{<! zeE+_^No$JYi<9kX4OKNOolQejnAWde;^2Cx$N9x_m5c>aj;iM$IGiXlbG|$)e?PnF zg`#OI{oJO`sJ$<EE6pc5XVqG6>v{jSUs!i;P2a*j>)GyGZ<46rb?{EFJkO8rg4xMz zlWj8=|9-N@-YNILj-sF9q8XOlA96M3><y^DE%|R(@w!vn)eo{guUThPt+3yYZGqvG zA9)E=@?P9`3cYpiT+qV#Q_MJXOWVr%_4oP|ZCh)sW6NbKdTjEiFQR(skFCV6RiCM~ z<307|>dVy|?kfFw^Jt3Vq%*JIz1aGBv(@9J8*DV+DK6T4)_sBTsy1Ht_$Lz+rfN<* zzlurSwIpRnNXq67X);V4PIJ4ARpx%)s+Ib|LxTNAOysOhyz<75(Q=R68!pT`c}e~7 z(^(x~zs5?wKex1enWj+RZ0&CCBB3Q&6%E{PLL<X2gnM7~OqZDZe12kO-x}wz^f$*s zr+z<radqI`2^TB1TGd)Zo2_o!2!DAuC+f%k?dqu#hx;~!YuF!te}Bq9^9kY0&lvF8 z<P?Q*Gw%L8+i-5fe3sdw{}tzi-S9tj`{>R%&T7T>M6qS_S?02=w6*e_Z8ZDQ;tkg< zLiFTbE&imFDF3)m=hV~gN7Lt4m;d5_`g+j^xn!en?2n&M_tT%d|9^K;{vn-Hm#24` zrq_w<?f!WC#*h5}T>qcnmx`Y^Cth@&l~Ghgt8end)AB91&xgNzuYEdSecAr`7JEhO zu4z2EA6v1Xb6ew?fO!=fX8D2Km);wg|9Huo_k6{(-*P>Z?Ei&7{#yR@+xiFf=Km}- zKCkK7Z{=?vnNfa+Yj$LZ%gP6nKh<Qtcrj)21^u@9(vRlu<-8pwkvBEoccpmx|D_ur z?%Bt;<$HqCj~6!nffKLoO*&dB{^OtWx~=b>1fM>QvH1Har#q<n%%8ndThbqY5;>U= zDN--KOET0twKK5gefOu!rb2t(UqAQr-p|J?FZi{V_C2?`*Lqv{&svK!$L!4;g>}Re z<#`N~_p(~-nBTJQ)IN^V=6zXbqP6!-ajNh9VJ$LaPf_l<uX4W&UR~(^kSlcTtOeue z$V}lM@BIXqpYfaByU+UZ?t*`o5<;Z~ZL>dZ?Ypz;!#4A6_qqOFk(`$}Cwb0mcYX)2 zSOe{c%J(1H2%Su7*I3f7`|bbdHwK4l87HlM!o21^V+cR<8+}XbR{=*?T&=LqY&fJX z7#toUb~JA8_I&Hx{l_A?r~kM5@Jq;wUA%DLzgK@&AO6ern92U_hua!=xTZ+=<QGWU zzS+M?V!}mv*)1PqB<8WWJ^#A<a@oUFlX-fl{{MJ<>b^nB>KaMzbp_SUKlvA)z33ug z%U$+}XWz|Zp4xBKV&Wa|IX;*8oFwvx^Bvpw>lXPp6La0_?^@m#`0`q9OZJ)HeQeJo zCp^E={dl?u|1`e0yfvMYpFeUgvD$t#Lu4NxlW@%4AGK}k|3@-2#P&SBT48sT<C2-h z-NS-M4Wf*fWM7)#>Ft`XE%#=l*ezDAi4m_l-H-n>Y=3?7k5{+H_BTqm1e1*`ZFh0b zj9BfmeJ!6Q|J<YR0y(_JwykRtKmO%#kWlx0*{weq4VIi1zp3&+W6J?$%d$-?Y|}dX z!!7?SoJc?UvQ}f!XUDm`2iIt1cyUhHF6&x-Pks|~_lJVy1?&;qwrjY(n&I0jr<C&R z<LZmK=1gbwKl02vDwo_5DExWHvB%X)mHyK-&Q<kEoN?Zev%)hZ$Kd^ec_+6z%v|VK z*uTboUZULd{q<5YYrRT7>)a@P&vsdgccRq+Bdv8#FAwHiX-p`;d+5>Hw23!6=F84K z&a99ldn4&fyPQd)rh>Cb@T&fkM^5-#t&C(adortNA-^Hl71x!rdaiPZvRo7Gj?bRq zxo)~nnrZjFXIFF?&gEX{I4}14DvKMx!-ro=YwQz>9zH4Ly?!-meV>;l_v4$A^Lkq) z_D)r0m?H0e{GGwFgi_5zAEx-oG2gS5(q8%fLg6ys73muU!@jy-H0!o`m+jxqw>_m? z=4h?hx#Lll8*=Ub&y0Omz}#iJE8@wzH~nirW$^7v5uDl6xJXd``q>S(H|^zOf4)=^ z6jya)3ULm0&+404*~Ixo>g3+ChUVk{{_?oV7_;2^v+-qUQtTTshZ)`t*Z)52(Y;o% zdZXLX1KUqz`)l*q9w=S;&@EZ6)XDkh-Ind|y?)-?5%T!?dIj;LR(Jf|<eO`^=?VF2 zdw%ma<MmLRBGIGDu+VqTQf}|gSt@Q0!domNtU15Q{ErH{*Y8)>mOh2!QG0UB_MYMo z8{*qp_>1#T3!G2Ctt4J|D&l(8n#G?5)+I!TUUQ77S{Nt&dC89_H<tJ`Z>~zLH2(F9 zC+lQ`!7)b(_DN|E=cFz4KNs7&)NwEOYoSBCA77I^vSP7QV3(zL|9cgw!UUN`6K`|$ z?)oU98+6c&JFuuR*7jJ*Ce6gJi)W~Jf9l^~f8}ve!1tE=8F%XqzI^`LZt#EMY*i^e zb@m9Ie;0q+>o6SbH-0TYvGM%e|ILpc&Og9-mRXTy)}jXmjZs`mPAC29ME=+8k)M<# zB()-_GoifZpWv0|sHq*jwSWFN_-tv;W%qg+AbNP^VkK3h!%w}UHXM0=LWHBXoPWs* zi^B>r(mr7u<m$ei=Gi~x)PlKzEk9>}PG#0}n$H>}`KPQrN8rs($z1_u4}ax3p5L@! z+MfAtTevrsM7{R0@A?1b^%;}?IrF$wcRy&XdfMYDe(!y2rm){Ni`?GpQ5sP<&fb*T z!g?$1&1&c3YiTE5&B^A7pW{|B(eF3+p1ORU)dg}b_Wwg7!yevCxXpA^R&C+lZwt<8 z-qAbt>)y=wVpskJHrrh_-uS|?UH;A?qk@i~i%pa{yy~a2KVIbH6j~q9Xu@xKf6k>j zpDoud{=%Fn@=H(t)n={4iIcuHERC$#81_lw)Q;JWE9+T*EA7zC+i<7#p32_n$yQY? zD#dHKs<agCRE{k;)++Gfw$+PgFLcvFSDyQjec@a;S8jL0>hBJn-{smb-AOb{ujSW1 zp=ix}G`Z*DU)!$6)2<f$4@}p1{E`y+_f@3iS-NRk=#SsaesJBH`$>7ymPDa@Tqj=5 zv6@q!cvWC+<hu{Q4qJG;9%+g-I%ww+;TShrNY=3V^Q$%W*Iy{?`1ITQkNTXKH#6;} zOWSW(r|vGPxVK`}4Do&YwLk6NP|vTp__qI{zcD|XCE|}Ci*IW*b30VJ@9_2e>~)ik z@8@x!uI;W}uDn=F=hU|2yJSS3s3my4K3CgaTWU9TLHPM|ku6KPSG!#Lt#itM`>Fd^ zcK%~LcmCqhs#y#79I$a0FJ^orv-#}%@QC#vzUa*<f4*k!-<&_&roLGxZD#)FwBP$v zYrM*L<es`;Eu)fJ=Azp&(d=QXLtS{|ZEyGMhpst&eq<y1MlRW?^+m=9rpxOa<;uH{ z?2b^lSS@^w?Ou}0!@BZQ;tzk$7u|cHNH~RewcKToq$j=>y@xC~y&FGio%!xzwa)g< z>wWW_rI+4i4SW7Y=g)>2d+W14T-MsdcOk4%EOwsh&#gvB_uUNtF#k~A=NhwPCx4z+ zx?||ps;~ZVz3Y$ov_C&*e>|;iVEx`+d`CsheD3S-B65B97EP2`T@|f6Wy|WvSBuVb z)e0}s%t~CFJkL<Uf8)-hihWjd7&%}4sN!4oFCbxt?e3048j5BS(>%<siJlVL#dA3F zN8SgogL;Q5#p*1jjkxc#J>7Ni{C}Z$oWCbu_Al7qHu+d-({`Vxe+tKbi<SJ*Y+aTY zJ?HaP*}H!e7l&mVw9b>6w_p5U>ANonH^klaU3vc4Pm#wV*TsJEKbA`BSYCX5p4Hrf zmIs~_zcXELdUNQH)cLyOlI$Nei>``3H?w-aeMaCq<r6v|HW%FHd0mj@6uB_A*~|KD zU;nxNG39lC^=$S#?Y6kSIoMB7UVKjUE}=grn)k~efB$`M2Y0+5b8ffcBDJP~8Tx*< z<#Xf~6os>e8+316X?pHPQoybtn;iM-&Ks}gT4#u6Bn7TW4}ZzP(e&tjf6C@5{gU@L z=zZ;PvUcn^Y`Wm|a!1eZb8Cds7x4#*xNc(Qajz3SF!`&%is}oGgc+<@Sl(X#dh(*s z*+>5wOlP_8Ss@fTX=l4?juE5o<dnNg2j92Yoeg~OD^MZz{95ll@zX74m-vXwwN9%H zIw?4N(S*0V+?)RYP-kR&`O(hondwuB^w*3hD$d>WcfPS$>cMaJ3m4Tt=+3)2fmhJ_ zz??T)$IdvKEU9ARn$&u-P=02jX6r8N;<D#uopU_jyG1hXxHxN#{iEG{huVV{rhIl~ zeo?}hb;BpS>|1EkzyA`#7hD*3P0s1-FHI5K87uz5)7d<sXRDUfF2h{{v)qJydiJ^| z+NW$(*}Ngz=KsbcRS{BW-fz6-I(MPfbKx5KxeGOu`PJ^epZ$3=m%4A%Kdw67--p8v z?JB%6C)?P~>BJ7dNl9zYm6_iY)^JFE7PIUM|B3YX?=LQu?XSrB*?KZ?%{zG=KP9o# z_Uo4P??0OBv9@Q<cfV)u_k~SfGk)^yOR2fyKgr7Q6NC6B^Pd-3IM?{BQ2XJwsl{F* z;o^)ZhW&LfSVTD8SfBi!S!~fF!>7>ycW!l*>8@-0>Kmrm9@Nsd{QUmlp^Z5eE8F<O z=O*3fd4F@mE6-5*<ox}Xd+a&u|E*MzQaJwa`nk{fr#`Q5eeKP$_S;#@?~`~mmq-1% z-Q9B7FRu9Zp@U3JUsjqnI{d!zO7*qX^easpnEy;_&vvt%_nlAc;+kBo{*AM=3^(OW zZCCbS&SKx+Hg$)pw$g!fIc)P5>4^w2d@5k9lIA}AY7XzKdoNXw)O;_Qvht_hVG)Px zhX1rRes9m1<M+xy^ZQk&ip|z%PF*=1wkNai=gyV~3tH#qi0z2@`QpZE?&$tyi@p~W zPk0n@l_Aj8zVyvQfjj*-J{d0lU-|7n1E-xsgN=OO_rmjqs@{i6L|oisb8Ae#@;`K( z$e!_+Gx5RV2>Tff$G?4Pel~4G_4g&mR|K&2K8oM`V|w$sX;Mrc3o@1Z=O1sHz~1sq zGNE51M@;&>O~CZ#uVn$R4y{ran>lqu*aorA4+niLL|WPvHSQmG3s(uas>sLiTB<v# zkMHw7&bs1TvS031L{7OaBa(AQ@_+rdduu%VQjTBx!w`D=PO_r$XT4C<yGmE}m5o0C zuRpoxY_R|LkgIzujXm9dq;+c<@CR(}SR=PApvlv1$LyUeof?~q`Ko#o3|jmy-#e7O zz%04<j%L3|^5RQU%PRIBn0~#_W~o8iZ;_k{b2q8)aAlfcrl`Ll?a4LAc++(YpSX$n zFcy4?e7WiJS0S}T$-3(H-?}Az=jVP>S)g|3s%EVYOW?!C;!kFJ=>l?^X35tl*ky0I zylUgg>An|KHSC&MtlnnMFPHotyz9lOOy;eVj+IKuJd<-aI~Tk(jFaWyqs{YU6S@Ue zZfWT5-sp3tDsOR&!irX@D>jMt9jwNQv8|!1Zo-1XJVo*^k}}gYl8uu;2MSy@2&g>r zbqDuR*4&f#KC}GQY<jls*nZh7=WHXTnF}^Z9XNL5!ONgUoA-vU$eplNIb*A{_)Ddf zZb9eP7sp<{;#K_mxWGfwNY|sM@sgirTyibPd-3N*#dRAE=FYB4w`!i-GF$DFSgf7- z^O~Y*ZX0dCUZ`z++U;&=eE19h!Trs%i|V*u?J2o9wZ8cHnHy#jx(BC!n6^R4vCQk- ztd`xD+YbELe&*+@oTVGAc(R`8AKSxq$NAagUfw|O%RAJT^R+$y&?vxJb$REpFU@Bk zN2UuObG$m|5^ODiyn)}br%&z_Z(#M?xpwBaJ!`i8o!eYkBwBH|rPFIy$h21>Rc(GJ z{Y9(WjKbEKPxIYz{#314o3Df^*R@^))ib7Fo^91SEmgSTNyo%2$CoL~JeNJ1@FrA2 zbKg;0?`*>o+nn0Tb3-nitN3#6L4lm8{c(!}bv@2^8-Lrb$c}9)7QcIctBa4}XNjeA zl~%6S)6vXW6I^!h=m*6W$Kn+4Pd)y|z}mK;iYuOT)8@#YvyyI$UpF0`a%E-n=6Ow$ zTXdbwo_<>T>2>Yn)OCL@&;Ib+qR3kF{q!briOrjQTQ_R_oi;%#IQq)ey8feL9bOC> zj1IexFI-(6^zQ7=8wnBzitgkaTDl#0$+t;t;cek_Lg|fyhuzvl_VcE{WBENxf^Dhv zf;)?u=Vmu(PuFGGH(jyo-))6G+nQFC1)O_my}{!6ij_+(`dOD<+qp)l>bqj=^^-d+ zU+R^7pZ9TT!TSe^ZnIkB{hIO)nQ?E+d~*HSm)VA@>R&JRewe&D?eX5?X=f`x9@(L} z_qYk$>sg6YtmiGPD}6Wjvr|U1eC?4%tqIOOqMw9V1Fv=5J^d^u$S3IMN{;oji$q<6 zCm$0%Xxnr4&+bjRg2z9p6uRACD_Y&v|6xvZ<5sz%&QpIn-ffAt@%LT(GNEru!SC-| z#2GHWE#_Qoerxl+$shO5-d`TGHJ{=0ypS3#J3eOZM}M+<bwXynX|U+83g066<0PNK zmbTW)H~E<dc5QLGxYU%>J}|w1+RZ}FLf=a*i^LZ0m;CVdXw8e>a%P8#H*V*&)cpxg zeD&|+Z;$U$^HQZweq6^|`Y0+#z>FhcMQMEZC6hzdTsPKTY5sLbb%R~Z#=R!>Jmss7 zyg2^1%IM<JyEBDqwQps8yH?qkZNJQP%kzn|rW~B3<~?!o*WLG{=RdsIULUaOL~_`y z>&~xVy}LZ8%(7F!Fllnd`jR6OAHr5dB(K_5vVG^W--e71-_~X9o|n~Yd!gj%!x{JO zUc2qRXMJR4rqU7TO`E1pcpmEX@4ET~xoJ|CtA*Z|9zVJDX#{J;!w}BL#@wGTY&xp3 zIk8KVSxs?uVz1zJ%~tl%+<i)SMJ99jB<yUjSvBQG`O5Gu)01C0=QV`suKk%j!Mwj| zwwY4jk2Pl=fA-LA&piFXVOiO$KYSInYA@cL*D3mE%XTDvuXLE)gOKX7ElrmjE_JOq z|4*Q%>aK169aWc#IsMz>Bf6E>%9p;_@S5+)R@0yC49*rd{9E2uN@*+lNHqI09W1zc zQ_yMh7BkJ~<(E6suNh305-#Igc4+?N%Bzp=<ege8dG*`<IYq_K_PyQzx9V1;h>x7p ztr=3yTTS?xKOX*lR_9uhiH;Kc?cM+M4yxT+K2PST)x9O!f%9E+cqV&(Qa`ZFRv~}I zNw?p-rOp>*d_0t4XuaKbze%&-Lxb+=if+tNjC-Sh@Cq#O6-t*ncszqkFS|l`ru9;< z89u9%Q|mAEnN-fdx^2Jew<~s~$6RMQCVMa?%M`AeIf1?9p}L$xX#X+GiCflQ-uvS@ z!-Bnk{~o^{`&qvI$n!`4ljqio{I6cCA|aZ)Y2y#Z{~`A87f2nkvJm@nkio)WuD=h% zH{aa10X?GmT$alh+<GI`@^{^=X^m~0-YsZ2)!yE)L!Qw@y{~JdS<9TF7*1=A2V&B3 zzjpk*vc<f(vD8ds;t3rgkFyC*;fLPdy|qw>t;1+X>&fU|t(+H&HpI%9g<i|K!rHdo zt4{pgQBOS^dq#WC+r<`f@z#s08EeHhv25Bt^MKI%ySpb82UG^FzP+_{b=YK$Cht4z z*G~L$dfAfMirI-XWGq#`sMwr4_v=p6oW@)y-L71}qQ$30PkyLgK4tx(%%FMarCfjH znM_g2ifY{{{A+J<>;eCaK_{eGZzK!5J)iJs{ayuAp$+E_KX4M+w(sTgDE37;f*;Bs zsIT6<WP+_r__3KmPj{DU1kT9dOjsGFxZW+^dB3t}|IMQ-b?@wD-s~ll<E2oN6zFr$ zjF*{@^YE0ql3#*)QXQ{OJ}lwlZ27v7d3RoCWoPLk%_VxXkE9#!nmjE*^oA1q>cn)# zFS#8bc3JjYay<xqn0V+`!^%yr-zS%ySXW%a@FMAS#ncO%JYOtGQFb%g7I|tX|E}uX z*fUqy6@s31-A$<0I4UDK_pEkm=ex^0EN}b1IDabk;X}XtW9K7(Y`+>%d~WuKO^4p6 zr@MKWr~Y_%L&&XM|9t1$IT8L3=6<Xz-zMa6wler!_k`d>9Q_^BLw2ejHL~G~*{}UF zT-8_huJD|=sV{l<N2j`YEH1V?>apk1!>;*R)>o_}-uLM({C#iYols@R*De~HKdd?R zJ78z&xy2GYy=L64l#uY!E>hv_wtBz#gVo_52AB3Gv3-u2X{ElusWwn<c|}}yXju3v z6aOh%9-(t4T;P%1qxIQ2Qm#|c+SKy3ltPf$gieFvI}UPA;d5hz`0rZ>I%PHZSqe%W zef5PiZ|~x6gFGhj&Yjn5FYLXx$mYt*^9E_pO^#@snay(h*sRDf!NvEQ!}5b=CfuBD z=_}s;`%i(~`>Cg|zIgYc<%21=Rhzh%RId#SM`T*+&Q`UrHkQ{nf4aBpWz^Jno;&}Q zJ}%UMvdCw@WbOQjys0Y3?ElaC*>9g4vFggA6N}bp&rxwp&TQIgwW(FUo%?LcY5wCm z`J6Z0R9fzGZDrfAGj#dngc?upy4>z_v$kp)cJjLk)|RBa>t_q{E3j%`xlsIqZdcE5 zhJH_r$8)YTxZnSLkF%>O?d{zA`KR_C%3S^A)+*bnFPO|$B^;D&JSQ{v;5!44N1m-; zQ*ta+rEO0Y3Cnda3YG9*`+1MUtizsnjtUsAvb=t_^2sTc&WqB2i#sw|w;fyhWv`K) z_S2ip4C@oOr57_7wHHXv57=dR?q<}1^aa6r>Ce46?I%4q6*^kl`*HFumW9{fGqTN@ z|KN|-o%hFb{9=>rzMK?xE`0JR@Wt~Fw<ESCbT3tT@j@`W@J#dEW!5jW>jD(AOS@c> z6}K-jKXd=l=IeVIP8VI!to2WjUS4Xxu&d?eVV$D?b<JkEC!%W=bl>*Q*eCvWe)mm} zZ&7@YAG|tVxmEr7@#=RA7|!Ob5}mh5p26YtR(|8dGjwGaOwX%U6#O3+{k>#5gN1vn z@cWbO9zxHJJj%A|%#WBO^Q`H2oiI1^+H1`mp3B%6Hl((zrl?G^6S|jia@+Ncw@cqV z^bQox==+ncUv^7XcK%hq{*cbL<_eK@_qb*soU6*c_35IOE*t0X+R^!HV)WCpyy$AP zUE=dDeM)#-p{G`3@x=UD)+xrSV=toe(~{Q)CI*^>|7HkV(`e)QNM-}ufw!zHsvF#2 z3;oXZVX|DeFhAj1=#+(9k9BYNWDOQ^yv?=GX<lz0!}Je4g6;Zyjd*h(ah}_=`OLMy z^IDSJra#=`z2Ti(Bx{%aWc9YViYFCnoeX=-Kf1lnZ+&}=anD<Ro0IAvI`*FU7xC=U zwfAwUM^t**vLcT>uC<BR6kM**wP9}Nn_Dv+j@XqwW>|5i{Qd^!e2aU|x9uig;o9`q zI_G|SU5?bpW7o2L)$*(F3%5_dp|?}8(>QhcuIgm{H;>JB3tkea^jLfDmRsESTw9g$ zUt8POluUJA7sM6O$#(xGkI_-4+MIJs59o3ymwpNIeE;z0V|^z%OSiCPB0_Pqbhegk z==^ZOU<dcDeVe!Ku@hujFh}Y8omX*g9-rH8I*Kc>TO>SslJ=^*S<L>AjZ0JO)3p!o zCBOEv;ptr}uMnFowDemJ*FiR(2YR!@YlXJ(%dg#Kby#MNk0<BLrkA!Q=d#Y-am%{( zsGYs3bnU-YioT!pik!=H)244cp2d4D;Sz&{?!jFWchh*pauy!toIiK2@6|2;b~bH) z_Cqe`o2a-{o%Nmn-xvMcoc+Ik8t0FTAHQ!a*J*I!U%yMXz-HEuwZHDa{yUd*LVvH8 zO#U}T_8%fUQthvZtT%jbr>d~rS$JFidVV&?9DxisR-yK`Xlo<ssOdTKp<?o@wl?Qa zzMwUW)k9#hEmP`Dw+UfeuBuuY_8+||mTr{pb!v`E4TsDnv9yGx4*n&lUdk9Al^5J| zX6{PW;&m?WZ!|w@B<v5L79F4z_~L)<;}XGb@kaOeX`~j-Q%@>k-(b2ub2jVEmW9U_ z>Ag(|Zr;<@{WMv=d55dfF3|}yFRZkkvqe(*+>GQk4?b{xyLyw2zx|Eb`agfKyX-pX zt(#)_>b&hO&15c<wHkZ=O3Ch0VX56zC9?MD#NEcT3V&%WNnbi|;kUp&U!!xFj5Rzj z7%KNW{IYWT{!gQ`c1lOLi+E1+oq)Y5e#_-<`4&%;<|$vkM9f+%qIlKaKZ}{?X)k%R zgm0G}SJFzy<Xi2Q?>UxCUtk#7y7XB3EZt*|=M)FrzaBV2xTksYd9gZ<@`ZLS$92wh zU(COD=H(P!R@K?F1NK#}`R^z(f58_)i?v=h@~x)s>0i&UbW7TBG%;rOwl7zj{U2WV zZNa(RTO?`Kp*!x^U5>0=eLyNrGxL{3u}fPye^l~zi`!Rs{Mk0~p0@M!pD*W6c^lsn z@BX6RWz#O*g5Qk$cYM5W9pV0X$+794KkBQ~<yzk9@zj_9D``9~o+vr>=$x-XKZAPq zsa^6tsXRseY5wU`*Z!C;yIG-l(ckM;qQ^1s@SpDD4Hxdtt*_Vq^QZdJ&-Jp-?32}Y zMgI7j_s6v-ex75U=AVBy$!a#w_;#1SSoGvzh4(RoLy=8<k#da*%O@*J-rKM4XZ}>j z?QhghJIlxKWs^JqZawo*PCHV<y^(X8_``hj^gnX1>*IP)|2}j5k&Q2BwbzdsD<eO~ zRsP~U7C+}xmQMLX{R`h0s4wS=`8RRpb+^>g71?jj-kbB>&}3b|kVxj#gnK3YGopo* zn2fCbr4@6f9t5^-Y0*FM=;N+UYE|WGhSPZ0z4!Zc>T>+lf37dA`ZFcu(k5wLl&t4D zc6<AgD_!fGHiuersflcxKllHRGi%HrFQ0v(eCGaj=RUodFn#L3=~HhT$J}RocK^Z4 z^3*+=v8BuA?AXK6ub5(Ue*3()@#fd&{JeeN==6WpHQ${+PJJ%^<NES>m7?qRZd6fE zJzVT)wp9P(r`_Fw?8$42RHnJACPlGE9y-9z+w87)G53AdQlGUBDw9sGy>#J^1bc*- z#N7?)oVF_t{nd-Pede`iZ_J$g_ol4Z_R&lVh)=9i-LhfxggTZNhcwP!KK$4;E#eth zzVuEDe}CD3-fG)d3Ufx>j*QgS;a`65fsNR*{8K*y-duh8FUjU!%W)}(N0ASgHl-%U zO?|7_^QvaQ<V(4#%J&anPIvh)GS|9%MS0@B@R+&lPVNqR`Ecu}h=l6)uTq|o_0ukd zX7xmT(ptlRNZ?|k6su%%Z?xbiUkMqB1y63wFKT=(cHo-vDU}b8Pp(MM{;pLMX>{7x zgWp~EhQ2E2FQziCX-!L(EmpaaGHK3PCY#%yErOpP-`W)xlEK`jb5!zD>c0e~G)*p< zYi_N%4Gy{+&;R*xZ?6D<L*GN@A79h5mYM9T$c}#}`@YuiTiz*lmSDY4TNfL@+^1f$ z_CwBHzgt`1-Kzh#YsuZ|H$EQDSvhz6+6!No&3zxFGH>_l9ow6_t~svbOU>QX#Ku&T zEVBDrocGkjE;;N%r<61vzIN_(*`J?&`%>4wl}}sl-SDYa_bO#CeI#dR-KT$#=Z?y` z98;(IedV{L1tMmzi!LkP=5=A^?e7^~kB*z#aA)<}uWtCFcvYv>pgwPE^lNKF59Sw9 z-%Zu3SsWH>o_n-TRBpEGzCbf~`QDQgp1$~0=hNKr_0ew2rAI6kq@L~Hx>2EBF6T+X z{_ATSg=HhOnI?1p<&KFm-#pv#-dwwO6J1-)mpVPQ4SV*sl%${YTYpgD*8J~ThJVuw z5_d}7zps_<zoS*U?p)KFKAT&cy+2l-d3SdA!qTVO?bZ8CSWbB}N0{2NE1q-DEM?_A zadRf`$I7GfK8JpUd5PqPB^7$Dwwz>U-|6?^n1QZu|E|+E)_0FLv3Y+_*!AZ9-AC=) zjhnXFuWEJsW$;j>@8jls64M=$i-pu?ZDY=P=qOnA_eab$Hi1&E=Q6La2mg?^y_NlK zt%0`awfnmBwt6$@aV@?6p+@7}ORk{arH7s}^|vP;y`gjN-kL+gopD07%yz}%`*+K* zwQXE4Tf6R$oo1Eih9gV1nQlGl-n;c;dEJ}#E_tKgTUoQONF{|H_|0&8k7xAvuY7eI zc4RDI((HO3rR0}+eVJH@NAwZ1iwtYcT9ume*k*5@@qx+E$k@7ge$pJ%1gU*~hf{L2 zb?mbYF3)<C>gD#*xhrDzq_znGv!fW+x6J&0&3Y+|g3+Q1&TWw=&l$1Zus9==5UJ@F zeoHE|W4?)s*49n+%YUmUy?x(#HZcG7@?X`*7nHFbP*-y>cqOf@qVwQpm&=6g2UqR> zCVbz&u(nY`uyTP(y@TAJ{x}9}rRQ8Fnq3Rn*yY`f|G#`b*Pp|sd0Owb)3<+H${jr~ z_4uuevZKD(Nh3MsJ!YJbl{;7#3a3X)Gu`Fu`pWr6Ce|){^StS%CGmfyVxQDrnS6d> z_5Cw}O}lRJJH1mrxLW?^_y*T&ONKAdynW@JHLxkdiDmtx)7)s353eP1tpcqUG2 z)-;aTx%u*r$2kp>=E$BDTV|`q!+A<#GW!+dx!j9GK1E61Gdt&6vDGEq=(>1%rQV%$ z();I|zcZS!{?Kbz5B{gDPn8yy&&&7QWj%ejahhw$j@)BUoXWX+Yb!JDn7A_eE>D>y zbNPzffx;fGSL}yc4maME)Sr4?J;L|qE{`SQ%-1yDtaeo|)_NFXoBs6O%(r(d?7~l} zoLOZPwlwFS!1fmpGFufbC&}h^ShJQCrt~qG`5h3L^8B|9dz|^f^3b++W4(u#8zN_a zv^^Lgd++hAwQfSMxxQ&h+*(n@o1t+kwJ>Gv9+mW0!jBH^Dax>}blJYw+VQ(o-nU<J z?FTIm8F6R}zPNPw<us0(@<or;-ucKraon-~T#ey5=|5lA=tOR4bNR)*B0=(<=ML3W z%kn=aX?~g|CtmNjey{%_Zti^DV>5N^OV{j|Oi%dX`qA^p`~7TLt2jc1UrVMKFS|d- z<d{gOe0<CG_K&}=&Y1sjHpf%0yDM_e_mxha)AKy|#R)m_7xxuw*W2vZ_&$GXJx^=> zpG})=t$t-IofovwH~w<#<Ja`(riVY}%kE7%^(4o0F?Td;G^_bxmS?^dzo$)jGe^yN zyTOUd^9FX-&*!Y@{xrcO!jyGF=($3JknTT^R+cYIe{65%9Qg0o_nx(FdsT|~{nIyi z?p#)I%=c==POiPjwse;l-e@Ti{t{g>Q;x~3W%*HsLwBr;HW{p0(_}ioy|m<sWzS2K zgJ#yLna>((m982@e9_gY+FmX4^6>-1`L!+Yp8Tl@zE{ujI_uB%;)Sbc{#+Fjyd`88 z<2%<6N-5#<cC~yx_LXms>m`eTlg*RnD@DeoJ^#MZ=<oYJ5BEsX%GG~r)};i#>YsPo z{HZ(d^0zPNHy!`}oB0%f#UzIl`&So637!9+yhwhocTwK|=VHM^%UZ-z>%!yqtG?M< zVAnjaDSzMHxv64plO$bsd~Ngo(YN8`!3C?FPRtCFzH5Bo4m<aP^%K8**L94JW?Uwz zV(p`Q@ry=H4etk0=3Iu4VJ)9H7F);ZSgFT0a623K@12@ZVv}nqyd!3o_h#4jC%-pc zOnqDubk2X`hiWda_qk<q`RC>f^Qb>GJP<9o@860JDgEU>+f`2S|M(WR_(Q$mFa5RA zsZK8!Z4M8Ael5R5Z%@XvpK~tid)?<czSS-8TgJ|V0dx0o-d^U@9Taqif4ZJTe6W5D z+YWA<wDin%PilqcRUQ0w>e|tnLGS#+TWVTM%HIV=8XBGY5!~=QsP&_~g5?ZGQ`Qr4 ztTUQEK3ev+qoi(D%df0E%T8UI5qnUpCy$qH9#6Tg&xbF6E?(4cb!f3E*}U@QmR`5J zC622X-Q1w*w(#8p!<o&?c4dDFFD}Xq_P!CxtUEXJK$BI)H|6su<z8p{Ppq;3|F*fu z{r67UDK{qX)|x0&uaYAluRSs3ef`6=CvHT}bhlqtD)aqN>h<gIex>EM7HPKpS#|gL zJPET$ESVka*Vb`)nNR%iUGvl7O_tl-d~R~<rKIz<h4}AnEPGoTGW+L)f0f(oxBJIm zWp=TQIsLs_;l;mcPRm4&<rMYQomuM<n|}QI3GZU{D_11ARaaa-+LZNwr{uEO*O#XE z|G!_q@|fi!)idAC`kNkYYC7M0R(Wmq&R_|avb{S5ULWmfYc<nvS=$m)`sUE_laoH5 zIJAc=SvxDDC&}<<mc*2=XQfZ5o@qYxV2-<LucnG(_u|zPg>GEEaqWbuapDKBuBKC= z52SpzBpL8=z7%@>h(|A_<+qS!?tSi?i*JU7*&kRj#X-6>YL0<RNuMSsqs+;T?BC{F ze{*A=_3h}yTTyYQE1oef*}5{xH>+wxw%4CLZ@Hl4@{WIrN{uFI?Pg|eZ+>rlYbeZj z_|)S{bAkNy<~OtcJI~r=KL1v2Ms)XGxpHnDe!i~#vkpg}VC{a>vuFah^~Cu(>ta-n zU0sqkFE(5I#;l%(S0_GQoVY!1qvy%oFIDFZE3;oD>3?}u@<`=SK>5ZW8;tyRwN?MC z4KCr<Ogi_`@>uE-tJ&dv``6CB8RYW9n}y{j(}~S)ckj=#QCV{9V`T*MzGCJ}tDIw_ zHb(t5__c1X%jd-wv7Bvz>K7AcM?1_8dU9<wd+?!c0lS0ee&(pnS8R`Ky`(-#Vz2A< z`A0umPVg0dXzBSRU#+6IZ_i!r<kD+$&o&#`FUp(S!5Mm5A!hOfvveQD!}~hfwDmnF zSGKEEtnaor-#V9n=HGJ}ch1Y&cK!4J`sw*2`M#>?l?TrmZ&+3Tqb~isP(rw{%$wPJ z@_XzJ7#`IBtjZC}?I;lDT5+UPO8l?;S*JTwWH^2mGQ6u7$d6-?+Z^ki%(li?Zvs=J zVCHAb;K|$`#of6JoD3(l8}s?SG;K=cE$Q*AFcI&+_oy$McbcQt!&5VYBtk3L?;dz) zG5d(5z$-D)!xtEvi%y;^6MDygVfALaIU6mOM{d;HRr&5hD(CZ`%Z{#f*zQ`sYMXFL ztm8I^DJol=!w<i$eJyg%X;tT@Ft*hxrk}zj_oZIzR;q3H>HH~EY+o<(&_vt*?wsdY zUqWxJD!7@Tp|Dt{xMc6ndwyO!_U?0-*L3Kl?XLHo4!hn*v&>s}<ZJ2b!0M%|HmErU z?&_W>FL!sDVvN<oOtrlW*Qv(2b8Mb{v*l&hi@6N-CPIfUD6uAKTUc5rKY#ILil?&V zT+wJHM~mbuzK3=9^*>PaHuk^7FyT&8vh7wrhnp?Or+Pe5os?0yaPoquGn{gB6;?ku zFZIkY*Q&KrVc*<_Qp0Q62WHA_;j+(4GD#Oo*9mCaenrOf>5FqIN<X#4p7p(+eKg~U z$T8KwVH2}Gbi(-8PLukQ{5oNdsPtjsq_qL--F}8u{Csx8-|Nzai7O>DL-rK^Vfre> zUi4NtmP;izBx3cXyBk9z<O(&e`&sI`9r|ggVdf$uvFbxn(7r!UV$SY7KebdW$FHRL zsefYS86&NH{SUY6BVX2i`Qp9Eym9%pg#sG)6C+y`kKVAAPPQ$Zym_17OlzA}!FxVU z-+XX$@$2MTUj5eF&YIy%?+DkHE$KgOoms+nUFiIp_cCvtZ(XQ2tossh?$D3zefo>$ z#3%Pp3B5S$!g7l>3SCG4xhq_4=ibr0Ch^|p(g(FFOtsHT<|=c_nf7EFRJ`Mz*AtrX zcUpv5Qr`}zS5K7vuFWXg5G7NlbEu3z`J@T=b=9s9bsfTHXAeka=SB-xb?e=D*0j~~ z+N`NNEj}NXcz3QlWS$q_<1>*Fn?F6>n*Jx~qT`Q^R`vg@lcE~#Cuq;yq;Z*J`ScId zZ#2mBKg{f@xIgo9X`7AqGbx3{bvCty|H_&s&Dp+GX;)(Y%s+BQlWN*7PuV%+VzQ&~ znhz#RJx*<Y9C4yC@07;b04>%RU9N_KDpvfDT9PLT-@R@3t<LN0Lkrf7>e+`aJaidm zT{%2$@#0sWGd5lNZry7rr0sbwtY_)<3Gy8uB9cs&Z2xxQaL*s_Bn#HuirZ7xYLs<r zmA;VqKRwo(;}X}e{Ar%6diHL5v}bSVuU9tTPfc#hWhrj9I4#C6_0m9X$;rb<Sod4~ zU69y!UFi515zbrNwjEi`Wz%#rXxD@-staZ>EOxa{KFVk8EfxFy&7n)0ub<>xmC(7f zY^jU-scaR``1#C#cCKr>*OE1LVepeBS9H$YtPondMB_w>aNN8^E7rO7x`%XMv>eQN zX~VO^#;!Owv{~|s?zwW69z##T?C%qkcKhw#mKAJ!qhL`(+wT2K_rA;HoK;+M#<rG2 zsQmlCy`P`{mK3&d^*AxhpQn1`eF--Awl6DB{QoiUo45VHdyTQx4|Mr1S$R~8=gn6s zFko$Q^ZobbmvzF06<e+6PB~K;KmWMcs%<WFExhebS4Y`NtdE>HqiS-rO!k?kDNHLS zOyi#PXz%xrd7AFaH~r#EII@4|wsR{BYwGs41{QDC*rmYbD7i@Z4U2F2)*l|_v2VMK zedH64`+fhuwbo~?fK5+(bkm(Bdmc6}n0Wk+Sg3Ww=Ccan-RTMPcHvrYcb(-wo4dg$ z^Fa%H^@--XyE_+0zSzxBmCJX%KJbQ_`?M2{*RM)eahCaUZ75C;z2f*FyRT-6RcYU| zi1{s#j@4+d>Ha)P*o@=#;z`}@cM^iuna*IV<tl!%^j2a{I^XMOOGJ*&HnrOKCXVaK z)-s{<H@+1MCJICy|MNJ;*v?@=t^Aw+V)ErVY^w{mMGK{5=*(p+c<a6ER$S4Mdv~&D z)$%OpbUAl(UbB+?(f#!zv2SlPv1A-wdFuF@Uvo2p`_r{@ub8%*B<$aI_eQn$hlu2} zbv|DOyb3Q#x$b3J-Z$Y$#vT8S$MRmV7BQGSTUa>VH{f%E^o+;3ho7_XIKA6?)$`Ls zXNNc5VH+%GRc`#DynXHJOQx0UR12owE#A!7{x)Xy*%TAghD*02H?7a^e%8Ka(M9Qq z4aXHfwjImZ^PTV7qk{n#o~ci{b$-p>2dgqngOWdNh<x*1&ckv3_GdE_Egf0{Tkp-a zajrZf`J8XsBb%ix6{cGRXPIiIZ9Tsr5VjT|@xdDtwm{QuLOyTz75`%N3Y}y2sn~dl zmG?@KSuqK`hYJdMuU(3}Z#L`XJL^re&%cwcf2wR(U-9vy`z`zV*8hKBS6iLG@sf{y zWB9(sEc0jmIet+f``P801tqWg*Z+RFp}yVh*S>dM+x^9_i&Z!zeEc5x$Ngeo%e-A- z?thJ)1mDLn`*LVaf4@19Q)_oiW3X3Ze!%K&k+T9@)`YH@ZM<WW&awY@!;)_)C9cr* zw2YJp6k&P)Sn7&mYHqR{%gJ*wO}~t{DF>QtnHu6@p8R5}P1c32(zZ`}46Aw~SIKpr zDdu%+Okeor+^hp~iEpO!X~i(eTbf^qX*zVBKXAf}ysm9lOWQnq?3H%h*6sS~H)Z+B zown>#U+bNEePcyxcYsceg}?uUlYN#SoW*-OG8+mf9Oif$%PRbEO`^aw>mB_YXOwU^ zwCI-HTjZOykm>AA`}J}q8v{42ai7o^sNl%D=BiV(>hCibCG;(L&P@}wa@_Uf&o8?( z?vq>+7}8%)N#$2#o9n*Z&h3N6d+9IbjJ$U*EK`vC;&N<(QEq6&W`jB_i?YkpoYyaL zTH4#`$tWhuJ!}5E-OJkegfhQqF;^dmS@b|6tN6Fx#<ue0Ww$hD+%wAx2zq!;QorS! z#n(em`R=Yg#Orb>XS00MRtK&RivEJ4*O;P(%sl73KNm99Ncwb=Pu$CW9NU+wo|=8J zGI5U4UyU9vOY7`u3*3dJ_FrbP)0m#`_V>70+O&A1@ApnF{xHY*@Af0N`wQC7uih}} zh1+w>&}pufyEG54eEjzGA+x+6hfk_bHkml7csIvWy(`ik;X>zrs_^I=mMT3nbuZc< z`uyqhLncnXr<5E|mlo=o?lO#eu*d7gs_3GLCRSf=&T2MpEZaYC?(gEK?rk3<e|S$_ zuu<>S+hsq*(k7a=_8fS3uA)7W>#t1jx#(>L-tTP~7%n=zxvcg>N=M<e;AOYcY3-lC z3H&ivS5LG$Xdtn({iw8XTKAHm%Y0Ur(++*CtaRDn&sijv_x(sjYaI{QyE!bg7bj<0 z9$Q%%?>uSJqQ|q;4i)$}>h%b2)>?ndxMJyRtumv3(^@~)bDh8MkgpgiY3?q6;km}C zBDG_Db_u%=eqJyq&iPl++2*NVx9^yj=yhgq@mapbmos<ldma1o8Q(9dXY-s@C3#}I zSPU(%)dZWh-V@2(Cz;(Cv$Qme$z#qZccuATGUd#rnl-v6Zar4Qep+T$Kz{YEw1dm0 zt*Ekb*V$4$ttB^eS;<<VTRL&-yOy70`}1e>r!T5Pe{V-8-EL|1m@>~j{g>7nwHvBQ z8TYN<*ZX}5-KdnaHOTGhQx;2i)kpV}m*mE4_nB7B|6ro(#XQH$^wgt2dsvhgM+Ef8 z$3HL<I8f0!F>&F2-nEOKCR{lw+7`G${i$tuURdQPmuW6#iZeIe>v`0tuI~TvK}>r3 z*9hg{<#WQGYaL5&esjn~!;0%m;Fs$Bp1p;k$+~ijOMi>B9$U1;_d-mw5_d^$sw~%L zwqniY3}$lOo9voquU6aP>ZGLi=D%yY-GTJ%HP%}*(r0W}+V`@xd~HMZk<*vDZk<2+ zC9fw{=o7P)$E2bVqoa$3Zxy}mkFOTGW3=*otDfGQ%?tWv{2tl1`1djE-p|^4O@2em z;tlzt)9U>g>_tE9i$4}8V*YpC|L09N?CQ#ve|UfWnOyqsYeoAXecU|PB`7{CCj3$u zhgn!kjapy+$3I?;alKOxPk&*sDeHc=w6Boj@7w<m-dQutVEsqtl}}arl$ZZKllz9D zTkre5g?7tSEDoN_oPWLU{K}`xrrEvwe<D51@j1ipqOLtgUAnWLA3h$rKl`6-)aB#R z=QJ0l=U2N$U6gi_TrS2RoTAijS6Zlh{St%iROeN3M`p@TY}ZtDKEPxV;rfxWikI_N z5EH|dpqKf6?~+VPolcmin{~_V6P>a481MX5&vsAP?7+8@<&$RJwy(Qp&u1%pdOXUu z=)V8!kDup%XZnA^XnBP7ads{Fpa1=I@87({H=pOfomBtt+i#RPKJpj%+<Luhd-}y2 z%E#CLZS8#h;fwnQU)5dL=Gk4Fbk(-K$>fxwrc&4Y3CpUOgR8~&{5UvkqZ<2_YkO9# zO}HcV!If3_+N*Up{zkSkE<Nvbwx~gneZ!3!%@r3HoYLg!nI8H<^4#(t_qMKm&y!f> z)v)1OO5siCX~8Tv&POkb6mM8ke`J<e43o!?WQHwLTN|$KaQ9>pxVeI9o3T~U2DYq^ z6TX_AY}|5Z^}7WNno10nHsrCX-AKB!O3^TLy)N?^&SiQjyH^U|>$Eb`b-TXZ>ZJ4K z`?&|5EFRz4wIbcSx8|5x_saBJzj$U}Hr4E!wcXR`l3Gp1;@9nowG1kK+phf=yl!v! z!T$QgPcQ!;?E7W4G~z^B@6xx{9T&Dmbm!0SWliQjX~$c5zd*kIbfd$EgA6y!@5$RR z-I&PJ*RCh%DZT1ikBkUc;f`5v-I`@itPo;!4sPJ|bdH{<v&&nP^Q!Kbucl3lO{P?> z_4A#W@kK2s%f>5U&2QfioUc4*I~|%WrYYM#U-+bKZp!&L1zF!8%H3M&dRXT57moI~ z3E{4cn(515Pnn}V>yTr~?K$V>Y*g`ic(0lF++pWx>j-A+S=W@kRgRfl|0LLc@ME#@ zZLLPGbKOaD!n|FPJGP%Q*kipZr6MS$q{ir4b<V5>d$}$L@44PHIrN3AXYvM}Al9FZ zC!Mnr(=y81M0TB-#q4`lvt+?i7H);oghe(+B}aIk$IRW*@~r-?vK8A>{iY7l#aAL) zcXltB#<QjE<^7jDuP01kJf=Ql-rQ9Ivm(6SEo3Zad>#F1OG};C)g6rHqJFy4pTr!F zCdl;8GI_C6Z%Of*^wot`9*gzfa(0_^#pHH22(e8Jd$>h;muODeF+-WiyG=JI-oCLV z_i93L#cylwYhIeYLN^aI&S9-DdgJf4{458@!}dd8G)jy$-0rjMuJO7MI`@U!E|%g$ zaZ}!Q7tC$_k~T$m%jtM4_poNEqnDrY?O(UYj{B!+#?_$5^Ip3Jn8nZe_ar3n-{0K_ zc7H5c`{(K1o&QxA)-H;k`rCZRzr6<YTK=i@8qE^8`QqKNEvbG>(`(n}=(qmbvQhWY z7Om*QdjZQ-N)`t{?_Fs1+*fja=jk;)%|$04NF2`i^U`1X_1<>(7q?HP{Mo_zT9@y_ z9qHG+ZQsS_?3o!h?^fepx5kH$Y;<k+<iz+-{W?GU#XGSX#Yyj!Kgy`4Ej}+4wI{II zao@5RRk?EPwe{t{(hhA^Rm{~@2tUE`(vnNnEODR8J$*mDsrFCLoK7ft&am;6%o~Z! z#r17&{8#jReq=SBe!p@1?y`jYTz}S_ThQ3DUdq+)zPsSQ6y@G?n<Tbn2C(>_%_&rK zd!yoRwlsRm$yPxPed+u2=G5D0?yqT|f6YL?r04DIV0p$ne?P}RG~%$g@zLME>w^*3 z>x?sdKmV1j`@`Rwe{TBxDL>C2`Wvc|zFaza*5Pdyn=*bBe_2q=J1c=v^Ws&rIZGuI za%WEn|Dc<cVx=*!=~+c@lCGdC*QTq7gcsk=V2BC$Q=7B%s?<LzPpK2eM<gfDF5YI| z`!cL$lUvfnT^9~~Q(m$;$a;CmVbOmk2P`@Hh4msOCT->wR6nO@v-XgApd8y|Y5$}> zwP(+mf2htdU4H${2bD9MH~cNQq*}85^xA}@l5P+Ggl=4Qrg+AIsJ5>uKV*U}%9!t5 z_pMxVYEfJNp_Hcd#GTGj3+^Y$ZLxn4)2hcgJuqT-fw)+E%Z7Ci)fYz|Uh-b#!Kqzs zI*VVo-cf&(=jbZ3-0#ro;AhqEbsBbE<~7(WVZKttd<&P2$sX323o1O1a!yKc9=l}~ zHf`Odr3^o=32l<mnH+FNL|ZWXuJX=~rV4$LMbSCYYkEJZWu08*rnup{vg66#Kd#-A zZcDxX7MRD9u*I}2{{GSDo27#n)tped{hndEvZC4V6RnHx^({IZrS2Ogls<pg&*Rs_ zTz0TjD{fE8WoIl)uq=|{o3Oi1E90BX-dpU|PDbq~r)*8K^uGN46Q{s}(oAoWY|q69 zl`f@qm!F%X{OzsfyvipQk0w3|z9pGc_;jbmN|(_6(#LnYG`%}_am5C&l9|$H_g#Cj zgD?1rrp6A=zZw;WUc3T2SNYu*c{B5ut@;<Z*u-pFlUeR|RZFf#ZpRXwnHqEq1db;E z{@AZ%cIeE<(;at0b#JgvV%gPy-s#(%rLo~_FK(1$uyqekS?L$qx^Je?E|<W4dQ*$a z&w0LZS4~aTOq5zN*-5;osc5^|R<DH8W6=+Px(fJy+_zd*`F2s((O{t^F4u2$p09Yn zY4^7COYTm8n=rBN&UL;c@4q_PxLaC%{?BcZ`f--E-v;q(>>5jIJW^89o!=ffsBUr~ z)AzKjL-CDXriG%X{$<+N%sB6=`2MWP9D|SN<P#=rnSWn;+Oohe*LA-&Xc}<s%-*?# zUH4u{^Tj(^8msSJV{)H<Bf8jADTg)sh@Dtq-sXa<O=k0BC3KhMdq4XSd}H^Ut4)>- z&eIoNwhK=zUHH1^a)yp(#Ih{IhZ^4}`kz<hS#99JvUP995=KSeWet~>-2Q!B^8OSl zqbCItHPh6tW|rFDI}kAO$M@V^-Y0IZH&WyuO1__YJ8FdxkNMRZULk7BbrM(HtUmE! z&(W{zK1=++Y2JD9&bi`6AFJ2-T{|JYE^CeE#<GQf<&UnYZD={V*fTBk@E^;ANr89D zSI$%pTmG5hIoI3Br5}78Th2QDyEo6|#`4lz4D)4KeyrGiTk4+m|KGP%dw9-%jW~W> z+3MPVc8_h%X_f!w%lXd!|G2f0L7t=Fx7)Xm;)R93zt`@#yKVn<fAjF~^SQbDJ}zt( z;McAH)_;9^mS9Esk;PKC@^*Z4+<Qx$m)CDXu=5{Il`Uq@9VZpVlcj@uPHH+uKDr=v zcY=uCiYeP9*bn}GvFz6Fk1d7L3DQ&FzNzta)ZBkh`K9&OQ%qOBd#L?7r>T5GgkL>0 zF`{`|UH-1n%ysXBm?yq9_L03}XOd;>xBtlD-8QDoo4pU^ZCJB*v2k197M)|$lWM;9 zMjGwon7%q#uQ4S<KI6&{=1<0J;-^-&{*nE+r|I0esDsx|?GR}*JiPgWI={)17k$2g zGGY(fKBRUx?R~v)&eq<e8R~mX%^dEAFK}UB!%^Aod#Tsyq@d+l8x@6Td%hiW71ccV zGmYo!jEf#YotX^ZI-VGIup54Qe^aZR@%*W4+S|n^>{Mlbv}W_?68(&AX6j)c<tK8v z8nzp<U;O#O+4|a(+Y?!~teAC<@9W~v8&fOJ%5CZsV*OXy;jp!=P{K#7^W(0g8k2Te zI6uAM&Aa;JFJ=|@3zdHgmR+^17k&4C)=KUt)=zd9?~0n-$#JsPZ|c=UYYN{e&VBHW zCx4Mmt!Uh?8{+nQTUg}oaqZzfRe!Rt&h(n!&1o+d?U|$X{JI2pWv#~d_aFXtAKKa8 z{qeH-!~MQ9zlQ$&nDXb>9wYx_`nBh0wER9?`KNut`eQG5e)zij)9o99`NGlL3;d<U zqgTE^Rlwg~_)n_%;Ct7~nG5tzy;Uj@^?MeRf9SIK^Z0*32aWIN*Y+@rJW%^nwfaww z@wY>Z4z17nk^kZ9+$CON4@;Y$szwOEd*C`lY{tH?Cl)_CKee<VPqjVKr-k)eXvDMy zEuU3%x-Yy{NVzS1)Ny{&vNa-!bsWj8RqAu+<aG$Io}XBjYHRs(>!tk`dqtNmJOA76 z`yJh9E55HTm}Jo4bN-mXJF}SZrGIif<c~*}E}pOTb=4I4nNQiLX!|UGQFD&_NA-^; zn|U&_y&sQO)RookSB(pie1EE{^*Hk`<2lvIJ2bzaZsAz7eCp}{iY1#b{dJC%KlYd9 zSHQoL=K6g(f9_B3{dm6V-}HiW^6zBN&;DF4{O|08<MSWX|IVs8JM)~;zuh06-}`A8 zvMTJ)6Q9Y7%NP8=J?X+E4a-dm)f%a}Cqtj-WU2ICb6zW-ur=%Q9?=Q0`gsSLCWy~4 zcYkM)r}%ai{{*3)zUb3$_I>d?bx^9(Ct&{E<FBr)4!-Yv{ibEl+Z(gYA1{B??s${! z2g_p}#z`05*d=>}*LdzcV^G&TYtAY^JIVNS$L??abWeMcSDB*pl>G;PrF{{d=O6gs ze_m(Z%9^(ive*APFVxfbhVjI&%>|`NPCW;Hs!p=r>$?4X`-_T>1GPnevI_ljy5_Om zY<Xw?qsVK@|0vC*J9(lzTWYk*3+%M*4&F{$<2`3@Y}mYFrSyk(nr;pA)i(T9zLEZo z<+kOF;=9$>!d1$=$A0f9+?D=GhPC|ug|o%sma8}CbgCY<$h8T37}augu1%iD*~E~i z2j)mb|9)Ta>AKqXL(%SPvOdS>*2(2;{lLN@wfea6TV?&1s*`@rw)`BrB3orfCQo>l z&5b^Ht~E71os;KI(sp+YS;`o$>#RN1U-rC3^P0au7kuHCk7HfyAkaOB>DJ$O46Wu4 z3y)dxFL-=_gQ>va_^tE_(e0Znb{`XQ4G=jMxFvJ<w@X%ARz5XZCX@GlVe8WuQ{K(J zA1mqD)iO);5{FWks7HT+SA3~`v-6^z)sizz4>W7odF4L#w3d*5ykgq4ko6Od-|o7l zv@!kro@<Nc{wzMJ<oN#F%j8@BMGKB?))Jc=#8Sew_@&<ygEr%*8aa(0^nz@;qH_(i z-n(5FdVOy9Hy+(H@gFnpd2E-qw0fE}#dMbXyv5m_?L6s`z0ZT6nP^yQX7_HashD$g zTj;y&1@mI3-<V`zpZ@E4pRl9v{ix`@uaozbdo^u~**h)ba;*9iMY#idAMc#iFF$-@ zZdm*+<KRbex$I$fqTl>>zuz|Pds^YC>WdQfft@nN^6A?jn>B9mFnRE8fA(zuOZV1% zc`S2d_6&K3Bknyn8qKmViDt7_<QMYyw%%LT+u~y8=+QFEW!n~8Z6SvhLi#CUYYgNc zeGXR6`13|>$?;V7gbQ6y4ht`KdV6@iDvyn`*aYDvaWB|<rIr=+7~Xjr^zI+~{fS?t zd{R9pxIcKb<eo=zlVF^>`rf=4o_i*S)6V#FvuiBZ{r4sz{KrC*ZD;*TGfNZmTt7X_ zU3>k-tLJ*N`sC(%3h{Yr2<7bZsSsh%=@oR~da&mG0v@3_m7B_O@!CI?ZcIL4$@=<i zl#SG^Jqwzb%dHDf+-dRGwy4!LVZ({@ZKh8aU$gAt)bEp;v-)vlM6r*2^^VKe6Eeg2 zEuG?9s~2rNv-qRRSr50U&$qLZt4)^uQCwcc*LmsU&gHf9Ypxt_+RCXb_TYkAyH1=G z^TQQ~zn|N0X31o-^WQm!4}T~8`2YToyuyLFGx8-ZVrM#C-@kp7>aKN1`mJh@UfJcI zzqMJ~Jj^y3#m?nVVwprZN_Luk4|ObFuy(bzY~hW2K^DTl-<(x&xe)jGfHd<N4e2Y@ zygQt3*_<|$N{d~reB_l)bxG<A<pb+ICBz=zIbN~(4yX3H@9)nUNiSzP|7eQg$7hHB z3YBcwC~jrAY;y4L84eqA&l$LFin4j<Yn#z~QYLoJE)Hk;P3>1(7@sdc`lBu^Z*H5} z%7*oUmEZPW_`B%N<_Y;zOAKY6#vS_bD6(a?m+{Ghf1a)X-Fw~(mAwD0^~CbUXQrIk zBqgDw-R=8QW9MZ0O!1s(*Clwm^SA6CuF332<tADj>By6dby-)tG(zZ&<@Te}>~T99 zxbD3$bXxG^5?{+FfoJkg=h{k~JWnY-ELk}_VRfK)PMeAJV=W$Mmp8e^Y@LU_CL8!4 z>RDuQ^7e@(BJU?(_uvShZuZ;wg421SAm&F^u66?FbGr{+=-_+cC+I76OX*iw&hj1K zQ?nhrE_8}7?S0<Wu>DHGuDSc9jaqq<g(db$t3SA>-5=LfwzYNUqZN#H5`h9C?du%& z9dn#2dd%;H+L~t<w)*wECY+9EpCtA7#htT1?@l?XUE5Y9`b@qnb3@cJ#|ZbQw>Yos z6>3dgeqZ_Lj{REigG+u+ONwE=CjL}KHvZb7Fa3u;ulaGlv-|5ANgu7JF_o2_hPshS z@mG8!(^Ey%>r1!IUwq)~NekX%4MmkH+w@`*a`}!Oir;_8OyYg`@|Y=d7wR)T+pSNh zeJOt$GxsQys{h$LCwWprKkc6IYsdX0$KSeZx%aE`x8D@1-dvoV@LtXGvhbJSo*j|m zH-2$x*Z3a$JX!Jlx%_1()UITeaPIT*vJK5Le7AW)aoX*cT;njMoinUHT%4Ky^jm|8 z`}UP~OC_SsL!Zc8HmN&ZpzF5x@b&gjAxg{cu|=>~oN=o9|NlhQ=BFN$=0tvGK6A%b zY|_q<Q2q3o#d**E&QHs8Pf2+eU$t`885PNgvl)vSXRxpSFZS}>Ga*O*XvWr6PL|uh zxcrpWICX0g)0^_=r?&*x7nud_+t2y^{-dIQr{{A&zRn=GzuvGSXj$-<l;6k87yi9{ zWO?D^&sTr^ll&Lfy8r*XId!7nd@C%ur~eP!5%=J&-k!U%=8q>!&9>fuzxAze#Ye&4 zdy3U%K83av3z`{<@lStza!O`L-2P&tj$P*NXB%qOqqr?UZZ_$Dw$d$hf9&NY8GWC< zKi^sT>P2wa(uP@Aer!DQd5wDFc|W=H*)x_!87(|^=>|LZwn$#(MR!|%@}1^6o!4VL z$Ia3IP}qZ5<_~k1S)8A4xvR}Vg_B{k<ofQ9o~`<mKYUs8N22A|WQA3M4{s`OxFA)& zfU%DMv6{^i&#$@~xAG*9L?=#J;bwW${FmfEuZE8AS8wjK-eYP1xBBT@%Ny$3CvTLn z5lzfFWar+ZpMIgc<y)z7-L2N&9x6$a8~&Res^l#@x03Vl^A!oJ5A5)I<J{TDenx@2 zXZMGf=?}Hq_G`ah7gOr-cBzryhd-ApbbB2aMtTUpy0CIj{|>h+6Ax}OogVO=W1sTI zzJ}cob23WiY;4aAE&uYK^ZT^~Y1x$<?b-~ZKbzG{s9&D^?)dd-C#%{V3iH*<{H7hP zI(nsw^QXtB<TYOP>vhtzk7b7mB}}OQIlI>JyTw}f{Jpo{d_1`2H2<fqZkK+1=Lxc& z+TiY>C+Jo9{-#X7i{HfmO7$N~7{wLu+&=!|!lmlU^=y~f<}{h^ikA3W>%(_ZX13{* zmc1&f-aYQ8Ppws3ana<_rHyUz+ujP!Z+Z8_(C*<U`EwtquwPSBO>x_1-!RAQ*@3z_ z{%@1znq@nmB|Gt`JDu;CYb~98;lr9c-==i1x#}Lfwjk*ZSH8=^XM2vPXYFQ94t`*w z6&{*Vc-*Dc<k$|=gV~Pkwkdk9tok2$P74{bu$=A<)NGas^;EXYPInjc)NEP)GF2&B z>-Yo)&4m*34`!WEerNyUk*)cQ!&k0P|M}6b)_x01-lhjN49SeEY`?s4ihtjK^!nM? zrwmv2&tG|@X0}Tr|I-QYC-AUmx7e&{;7R<mdRn&9_ZJi7I8JlzvV6X9<I?-h9wiks z^bE`0?6@^~Z*)$pWSghMbTQ$8-n8sR?`N{8-I^E2qN#jO*g;FzuKNC@i&-{246|<@ z?kF)%G4^RaDVOfVc<p`Qjn`6LdtKW_&+c`s<jJ@9Kl0z;iQy6NhP8ek`O(`r_|-xh zxN>`9G`74k+`qLv;=}P>FVc5$Owm;-mhOGO`oZQ8)6YcS7W=*-rS4|lyd3@X^2hsF zb{9`D$jK8u=6KWOhEvY5$~BBNLOl-?oB!syM?Za$BBZwE-N7||2G+5ke(m|3a3oso z+Cr|5)_;m~>)tfhnWucZcV1}I4!utdiEFv?iVSX5Uy}bmul~gQ;`nFsYvw7xPLbVv z`S;6&10O{!_x?2aTl)7<!|~TeM^|!ZiCvXE?|i-2>C3skgC6EC>U_U+qx@O^s^8mR zV(Z;0CeiD0uQl&a@|tXmW&Cm_H$Q8fkdQCmd_lEOx@Ypn@ZNjx#A+8rbMsF2S*U6| zeL>~>brFWkx{IU|gj07*n;m`~Eg@suA6WP|xBOmo%$>svD#B{JxwlO^W_oC48|P83 zg)=o*@_Rq8K9b0Hy-fDd<c9lmKi=KZy(vQFfzy}Lxmg*3_XTx$cbs9-KlD<jEhuWy zr!9|PL_62LiCnTiC+^1T03lWFPPdCi!CjBkQ*}-)U{d8dzUDxTS4P|?wds5xpB;QB zuUB{efLmXN`t2#1Dra~KcSuS-3y}_Vik6LaKD{_^g;Z%kUf7Ly)^*ua?l#-mxrMHO zk{RK;BWB8Ji7N`{Hq4#+d-sMr&2go(9tqr=q!jIS;oIv8d3Qb2FaL5#7c3BbHg^eQ zYnlEQAIGOgod@=BuXWnwG&5ej*Z1~sq3U(*VULpb3wfTZ>)Ln!{Qh=#CZU5DvkJ=k zyUvN-<6kPEaQM*`U7^XpRC+3J=K9{aX7Q!#z~|5hQ5n)Y_7Ccsf9K3$P3f}??ftvO z>LK6iLs1XDE4|r&c>aC!eLClEul?}7_~5q!-Fe@4DCGMyKQ+Df{rb|vo6XC%@Ni9^ zYvp=v>w8hLrMgYKH}Kl7n0lpxYkF}8-}}`?_16t%cx^W0ndg6K{i`+C+vb>`YkshG zlWy1gi%jR-9xpl<aCplpnRmwSzZdN~xN|Av9k~TFRjM=d<)++cI{SA;hRB@HCo6tF zsrkO*4|@m8)1x!pk^|CrYMu^SQN8E*1i#Cr6EoPiXm8T`KD(JawP;C-|I6~kokt^$ zOrNimdcAv7t@tX9>BUd$1mk$c3V#H<gszor)=Um{dAQs9zwZ>Q16JI>XMeVFls@3+ zS8L?e8&=fqKE2I+&iSi9C$l{L7tK9W)LFu3C&&8p27k{V)1NMDshuw}&9!pw-1&y< z)E|C!-6{I?@9fQg8xl?C)%UI1kaud2#QM#K{{qgvXMTF~qj<7K<eQ78T2JRJV%m|r z(XaOV;TxGNWX>ImtzNV8<avvC2Bt>+Ugy*l)cd-oW^MB{+F)y=@y)U(<H+N`ZGk@u zJM&C}i{08)7q36~u%_%>_;I)Af8!>oor#{)o-5FH={&=Z>MiG2uiA3;=eJqkufE_> z&$v1>^Ty`Z^tP08o(Df=+&sUFe)~RwiF2cT)rE`a`uO>x4NgAE>#z<NJ$8lv_`P#1 z4=kCD4;6f_E%D>E+uD?SXf|tX&}OUSN-ty%-kK)b7qs}5X41m#=Ou*7r*#LjJ-pJA z*?fBT0`(sc8TV}U)mU9Lt3@)o@Og>&zc2ki-Yh$1aj0DM-ha-?S{q_korkRjm_NVu z@8*Z|%V+5H%v)0U_maVsZQ@H_CcaoIar@PpFpcVmQHOo+nVzay%_<RnVZ!mPJB0Z! zTQ}EsimIyexSFo6;O*P@ey-P@=J3xu=2shCz8Mi~Ez@&?zcbHE;?u7lixqb7LLMH_ z`E;+<J^o+^dll=)6-DLC(&~M?C61^v7FJyNQoLtYjZe<!{B)rlF&<|{rYQek8-F{W z<Fq-$dRMvg)W$oTFS)Df=M`=Udvr7GyK;xx@vEQz?z!J6w{Z%eVEa2=hO*p`a}F&Q z2$afkF%2<h>t?b4=8!*CZSQM`w%vh$`7IN+)b+H8KVPBsebxKL>;FEkSDiffhqY~I zNmS>fgWFuT&%Af&f~}gL>mnnq4d=zA-g4zVtlheGioEDUqa|B%`#+zqX5G>>-&B&T z?!+aP_Zz}Cb>tPzX>6Yub1vI6Yjbsj_C2|thE)zv4K{!4b2!=Fa?d(9a?_>x%-J%X zDgENrPFE%?POO+Gd&88gqIU21l#TnRt2n5h_-L)wzvFE6v@8GH?BBI9Ofr%?y>;2l z_Al>5XFbo(<e#w6-reH!@%O)^?)gtX8rjMAdaK{XW##)+K5HLjs?#Xt7h4`>ac}nl zc@19vCww+bR@=F}QQ{0TdB15{g{S({W&g`gOyAvObvz}zX-(fHi(IzZm%29SCB|9z zPRd{9e#x(M&fCY&x3fI{{b$>kxi`N}U^)KhwKLPA{;v;R3Qx^(Z)aDJj4)(yRZ4tc zeAUc7ulHJ0*`no#EF2FTXfg)m%K3B(9r$8)*v@>J_tLl|+c(jtF6r95YVp(U{rZYa zWT|O-p5JWc3G&?zhEg+^Py3)Zai0C{_9cHEQj*{Gt*@T+uQ026or?UfkD2vy0i2y? zLTx8@AF+^)QvSWZ@|W`b`kXaYJO0-HSj?~Az;A6RKkMJ;KmVMgg>QfTVfuW<zhCzP zFR;rxT1RQiK0S5zy5Q29j4qk>k_Atg@+Mx{77_9LZm_<nXG!LvrJA~P1FxA%FsO5v zpNQ;@byCidUSUxxqBAkkl-XOQcZHBw;5FHAp&Mo=ay=IK5}28|$4GjP|0xsJ(pxTv z9;EqaMR49Kh}m{8RPaqo{@G{8k4YA`O+Lu+{(aY9j__P-&9_n|{EioRYj{KQD!69- zx!3W)^-+SJ^NiznSZ<jo*Y>Mg%?*w>KDCj<b5^*0!BVYKosF78qVk`M?t~m-N#{SS zEN}LCV@c86k}sYQ3Uu^3Lsl(6IP(bW?o5fU87u`R85WnOU)4zKkjgH8R_Px8c+QF0 zZ`i(PytW8Sv<Y3;TzvPi_aaXNj(eS9rs;)hb9T2ZIrQ=|Ysii37Dw8%8aF(>rxj@! z85Wd2OZ&d^3Qe{(mec>XbyzEZ^OCzDd0%#m<H`rg88gqX)V{a+Lzu|D!=~F-B_}f& z+~PkZd*gtu!2i9C5ijOnSzNUFE#oSd9gljBR(kDvxJmSy{JFnpS3bJ3*{RvcgYBzJ zYa;jE)%+iFvu-HV+<ox$YURy2r_&Q>Kd$U@X)P99=r^^{WS)P4-ns8guT^-`6Q!l9 zjo<0sYS`qa?PJ+`EHK>h+6t!lHiu*PuTR(zqrzn8t+MOP#eZpgBDPG{KDEi>u+*^_ zBa7cp-WY%RcYStiUS&q%v5-!&qP488<@XPtPL6E88kFS`_bO#${q+kTaqcr@o=Kl6 zPs})&wZmuP5#92KzqdQ>Zl4*u!Mo{ElxreKY-Due&ZCy4vWsWgR=-#^ySdMAr5u~x z?u|KtrgQUJ|E>*KRs8Rc#{AwQvu9T`*SpNmZm#^0@v`~ykw~{6D=o51pPZa{vNFE) z<Mxu>vNAtY=J>gZrrtNPm}D`j>TR3C)g6B<pP1f`nsHzIw9=hx$L8xDvuOLcV6XQ5 z`h1`6k1sj*<sDM$y2~AXd&XMB?hkvk)A^P6KRXtk9npQj(QWz6jk<ohtzB}Q**_vu z1QH_?A5LuPOiQ}YlE3inRUwlTazDI!KWE%-UMF#Ea^=CQEltAhMhAlqi+s7FwDSJs z$U@C?pC#jBEBq(hDrX!zY?<mVDWYHTqWby;+kN*Oqgi%7ewV|Q+H-A@Rm$@j@&!sa z6JFh6y>{`URQ5F81L<oSBen!f%-`F8v#3mbU8u#?9pX9N=k59emakZJQa6hIU9iXW zn)B-z)?U<!FkE*qC#m?A(~bkx0o=<qGdBJH#qsFw<G+6=t=VHL!LsJT_jwFld8bw$ zn6%~hC!L(~#^^+WbeZ1SQm3;YT50&NJ7ZiE$^CwMTb%hZ@yC~!_uiM<vQ(*Bb#J|( z`L(n=M|NazDyu18J9y!cvLn~jLoZsJWJK+37&W@RPA^#EUEXkTZko2Hv*j6<&XymG z#XfVa{dGOkQ0e87y*J*?n(}Dg0dM<s<HYykJ+eRl3cmRHc;n-~bMo?29!zVjR?S>K zZ?2G>=RS{|-;+FV2R`&JU_7l=$|!9-@AUnZLT-C@3rl_X@lp9-$ME8#q%RYPda}pe z<XE%HH~!PFM5aGl%MxMm<nEoxogF*nrabPjZ)sljPw}MdqtDZ&syCOJe{twmYK;1{ z?^+yZor>L}jqj`lKCcivQXlfD?z-Zm?nIMi!H3Vgt^Qyp{w!YAN2NL@p>W!iocS-F z<zydwpt?)eguh=vw$+H^@&vafY>t-wg=+*3_^4f6`}1PbMuEZ#k*h^HRWaut?{~b< zzii!Xm!PSqH+u9e{<dIA!H$#Pw_fWNzw%qA^55D&^XDCTUdOS>Vf~zAd$)4SGc0)X zV(N-U71g*;<-dNtseahuyLJD5nb$Y=G%J1Nee03<*1_kUpxk@y=n~(Kb7C^Z@*Afm z&-~ICZQ%EMK@U?p?_smswzp<88y`wLwzO3~{Hw==v+_NY6H*IiaGFhCY?{SBebc0B z1C>6$+}a<Dza0xZ#P85)c`Go*IOI_9f$)e$qT<e?YMrIUC6*oy2PcOXdnE5YzUP8Y zm-xL@_qmDTGP2Hbm$iRdHmf8W+O-v(FnDDA>*CZSwi3d3*B_s4Ft_!kXQt_mjiJ3; zx$<Wh<{ADx>sb)7qpxq?)L5GtZM&0ocQLNuI;^Rp@%Lv`xAC7inN<PbE%?8)7+-B& zB$Yn(_%6#&cNSlgZ!h|9Wq#by{qOCfoP9scpLo{2Vb%2$Jbd}do~QdnrZTvEo>MKs zUeut`o~-ll1(QI%P5n;?l_v}0BJz$kD?a$AAOE@i{cLxpTT&i+SE3Gc&a9EJRWq%- zFF31(&$npOhl0~OFVAIL7#(S!T|VPEM}-%weWt|fnJwF@8rMcHaCqj^Y@pM&@XXO2 z)nD@WT$5nXZxUbn_SB|hPAjV=_}69^Y?{>^J7v|)sR_o@c5hzyu%k|@Wu@1rl%`v` z&ODzs9nLJfAv>8vrn^x%BU(7|!-dB_&MKMK=lZ=}b#9-WdhE96&e<FGG8Owg`pPt2 zNb0Hd2fcHb%ahlfdm33Wd&>LWn?)YSI?VpCN&H;$m(bEq-mUK~@2T>>R>^o3J&TFg zh4qr^i@Mz$%`U2InC&kyuT&N~$vk7m^E6JWr%#tKEp3fS@&1*keaP(CQ#-w;89^}` z-iPygD-CBIFc52#dc7_+yFaQ$Uwz@6mh8sQQl7u8+RLgxTijTx_JiStsjw%v@YLV7 z8W*js^_`QoPo+7&mvVpT+p^PDdf7_13qp+13iE#JiSWoaw|?Bgv03W!BZn(a2DT>5 zk2e?JZhg5o@cV`D`AqlcO?`b<^61L+<-StSRCQ-?-+s4dbK%Sc3vIiW>c5eTtqSHh zN}mw8+PvyqI``r;`?sFTF5O`kr?z9?l69vX&3+UXM;RYenxi&j{@nVS%pUvDxc$5_ z_oU*xK7YD2!~OXcE@4N;xb&w>TNszxxK8is*36ZwFpfw~*I(INvRLDfk=QD(a?a*i zm*rk>yz}VST<JTr49|JxI%Uq&O_;LWdxr5kj{9XBb_bO`>|9dEcWyU#>a>h@OUvIg z8O#gVCSI7K?(y97a&`RUAQ=~n`469F)qG!ZsE?~zGyngYd6ykz=LR>XGw;;Cf4?<8 z-9lJ5CxtP#iB)0oW9gjk%{hgPS_PH;ETwX-PlfI&T|OysY{8;`KXjXRsZU>VXNK|B z6&=^uO1Y&z`%c+z%Jce_<g{psv$5+E>{(aYUVC9t@PFB#x?nwPo9+)!U(Km&d+7c6 z`~M39N1|CiJD*bNI%NFe^t(Itx_92U{+4@w^XbV-D_7OOUqd6sGs4sV9Gzjd@Nf0O zHJf%WSQ_B(_uJLdUm<kI`BR^Cnf88EJ+NGL@~7GFV*DGXe|UN0;It(xrg3a3??19j z#d(>Sx;6JBmq&#w?|Q4g>kZy^c=r1Xo6fG7&t&5qbbe?1lm}}MB^?SDKBt~M*CGGh z2Q8cPr#?kS-kquH&^DR#yz}BK1@UqBnj4oLnY&}_iyK8%Y?8VMd<5sM7v1aj^`mII zwRN!YE3F>3$5$fe_c#UAZx?!SGr_U&yK#>HvA;(v?76SIRw_o7oV8egRx*IiDXTF0 zKwe?q{PTUh=l+KFtN0(Yc)sL7Ph!jblTRZfy|-Lny?aAMNNg3ueoLEPR{1%#Ek8vb z9R9@hJzuaPe%_+&rksGV#9dmC<E8)qkd3PgnOA4=_V%%T63fpkKbAOIUM)Ot8sluP z>H7~o_wU_n`TxKTuUDQ+H@HW3ZhfaSUH4YXJLa6$laKe^)|a+VVU^ywZDO|W4vBrQ z9Rp*JSZ@6gy+N$S^kmAm*Y9_`?FzqX9M}HO+IGhlxff|cITLlN)O?C8s*cKDo&0m2 zhO^p97o~fVb0we4I{w_R_Wmrhg#N9`(&tsaAC#N0=lP0$7tTkYOVb)xv#i*4_`)HN ziqqd`f4X^%$L>6fMylMIBNGHHnh#FmT(wqq#mSFr3N^$|e%!Jym;XYT%H*5XDo4Lu z7rBu=>qi>XbIWg0s=U`1NyQ&?|GHl!ed2|7cOBh5nmmy*i5wfW)odTn;D3Be`24&X znM~PMZpWuQe|_xB9)tOF-kW_mFMsIv>f(uqCbusSo!ns_;-DjRN;gyH-kjT67x}hv zeO+|1?&hRiucn~muN|lPgtW;V7COIX)?3@D$L~0my?>NYEyC?^-XtkXf9_L({qj6P zo1$I+Z2x#+ZuP69k2n2OW;k}d@}xL>#^eTv{^=^*MO?m23g6CUOq|#9ae{({`*ik~ zKEj>n?=3Z!HMphw&G3uq^N-bHpYQY9FMXXFrLrgL#5snK2d7_22%f}P&1bMZ%)<Yi z<m2PB59L?-`8CBoFnu`1Gbwi39pg;q0}e-W?bL*ogfH+heVejUB|$9jKc__HnZ@aL zNn1CBb05wt|F-B&bCG51#GjMwG9L@D?hJkMp&~na&FqDjKbuOJ&U?`8(WKxf;@EC8 zdsV=sn*rVo(UWo(rZqjyR=LNvwPW?t-QTnKoYR#wt}H9;TJq3}Yx&uTv>hu7XC=%$ zw12@KR_PNgf0$w(#<1Kz{I<UIv5knCPKup&jo8yKDLb+aT6lTV<yqGop4fDB&dQdF zyWbQlnD(!)7P^1;|8JF($4~9~H!<>mqXfg;#tV)N?_2k0MBXSn;KelWuTD3su>Svm zpZ}Se75@EO%-!%IUhDro^W*#XMEd`--(z5wsTTbA%DV)I{FzF+zwVZ+N8VZK5%!Le z`_=C6mlXt8t$4?gvRX9z++NPxNpH?NDO<g2Oxo32y+&2l{!68k@7!%$k3H$?b^0Au zvEO{z_hV0a&&}t4KgGdadrJ4F^<vL5yp!k7oh*I+eCub?YfQ!GK6?bbEG=H=V9oj6 z`h?WUJ#(g-n@1#Fp7?j4wbk_)i<O0I8(-avoBFpjeT(U@y|WkBZ+5u1N@1%(&#BLo zKYZHx(M<budBnSOd#pY$<2mp{?90c<#5f%Zwyj1PQZrLu%dqEg?A4YlF^=!OIJYRs zLbFsLrSip0ugZYR9`-KNl+bUB-(9fLII>8Rp@ZEu|A9pNBfqV4jtl36Kg|_9SFGl_ zdDB&=orf%1C-1Dbxcn}9%LB{MrE|ESo=IG?sQmbSp`W{>W+;b6Y&WsJbm7Mtw%fZC zw>zA#z8}45R+!iR9^(oRlS-WfnkqWmTw*?4`E*RA*LlsM*hS6Fl~OZ%HlAO_vUJVe zmdFQv1@{)_7;gJ2b71oOa}zoqTRH7MJk9U(<H<%nGHoW0i(`b=uXo#hcyjCG?>{*8 z^cTh_7f!pm@vKC*abG~#<7-oL#ipqWJ(!-pVm_}VtLCZe&)fW^@8`E(en0iO`Sak$ z|9{@B$yQN&z4>Eq%X9f-r^^@bv--_&dFzL7Q3ir-ftGtY%q(xOR18kO%N-qdaq5C1 zKA}lnseN2O9~{bMi=Wdias9c$&EL6!fAU!;GBqcz4OFdCuMSGD_pdy@l=J*e!Gl>W ze!1QMZ%KK2v$QnTa8@4OaLn$%mG!@yJ2E|ljzvx=PL}4$Kc#T$G{d`7ugf3)<7>9^ zkALts?S-|^`$Mh^>kRijca8S@@W*w=QD^n-T;HUMtMm*^8(n{F<S;Lvw@O*>;-O`S zO1MmBlrOE-W)F7l{`}|aO}m4~&i!HgxAwsQ)i(Ch_g#N{oSm@#)OG&@%Ojj8b1#=a zwf%eN?`1u{8_wRmzQSR8aZKE6^M|+p+ZO)bW_U*W{H-6amrs28e@#U3zWtK<_r>Ow zKdq1FdL8m3?!jM`KamO1J=+dkIb`!Lq~&__4;B;SeRZ6l&)=0^EBRZhBv^05)?+r@ zSEoFaTeIeo4og9R@x)DcZ{ADRS<X4l<-Ga>Gplm$Wfw1JhdjM*tM~D=i^LRL_UzMT z7j(b9-ItPD&r^0Trq$eY)mzzlb<O#bZ}_fOR`Ic&{Hyop-{H#t7k}Jh*(oxM^Ub-) zhc+7K>~lZ;ixP<!&Hfm(iRFgnm*1BbO<lZn_q5J-wmSZ0Hwv_`cz!&2!_9eKPbu?$ zZ5_rQUZyopySYzG9ele|>sHHb(`%ChXE(7QEi8S!WlBWxd>a)-vCjLur0c@h757}; zWqM|AH`jA9qX`Qwrf)8ge^B23{%F91qX~OhKSYTB>j~07WWWB{pDPu%lJB{%gg>nc zzSZA0>!XpV7?-}VP5t_q`}%v<rq8o8zqVex=Ul(*%xkB1<@Jb5)ZLTZf3Ko`^^e;v z=a}Q~{Ips7r(JK)O&84%M>=vZ97za2bW&{zQ?lC&+l}u_3VqqGO=EB@m*qeH!Gljn zxK5DIHl0n_o$1P^C=0d8Pge9jpZn??2T$xIrW|>pl`P_X0u28iI2ODpm^_hPW=qyd zmerDTbRNlu^QAG!|8rw`QV{7dohQcoPH|LI+PldH0@=GN%c3VRxR>xVxUxi*y_c~0 zwmx>zr+sTVmp!?^Dzhm=u6*uW$@Fg#w_De`IUf8uU5QoFM|?)xjmNQ{{hL2NS;O^P zDd+o-p4}-^i{F~OPpF$Zh5wH>^QI+NR>$#JR)^fYx^v3hT^8>@AGmGw=^Nkr*L@0e zTqUzqZrO6&pJlMWy>55LmMQnt62E9Xn8J3a`Dt+bl85P^9`5wp+W6+&g{H{Itp-Z3 z|G!)|)${xGo?Mwr{SD6d>o=szJ^cUif3CloM_v8KGZ($i+*~JkU54XoBZE!D?J%Yn zQ@<YEHi7TQ8&0*9puJUMQq@Xx9F86D%If#^mI*%SbBg_ash02pyKl~_*Zxjh&{fgn z>@DD;vLt?~i%s6n?-Ctmb#f;w)^ghMAKY_0?BQFs*VQGfs`efE{Xe-NrznL>?dYyH zdAAvoM~(SZCkJqD{=lHJ=z!$!(7wNpb^gL1UhqiiZtR#XdSlU}c+qp|63bTn(a(0A z-~8*+U!OBgmO<7PZfpMk+c!5Rne&1&qficO8Sk+UwbxFZ=hYtu{Bm19-{$@$<9;Kx z2<8akl<uam(>pbUXG~|PJrnuugXpYP#%Io@bj>-$oH;8wmQU-&(oc2lc@t~q`gM7G z+`cBp)1ZCm=hdIKGp9{%mD$#_AuPhi=7ra${j-kGy2!$Kh+mm+5#KzSlNT1g>~CHF z^L?Pn*?8@p=XUvf8@yJQH!EH<)nc{jvn!$(_@nB(Yb<OeAOF7gx$MUUR)&88KkdE# zAK(9H`l<hpm!HSi&D)+3aPLt0hJy<?YIJ5OB<SV|u`h8+aLkJ{sdjz0QOj%Ml2W() zpRots9@>bk3s2xMI5;cK-tDN@EG5k)qKehQ&s-C)Tbu~J5UlX~>0O~Nk+xMK#rMoo z>$4qqYF_;G-bmA{ggHa}_<2YBW5$IsbKa)qn5W<9d30{4*A`xGjlPAdzFhXVrcHVF z<Mp{sEo#-frBCm9uBha~>b1k?(5pU^!+FQP$xEO0-r^f%(eEX>nD@avTN`uZZL-H! z7OXrqVQTvJ<4bQ`Ty`Uc%XHNRuLYfg9zPP-I9A6L88!4R%$IU+KX_B<Z?;&d!`(%u zQrbUO%{epUN<vfU)V*Ju4{TQ7y21bCqJj;v#uxi9JKL@Ka!tj&V$s|5bbY7nhuRy? zS0-e?@X7TKb1SlzPFzx0Ucf8qX1aW9+nZw+tY`C1$GOe=B%<r6m|w8t=PA#K^4^qM z{=>)r-VI(Yp%&Zhw%}Was^~KfuLiN-a@NT*EhnAD3X3P~{`}Nb<FN<JkF$qlBUGcB zPKG9i-V@IVU9q2~w&H&8#e?-0@3*(rWN!)D{Jq#_evY-8m+X|Pz&EZd!!E@CjnH1c za#Q$W)m!HagTKh1t5D<Lze4G~`t$FhH{x5L@6Vredv5$ct4H>8Gv*urv={!}vE$CY zS;a=2U4^{MP8MJK`z-BZUMjzA!CtH7!gKr{-rJXBBNN?SP~9c>@?GnzQ)S%Ewz>(= zEizTN|GCz1)^g|K<rnrHb(PP4SXcH(YJYis@VV~I{ik$<c)E8N?c*wAl@$6hM>WdT z*7CWb-j=WgOUuu*4Qt!~f92c$Drd2g->KAYvGTCQu=IVF>B6scUf60L;&>js*s~<p z!hD9;78cW9(_Q)nicON427lFj%8z?LeCHIr(8n!u)9FTz$Lfzid+rc_cyGbpLr=p~ zXB{}cz;?av`A(&tn-ibJJ&+Hz{J-c<o?B$k{*J=Psr%nEZhGNw5a+br;!IOd+y9-e zrlr|;@~j^}`xA3e<IJNUA_tC_3hZ0I<Z|wpi?TkN*L+PcM_k#>86Bd1oa?Zr-@n^R z2OpexeOfAnds=uTD_2hXj`V7WnN|e~J^2Ne*7hRLd{=yrV0RAVH5dODugs()#rHIt zvv}XVsyv2s-gB(idY%Z}=W=>cCdc8MTMzD%I=}gYkz4B1vhr<_hpuE8Mp$d>ZJC)H zbgz3uGy{v$!@|JHZ#U~6%k0l%3R`qE<LuXc-xuVRKP&HEr^)d+QX)Q~_;DS3{2>;T zC=JWU44+xQt^H`j<+Ji(yzx(|gw@BsKbo_-cP8INk#}crUXkQY=`;SZ&$%|RO;c!Z zso<&b^f{YW{a9sV&$^;`^`W==t<U!#$$sm*;||w+o5vH+-mGiR&vy}@zqx3?&kfEL ztvg3<-qZU3*Z<J+$)Emh`RqHl^3J0(?msFS<E71V40LlOPV2k~)6lh%-6MHzN^SU+ zO+wSZuUzh;-*nU9W7jSZi>ci|HilW3?%$nV9=!FE_sYnr{ki(?H7PT1e7{yT_g!^L z$~@iIHt&wM^I82r>*9IWxhSDh?$AYM+gs*#H@H5|;lHr($<554wQDDKtY-as-}_Yh zw3M1O>n$htC~=7Pv+O<YrzNyz*P3s<QVV|1K3bdYvi0<pm#!;v9=Yi9`Tm~}9oB97 zl=Ie-seT*Yd#SndzPh_8YhB@cyMF8a{D;;r+M|2wX{>`y@|2ENrENVQr`BD2w*T(m zJz^5GmA%#6w63_Wh_t;KGxO%o&Bh8k%cht#yyo09yI6ivlDgaiuhmj^GIAxa|JCXj zoniM=Ibzz7=({b@bJ<!iHO)!I^W(p3Etzz3aovpXf4-{lx}=&X&q%wdt6VJBb*SX5 zR?WJbrozc@jV{DYe#gl4R7CD=^lp<BW))tc#TvqsRx2mIs^~mg{J=$hBfo+(`}1A% z-RCb??%nvsC6iGg;`8J5+87zm>Ayc!1jqlCct5Flf$0s&w&3WLt*^ygrLzN$XGq5e zAGW_bVUsEMO_6UC?3c^hJ?K9tI#YzrTitQepF4A-{Lf7kn-F+mA@hWfH)p#ppRBm| z!k_O3+r`R{-Kv;-m?hHIp)a!|Pxqc&_PT15g@V;OE6cTo9xvBB{;zwn=4M~xQ*t_w zo(Z~7VPQ||oium5)nt_?x~kmH84bLAA%-i2CV6q~Hce?XI((k#zTdIEoJGxvji0W4 zSoCIhV9d(${yRD4UZGj6tBR^`H=3}>wxk-qVp|<ibxY%JxzZlqIp>7l6ji+yt*g@c za4?$RU-Q)BPxl=ePd<s)nQ>EY)<NbsJ>Qn{PMkDP>0#&s=QaKlQ<}cidX>F@UCt@L zo8gIkukRGkKkeMh<JoL?*4OM;|Nr-Sr^T20*h_cbHD7N~l|8iZ@FjVE#pjN<3p+hI z_cy-_n4KTeaZSA0AajfSEw351qEmP9v>BXyz4zWx)0hjJy*B9`RJb4&Iy<#^+fqXj zSLNuGyo>Lzs%jZ8FOCVQwwuqF`0s)4mm~YEH?^BAoPCz3+gP`+cUIJzD{+-764N|C z?K`~3Ewn6lZYh8Al9hsP2AnJ_xO2Z2Xy5DkzT0)`7LLQ3Rl(Pmc&xRkmfChDN}~Nx zX3uG5K0o_+j~4`|PFl#={Oy!e{DOI+YcKIvDoqHRUU1v5w@9;Xo=wRdm;Hq|Mdog9 z-|KD~%5lZV+dzIzL;lBz#TKU(+PydR7s;sf^NJn}$)1$0@^2qspQ>xQ_QW$Ur93J= z31@QL7CJETiB(DGl0BUp-uB()y?>~47vCW@FU`P0=W14E2`+&H3|!u#tBxyX>S~MV zuJnJ_Bjowc?ubo<((G%W64V-}oeh5d`$Fhe)9uUMF70`HY@cOlZ#U<oL*H3z#E)$@ zvb8KNd8c<~zvQpG5_J;KcNg!K$QAe&d*j{8YWcYvTQ+~VH|6Y<RKtj#OPi#Ri5;Ay zwzewvQGx6^gL#P;4P<Mw4cWbg>-L$}{j77>e-MA}PRPzq*)<Bq6~@UYjz}}Djh}9? zZszwFMjx)UELVS6)4R=h8~48Bad)!cS<ZQ0tWx&<>dN;Q@(lA1OPsFum%6`h;a0bY zCl6FDY2t^i1u!{hmEDrLh;zF7!g<O4e+8aa8NX6naA;5K$rqd3-?+O**f`9s?fz<! z+UgtnVe@9*b9M*+h)rr1<llDIb_U~jsq|ZRORC>-nKkD;Jp9py^K`}yj?a(I+;5%i z{^@#<Uo!8vt2fh<qnw=<g+7Rkn4e(FnZMrac7m1l<(oV8oA$Y_&zw2;a@HKvZ~5=% z6iS)K^jv2st8MtnJ*Rt<4d+w6KU>W0wjQhB*3{8vliGFa-xjtNTOaQ^9~ie{aiE^x z!5g#Et}1<dx<M<??QGWFOFtVUH}XuDI~)@^-9owTQBSbMma}ptUV-WNr`Gy<&F8)? z_55W?*OL89Qx=A+9iDhc^S#WjGjsDEiKZWzlY8uy)SGpem>ooqdEQvgGB;*|ZA5{U z%kHCLb89=drT(6`tR?zI{dLuAdfkQh%Syf_920RgEaAO2Gs9;2mITpGF6Be(`r>+` z<`f1TQ(V0xnx!fy;97yfyz6d}t>Rqs^*7q@^DJRo;qvL#>czW_uS8foa~>$YpLjCp zT&Kb2O^@DW7Ku)IT_74iZO8U+x^bKDGd8~t&{*y<E%sqe=f}IeC4GJB>x(Z0w{!2Q zX?p+qSef9L(3{T;9B%VYyLt27fxA2N4g^K0w+g=7R6J|S{8^uVUO)89E+E_4ZGz(a zbvuKWDm5pk9$%Y~ewfYKyxCT)sd~=zt*qJ$)DQ1XotHmTgO}g@-Ml64i~f5AoSE~E zp**DLm+SKW?`N|uu1$EpcZCf@gWQ$U1q~)UPT9+yoSn`vyYQOa``}5Xk+zM$d)`(} z{hOS0bGO9T<8Ll4otDt}EJ7!m;qg*+W683T@E<DGaz>V-a%t_7I^UPrHgtE~J=CMm z{&<Cho6c3+6?YuZI!i77`;~uYn^(y5J4!p>D6SPq&y-wL^)Josrs<NUGexcmUHQ4F z-}3F+H&)JzQ`DPg@kB@-%DuDggw<(*1t-&bfA2HQJ+$q*$0@IKyPy9MdHGE{GepZ{ z>YT$KVqMGZ5B)p-Q!#a(ug$@k68&=J<!1}0@2i#%`l(!S<>j|pK`ohFIo<c~&j|#0 zwzaw0Y+aU<oZY`uM~_iU@B#n3i^1mC-A|tS<tM_y#@P^ba;Nyh6a}ry`J0OkY^yZ4 z)ax0YI~Ei?-!Nvg&zj(A+IsD;_j|0H-v7JxM$K7=Z!502M@{Lu<nzbmdRMBFxA3<q znlB{I$El_mrS`Mu?%tfM$o}t!-^STF<^BwcpE_chcC3&~m{-Z3u*qR5W6Si(hb3zo zf|}wkH`IpT;@QJl)c;6xck;V6*>k+Nwr%-o;$pb{fA6iy-kzLW4@9*p)m79?jnSAp zwNNJE82kCw8HcZV1av*lwrj{%yC`_(L`7Ba?rpP@O&w+~V=;K$W>&G!{N2@`&kX&p zuX%Pmp)yZ0)O5xIXD<$0mC5sdW~$nK(Q>*i)g(VJ<AcFA8;7%X=f17)bbgo|ch|A; z9p~lkQ=hzdH?+B)wr%m-sr81IGv4i38mRg(vq?Tjy7O)6pQVd$=zqLpI{)dyhtHdj z&Hv~Axxm_QXTMLwj|+F-8ceFUyj9K;q{HrUL7Z>5;;O$-Ki26bY87TECVkFd#1p+( zWs}Gj-Sm#j3R^O^FLCWomU>(5waryY{PaDCYc@PyTS6kw?g(n)if@_iV*l{-J&To_ zIyZ<X&U^6WkmtjwN0qkAS8nm}{BC-yW$M|BcatvqA6m3wXOZV)m99%cJIZ9%$sPRK zqp<dZ!8akP6x-<>--?V@simfM`(|-{4}N;ZrbL}3L7{u2#hTrl-?xc9Ez;w8F0}UJ zuZ1g)Z?Z9yJ7QcaQr_O)o$vm`<k<ejy~+j^67w^<Q<85S+MT#g@P?`3k*Tw$?q11p zdr{Bk*35?jvn!^1%(M1hbbfcp1}PDZwSFtxJhI*i+fL(Yu+eP2*0IXgaG!do*UpSJ z>$gWHoZX$!k+8Cvp_^l^h@Yo_XgAk=g~*w&UTkr{5b~?)%L3cCQfi&=SOh{Jo9WBF z{iVkF{leB4ic<^EpU)JW5h-;lBd#kfVeP3YjA6GIw}w}Wc?B+eRAHP~ol)j*J!jgD zUHPFumb3nS_1bmk9u9x!hrAE>9ky}_sIqE5xOC#xb4zSiN{PA$m=)#-&qy>s+-+?3 zbProag7BXm?779Z-2d)t9nO8U|8{TuGuGd6Ki#Dta$Zy9JCxhs9dO)z!h*%c?0MA{ z(OZ)K=zRDZlA$_DKQ8gk!%sZlCvUiZL*IYZ8P<EB8^XAw>fc|jz5j5@xxLSfC4O*i zJ5puHz4)TH@Vt=2YgQe&t@2{tUE_irmc3SwS1hd0-RNFkc<Wir^osse@nc+JQ_UQA zOV!ISIOF7NwdVby4{AC>`y>vF6xZbouJL2?KYP)2hX0`|qkAD0zj^;X=X?I_hRU7g z7vj%HCvRP_Vvf&@J3FNAg#O$f^y9eP!NbCBCePomKNtVb(RIqkg~7>lxNggo{aU^z zXOAeqdzvs?%cqnI;cHqRtzVz{IEpV2dAdjR)OUvX>%3oLSA_l8*S6&G>GQ0Wg?SRM zzt^3UkmwO&Yd`$tjcMJpSCyPacji@hdpS=1@XR8W^^#&#TIj=VENdt8thyJvfO9!d z#0o!QTP^<V&TX;VJVF+*Ir?36Ou6<#VUa^^(KF#G<{I2Rs{@y3%+*?a;AG?(%Y3if zO<t9IIlevG^Y7h{YJ=7spWe4po>jsY_U8Y#z4HmR%ucl8K6mWz-VNu(95*}ZvPvEj z(W%;Ly*z!nUuF4@O<^;_4~uiwx2V4RHchAh)d!oFGcS)bl(qgnIWs@OUgq7ojs)?i zpJW!iN>jXeQRul|=9Gx;ivnDyc5qv9zSq6|+sd$RrUs9i0k?0nV_8_D;f*_%a~FO3 zW#@k3@8t!5R$A<jD}N{27MvQ%oqGP?xoVFO4nLn5_#TY7X?yGB-<RUgU#`j7&wJ*6 z$LGJRKYuwYaolb5#OMC!qVEO?M`<)~_UIPNT9x@hys#xd;JeU#TjnQc=WNS<Q_eZ< z@;xS<jz2a{ip;y1_f=iEw>bT?@&)ll1uJJpc*Pt%F4<YJ?Sbk+R?p_U3z}yaZ1L^B z)ol~!zCT&HBIGoeMs2@K(az_#*S<%c?uzZNuC6wFc~rK0clP_x_miev_F?c&WA=TS zd&fCwM*lM1NutVK+NzI_&ufzGOMNCek9%&{YfaS&hg~)@tHv(=W4JTa;@G**e0jWo zd^K1mJZIJkp0iVF?_-a!eW#Pxbv?cBVX$toT`I@tYcHk=C@ft!F~?_d@~s)~rC&!i z9bNn|Qdx@aqWeLOm4BHs_k8!@s}@R<J0tg;(L<(qPWQ@=C(_T1zsY}f2>A8mi;K#t z-Kz{|95)gWP;z|9He;G++*J>c?a_bYHXG!Bi{*dmn4VJNd~})vr>;ZZ*LKIvjO_V) z`d7E5EVz8+`@dy>_1<c7_ZPmH5m>+auCvv}y_`p??L<D_WoGfL@9W|JC?}r2@6z%0 z>sQ}7pYn*S#U^1w!nv&U7^~n{&38<!7Cx9`GE=B_{`P+zMKfIF<khqbCAHKOeoqLQ zqyD_)-bVjpMQ;zTdMM;`)r`AL@XeYR{7e5Z#4#HzV!8aLs!O5%cG6z{pEVu~k27YN zY;%0nuP*HIIp)R62ZsET_mcv5-13sp?N(8Eka^^ulKo1HkQK=lo_C|SG}(uCo=)jy z+URL%Bau_S?B>j<WIu)nE5lCR;8i%xu{W)qd9#MaX`!@FVT-fQ34JU-ZKIa8ai;lI z6ZLB>+QsL;Fon$sON+bs{L_!0%J;+GR+ckah;4c=$M#jpTI$$oE!ORI+$tRjoNN&d zjK?d!*T~tQ<Cv&-`J<iY#|nOd1|L894#)q;<PSFTYc!@kxF(owyRWvUL^)caCP8FH z%GYfyhn~oVZp_QrSn<NXt6h5EJQ2_Bk5rX%&t+%SK4q#C+;;V*SYkZW!sxQ(J4p@Q zY+kD2N6otby@{@Q_jZw^f64QtW4kp@uROv!J?5d)g1C$eYqwqfxV1G~+c9*eO~9h> z#fdW?Y+}E={Nu&%4;nXY<EjoU;W2hT&Ad`9F<v?~|H|DDcQfy0NWS0;ja+u<@3uhO zEjuqYO}i3xCQEYa%S;D<p}*e2k4po7|7x5!p-^YeVZld*x4zf6mU!`gSp0o~Ooulg z``ylcmsba<^M;)Iw8@tJlkIt@+^#&A)RT*Y?(#F|pDXA;?Y?RHcCj1o=@Pw(9S#rN z9zK~E@OZ;Iuie~xj#;d->S^j(klwdWcoX-1_S6U|ech@v|NR;`lUZ%Kzpqz*ESxiY z^IprZwk5|l3vypjcCfHz-CLg<=zE><ov*}Mf#OpUAA&Q4&T{tMd^Bg4`};s{0R@e> zPPaLw$_j63zNp@kz|YaBblzpb?-I=y{vT)kOq=rEV9M(6$G+Nb@isel^l^CNAA6;r z(>d?`7tY(h;#8)f-g2QYD<UKA8-0wN^O39OqQS&UeV%yk(|rGbY<K%vU-s{I>ht5* z1@BM&H2d>uw)*NO-M><P^WDVM?)}?;==1j8<@NDD?Ly+_O}%ZYqV@XKpPxE&_7}Za zxNP$0x?Yu9JLy#OSJx~Q_uS>qH@=bfr?UC<_NJKDudW*BBY)m9I#FZjH-GLzhv*0Y z?nb^pHN7+Ac-W#>|7rt|MZf8-Dw?Lw@5y!Qh7!l_&~&-O%O92$eOb*q;iHsMpWoEI zrW;OLJmy)Jv%dA?lN+2izqjuXtEl5LIaxMC<eB-6=Q}FS&!77}>Efa1LOLw-AGRzm zUwXIY`m;UulBfF@%<Qjz@jaL2x2on;UkUG}bIjYWY|ZukDf)Oh+pqHlGwY(IpR&Zq ziPW_{^xP1+SoFy|&)dzXO?_OaM@ro1dcJ)}Mf7Kh`?G@!=gpt{Q>Jmwohcu=)|)5) zXN+I7!R~F$(htwqDpf!J`uWuR{NAs-KR@~KlY7sf%*VG^7RD#+b(OzYRVJ`F*D0Fy zc9LyhHG|M$u`l;+18Y7TOnq}~=5wa$lQ-A&X;t|9Z8QJN(DZC;sgPLblLQ?DzlR$? zDu11>eD3tkpQR1?T#whEo6hRiGbwFe^<)P9j?e4)7KHBHd-(Mt9@mWY<jrmGPrViM zymLMM`Jes0|6gx=Xs=eMcj~lwvaRL%|0{pki_U*o)XDWw@XmFHIrh;9eP)Dy;4KM$ zcUvqwm-pANlAt%i2iM8@><T}gKXsS*vXeL69&fkZ<8+RDPsPLRwR7^$*+}P#uRGso z&z;@6jctKp)g9r-k&>YsqqpdO7US#-i-=paxP5)g#|M1+;vXV6of3NZKfhkwtmpIO zPfDkLvd>w5sycUzzMo|8ZNB|~rPg{KU*+RJwbU%du%xs`$nI~<kJmdMsr|YA>d)~# z#kH;L@4M}@;eNcu*y_*IdY(VOQlD*=xW3fr*MV4bpGD_Chp>1hPZZmG{JGQIsZo#O zOuDN}6dLB_$?Y(G7~^n^VRIDQ$KP_f8Sb3=v)5&-F<Z4iarc(c7ETYGKBMBurI!-t z7yi8NlM<!IGuQCa<2CPm8yd1V{I}73XUcp1Oz^Rpp2^Q_`pX(sF6-JBpJ`f~rfaf! zV#V?9Gs>1>-Y1odcI@^J`V@QM*_3OZ8}_I0p3SddKVtcgdEw-9=l6Qgd78n%G3!D6 zeW54mFFKzm-cz5r#600H)1Te>3DR>`6<BJ=B-nGBW<HwKSh@B1jgx|XzaKt`>oAQ~ zO`3MMXZG|29=%g18FRPneJE!aepn)V!R<HRSADkq>2SWw%yYV5dY(Y#`!890WgYA6 z!rxa-$X=psWy|(<zk0!zJ#U^WD(=$Fk-U)IxiR*gf_IZ1XF!S6_PY=N@;$zLpx4M@ zXGwtdjJdn*9eQLfKTTZK|6^6iiuBI1i?Qn#UEF%4Yl9j8wPs<%dC&HBPG>im-1%4V zqS}Q6?eAT~JO1qbrugh=zwHkOPpb;mDJd%*rZXH_(AC12V4!-r)$Vpv|1-&Uu5Zdb z9}D<idThF-nJn@%N^IvAmJ@q*`tB*kaqM3^XXlh{Q@(htV4icX_q@OMx6H@KyNiR5 zZeQ@fI`_ua%=*UdOE>(DyZB#5;(y%4*@jHd6}jfGpSR`HCkgSSpK{rvi(W^Zt_>3o zd08Yqamt$|?p@FC@wIIVK9*9tPUfECBgMZnOzypB+cLT6mq>PL?3A+pZ`ZYSX9#9K zd#-y+`rRv@;D<lCo-aR?zdeDSFL;jn>)ndM_u?PLT$|CH%75+l$%Kf*d%}(j{ha(l z`ETw?mJ1B$e$7n(^x>MYoyy~P{A~{GoKH5&-TpUWzK6ZMvA+0K2DLRT8V}|M3b^K9 zJrUoZ$E;*g_U5l#w7mqwUqzb*ZHLe9zx-~la^!pWnEaR5?;o(XQ0V7Rzc#TmMz4L3 z!u|Vy9gMuCc2(xxQR;WDotUvPV3wiD;yu!*_sVQh(DajL%{}%-u8~hQb5;7%nV+|5 zolm-G<j1seit3!s+xK>KBw1YFXfQ{#_~Exaoy~<_pN(Ya&gS@ZcqZH8sRn%&_1QL4 z-}w54%-wRZq<q`njUFLRubu2eH=EA<(#SdGYR9)0Ns)}Rr&B`0IJNdhcAwsvwd=;A zm6Ankk2CTG7Jite`*B&5UuH|#V~4jdWcy7&vHuExez#K2YwohY3&LtINT{j2ww>tD z?Dp9pcjvCp|0jQ4cY30V<+Nw)D{dXV`%=Yt)26Id%U#3D>d*Y%f6DH_sZ&1X=gUIF z(pX-a?_R<5n>p**nO6dwoj#W`O@c3T7ZjX3SR|6u(dB7)@Y#gqjL!XgosUTfW|f6; zD!69J%(HZ#t?gbRxcoKuW{;ex?oVYAp0QgpV!8@m3cd5%e?&&{Xp($Yy3s>3?lRsq zkMBwgA1YQQXa8s2WAxy#)Lfw&p6!7yv&sbdEOxfAEV;tgbk@)CpzX7_2GIe(`I^2T zy2U-&a{c#P4w{FHFYx?T&iJ~hKxWDv>!nlkUFN#8?rop9BiN$!BHv|JwahCH9or^O zWjH8zPVumQ`;9%Pj$XX~@cZh57p)~lUg<S8?c)7ee`<T<4j+~Id-tWj!5)sMG7i^O zCHL=jclci)+1`IhRrC6yJ@>Wp9saVVJpVYmFk<Ta{=T2jrkr<5FONIl`Mdh~`gVtX zpG9|hUpTt7eM<0_57yG(9$jfJ6n*}Fe^b2DfhmhW<kuV5{o7bD@3G4q@5QB#uh;AL ztd+gHN8;+7hkFw@%WaZn`Ezz={{-*LJ>{pA+}?{l^NCd{p0oC4rK5Q2U(;3pq+4^} zE|BNhWsvv#_wonk&uh(sigXU{)zUn==f;);(=CP0*6?hJj#9FhSGur`>pDw*uTk7J z25*1$hab7_-aYx<>(|~-|Aa!X?=L;I)#~*7bN=ZL!md*m3fukr?X~jI(^Wd*53kBh z@7o-9>D8IlpT2u%-MW|1FS9v7zw_2%=efTZJ}Q6uR_=_7(23|rMWRoXc!V!_Z%Lf} z@b}6^?#siUzFqPsqABhF+j5QK<NuFI{>$odSLbcgnOWrNqx$T}_HxzvT&_KvxLzwC zEOiOpXvegg#mDu>AH|0s);q~9<nyyMTd<i`{<CsZ>zk%0&!(-N5ESs&chT>bNCwvA z)=#T1ZM`;WYx7S%o%@TmRO}B%wcJ~@`Rt7+66J>^wz*GmT+zPboc?;olohR+SNho_ zIM;r7`0U01wR`rZfATkw=@EST+3Hg@>&w>3g0Z4}=N1)iE91*9d$-@MdS&wZnjS{0 z(#4zhNWAv0&<vP+ujT3Cop<NT%OCQOeQKZ;+*ka2R?kQA3;SJ`Hw4G+yq9#gOzDgJ z!%J3oZXBGLe0jT?`w=H0^W!q-li#de>L%V>*I+5VbnE3W2g*G3&hY>EsHq}+F5l_C zbyazu#<%R_A7@y|HJh6GKiC_5Pu9Mj{n+>2hBb#g=X{@^V9W9U+kCHo(XPu*{hs~F zlH)MfpTjF8UI$73pZ?*k??c}i?&{aioc8CeH2-w*#jjJzt(Afre)eHcjym;i;ksh5 zFKSxa2M?C_D~*52^h`OL6!%i<`HmE+4z_)ncPhiG&OVOui{{zani8$LK{e?1P4C{q zEo+^Yd}=?xJyhU&9;5ZGRllQ6OTONnqP?j;YSOdwEvIhZKii<S^>yjQ6Rquz-d(dx za=Ob`wV#vkT{S&_S@MzES**#=IZjAjz4hus_8ecm+Y+{Cx5<1nYw%h<ZCaQ{?p^Jm zWc_DP401$1Fo;gm`D0gpBkKfDb8FZRvjeP|bu7Ir-My=LZ#K3qSm&;o68ZT1bAI<V zMK;H3BCbuSvC^&-X|ubS&a1os!x!%x-Ps#1^2S7M>U_i6x|aLEv(Fp;-sRO$_WJFd zw9$~=tgGy_>7w07r&Vkb&w1^Z+h-VeE$pb;Br{c&D7}kvSF|T2RtnxRiTcBL(Cg#d zz%Qp`!VW!%l4`iJWY%6biCubcSWn)0mR7sv$bQvxvlAcwJIEH18@oIvDkro#H$#rq z(KC9@g`^#qRJ7klns@eYJ$Tze_+}LMg@z4clTT0E@UZ8s%A$%5U8y|x*XQzh%`aTt zd+BeA*_WG9`>PYzDRM`rC&!vkezn3byDMg)bju&6UqPOGFMpkyx1z)9H1C)D#+iW= z`huLyW()8&Z<g!*D)9Tm)7nJShkqA4cek13a)m8zdtrYq>Q-=Ltkjh4>yNL$dDAdD z=1I%XcWE9k<Q9aTx>y#q)iW_uA&&1^oNB|#s!kWP<r9`%6-wteId9Hdym*CCce1y^ zkAHuz&nxm-qvs<p8oo4|Y00lWVMmzXeB-(N%HORpXq7~FW7QT{9h;Yb9x6UO$R)h! z#TACYsHgku*6!J^w7c%)=ItwYt=+%&(*LX438%L|{+w%M_Ql9<dCt6=t2ykdW@(4Y z_Rd|XdMQVB-@i|75f>(XcBtQfCujH0-g_Gi8TZ6y?Eks8Y>#Zft$F{r_ujvK-u=^M zvz@*7uN-K8(wI`AuH)jMa5b^lu46CT-4Y)s&kZvcOfKBPthq&dXMNZYKFyeS!AcoF zj(S8c^q;t8y}^ujw@nK#8(BCDS(Pv0(C$iA_7&BhC^J>a)^WE8$DKzHq@H<QD$%{_ zEUfZq$&$uPTYIyO9ajpRj840rUU_*(`-%9Efzo?7t<}iw$j%Eszh@_3`@^JDO(kcm z7lg*D*iSsO-oz;7_Je4q{R<CBZ@O-#5oMbE-u%|P`#gKRcpR#idd^L3ovzelZ}~m> z={3pAt8{9WzH9bq%eh?jo8$MVbDh@0*YA4@UiQ9Y{VSvU?FFx7kDchReV-WY<Ync# zmYXmCoSv$(I&hVN?uUp2t1gxs$Rz2UmU^$U-DP(~#`S0I#Xb)t-*J6!FBEfc%b4H9 zow}_+F^}VvoBVdusIs1u&i|KhoVk|CjKjDo<mUZyUELp7moIVnw#r#$)6qr24G+E~ z$%xpkVv)G4rF3uJVU-yyadQ@0++F)qN#TT0@p@y&{0$W$tIsf<nIZlmtNQ-?W-jJN zyY<-_6F)0V`R}~LCP-ophfcFWX4gB8cWd6=DYl5b@86mEQiI>a{PFVFhpL;xL*FIO zh%U2in01Tuv{doqqpdof)%-nE?;pDm^L%$e{)fYJH(TXjy}<wc*W#H@Wv2=lELm1B zj$ml8YD!tYCeSvZH>~=SmsRRlu@k~<lV2^2)H!s)@^FGj*|SA=-Z_~cPBh87e(U?1 z2b+~Q2kB_ZW^RZu=2u)__@HumwL$=I-qFgd980#y)*RPbvoez}e3prd*bOlkUeks} zkqJWW)gA@+-W_s%Fs<jQK;Yad3sU8MXIS?x_%8ZN@W`CZ(!RWuo}aUR{NtD#yS!H@ z`arlu_o0IoUyk`^d8o_8u_fAQKFwf^nqlbcwO8u+qB-|j`WzpNPl=p+{-i~X)N`Kt zzxE6F9l0}W^@o1%L*2zTVxKN9j^^B$_B`jz+`!ERljP2JDJSMcw9a;Wbd_5sbj94_ z_sO~bYA;slMC>Sit!CJ<xnQy2<HQp)cCE;|trfF=<9&YpjrxBczdCW)au0`9+s2E2 zcUNz)J9IoTR!P!UCaHVPvY3@?v{QtO{A{jSNUv@dd%DHy|E2OX%RfZ#xYzPJea63+ zjMEsW%{KHY^xu@3&s#TN`=wau@5hEqRNv=+sAybiD44`6@i|E+Z%$C3-!_Tj)&J_g z2|jruQe9*^W7o3QZwBpO&aUuvmb$!iQnbUK3TC~%XXCRE9K5kgcI~6LT-&YpFquW) zUjFc@#vPeghcz~DT-PLSp)<3l{k4?ng3H=J1hd3Nzs`2D+LE%qSzh>0T4%8OoV${- zJDy|&$E^PJGvG;3WY@&{khng@_ZGZ|4o;b}$n~vr!o0aVrJ4^dEWeZxBj2FDON>h| zEg&WT;54hnYYuK$Wh#*q9lh4zS=NHd=4p4Q?bxDh%A|Jx{GGLry5B!!h>i)b3{zXG zdgR+usathAdYXl@mn+yqzJ1O)t$Mg2XZOVVU&?Q)eyv@yOLh9h#qOK(=Dw+8-@VM{ zi`nk?y%pZiZr#+q)V0++XNuN&u9EJ4!S8o_V_eE6Z|B`{|FLYoNM`Pt;QnuQ*;5&^ zbiQ5DZt8SN7Zfhyootvd8Wt7tI)26OEg#D}7u=s!81BY&!c_6BQ+V&y#K>DWC(jAK zZ@5h6jZY%G@wRHWc|m8y&c9E7{jW9X?VCv*d#^s3Ca`_u*ZL~+_~+O9q$7GRw*6dl zv|Qk5rcaO9@*G)#kXeok-E`tiQ&yUqYHfASdNcKs+R1133Kw1o>AGLgh^VZtd%Tm+ ztl<L3vom7+tKDKkqxMYC*jT#yL4I1Vh7NB<K=!36-(vJW_LW~)z-VLWe^dBR?V2Y) z|LV?f)W4sdyi@Y>Ec4{t-oKg2A9aF7&b1hb$OkppoEF*WGTk|=G=5HLZ+f<(_1r@i z7R&Qn|4pCzQZ?yp!V9VIriJ^<p3Gh_zhUXKaIxeIUmwISl5hE#FvYnfrZQ#m?AC{h zOFWh5P1LQdpJ#Z<=-UVT39)(2LX$dk{}<ff>yu%m?p)T8z&vf6Vecm%kI6l*>~l`& zwV(5-HLfe`To)zvJXy1Isa3Z|c9GvSi~CJmcXt@CIaJZ{CrRtvDlaj|?#HTPH*U?S zo)vZJ&eoHP+oYYmv~PO9KDuM`vi)yNrQiNLxum{{VfUJSzWZv|=JEX0JwNS7Lr!<; z{V!31_ijsUx0$=dT39~AXx;OcJM*7(6~fj6tlMtPu<u{dL<5D}lL|ub&SbdFbi?HT zjj)r;GiA*38`3BFJ6qiNCH$_#{dbJB!66-8A6c*F+h=U&*of-5$3HyBvi(9&`J)bv z%3KA<rmf;n;v}D4__a#2=ae${_bWbAyfPZodlwj}f6#MiiJ4opJt0u-h5OM}Tlc+g z{B%$Ja2{*rk>|ghyP8+arYJea>pWvj*&@8njQPmAT%o&c^E`B<raOGvmQus+Jm-Z| zLW6qCg07u;`sQjE-HgBVwyodv{o)tinc4L>&GYVyoA{Qmnd_V%QD$S_UKZZv%5+34 zao4uDr+7oxiRHe`_!VS&T>A6F+_g`fAAXAZ=$vY0`PuW~t;fm7@(*S9&7b(z;g;G4 zmZ1HadyN*(UUiA*rO*b6PX%7Schr{dc(C_<!Uo}AOO3cc%e+5UZNb0L+}LTiFYA1z zPaM996&xADMr--xIqZWyIqj@D+dpn=T-_%2Kd>oCSB~-S3YVf8v)*k!_Ddu7!tZZl zK5KvN2t0n~_Ka;Uc4pto8dTGdyi9j5=KDLt`s&<FQ$BAO&ej*RCZ<3C@i0R$&$%bi z{>YrjcLDNeSKghv^FUOu;lWF;vv<y!_43BvP-oF|>zUSf-Ve1DZx@=n-qbw(jpvHZ z52I#I7drW2fsg&yp4!x1Qg@G^iuSaL6RvF8*zBAgTlsp?rN2d!Jv4kY+mFabxH*R{ zwBxBQd=+_E=JUHdY8A1)j~Qx%YIqv-(<5%T%{aQUcEQn=mdAE)Yw3N~u)D3eDoez6 z<;L}2SSMNVm&!R$iRBZN4CIwND`Hs9pnA{pEAKM*HT+_V=2K?&UD%R7qwm;k*HEUY zhFxx{nO{GAdGTs<@5QtiOS_BSEIxcdx%nIK7r}>53M5(U*ZO?#xv$LlQoKU-;aLXX zK127r+}VaZI6wPFY<j%fFv>uATSmEoW46SKdwx?_OFUl0qb1|ser|=vWu-eoTW(nH zF4oy#(~|VC*1>3>zTba?f9>MOOh5mgvm-opWkF;@z(Z3`{#JS8FW$%Qt_X`fTd?xN zQN>7~9ifSuhZgzSyBXZhteCn+?rrpQkvJJ64$bzLsasb($m{H>+{1jn@Yofpx6bmC z_ktSIw_p9aRjR(IBKLi2UiFWtguRxfU0Du-FD4aFF!;CGQixxlv7p~`NBKtn^~o+9 zgQo5;In~c}nQMQ1%TKAbv%g3z>j*ErXJ`5>wfEI2ivwTpR`L|gm~(E9%0thEw`3L^ zH&|mLu5<X;t24(Fic_OjZ)|rl-D<c^Mx*<U?a{RkGv_x(%ak9wD0+QC;63&9nGap3 zC{6srQycRCzo9$BOqFvhtJ#;E&M48oICZgilgRRGE83Q_?%Ma&K>woP1D%2xR{djB z7Rzr{;7NZpC*r|otL>X7@SR$@^}6@k?jupH$75%PrRM3b`^EBn(hIAnUk_WVrH4JN z|0cUstSFtQw&L&=_Xei9?VM{@Z+?)%Ir)H|lfp8o-}?m~E1WgB^!W6{4|`l&KO8;M zzgKCe>hat2ZD;<T^x*LIC*l7b`0uaVuB!WJt^cL82C;?5FEjZ5Xy*PCwz~7aay3)L zewB&R9)f2MiPfYj8Rofil^bw!zF-T=NvO~~|9i!zpF&&0QlzsNY?R7Mw$7Q`b8CBf z!xzhdjp9pm<CrxVKg~M2VaDOZi+?+vQ~d7nR`T?;knI<a-!^5rdHWn=%k;o4g=g0O znHh3YR>ts5>&e7beoCKT*{Yx1z0G2y@s;Er?%k1d|4a^iVkW-rPU35ijiIu!^Mq5Y z&8sIpee?1EJQb5GD&}U5f`$uLychK=pKy&Y?{uPp`}1$>Zpp~q`uaWn=d1K9?+V|~ z+Ysx+6tUsXx?qPW?Vh;@FUT!Bc1`4cF=J>x!`ZYM$1X3qz%)ZdN?X-6c5Qa{qEq4y zYfl!JG5F2n{2tzR^xL_|vMoRFUfUIO^HI^w`ToJx&$g&uWMsOxra({fs|H_MIhWkV ztj~f`Yby&CQaE2a20b*fu;06GPW{Z8@x75oX<V+6=}$kNm=e8g^&y9nGf`p-T73M) zl}+6i^mEn*|A^Fhe=KV5?<pI0PtrTzr?fHsMA}@3O)q9`eb1ZgGd=9$^|HQMC-oL? z6Jg!ho4SYfm9@a*+jfGN4@vDlqARf?>R|Dk*_xcOMtj8H@g1FFDH*){i?Pf*g|M0Z zoWD9A<}Iz{=h>L<Bi?Q4Trqv-c0J1vDO+A|yMDC$x|zhTkKd!6{>D$P{AOGJo#li6 z&rjkCg{S-fXK&ow$o+Pgv~$Ar_w_sZJa7Ncm#?p4$T^+<ouT9CY2%gGd09G+?%(<8 zefjilui7?j6f_GztZuZik@L3m=6tdEXwJOuDa$G^2%TK3y4)*7b2Ho0H7UKm%WfJz zFEfg4Tqp5O=}zAv_vsbC^JGMS2^|c#J2b^f-7f4!TC?Man}=F51oE0U#PF`Y#H03L zqnqfV=_?l8dZm-L=KCoN>GmZjG#^Gr9eSWL=gq+=gB1Ion6KX1{cTE-JY5+LY}Q*> zsJ^&%CU;G)%PqCJIpSB%&WUw;D?IshCqg>t`S0}P$xFH=7ih}-U>4z+JL?<U-iOXh zzeroHTbLXx^y@;~lWjL&G`?%CGpO=>tt_N4&A_WhbL!_UMs{;j3-Z|0t0H%#w2Mgn zTzJIMJl5nE+qO^5(+$K}q}HB)x#Yskg~3U&#;2FOFx{+o@V)h(${ER~Y;3Z3)DA{H zRn`2Vkh1Z`s)V(3#RJ|=wK=Zzmd*9og@o1*@ek&lxOw7i$D7So`d6d2i!Ho%A)@`A z@8Vq=$1bd5>TU^3U%X@H@mD7~Q#u~ZZHu~nX-l1);~MV^r)?ciKD0l`d(8Pnf|t;= zM=@(Z6}2yBXHI$BV*O#0l)iUJ?R(2FE9O7CGx_4`!cQv_><d;&Esu-rS3I)nvzqCI z3pVSHy=3oE{kXUIN^_WMan7QZ`MC?ioVyEWht)a0@aufJyzhAR@%#UnFWpybdwnWi z%%lFC3{P9u4@ZyX26JAoKlV^-PFK<SnTMkv-jm)Qyp-vGQNSK?J#mA=WquW!7v21V z6n35FxqGuo@ZrVBcl#$glxt4vnQdXl?VTC5SLE;Qi!1J(;<0MBnNnBqYq7hijrN~_ zPo`q8T|(@GxEea;-X%}YP+75AnKf>cad|-Kijxz+dqpPhU2Y(fd(o@PB`tu1YeQ<; zuT+oaJr`wO&pPfPpM5l3V$vr&hdT3hmRmlQ7Vc^<_7ZBDt8{VJdx=Y}m11()Y4e2t z9;~#{I?UV`>Y41c$((Dxfle3Cv8U&!rWRdmpWyA96|;Q7j|XS|%TDuO6#LLsLs%wm zPF{&!)s8<;=F~nd5S8;jZlaR)e9A?Oaz?iE(~kr#+<s=4)l#iV+J~hd+Uz&+Z;*1! z;X9ja{p~~^-vig;&u$V;tV=YXz4|i2KErMC@l6Kb7CwyEJ*Q;LI{S3inu9MTbXp7^ zipaHaK7W37rF<*%hfl%J?6}%5zMN#NTd>p3;rX)_674Ei<WdZ>xU90~E-rTZ=PseV zR$JlNZH*f*e6sGSl$?32zUR!jzy;Qv-|bb?TKiXD`hV}-tH=qvC#-i8Qtjts{^Gu& zct)KczoPG<Ujly??l!w@du!{r?hEpBZzrwcmg)F7<=O^|(t=M3@@Io9oHBa1W&Y)O z%y~@hXoTB+U(?Wo{OA5UM^vyyr*<W|$hM?5+~IDYp3o&)7_zwAXWhcv>zJ;y?@@nv zCCdHoHHOeHBJa2Dy0CK5-T-NhJ%3p0uOB&ItTcB)597M4tFGKW^`ZLdh6DS1ZSOMn z**h+u`a5UM{`NO(q+1_8(TPosY_7e2y=9Hl%;r_I_$U5Yf8^%QMnAtj$*a$2C9y1s zZaTuZEq_^Rb=bMhhxUi|?pJ#yE%2_o>4o+03({{bnQZIToZ?F_u4H7}6uOJ~PvEy- z=lFth>Yr4ev=ENEl*X}TMrwCvP~K7Y(rYV!mb>V9dj>>*+p0R@63d5Y54K7&=5IVF zHtWs#UoyUpZE8oJPg`WooVxp-mrcIk!~?It6^ki!a_`Q}zvG`h{h6+#7vr*XVrS&m zd)?o1b5&Dzl3dI0yC<$0UMgH8Wq4qEQ$w|i!|&Y_)0OTOy=Kr&Nxo;|^*e0J%}2kd zP5JlP`sb&&%YJ=1yWM)rUAejWOBPSP@|f#hL))cYof+MC*LVsloy_fdG;K!oY3-oi zh_vh{o60M1ta>YSva_;b>r{r<-*?_U7S3`)*KXY#Ia8w+ma>%wQ)Yy(O^&u$VZPXP z%huXEH<WY#s&s$fvW!<|vVQUppFF`bw^qUTp3<j1r8|OV_ozNkP$}mu>2dL~kt<p` z^>vWMa*YVJ-mvWtLZ&Qr*vJ0Z;(J%g>}xiALhkXm+Rs&Mv-v1*-=}lEanrH7&F41w z85*uBp4Pm{<AncYwiChGck=H)N#3dP*LmlBu~#dN_DejSce3`;g(X>Ag(l5WI+(Ym zqq}JJtd*?FTT2+5mQK5~%C1qQaj(Qq#kRaRY_k%}B;IQ+pWt$C72_O#zj-}%EYgRj zgz^R~es<)ITuFVoTC;g+T$@XI$SSWB?io6ojg>2PwkoM6Ilfh~G0ynu%=^Ld$n0>J z4Q1u)c|OiPyGiwVy~nQF)01x(U%Iw9|9*Z#VDy5I`OLyMO#YpJ{fCj|M%WkmI=#F< zosNG5TN={V{CJu^-@|2f$n1#8j7JnI{wjMs*nO<QUO{S;?Vo@8yLa!;k9Uuny7lkA zZ~p^RyH7@D?%%=oDEZYCy*cf|LU&obz8tC(e7wQJOl$j+54yo!iRS5l_Z9srk=yIG zbUVw`UpE?6m!5MgUpZyxg4n#j39VljCk0zKs-!S(W?r4R=*NsEHZB_%joKHbheZxc z2S4f*n#i>B)~fIOa<xvav%YKQkSYCmS@Z3<luPQbcD%Pa)fbiL@u$op&%sIMPhXmI zafn7%UvK2Bi2)0ayIopQHa&Zh oM&(kIur)~(9u+@^f#pj#5<;X3|t=9|s=e6X# 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%0Ae0o-uosnAN$j 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�?vq}z(@FaFLSc&uo%0Ue+}vYb8e7X*vg(dw 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�DP2|M!OrO;oo2MyH`_yN@ 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 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 zcmex=<NpH&0WUXCHwH#V1_loX4+e(+4;gw~D>Bm<7<_#hv=|r|I2c$Ng&3F_7#J8C z7#SECr5ISjYz77|Mrk-Zh*1NohKYfpJ(Gb2swRp70z9C62+h2J5vrPzfnfm?Ty?_& zW&|6g@&7|k#f*}Y0xNy}ykfn?l>DSrz2y8{{ffi_eM3D1eFhu*ih{)C?9>v4q}24x zJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i=|m<QC+nmLw`v z<mTiRTUFR9fep9HE4Bg&>nkaMm6T-LDn<APC^+XAr7D=|8R!`(*(ul*rKDK}xwt{~ z7Nw-wDnT7tUS6(OZmgGIl&)`RX=$l%V5Dzkq+67drdwQ@SCUwvn^&w1Gr=XbIJqdZ zpd>RtPXT0NVp4u-iLH{7zMX=NK1d+Q#SO#+I|Sq?JB3j&8UmvsFd71*Aut*OqaiTz zLIBa)NzF^KRVr7qw`2H!fI*Ohp@E@+nNf*>Nsy6Qkn#T!26+YsMpi~J0JWn)n30K@ zg_Vt+gOiK<{}G0*0t`%y%*;$I%&e>|EDQ{cwTw*63@n1ILW+itY{G$w>`H|qMvW5} zawt1(JSZA;@q>zSQc)8pmzcPOq?D?fx`w8fiK&^ng{76Vi>sTvho@I?NN8AiL}XNQ zN@`kqMrKxVNoiSmMP*fUOKV$uM`zch$y26In?7UatVN5LEM2yI#mZHiHgDOwZTpU$ zyAB;ba`f2o6DLnyx_ss8wd*%--g@}x@sp>|p1*kc>f@)+U%r0({^RE_kiQrin8CgR z5g=bNFrfKMkb#MjiG_ukg&pKCMy7I*0znp5MME|r$3XVPLSZGNMh+3Di3>L#<Wx2e z`XHKAbdgI;#pI#tN08URJ|oU!O=S5D?lFYFZZkMDfIP&=$i&FV#LUFR#LU9X%*@Qf z#sUIt>}+7b4h0-wzzG7}aPa>&gEJ#YCo?lEGczkU2O9@mj%ddJy9_K09RF`I@Gvtn zFbOgXGT1X*ium2NVdAf=QyS*EMtK-tDUM&Z`T2xtYeH9Vy6ln0aNSULbGqrph&Ct2 zHEHXD(igwnD90hW-u;qpVSChrEn-3s1kYBhwWmer7siOj_I1oX)||g{`mKFaKgiEz zS+(bPc=wNbpVKQ74~Jjc$8&K>WZ;IvxYSDJWwY#NeK<L*B3!4O>)TqPlXn(QDY*0e z-k$#q2WR>83#|}+w=1nzA#g&$)<;*W<`!C=HTMi>UbybQ&jsg`)BO0e9xUEfYxGxX zwyM*o?Atch^~u#aD%%T=TsP_EV-Ek2QZCHK-FR!;mwrCir3btjcYI&(l(Bfilk3*& zPYCgL@flQ=E-l|6Be(z2T5+HGZ>IZI$QuUE37`MUPUpj&#b=$BQ_B25t_wc$;k@0V ze-XD9Z%zBpkh=L0&yE9Y7qezhcvAoW!WY-eOPx=wl~}V~Kq5Rl;a2TQZVgHM#&!EH z9~RrLAR&={;p4CCFOBDJx2x4VKIeAE(T`iwwy*tTuH8SiAp4STjcOq?+b#D`>)kHa zSRHBI(XV`6^sLo3(;j}w%O<mDhqJRJ?R|VGpmW=j#o2XJUq#s;wyq5`HPle)db6fZ zIR51)cFw84!dYWn;@UnoyB%+-vADd8!RpJG^&9qZKiJ83Q0eP>lOOdDJKuJ3x_yy& z@KyBd+LmioYF)pkvnm9gecgEd(|U2?z<VcNFBiUGWB%|&PN?y*>^miQ<@h&Ow$I_Y z{>c2;{2v<g`XAO7-FN#?@H>6FhOop5)sXu5tiL>er`2ccv)5hN=Dp;Fkm&wi_qp63 z9=eAekKOn6d^~fUKxnEguVNHm%*t2Q>|N^?efYa%*W7<GCqErq{OdR0*Tx6(68<R? z(SkGm8FwD5z8?Lt-(mNj%NN&PnZRdYc|hj6_=m-Zr%Sb7G-qzLN#C%pWV-6jsyn}C zJ7w?GWx1ZabN1fIE4p@<=5X!IXNq>(aLhm?Y0v&g=Dqtjy!m%_*&UWSPv-8>VNIHP zcVf8F9?yj@XJwiGTX4`lz<Sot^~d9s_D`)lzod~Tr@-v1^6P)1&Y>UW);>y`Sju@X zX?fek&5eKBABJzKHM{o6HS>wJpLJ0^^Vw22nO&P?)^GfO@%xS(RTjRjS2HKwkD8FA z!|=!bY3%13vnvX05!?yY^{uMwnrriZ%h~?;vi|b2N7vfVExGpWdwY#{A)8o=j`iFB z49xKkKZ2t_y#2k(fbqv;3Cr(nd#c?otbOO<DRQj#ll|Okzs3(Q-(9iNoKS02Zx|P+ zWbk_7W#7#&``I&Z`LxDyipU4l&sgvC@#yxBE$=x`*FM}Weq~AMLxqDA<YR=4<5(B` zaE`d_WV-gYTlkOE{|xf~_Ey)oetjG6yF={y8AtgeeD+!&vz#tHi<-M}+O+g%s{a|@ zKK^KZaM#&mt*bM5Gs|<H##tWh{h=-y#Q6OBglef-{693NA6c23wk=jq|6UV={(<uk z<1_1S-{)CVQ~P0&y;#&sr{95>@8r%?`TND=Ze`#!|4>WGC&ls8;&^{pK3bc0>2dJp z3wrC<J_yr$A<6XimAhn4IkVl@FEg|xbX@s!UM~4o_0{IoRqf!FC(jmlc3ltq(f!!5 zJbAh8(SM80T(|DXjEj_bp0$Ey{sLL;UxI)8|L~`NP<NewY`^dxMfR4jid;()_V|}t zD9>RjOEA1*cds`4q5O@q-~K<!Ke9#U+ZfiWp4s@5?H5PN%(t5kTTjnZW>+qhx&E^M z*nfuBIHl_)mGW*o%;k!n%SO-3K67q$^=qE1i|_qsxc;a#Vd1-7vp3(|s()+!0rMp{ z-I;ex5Mcgr_`~^6Ywn7FYrMGS80XRmjw^rPzCHgie%iGAd^L&7;%29Bn;B(1`O`e@ zYdU|d*PAZdd+G%LZ--CWC#JDYiZWgsHa(=S?^XR49XqGLa~F5KwY*b#wnA>{M{(aP z@1O46J2NHSmbqun^|OZ^u0PqX;;1R_+;w30hhtk#AKm@rKf|U>XLi;rvXNzWGcVVK zKa~6`-num4c+-OCncwaIW_^p*KRm6fb^o{CH77!N+V5ZfxW1v}eQTW2{>i0FTi)FD zW>uE&t+Jc?aK221t5jg2?nY()o#*b^_PJW^sQ5ecmEekBi~nExyL{UZ^N;V|7)-jv zv2Bj{>?GlSr@i%BFT)?yAC2Y~E-uf^T)FG>Q@0<*UvwDOb?(t$a;NE6eD}IFbH4D~ z^ez6+Aj|%BmAI7pk+n9GCjHW?hxnS`y88e9bZEcZ+^or$F2sL(9pC>)_}OEQ<7?)h zH5TIMu2}A=t+w@{^a+8U_I@Fr-*3-pU$YS`&s35WI&di2B4uJ-;a3^KxM=Y{JJZa! zPu<sfE6A<t<9`&i`reP_kG8EY7h70f#e0TDWNt!ls>FHerYC(>a@txuEJMPwv@f3i zRR1i-kW0VppZ6EL{eAcSuDzKhoo=={`RT;a4)!|+Pr}cCpXGj3aFzeJ*mRHW6H??& zRYFqZj69_sWltQlzQz+Tu+NmC?3H_=gzi(l`f2uF(d)%)Qm-a|(l7Ot<v189rC}c+ zlD6~3gH=KK53|q5U%0ePO?caXhU;g(<}+6;v$j~g@ne2(Zu*ROpOrUqY;2w<UfnbC zbz{7j<45*`zv^afpMGoUlyBb-E1q^MlMif@_`_OPef;6-*FXRKO*<sLEN@M4qW$+1 z>kEEVewh96-{w-8s%O(>6ejS$=dfQXdba1_;m5OoPx{Z$kn6PjNAiz5U-t%oTlJxC zYL)7yD{3X@?{14XRw=ho{(3h1#r&<urmw!crn68<@YK>H3QV=%CeME!A+`O@?GO8; zE7c>?+rpBRq9c8}82){GGchjP{>|qV(J?HSF1`!s=~2AHzPIQ&f77I`cmJG?jd~p| zADQu=LG0^!!OBZfs@*0#4@ul!{`|6N=cDT05I40exe0=d6Lde%|5LsEN_b1={LTLv zx|bH@>ZIh9%j?+-xt7n$fAjY7>}e6{-6xz1d^Yv)pO|$lqQ*w{s_WmHv!YS`?qa27 z_R=P~W~YDa95rJ7>Gxje@#kl|V&xyNZx#;hO=vPJKB(8d-EOB%Sn2XN>-Fp}mufWr zXING^?XRcke)c!JA6}7v8P&7)-;=EUXJ#FX5BisXX6xJCQdQ@V{?yZbx^er?ZLKoz zn9n=@eEcW-nZ4MLN2d~=J$t9!_D0O<@P7tb(JvwUH+^rKk(jS{{EAz)<$s3M{oFRQ z6Zg)Stt)8$8N4`{lecm|qi<L(|NqPX&MduVBb+~F!-vPQ8@@EGuwVHvbiUcjm9c+z z#WyeNtQO9S_?N;MSId5Ees9>rB|EmaxvE>IhO*R}Z7{v$`f>gvzvanKjiNF)&9k|@ z^FM=Xo_%n9s*b8hcE*0Yvi}VHKiC_kF3!7i`rloTee<M0u6<oOv7%;y?Vc@xzh?D4 zcKI0Fd!%f-lo#ic-y8cicAl?YFuA`bY4gL6?mb(Ll&{wK9d-Y3Q0n;nm2ugZYP36& zHLlOkD1W-7O#1e#s%xQHyRzO-{iRu#cl1!#>{olE{^}(xZ>=fbuIv``tM0x1xw&fX zkF!<p7cb6<k6q#Z!nf-4tFm9Qi#=wqQ(=DE8!^fM%9r&V`#<I%$=?>^n7ttK&d$f# zcTNOo7dP$EtKB^7P;2JZ{JULoRdqSnmP$C?+JF9w{_)iZ)6J)^vR%8GZ`EzjKMm`> zKRoZ*Cx5#^|J_=N?|*OnXW)AHM{#*Xyo$M;@`tLMXB>r0RMq;+sv6GjVE%D^>wLC~ zuy>c=luO0#DLnZ{%_OMa=bzh#qgR&Jd8&WP{>T3;*Gc%t<lpcAGcX+6@nh<ThaziS zRSGITEqd@TAx!bd<Ym5Uxru$IZx5XRwDd|HXGPMhf(fps8{Q;ZyFZ@b{%I|*`h$1V zm)ePV8<%B9B!6Ps;LkSo>g~@aS-X?h{wdE@WDGO>&%hY}VeRR9$><d0qtg7}9oF8p zKm5I_B*mG>q3_9mhOaBHpR6?cX`JIwCGju+dCa?#=uMrgdR_J@?TItIB>gvaQ~xrp zTR+wxK4VwW@SmZfIr8L#?ns8Ib7#nTXt8CxT|XEVBh0D%bMNelKhqX@wa<*-`;PtS zJPG+v=l?Uvh)RAeZ`~!){-|kvY(>@8z!}kp?uV>5zgD8nAT6k(`zA8;@^UA?TU|jb z`u|_~*OL0<Xu*S}8|$i{%b!~5{5aO@lfU5;?Rn29|D5%6l5OdYhOK*(SKdAMFj?g< zTlQDZz?QI%pBYys-}!ak^J7kdz~?jZa!ckv?fRz6{;2D=o6UBO#rv86{44#qt~I%~ z%<bC^+q%#74eLukT<czP>(r*$lY4*I8{Vn^b@j=k#r`XAdIi0xbzfHFHa{RVx*}!H z_K)Uw*ZW@hce_?&-iut8zZbMm*yyj!_`u4=Xg_n^_TzR6AARb?r`m{H-MEu`VtPW^ zAI8UD*7GgevomRJ@h*Mu%{_lN*=fYo*!~EbW)-&b@676IjS!BfX;a;Ggfn><WTO|X zKf9j&-^F@Clec!cdiRfPy6yDpj?Y=;p06B7jMZv8)|?lvJ5#^K{fKT^yx@<;K~}wY zmOOl3bY|t8R#~R?n;KZtTz|{fWN+I(>8T6vQ=W;FjK4g%el0<{>F~q9J+IvSzE_q0 zoM)!`NGs%dPn7%p`y0<Kd}QAtr@Uj|j*qQ3`%dUwj&v<lwwY;vO#Vm3D|@TohaZI> z<@{s1%;r}~4i`_JZEwB#Jh6}MJ$4d5E=kYlf0gckHRsNPd3XOk7H(SJ#PO9ypt|et zlON1$U;k&2veC5Ne&nsQ{}ug$rK%fyleIV`d6)%`@AF!}wPNQxLAO;$%;s3<{Ab`j z_h;AE2QQaq3fGu^wC}B{U-QPh(`NDaa}`YcPHnubxVbS&<;3YfzGsW)@qI9x{NQw1 zyC1`}SGS$!p9s&6H|$)qT)!|<ZmosI+PFocL1q(=CS_F_?CJSC%dO4th}4}$JFm>T zDi!hb^%1M@J$uv(w`E2?{{BQT^4dMaE2TfqBq<yIQxLaUzbL=tx2==D);rU}ciQtN z+{{e4wZvof3-+kjy%o0~UO9R2`-T5k|N3ueyK3-xTWxV{?edN-zg2Dv@VGzFe*Sr_ z&)ruUU)|52t5|<Uo$Y)2DYvj2zoPhMJ$ol^yZR-LwQQDq_wyv4{;jpzPiB-Jlrx)k zz58g;F}r_-F;g|vvZa>auQETf+gH<ByQgob>E+`eCsjWaJa(t*`t#cToq2f?ywBIK zt*UP?Rb%nAE_pla!Rpqot8)d`d~<)P-fWX~ea(Jz_SJG<-}mT#trf~O6W(&J)tkAA z@s*qQ=l;WTdS+*4=4iZ)53KM$zHnQ+4PVoq8dtHo7w`Hls-7?YC+Tme>9UV9Rm)pc z^YvcE-`hNGVqf*=d;4ANQ_kOP_W8j*Uub63>wsPTDVw&lC>L*+wXpqlePO1Z@`fum zo7MR4M}6zHj^387EHx*!V$H_LX=+PV-SYj<tg?s-oNpC1Z#L_lVvi)2ytu5p74!NZ zo&WMRGCJ9<pgj4R+|)PMz6-`WZ9d?v&C{fPVoH>C@J>^az#xNl<x$ZUH`6CKzm65H z{C-6GrOuXvDhYE+kA{fea;ld9f9<zQY@^@r<f{J+^Uv-4Y-jtj?ZK?Sft#NQUi!PU zy=pt_WkbnzewIbqan}+gQmz@LF21;B<)3XlRo53~R?XIA<bNDznq7WCJJxjGqSKAD z9<NxJD^|<9BzuO|f(QIn-|q8NEb~1rQCA&)!YXeG^LpFY*K15yTKmcRi$1^Blpdl| z`~9K5h)C$`{!4pzdw*=qpE{f2pXf)q)-@(!zXdnGjoZ5@d$qB<=<&PE>#IJ#x*Tqu zsQl96efkyCh6^<tjhbqU-^cs^Q1W<iDTp=ql$GGwn$m@@w*{V9tll^0`lgEVWBekm z$%m5HFD(e|&Uo3<zijH&T~ehrFYS*U-L}Wj@A1=rFJH&5ZSQ;YHCj=1xA5!NG4JL~ zTh`_A#nw4&%jHEzK8L$L@eBUgWPKnh&hh(y2Fo>n>u%M$g=v>uSgbFTKL6aFfA2k} bEK}RXdZnOj;`#liYc1T%PEMKc{Qo8ZL=81^ 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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 aK|7x9c^%ku`$UKwf7R=jykzy{|2F}cX{%8H 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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 N>yPT%B}V+e2>>bwWfcGb 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 zcmex=<NpH&0WUXCHwH#V1_loX4+e(+4;gw~D>Bm<7<_#hv=|r|I2c$Ng&3F_7#J8C z7#SECr5ISjYz77|Mrk-Zh*1NohKYfpJ(Gb2swRp70z9C62+h2J5vrPzfnfm?Ty?_& zW&|6g@&8)}i-3&$lKkR~`~n4IJp%>{Cr@7%km(Ez5Vk5v9fQCX*`AyI44YV9HgL{( z^TVm`{{aR;4u%GX24+Sj1|~s9W<kdPM;PQ87#LX@!2qlc<SHg+7FITP4o)ua|3?_M z3NSD+GBY!=Ftf6PtYNHWWMXDu5o8roG<0MW4oqZMDikqloVbuf*=gfJ(V&YTRE(2~ znmD<{#3dx9RMpfqG__1j&CD$<t(;w4-P}Dqy@EqR!@?sXqmoln)6z3Cvx-Yf%gQS% ztD0L{+uA!iyCzMZGIiSY88c@sTD)ZGvgIpQuG+MD%hqk%ckJAC=<t!F$Bv&kdFs;T zD_5^wzj5={!$*&wJbm{3#miS8KYjl4_1pI!KYxMz#mK-6_7#YL_>2+NUxExwj7%&n z%q;96e=#zZGcYnS3$m~(8nOvF2C^p>3M&~ka)>xhT)6Qdr?PR-2hpUWi(FzVCJ$9V zg1iRy8F3zKBFkrRk0JbZo57g@<RL~zCPqdkW+o;kW)@~<W@Z*P77$=#X9ELvDBu7C zP7vURga5Y~oEbqnnVDIcnOV6x*f`*FL^J;1Wnf|8_<xImhnbOqNsw8P!Jc7~<Gq!e zzL~E3`1xpP#p*A&=i4TmER?yTXJj0H)9}QqH+zqYU(pF(a%<UIjvePTm+*aA#~Rc$ zOF21wn$TTV4@KoJKgXnw?pw<|HWh}8G2La&e|gLLT=@yRK+n^THx?!*rM^C}Zj!{} z4vxq2QTtUlMY}ipUtTk>vU@w1wz<(x?>5yo1%@a8N~f2Js6{;5<r(0{nb*9uVAs*d zC)RXT$Z93MGv9dRb-1U{+(mnWBR}WIO#WW0eQ|5*yr*Z9CuB?M^V{@)=AXj%^|qg< zvgES!|1Z2s-NJoq)3TPXck6OFUTF(uC*BEv@yfk1dEz7^E!Nf<k9K+La#}F8Y_Oa1 zv+20)w<14QpK10-u3prg#;>$YOkeS3@EN;chUmsaS2o_5$?x^*!NrJg>$dxTc=ugW zly8x9fF-Z?;ryb58yjP{fAhM1{ON*qpRT(`XH2cC=9-jiBYfb%y2`NJSt}wwdzzd* zt`c%#>D;NSZI1KQPc8i(md&8Lan|SDyo56c(z^=Fg~N>Bzw5n!lDlT#)suG}pFK0T z;d{1V+N+Gavy`{r+N8c`U*g``3^E^M1>JHd-Feyh?0NnvtLw~<=GMuo-Mw_<^ZBz; zQP(?WNqA=R)?9tOUs920&CPYIOzzBE7Cd$0|BK&m-_{XYrOoAQ+4(Z=bos)mPkOFJ zUbyG>Q2V`T@UcRhwIvg*dO}_<-uQ%X>+5azL?(QCJ#Fpnc=qYaMOStmeq!UK&wt`B zYwqoe%mb1!*LO$#u;}yppmq8Mll@d-xv#U=*K!4He0-szI^mdM^t2Do*>Xo;Szixd z6{Wg#W9XmkGh3~HE_Reke;u^+jCI7_>Jy*)w)9s^^y?p7Z)g5V(P*=r_VlZJ+?9A& z92d<J7dO0_RkbHyv6tif(aLu#Ev8J+R+CL!nq(F7yQg8ZVDvFF<DBPt%0D~TDM#%S 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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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 JqKp4;0ssP}^GW~! 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"