Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Aug 23, 2025

This PR contains the following updates:

Package Type Update Change
egui dependencies minor 0.31.1 -> 0.32.0

Release Notes

emilk/egui (egui)

v0.32.1

Compare Source

⭐ Added
🐛 Fixed

v0.32.0

Compare Source

This is a big egui release, with several exciting new features!

  • Atoms are new layout primitives in egui, for text and images
  • Popups, tooltips and menus have undergone a complete rewrite
  • Much improved SVG support
  • Crisper graphics (especially text!)

Let's dive in!

⚛️ Atoms

egui::Atom is the new, indivisible building blocks of egui (hence their name).
An Atom is an enum that can be either WidgetText, Image, or Custom.

The new AtomLayout can be used within widgets to do basic layout.
The initial implementation is as minimal as possible, doing just enough to implement what Button could do before.
There is a new IntoAtoms trait that works with tuples of Atoms. Each atom can be customized with the AtomExt trait
which works on everything that implements Into<Atom>, so e.g. RichText or Image.
So to create a Button with text and image you can now do:

let image = include_image!("my_icon.png").atom_size(Vec2::splat(12.0));
ui.button((image, "Click me!"));

Anywhere you see impl IntoAtoms you can add any number of images and text, in any order.

As of 0.32, we have ported the Button, Checkbox, RadioButton to use atoms
(meaning they support adding Atoms and are built on top of AtomLayout).
The Button implementation is not only more powerful now, but also much simpler, removing ~130 lines of layout math.

In combination with ui.read_response, custom widgets are really simple now, here is a minimal button implementation:

pub struct ALButton<'a> {
    al: AtomLayout<'a>,
}

impl<'a> ALButton<'a> {
    pub fn new(content: impl IntoAtoms<'a>) -> Self {
        Self {
            al: AtomLayout::new(content.into_atoms()).sense(Sense::click()),
        }
    }
}

impl<'a> Widget for ALButton<'a> {
    fn ui(mut self, ui: &mut Ui) -> Response {
        let Self { al } = self;
        let response = ui.ctx().read_response(ui.next_auto_id());

        let visuals = response.map_or(&ui.style().visuals.widgets.inactive, |response| {
            ui.style().interact(&response)
        });

        let al = al.frame(
            Frame::new()
                .inner_margin(ui.style().spacing.button_padding)
                .fill(visuals.bg_fill)
                .stroke(visuals.bg_stroke)
                .corner_radius(visuals.corner_radius),
        );

        al.show(ui).response
    }
}

You can even use Atom::custom to add custom content to Widgets. Here is a button in a button:

Screen.Recording.2025-07-10.at.13.10.52.mov
let custom_button_id = Id::new("custom_button");
let response = Button::new((
    Atom::custom(custom_button_id, Vec2::splat(18.0)),
    "Look at my mini button!",
))
.atom_ui(ui);
if let Some(rect) = response.rect(custom_button_id) {
    ui.put(rect, Button::new("🔎").frame_when_inactive(false));
}

Currently, you need to use atom_ui to get a AtomResponse which will have the Rect to use, but in the future
this could be streamlined, e.g. by adding a AtomKind::Callback or by passing the Rects back with egui::Response.

Basing our widgets on AtomLayout also allowed us to improve Response::intrinsic_size, which will now report the
correct size even if widgets are truncated. intrinsic_size is the size that a non-wrapped, non-truncated,
non-justified version of the widget would have, and can be useful in advanced layout
calculations like egui_flex.

Details
❕ Improved popups, tooltips, and menus

Introduces a new egui::Popup api. Checkout the new demo on https://egui.rs:

Screen.Recording.2025-07-10.at.11.47.22.mov

We introduced a new RectAlign helper to align a rect relative to an other rect. The Popup will by default try to find the best RectAlign based on the source widgets position (previously submenus would annoyingly overlap if at the edge of the window):

Screen.Recording.2025-07-10.at.11.36.29.mov

Tooltip and menu have been rewritten based on the new Popup api. They are now compatible with each other, meaning you can just show a ui.menu_button() in any Popup to get a sub menu. There are now customizable MenuButton and SubMenuButton structs, to help with customizing your menu buttons. This means menus now also support PopupCloseBehavior so you can remove your close_menu calls from your click handlers!

The old tooltip and popup apis have been ported to the new api so there should be very little breaking changes. The old menu is still around but deprecated. ui.menu_button etc now open the new menu, if you can't update to the new one immediately you can use the old buttons from the deprecated egui::menu menu.

We also introduced ui.close() which closes the nearest container. So you can now conveniently close Windows, Collapsibles, Modals and Popups from within. To use this for your own containers, call UiBuilder::closable and then check for closing within that ui via ui.should_close().

Details
▲ Improved SVG support

You can render SVG in egui with

