From 3de70ff3c076352bdd68e0b312e68b43cfd9da65 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Tue, 27 Aug 2024 11:38:33 +0200 Subject: [PATCH] Fix compilation of `egui_extras` without `serde` feature (#5014) * Closes https://github.com/emilk/egui/issues/4771 --- .github/workflows/rust.yml | 4 ++ Cargo.lock | 8 ++++ crates/egui_extras/Cargo.toml | 2 +- crates/egui_extras/src/syntax_highlighting.rs | 47 ++++++++++++++----- crates/egui_extras/src/table.rs | 23 ++++++--- tests/test_egui_extras_compilation/Cargo.toml | 15 ++++++ tests/test_egui_extras_compilation/README.md | 1 + .../test_egui_extras_compilation/src/main.rs | 3 ++ 8 files changed, 82 insertions(+), 21 deletions(-) create mode 100644 tests/test_egui_extras_compilation/Cargo.toml create mode 100644 tests/test_egui_extras_compilation/README.md create mode 100644 tests/test_egui_extras_compilation/src/main.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 53b314da862..60dda31e1c1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -57,6 +57,10 @@ jobs: - name: check epaint --no-default-features run: cargo check --locked --no-default-features --lib -p epaint + # Regression test for https://github.com/emilk/egui/issues/4771 + - name: cargo check -p test_egui_extras_compilation + run: cargo check -p test_egui_extras_compilation + - name: Test doc-tests run: cargo test --doc --all-features diff --git a/Cargo.lock b/Cargo.lock index c4b06ef8ffe..565fe828799 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3804,6 +3804,14 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "test_egui_extras_compilation" +version = "0.1.0" +dependencies = [ + "eframe", + "egui_extras", +] + [[package]] name = "test_inline_glow_paint" version = "0.1.0" diff --git a/crates/egui_extras/Cargo.toml b/crates/egui_extras/Cargo.toml index a7593ac99f7..8d1cb543ab9 100644 --- a/crates/egui_extras/Cargo.toml +++ b/crates/egui_extras/Cargo.toml @@ -27,7 +27,7 @@ all-features = true [features] -default = ["dep:mime_guess2", "serde"] +default = ["dep:mime_guess2"] ## Shorthand for enabling the different types of image loaders (`file`, `http`, `image`, `svg`). all_loaders = ["file", "http", "image", "svg", "gif"] diff --git a/crates/egui_extras/src/syntax_highlighting.rs b/crates/egui_extras/src/syntax_highlighting.rs index 557925d9187..8ddd4606507 100644 --- a/crates/egui_extras/src/syntax_highlighting.rs +++ b/crates/egui_extras/src/syntax_highlighting.rs @@ -153,16 +153,22 @@ impl CodeTheme { /// /// There is one dark and one light theme stored at any one time. pub fn from_memory(ctx: &egui::Context) -> Self { - if ctx.style().visuals.dark_mode { - ctx.data_mut(|d| { - d.get_persisted(egui::Id::new("dark")) - .unwrap_or_else(Self::dark) - }) + #![allow(clippy::needless_return)] + + let (id, default) = if ctx.style().visuals.dark_mode { + (egui::Id::new("dark"), Self::dark as fn() -> Self) } else { - ctx.data_mut(|d| { - d.get_persisted(egui::Id::new("light")) - .unwrap_or_else(Self::light) - }) + (egui::Id::new("light"), Self::light as fn() -> Self) + }; + + #[cfg(feature = "serde")] + { + return ctx.data_mut(|d| d.get_persisted(id).unwrap_or_else(default)); + } + + #[cfg(not(feature = "serde"))] + { + return ctx.data_mut(|d| d.get_temp(id).unwrap_or_else(default)); } } @@ -170,11 +176,17 @@ impl CodeTheme { /// /// There is one dark and one light theme stored at any one time. pub fn store_in_memory(self, ctx: &egui::Context) { - if self.dark_mode { - ctx.data_mut(|d| d.insert_persisted(egui::Id::new("dark"), self)); + let id = if ctx.style().visuals.dark_mode { + egui::Id::new("dark") } else { - ctx.data_mut(|d| d.insert_persisted(egui::Id::new("light"), self)); - } + egui::Id::new("light") + }; + + #[cfg(feature = "serde")] + ctx.data_mut(|d| d.insert_persisted(id, self)); + + #[cfg(not(feature = "serde"))] + ctx.data_mut(|d| d.insert_temp(id, self)); } } @@ -245,9 +257,15 @@ impl CodeTheme { pub fn ui(&mut self, ui: &mut egui::Ui) { ui.horizontal_top(|ui| { let selected_id = egui::Id::NULL; + + #[cfg(feature = "serde")] let mut selected_tt: TokenType = ui.data_mut(|d| *d.get_persisted_mut_or(selected_id, TokenType::Comment)); + #[cfg(not(feature = "serde"))] + let mut selected_tt: TokenType = + ui.data_mut(|d| *d.get_temp_mut_or(selected_id, TokenType::Comment)); + ui.vertical(|ui| { ui.set_width(150.0); egui::widgets::global_dark_light_mode_buttons(ui); @@ -288,7 +306,10 @@ impl CodeTheme { ui.add_space(16.0); + #[cfg(feature = "serde")] ui.data_mut(|d| d.insert_persisted(selected_id, selected_tt)); + #[cfg(not(feature = "serde"))] + ui.data_mut(|d| d.insert_temp(selected_id, selected_tt)); egui::Frame::group(ui.style()) .inner_margin(egui::Vec2::splat(2.0)) diff --git a/crates/egui_extras/src/table.rs b/crates/egui_extras/src/table.rs index a28d7950eb3..b1fa71ce4d5 100644 --- a/crates/egui_extras/src/table.rs +++ b/crates/egui_extras/src/table.rs @@ -543,12 +543,13 @@ impl TableState { let rect = Rect::from_min_size(ui.available_rect_before_wrap().min, Vec2::ZERO); ui.ctx().check_for_id_clash(state_id, rect, "Table"); - let state = ui - .data_mut(|d| d.get_persisted::(state_id)) - .filter(|state| { - // make sure that the stored widths aren't out-dated - state.column_widths.len() == columns.len() - }); + #[cfg(feature = "serde")] + let state = ui.data_mut(|d| d.get_persisted::(state_id)); + #[cfg(not(feature = "serde"))] + let state = ui.data_mut(|d| d.get_temp::(state_id)); + + // Make sure that the stored widths aren't out-dated: + let state = state.filter(|state| state.column_widths.len() == columns.len()); let is_sizing_pass = ui.is_sizing_pass() || state.is_none() && columns.iter().any(|c| c.is_auto()); @@ -597,7 +598,15 @@ impl TableState { } fn store(self, ui: &egui::Ui, state_id: egui::Id) { - ui.data_mut(|d| d.insert_persisted(state_id, self)); + #![allow(clippy::needless_return)] + #[cfg(feature = "serde")] + { + return ui.data_mut(|d| d.insert_persisted(state_id, self)); + } + #[cfg(not(feature = "serde"))] + { + return ui.data_mut(|d| d.insert_temp(state_id, self)); + } } fn reset(ui: &egui::Ui, state_id: egui::Id) { diff --git a/tests/test_egui_extras_compilation/Cargo.toml b/tests/test_egui_extras_compilation/Cargo.toml new file mode 100644 index 00000000000..167a8fa288c --- /dev/null +++ b/tests/test_egui_extras_compilation/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "test_egui_extras_compilation" +version = "0.1.0" +license = "MIT OR Apache-2.0" +edition = "2021" +rust-version = "1.76" +publish = false + +[lints] +workspace = true + + +[dependencies] +eframe = { workspace = true, features = ["default", "persistence"] } +egui_extras = { workspace = true } diff --git a/tests/test_egui_extras_compilation/README.md b/tests/test_egui_extras_compilation/README.md new file mode 100644 index 00000000000..4977de7a8e3 --- /dev/null +++ b/tests/test_egui_extras_compilation/README.md @@ -0,0 +1 @@ +Regression test for diff --git a/tests/test_egui_extras_compilation/src/main.rs b/tests/test_egui_extras_compilation/src/main.rs new file mode 100644 index 00000000000..51865bdca57 --- /dev/null +++ b/tests/test_egui_extras_compilation/src/main.rs @@ -0,0 +1,3 @@ +//! Regression test for + +fn main() {}