From d4bbea3967ec78cc95ea2744c19b8ea64f4ce1e2 Mon Sep 17 00:00:00 2001 From: Colin Terry Date: Mon, 7 Mar 2022 04:14:00 -0500 Subject: [PATCH 1/4] egui_extras README grammar fixes (#1313) --- egui_extras/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/egui_extras/README.md b/egui_extras/README.md index 4909fd97..456e2b0e 100644 --- a/egui_extras/README.md +++ b/egui_extras/README.md @@ -5,4 +5,4 @@ ![MIT](https://img.shields.io/badge/license-MIT-blue.svg) ![Apache](https://img.shields.io/badge/license-Apache-blue.svg) -This is a crate that adds some features on top top of [`egui`](https://github.com/emilk/egui). This crate are for experimental features, and features that require big dependencies that does not belong in `egui`. +This is a crate that adds some features on top top of [`egui`](https://github.com/emilk/egui). This crate is for experimental features, and features that require big dependencies that do not belong in `egui`. From 27e179268ba4f824a5fcd48a6ee7c9d1e5dfcbf6 Mon Sep 17 00:00:00 2001 From: Zachary Kohnen Date: Mon, 7 Mar 2022 10:33:59 +0100 Subject: [PATCH 2/4] Remove warning about cpal drag and drop (#1329) * Remove warning about cpal drag and drop Given that the issue https://github.com/rust-windowing/winit/issues/1255 was closed by https://github.com/rust-windowing/winit/pull/1524, it would make sense to remove the warning about the issue from NativeOptions * Change `NativeOptions::drag_and_drop_support` default to true --- eframe/CHANGELOG.md | 1 + epi/src/lib.rs | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/eframe/CHANGELOG.md b/eframe/CHANGELOG.md index 656dfea7..b123ac6a 100644 --- a/eframe/CHANGELOG.md +++ b/eframe/CHANGELOG.md @@ -5,6 +5,7 @@ NOTE: [`egui_web`](../egui_web/CHANGELOG.md), [`egui-winit`](../egui-winit/CHANG ## Unreleased +* Change default for `NativeOptions::drag_and_drop_support` to `true` ([#1329](https://github.com/emilk/egui/pull/1329)) ## 0.17.0 - 2022-02-22 diff --git a/epi/src/lib.rs b/epi/src/lib.rs index 4481cd1c..ecda8514 100644 --- a/epi/src/lib.rs +++ b/epi/src/lib.rs @@ -221,10 +221,13 @@ pub struct NativeOptions { /// If false it will be difficult to move and resize the app. pub decorated: bool, - /// On Windows: enable drag and drop support. - /// Default is `false` to avoid issues with crates such as [`cpal`](https://github.com/RustAudio/cpal) which - /// will hang when combined with drag-and-drop. - /// See . + /// On Windows: enable drag and drop support. Drag and drop can + /// not be disabled on other platforms. + /// + /// See [winit's documentation][drag_and_drop] for information on why you + /// might want to disable this on windows. + /// + /// [drag_and_drop]: https://docs.rs/winit/latest/x86_64-pc-windows-msvc/winit/platform/windows/trait.WindowBuilderExtWindows.html#tymethod.with_drag_and_drop pub drag_and_drop_support: bool, /// The application icon, e.g. in the Windows task bar etc. @@ -257,7 +260,7 @@ impl Default for NativeOptions { always_on_top: false, maximized: false, decorated: true, - drag_and_drop_support: false, + drag_and_drop_support: true, icon_data: None, initial_window_pos: None, initial_window_size: None, From e3d1fa22d1d39a591051b5042793108df5abc8ac Mon Sep 17 00:00:00 2001 From: Juan Campa Date: Mon, 7 Mar 2022 04:48:12 -0500 Subject: [PATCH 3/4] Fix combo box misalignment on rtl layout (#1304) --- CHANGELOG.md | 2 +- egui/src/containers/combo_box.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d406d2f8..d6a7ffb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ NOTE: [`epaint`](epaint/CHANGELOG.md), [`eframe`](eframe/CHANGELOG.md), [`egui_w ## Unreleased - +* Fixed ComboBoxes always being rendered left-aligned ([1304](https://github.com/emilk/egui/pull/1304)) ## 0.17.0 - 2022-02-22 - Improved font selection and image handling diff --git a/egui/src/containers/combo_box.rs b/egui/src/containers/combo_box.rs index 14feb02c..bbc3809b 100644 --- a/egui/src/containers/combo_box.rs +++ b/egui/src/containers/combo_box.rs @@ -231,7 +231,7 @@ fn button_frame( outer_rect.set_height(outer_rect.height().at_least(interact_size.y)); let inner_rect = outer_rect.shrink2(margin); - let mut content_ui = ui.child_ui(inner_rect, Layout::left_to_right()); + let mut content_ui = ui.child_ui(inner_rect, *ui.layout()); add_contents(&mut content_ui); let mut outer_rect = content_ui.min_rect().expand2(margin); From 37c9f116bfb717243e70ecbc48f2d2280106a51d Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Mon, 7 Mar 2022 10:48:40 +0100 Subject: [PATCH 4/4] Fix egui_glow when targeting `wasm32-unknown-unknown` (#1303) * Gate winit/glow and epi correctly * Add check to CI * Fix epi cfg --- .github/workflows/rust.yml | 14 +++++ egui_glow/src/lib.rs | 117 +++++-------------------------------- egui_glow/src/winit.rs | 92 +++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 102 deletions(-) create mode 100644 egui_glow/src/winit.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ee60bdc4..a4a0c779 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -56,6 +56,20 @@ jobs: command: check args: -p egui_demo_app --lib --target wasm32-unknown-unknown + check_wasm_eframe_with_features: + name: cargo check wasm eframe + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.56.0 + override: true + - run: rustup target add wasm32-unknown-unknown + - name: check + run: cargo check -p eframe --lib --no-default-features --features egui_glow,persistence --target wasm32-unknown-unknown + check_web_all_features: name: cargo check web --all-features runs-on: ubuntu-latest diff --git a/egui_glow/src/lib.rs b/egui_glow/src/lib.rs index c6514744..6889e9cd 100644 --- a/egui_glow/src/lib.rs +++ b/egui_glow/src/lib.rs @@ -88,114 +88,27 @@ #![allow(clippy::manual_range_contains)] pub mod painter; -#[cfg(feature = "winit")] -use egui_winit::winit; pub use glow; pub use painter::Painter; -#[cfg(feature = "winit")] -mod epi_backend; mod misc_util; mod post_process; mod shader_version; mod vao_emulate; -#[cfg(not(target_arch = "wasm32"))] -#[cfg(feature = "egui_winit")] -pub use egui_winit; +#[cfg(all(not(target_arch = "wasm32"), feature = "winit"))] +pub mod winit; +#[cfg(all(not(target_arch = "wasm32"), feature = "winit"))] +pub use winit::*; -#[cfg(all(feature = "epi", feature = "winit"))] +#[cfg(all( + not(target_arch = "wasm32"), + feature = "persistence", + feature = "winit" +))] +mod epi_backend; +#[cfg(all( + not(target_arch = "wasm32"), + feature = "persistence", + feature = "winit" +))] pub use epi_backend::{run, NativeOptions}; - -// ---------------------------------------------------------------------------- - -/// Use [`egui`] from a [`glow`] app. -#[cfg(feature = "winit")] -pub struct EguiGlow { - pub egui_ctx: egui::Context, - pub egui_winit: egui_winit::State, - pub painter: crate::Painter, - - shapes: Vec, - textures_delta: egui::TexturesDelta, -} - -#[cfg(feature = "winit")] -impl EguiGlow { - pub fn new(window: &winit::window::Window, gl: &glow::Context) -> Self { - let painter = crate::Painter::new(gl, None, "") - .map_err(|error| { - tracing::error!("error occurred in initializing painter:\n{}", error); - }) - .unwrap(); - - Self { - egui_ctx: Default::default(), - egui_winit: egui_winit::State::new(painter.max_texture_side(), window), - painter, - shapes: Default::default(), - textures_delta: Default::default(), - } - } - - /// Returns `true` if egui wants exclusive use of this event - /// (e.g. a mouse click on an egui window, or entering text into a text field). - /// For instance, if you use egui for a game, you want to first call this - /// and only when this returns `false` pass on the events to your game. - /// - /// Note that egui uses `tab` to move focus between elements, so this will always return `true` for tabs. - pub fn on_event(&mut self, event: &winit::event::WindowEvent<'_>) -> bool { - self.egui_winit.on_event(&self.egui_ctx, event) - } - - /// Returns `true` if egui requests a repaint. - /// - /// Call [`Self::paint`] later to paint. - pub fn run( - &mut self, - window: &winit::window::Window, - run_ui: impl FnMut(&egui::Context), - ) -> bool { - let raw_input = self.egui_winit.take_egui_input(window); - let egui::FullOutput { - platform_output, - needs_repaint, - textures_delta, - shapes, - } = self.egui_ctx.run(raw_input, run_ui); - - self.egui_winit - .handle_platform_output(window, &self.egui_ctx, platform_output); - - self.shapes = shapes; - self.textures_delta.append(textures_delta); - needs_repaint - } - - /// Paint the results of the last call to [`Self::run`]. - pub fn paint(&mut self, window: &winit::window::Window, gl: &glow::Context) { - let shapes = std::mem::take(&mut self.shapes); - let mut textures_delta = std::mem::take(&mut self.textures_delta); - - for (id, image_delta) in textures_delta.set { - self.painter.set_texture(gl, id, &image_delta); - } - - let clipped_meshes = self.egui_ctx.tessellate(shapes); - let dimensions: [u32; 2] = window.inner_size().into(); - self.painter.paint_meshes( - gl, - dimensions, - self.egui_ctx.pixels_per_point(), - clipped_meshes, - ); - - for id in textures_delta.free.drain(..) { - self.painter.free_texture(gl, id); - } - } - - /// Call to release the allocated graphics resources. - pub fn destroy(&mut self, gl: &glow::Context) { - self.painter.destroy(gl); - } -} diff --git a/egui_glow/src/winit.rs b/egui_glow/src/winit.rs new file mode 100644 index 00000000..8be08c88 --- /dev/null +++ b/egui_glow/src/winit.rs @@ -0,0 +1,92 @@ +pub use egui_winit; +use egui_winit::winit; + +/// Use [`egui`] from a [`glow`] app. +pub struct EguiGlow { + pub egui_ctx: egui::Context, + pub egui_winit: egui_winit::State, + pub painter: crate::Painter, + + shapes: Vec, + textures_delta: egui::TexturesDelta, +} + +impl EguiGlow { + pub fn new(window: &winit::window::Window, gl: &glow::Context) -> Self { + let painter = crate::Painter::new(gl, None, "") + .map_err(|error| { + tracing::error!("error occurred in initializing painter:\n{}", error); + }) + .unwrap(); + + Self { + egui_ctx: Default::default(), + egui_winit: egui_winit::State::new(painter.max_texture_side(), window), + painter, + shapes: Default::default(), + textures_delta: Default::default(), + } + } + + /// Returns `true` if egui wants exclusive use of this event + /// (e.g. a mouse click on an egui window, or entering text into a text field). + /// For instance, if you use egui for a game, you want to first call this + /// and only when this returns `false` pass on the events to your game. + /// + /// Note that egui uses `tab` to move focus between elements, so this will always return `true` for tabs. + pub fn on_event(&mut self, event: &winit::event::WindowEvent<'_>) -> bool { + self.egui_winit.on_event(&self.egui_ctx, event) + } + + /// Returns `true` if egui requests a repaint. + /// + /// Call [`Self::paint`] later to paint. + pub fn run( + &mut self, + window: &winit::window::Window, + run_ui: impl FnMut(&egui::Context), + ) -> bool { + let raw_input = self.egui_winit.take_egui_input(window); + let egui::FullOutput { + platform_output, + needs_repaint, + textures_delta, + shapes, + } = self.egui_ctx.run(raw_input, run_ui); + + self.egui_winit + .handle_platform_output(window, &self.egui_ctx, platform_output); + + self.shapes = shapes; + self.textures_delta.append(textures_delta); + needs_repaint + } + + /// Paint the results of the last call to [`Self::run`]. + pub fn paint(&mut self, window: &winit::window::Window, gl: &glow::Context) { + let shapes = std::mem::take(&mut self.shapes); + let mut textures_delta = std::mem::take(&mut self.textures_delta); + + for (id, image_delta) in textures_delta.set { + self.painter.set_texture(gl, id, &image_delta); + } + + let clipped_meshes = self.egui_ctx.tessellate(shapes); + let dimensions: [u32; 2] = window.inner_size().into(); + self.painter.paint_meshes( + gl, + dimensions, + self.egui_ctx.pixels_per_point(), + clipped_meshes, + ); + + for id in textures_delta.free.drain(..) { + self.painter.free_texture(gl, id); + } + } + + /// Call to release the allocated graphics resources. + pub fn destroy(&mut self, gl: &glow::Context) { + self.painter.destroy(gl); + } +}