ui.add(egui::Image::new(egui::include_image!("icon.svg"));

(Requires the use of egui_extras, with the svg feature enabled and a call to install_image_loaders).

Previously this would sometimes result in a blurry SVG, epecially if the Image was set to be dynamically scale based on the size of the Ui that contained it. Now SVG:s are always pixel-perfect, for truly scalable graphics.

svg-scaling

Details
✨ Crisper graphics

Non-SVG icons are also rendered better, and text sharpness has been improved, especially in light mode.

image

Details
Migration guide

We have some silently breaking changes (code compiles fine but behavior changed) that require special care:

Menus close on click by default
  • previously menus would only close on click outside
  • either
    • remove the ui.close_menu() calls from button click handlers since they are obsolete
    • if the menu should stay open on clicks, change the PopupCloseBehavior:
          // Change this
        ui.menu_button("Text", |ui| { /* Menu Content */ });
          // To this:
        MenuButton::new("Text").config(
            MenuConfig::default().close_behavior(PopupCloseBehavior::CloseOnClickOutside),
        ).ui(ui, |ui| { /* Menu Content */ });
      You can also change the behavior only for a single SubMenu by using SubMenuButton, but by default it should be passed to any submenus when using MenuButton.
Memory::is_popup_open api now requires calls to Memory::keep_popup_open
  • The popup will immediately close if keep_popup_open is not called.
  • It's recommended to use the new Popup api which handles this for you.
  • If you can't switch to the new api for some reason, update the code to call keep_popup_open:
        if ui.memory(|mem| mem.is_popup_open(popup_id)) {
          ui.memory_mut(|mem| mem.keep_popup_open(popup_id)); // <- add this line
          let area_response = Area::new(popup_id).show(...)
        }
⭐ Other improvements
🔧 Changed
🔥 Removed
🐛 Fixed
🚀 Performance

Configuration

📅 Schedule: Branch creation - "every weekend" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Aug 23, 2025
@renovate
Copy link
Contributor Author

renovate bot commented Aug 23, 2025

⚠️ Artifact update problem

Renovate failed to update an artifact related to this branch. You probably do not want to merge this PR as-is.

♻ Renovate will retry this branch, including artifacts, only when one of the following happens:

  • any of the package files in this branch needs updating, or
  • the branch becomes conflicted, or
  • you click the rebase/retry checkbox if found above, or
  • you rename this PR's title to start with "rebase!" to trigger it manually

The artifact failure details are included below:

File name: Cargo.lock
Command failed: cargo update --config net.git-fetch-with-cli=true --manifest-path gui/Cargo.toml --package [email protected] --precise 0.32.1
    Updating crates.io index
error: failed to select a version for the requirement `egui = "^0.31.1"`
candidate versions found which didn't match: 0.32.1
location searched: crates.io index
required by package `eframe v0.31.1`
    ... which satisfies dependency `eframe = "^0.31.1"` (locked to 0.31.1) of package `naviz-gui v0.6.1 (/tmp/renovate/repos/github/cda-tum/mqt-naviz/gui)`

@renovate renovate bot added dependencies Pull requests that update a dependency file rust Pull requests that update rust code labels Aug 23, 2025
@renovate
Copy link
Contributor Author

renovate bot commented Aug 23, 2025

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

@denialhaag denialhaag force-pushed the renovate/egui-0.x branch 2 times, most recently from b13069e to 8c09391 Compare August 24, 2025 00:52
@denialhaag
Copy link
Collaborator

This PR updated not just egui but also several other dependencies because of cross dependencies.

As a result, the following PRs will be obsolete once this PR is merged:

Furthermore, the following two PRs might have to stay open for a while:

@marcelwa marcelwa requested a review from Copilot August 26, 2025 15:55
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR updates the Rust crate egui from version 0.31.1 to 0.32.0, bringing significant new features including atoms (new layout primitives), improved popups/menus, better SVG support, and crisper graphics.

Key changes include:

  • Dependency updates: Updated egui, eframe, egui_extras to 0.32.0, wgpu to v25, glyphon to 0.9, and naga_oil to 0.18
  • Menu API migration: Replaced deprecated egui::menu::bar with egui::MenuBar::new().ui() and ui.close_menu() with ui.close_kind(egui::UiKind::Menu)
  • UI allocation updates: Migrated from deprecated ui.allocate_new_ui() to ui.scope_builder()

Reviewed Changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
gui/Cargo.toml Updated egui dependencies from 0.31.1 to 0.32.0 and wgpu from v24 to v25
renderer/Cargo.toml Updated glyphon to 0.9, naga_oil to 0.18, and wgpu to v25
video/Cargo.toml Updated wgpu dependency from v24 to v25
gui/src/menu.rs Migrated to new menu API and replaced deprecated close methods
gui/src/aspect_panel.rs Replaced deprecated allocate_new_ui with scope_builder
renderer/src/component/primitive/text.rs Updated text buffer API call for glyphon compatibility
video/src/lib.rs Updated wgpu device creation API and added unused result handling

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Copy link
Collaborator

@marcelwa marcelwa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand the cross-referencing issues. I don't have a better solution than to wait until the respective releases support these newer versions, either. Your changes look good to me 👍

@burgholzer
Copy link
Member

Let's get this in, right?

@denialhaag
Copy link
Collaborator

Let's get this in, right?

Yes, we just wanted to merge #132 first in case further merge conflicts had appeared. However, it looks like this is not the case. Merging now. 🚂

@denialhaag denialhaag merged commit 4fdc54d into main Aug 27, 2025
15 checks passed
@denialhaag denialhaag deleted the renovate/egui-0.x branch August 27, 2025 09:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants