Update Rust crate egui_extras to 0.35#53
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
November 30, 2023 17:34
e0cf56d to
0c4cd35
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
December 8, 2023 10:03
0c4cd35 to
0c18521
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
January 8, 2024 13:17
0c18521 to
619c64f
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
February 5, 2024 16:58
619c64f to
75e429f
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
February 11, 2024 09:04
75e429f to
5a3899a
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
February 14, 2024 12:40
5a3899a to
e36ebf5
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
March 24, 2024 15:02
e36ebf5 to
3247d48
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
March 26, 2024 22:19
3247d48 to
256687b
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
2 times, most recently
from
May 5, 2024 10:54
c16dc79 to
8d2c7c8
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
July 3, 2024 13:56
8d2c7c8 to
b3cba76
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
July 16, 2024 06:47
b3cba76 to
d1918bb
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
September 26, 2024 14:13
d1918bb to
d7e6112
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
December 16, 2024 19:09
d7e6112 to
60f1878
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
December 31, 2024 11:36
60f1878 to
c8c3cf0
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
February 4, 2025 17:26
c8c3cf0 to
a8bd11c
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
March 17, 2025 07:50
a8bd11c to
4efc047
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
July 10, 2025 20:53
4efc047 to
13ebbe1
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
October 9, 2025 16:40
13ebbe1 to
a5872ab
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
March 26, 2026 12:42
a5872ab to
96e8c63
Compare
renovate
Bot
force-pushed
the
renovate/egui_extras-0.x
branch
from
June 25, 2026 20:49
96e8c63 to
079a7fd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
0.29→0.35Release Notes
emilk/egui (egui_extras)
v0.35.0Compare Source
Highlights
Uis to modify widget behavior based on surrounding contextEgui inspection and egui_mcp
This release includes a new inspection protocol for egui. It allows reading the accesskit tree of a running app, as well
as sending events to control it. It's implemented via a new
InspectionPluginin theegui_inspectioncrate.Eframe includes a new
inspectionfeature. When enabled, you can enable inspection by launching the app withEGUI_INSPECTION=1. This will cause the app to listen on port 5719.The first inspection protocol consumer is egui_mcp.
It's a mcp server that allows your agent to see and use
egui apps. It can be used to have the agent use the app, reproduce bugs and verify its changes.
Install it via
cargo install --git https://github.com/rerun-io/kittest_inspector egui_mcpand then add it to youragent via
claude mcp add egui egui-mcp.There is also a plan of adding a general inspection gui using the same protocol, that can e.g. be used to step through
kittest tests frame by frame.
Here is claude using the mcp to try some of the egui demos (sped up by a lot, claude is slow):
Screen.Recording.2026-06-25.at.19.58.20.15s.mov
egui_inspectionprotocol and plugin #8234 by @lucasmerlinClasses
As part of css like styling, we've added classes to egui. You can already
use them to e.g. modify widget behavior or styling based on surrounding context.
Add classes to the container:
In your widget, check if we're in
my_container, to e.g. change sizes or colors:Today this only works for custom widgets and ui code, but the next step will be a styling system that allows you to modify built
in widget styling based on these classes.
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianneBetter IME composition
IME visuals received an overhaul, they are now indicated by an underline and properly show the cursor during composition:
After-macOS-CMN-small.mp4
⭐ Added
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianneAtomKind::Layout, for nestingAtomLayout#8219 by @lucasmerlinAtomLayout::direction#8221 by @lucasmerlinsubpixel_binningtoTextOptionsandFontTweak#8072 by @emilkAtomsinUi::small_button#8159 by @lucasmerlinegui::WindowTitlebar #8154 by @lucasmerlinAsIdandIdSalt#8184 by @emilkViewportBuilder::with_monitor+ViewportCommand::SetMonitor#8140 by @Le-Syl21egui::Key#8127 by @Le-Syl21AtomLayout::selectablefor opt-in text selection #8224 by @akagifreeezLayoutJob::format_at_byte#8244 by @emilkatoms()helpers to getAtomsfrom widgets #8128 by @Nashvill375🔧 Changed
owns_ime_eventsonMemory#7983 by @umajhoharfrustfor better kerning and ligatures #8031 by @gcaillyWindowmargins and setclip_rect_marginto zero #7725 by @emilkWindow: move only by dragging title bar #8183 by @emilkPanelmethods #8192 by @emilkAlphaFromCoveragetoFontColorTransferFunction#8201 by @emilkDebug-formatting ofIdin debug-builds #8190 by @emilkCharIndexandByteIndex+ bug fixes #8245 by @emilkGetScreenshotinspection request #8248 by @lucasmerlinFontTweakUI #8258 by @emilkFontTweak#8262 by @emilk🔥 Removed
#[deprecated]#8105 by @emilkimpl Into<f32>arguments #8194 by @emilk🐛 Fixed
Grid#8170 by @lucasmerlinPanel: never overflow available width, normax_width#8198 by @emilkv0.34.3Compare Source
ScrollArea::scroll_to_*calls whenstick_to_bottomis Active #8033 by @AmmarAbouZorv0.34.2Compare Source
⭐ Added
🐛 Fixed
Context::is_pointer_over_eguiandContext::egui_wants_pointer_input#8081 by @emilkTextEdit#8082 by @lucasmerlin🚀 Performance
v0.34.1Compare Source
Nothing new
v0.34.0Compare Source
Highlights from this release
skrifaScrollAreasUias the main entrypointSkrifa and font hinting
The font rendering backend was switched from
ab_glyphtoskrifa+vello_cpu. This enabled us supportfont hinting and variations. It also paves the way for more font improvements in the future, like support for color
emojis and adding helpers for variations like
RichText::bold.Font hinting makes text more clear (look at the =):
Screen.Recording.2026-03-26.at.10.49.43.mov
We now support setting variable font parameters:
Screen.Recording.2026-03-26.at.11.37.21.mp4
(Unfortunately there is currently a bug with variations, meaning changing them live like this won't work in practise.
There is a draft PR to fix it, but it didn't make the release)
More
Ui, lessContextegui has long had a confusing overlap in responsibilities between
ContextandUi.In particular, you could add panels to either one (or both!).
In this release, we switch from having
Contextbe the main entrypoint, and instead provide whole-appUi.In egui we've replaced
Context::runwithContext::run_ui, and changed viewports to be given a&mut Uiinstead ofContext.In
eframewe've deprecatedApp::updatereplaced it withApp::ui(which provides a&mut Uiinstead of a&Context).In addition to this,
Uinow derefs toContext, so all code likeui.ctx().input(…)can now be writtenui.input(…).This means you are much less likely to have to use naked
Contexts.Contextcan still be useful though, since they implementCloneand can be sent to other threads so you can call.request_repainton them.Context::run_ui#7736 by @emilkDeref<Target = Context>forUi#7770 by @emilkApp::updatewithfn logicandfn ui#7775 by @emilkContext::styletoglobal_style; avoid confusion w/Ui::style#7772 by @emilkContextto avoid confusion #7773 by @emilkUiinstead ofContext#7779 by @emilkChanged panel API
As part of the above work, we have unified the panel API.
SidePanelandTopBottomPanelare deprecated, replaced by a singlePanel.Furthermore, it is now deprecated to use panels directly on
Context. Use theshow_insidefunctions instead, acting onUis.This unification and simplification will make it easier to maintain and improve panels going forward.
Panelto replaceSidePanelandTopBottomPanel#5659 by @sharky98Paneldirectly on aContext#7781 by @emilkCentralPanel::show#7783 by @emilkContext::used_sizeandContext::available_rect#7788 by @emilk⭐ Added
is_scrolling/is_smooth_scrollingutil, checking for active scroll action #7669 by @IsseWButton::shortcut_textandright_text#7696 by @emilkScrollArea::content_margin#7722 by @emilkTypedPluginGuardandTypedPluginHandle#7780 by @apekrosViewportInfo::occludedandvisible#7948 by @emilkAtomprefix/suffix support toDragValue#7949 by @lucasmerlinAtom::id,align,closure,max_size#7958 by @lucasmerlinDebugOptions::warn_if_rect_changes_id#7984 by @emilkTextEditAtomprefix/suffix #7587 by @lucasmerlinButton::left_text#7955 by @rustbasicResponse::parent_id#8010 by @lucasmerlinContext::text_edit_focused#8014 by @emilkContext::time#8017 by @emilkUi::is_tooltip#8016 by @emilkUiStack::bg_color#8020 by @emilkegui::IdSetpublic #8019 by @lucasmerlin🔧 Changed
accesskitfeature and always depend onaccesskit#7701 by @emilkFrameCache::getreturn a reference instead of cloning the cached value #7834 by @KonaeAkiraGalley::pos_from_layout_cursorpub#7864 by @dionbScrollAreas#8018 by @emilk🔥 Removed
CacheTrait::as_any_mut#7833 by @emilk🐛 Fixed
CentralPanel::show_insideallocates space in parent #7778 by @emilkCentralPanel::show_inside_dynto roundpanel_rect#7868 by @ripopovUiBuilder, to avoid wrapping passed in ids with Id::new() #7925 by @lucasmerlintruncate()and similar for os scaling other than 100% #7867 by @RndUsr123TextEditandLayoutJobalignments #7831 by @RndUsr123horizontal_wrappingrow height after usingtext_edit_multiline#8000 by @optozoraxVisuals::interact_cursorsupport inButton#7986 by @mango766🚀 Performance
Responseslightly #8011 by @emilkv0.33.3Compare Source
.as a word-splitter in text navigation #7741 by @emilkv0.33.2Compare Source
⭐ Added
Plugin::on_widget_under_pointerto support widget inspector #7652 by @juancampaResponse::total_drag_deltaandPointerState::total_drag_delta#7708 by @emilk🔧 Changed
ComboBox#7658 by @lucasmerlin🐛 Fixed
profiling::scopecompile error when profiling usingtracingbackend #7646 by @PPakalnsui.response().interact(Sense::click())being flakey #7713 by @lucasmerlinv0.33.0Compare Source
Highlights from this release:
egui::Plugina improved way to create and access egui pluginsImproved kerning
As a step towards using parley for font rendering, @valadaptive has refactored the font loading and rendering code. A result of this (next to the font rendering code being much nicer now) is improved kerning.
Notice how the c moved away from the k:
egui::PlugintraitWe've added a new trait-based plugin api, meant to replace
Context::on_begin_passandContext::on_end_pass.This makes it a lot easier to handle state in your plugins. Instead of having to write to egui memory it can live right on your plugin struct.
The trait based api also makes easier to add new hooks that plugins can use. In addition to
on_begin_passandon_end_pass, thePlugintrait now has ainput_hookandoutput_hookwhich you can use to inspect / modify theRawInput/FullOutput.kitdiff, a image diff viewer
At rerun we have a ton of snapshots. Some PRs will change most of them (e.g. the one that updated egui and introduced the kerning improvements, ~500 snapshots changed!).
If you really want to look at every changed snapshot it better be as efficient as possible, and the experience on github, fiddeling with the sliders, is kind of frustrating.
In order to fix this, we've made kitdiff.
You can use it locally via
kitdiff files .will search for .new.png and .diff.png fileskitdiff gitwill compare the current files to the default branch (main/master)Or in the browser via
https://rerun-io.github.io/kitdiff/?url=<link_to_pr_or_artifact>To install kitdiff run
cargo install --git https://github.com/rerun-io/kitdiffHere is a video showing the kerning changes in kitdiff (try it yourself):
Screen.Recording.2025-10-09.at.13.43.19.mp4
Migration guide
egui::Mutexnow has a timeout as a simple deadlock detectionegui::Mutexin some place where it's held for longer than a single frame, you should switch to the std mutex or parking_lot instead (egui mutexes are wrappers around parking lot)screen_rectis deprecatedviewport_rectandcontent_rect.screen_recttocontent_rect, unless you are sure that you want to draw outside thesafe area(which would mean your Ui may be covered by notches, system ui, etc.)⭐ Added
Ui::take_available_space()helper function, which sets the Ui's minimum size to the available space #7573 by @IsseWUiBuilder::global_scopeandUiBuilder::id#7372 by @Icekeyemath::fast_midpoint#7435 by @emilkhex_colormacroconst#7444 by @YgorSouzaSurrenderFocusOnoption #7471 by @lucasmerlinMemory::move_focus#7476 by @darkwater🔧 Changed
viewport::WindowLeveland dependents #7432 by @lkdmImageButtonand removedWidgetType::ImageButton#7483 by @Stelios-KourlisUi#7386 by @lucasmerlin🔥 Removed
deadlock_detectionfeature #7497 by @lucasmerlinPlatformOutput#7523 by @emilklogfeature #7583 by @emilk🐛 Fixed
clippy::iter_over_hash_typelint #7421 by @emilkv0.32.3Compare Source
TextEdit's in RTL layouts #5547 by @zakarumychv0.32.2Compare Source
SubMenushould not display when ui is disabled #7428 by @ozwaldorfUi::place, to place widgets without changing the cursor #7359 by @lucasmerlinv0.32.1Compare Source
⭐ Added
ComboBox::popup_style#7360 by @lucasmerlin🐛 Fixed
Popupnot closing #7383 by @lucasmerlinWidgetText::Textignoring fallback font and overrides #7361 by @lucasmerlinoverride_text_colorpriority #7439 by @YgorSouzav0.32.0Compare Source
This is a big egui release, with several exciting new features!
Let's dive in!
⚛️ Atoms
egui::Atomis the new, indivisible building blocks of egui (hence their name).An
Atomis anenumthat can be eitherWidgetText,Image, orCustom.The new
AtomLayoutcan be used within widgets to do basic layout.The initial implementation is as minimal as possible, doing just enough to implement what
Buttoncould do before.There is a new
IntoAtomstrait that works with tuples ofAtoms. Each atom can be customized with theAtomExttraitwhich works on everything that implements
Into<Atom>, so e.g.RichTextorImage.So to create a
Buttonwith text and image you can now do:Anywhere you see
impl IntoAtomsyou can add any number of images and text, in any order.As of 0.32, we have ported the
Button,Checkbox,RadioButtonto use atoms(meaning they support adding Atoms and are built on top of
AtomLayout).The
Buttonimplementation 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:You can even use
Atom::customto add custom content to Widgets. Here is a button in a button:Screen.Recording.2025-07-10.at.13.10.52.mov
Currently, you need to use
atom_uito get aAtomResponsewhich will have theRectto use, but in the futurethis could be streamlined, e.g. by adding a
AtomKind::Callbackor by passing the Rects back withegui::Response.Basing our widgets on
AtomLayoutalso allowed us to improveResponse::intrinsic_size, which will now report thecorrect size even if widgets are truncated.
intrinsic_sizeis 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
AtomLayout, abstracting layouting within widgets #5830 by @lucasmerlinGalley::intrinsic_sizeand use it inAtomLayout#7146 by @lucasmerlin❕ Improved popups, tooltips, and menus
Introduces a new
egui::Popupapi. Checkout the new demo on https://egui.rs:Screen.Recording.2025-07-10.at.11.47.22.mov
We introduced a new
RectAlignhelper to align a rect relative to an other rect. ThePopupwill by default try to find the bestRectAlignbased 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
Tooltipandmenuhave been rewritten based on the newPopupapi. They are now compatible with each other, meaning you can just show aui.menu_button()in anyPopupto get a sub menu. There are now customizableMenuButtonandSubMenuButtonstructs, to help with customizing your menu buttons. This means menus now also supportPopupCloseBehaviorso you can remove yourclose_menucalls 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_buttonetc now open the new menu, if you can't update to the new one immediately you can use the old buttons from the deprecatedegui::menumenu.We also introduced
ui.close()which closes the nearest container. So you can now conveniently closeWindows,Collapsibles,Modals andPopups from within. To use this for your own containers, callUiBuilder::closableand then check for closing within that ui viaui.should_close().Details
PopupandTooltip, unifying the previous behaviours #5713 by @lucasmerlinUi::closeandResponse::should_close#5729 by @lucasmerlinegui::Popup#5716 by @lucasmerlinPopupAPI for the color picker button #7137 by @lucasmerlinMemory::keep_popup_openisn't called #5814 by @juancampaMemory::popupAPI in favor of newPopupAPI #7317 by @emilk▲ Improved SVG support
You can render SVG in egui with
(Requires the use of
egui_extras, with thesvgfeature enabled and a call toinstall_image_loaders).Previously this would sometimes result in a blurry SVG, epecially if the
Imagewas set to be dynamically scale based on the size of theUithat contained it. Now SVG:s are always pixel-perfect, for truly scalable graphics.Details
Image::paint_atpixel-perfect crisp for SVG images #7078 by @emilk✨ Crisper graphics
Non-SVG icons are also rendered better, and text sharpness has been improved, especially in light mode.
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
ui.close_menu()calls from button click handlers since they are obsoletePopupCloseBehavior:SubMenuButton, but by default it should be passed to any submenus when usingMenuButton.Memory::is_popup_openapi now requires calls toMemory::keep_popup_openkeep_popup_openis not called.Popupapi which handles this for you.keep_popup_open:⭐ Other improvements
Label::show_tooltip_when_elided#5710 by @brycebergerUi::allocate_new_uiin favor ofUi::scope_builder#5764 by @lucasmerlinexpand_bgto customize size of text background #5365 by @MeGaGiGaGonTextBufferforlayouterinTextEditinstead of&str#5712 by @kernelkindSlider::update_while_editing(bool)API #5978 by @mbernatScene::drag_pan_buttonsoption. Allows specifying which pointer buttons pan the scene by dragging #5892 by @mitchmindtreeScene::senseto customize howSceneresponds to user input #5893 by @mitchmindtreeTextEditarrow navigation to handle Unicode graphemes #5812 by @MStarhaScrollAreaimprovements for user configurability #5443 by @MStarhaResponse::clicked_with_open_in_background#7093 by @emilkModifiers::matches_any#7123 by @emilkContext::format_modifiers#7125 by @emilkOperatingSystem::is_mac#7122 by @emilkContext::current_pass_index#7276 by @emilkContext::cumulative_frame_nr#7278 by @emilkVisuals::text_edit_bg_color#7283 by @emilkVisuals::weak_text_alphaandweak_text_color#7285 by @emilkegui::Sidesshrink_left/shrink_right#7295 by @lucasmerlin🔧 Changed
hint_textinWidgetInfo#5724 by @bircniDefaultforThemePreference#5702 by @MichaelGruppavailable_rectdocs with the new reality after #4590 #5701 by @podusowskiViewportpositioning #5715 by @aspiringLichConfiguration
📅 Schedule: (UTC)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.