egui-wgpu
Bindings for using egui natively using the wgpu library
0.36.1
11M downloads/mo
#3026 most downloaded on crates.io
emilk/egui
What this package is like to depend on
Last release 16 days ago
07 Aug 2026
Release timing varies
gaps range from 3 weeks to 4 months
Nearly every release is documented
notes for 36 of 36 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
45 releases · first in 2021
12 releases in the last 12 months
see the full history below
Release timeline
45 releases · Apr 2021 to Aug 2026Releases
latest 45-
0.36.107 Aug 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
- Fix
Sense::dragdetecting drags when clicking widget above it #8396 by @lucasmerlin
Release notes
Open source →- Fix
Sense::dragdetecting drags when clicking widget above it #8396 by @lucasmerlin
- Fix
-
0.36.005 Aug 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
Highlights ✨
Improved mobile keyboard support
Autocomplete, autocorrect and IMEs now work correctly on iOS and android (on eframe web)!
ScreenRecording_08-05-2026.11-48-49_1.MP4- via #8045 by @umajho (and @rustbasic who helped a lot with testing)
Drag to reopen panels
You can now reopen closed panels by dragging the handle:
Screen.Recording.2026-08-05.at.11.45.10.movWindow decoration theme is now synced with app theme
Previously, when switching themes, the window chrome (OS titlebar), stayed in the OS theme. Now, it syncs with the app theme:
Screen.Recording.2026-08-05.at.11.45.47.mov⭐ Added
- Add
BoxedWidget: dynamically dispatched widgets #8378 by @emilk - Add
WidgetText::size#8377 by @emilk - Add
LayoutJob::clear#8376 by @emilk - Sync window theme with egui theme #8299 by @lucasmerlin
- Add
egui::Window::title_frame#8353 by @Its-Just-Nans - Add
extra_text_line_spacingto control vertical spacing between text lines #8040 by @rustbasic - Add drag-to-open for collapsible panels #8363 by @emilk
🔧 Changed
- Rerun
sizing_passwhen reopening popup #8315 by @yay - Update MSRV from 1.92 to 1.95 #8348 by @emilk
- Treat a press that leaves a widget as a drag #8365 by @emilk
🔥 Removed
- Remove
ModifiersfromRawInputand make it aegui::Event#8336 by @lucasmerlin - Remove
clip_rect_margin#8366 by @emilk
🐛 Fixed
- Improve backtrace trimming for cranelift #8294 by @emilk
- Prevent accidentally dropping
TexturesDelta#8356 by @lucasmerlin - Make non-interactive tooltips not interactable #8362 by @lucasmerlin
- Panels: Take separator line width into account #8367 by @emilk
- Fix TextEdit hint text not following horizontal_align/vertical_align #8332 by @thedavidweng
- Fix ScrollArea failure by handling horizontal and vertical scrolling separately in the missing place #8275 by @rustbasic
- Fix window with a
Gridbeing widenable but not shrinkable again #8386 by @emilk
Release notes
Open source →Highlights ✨
This release drastically improves the mobile keyboard experience (when using eframe web). It also adds drag-to-open panels, window chrome theme sync and a lot of small bug fixes and improvements!
Improved mobile keyboard support
Autocomplete, autocorrect and IMEs now work correctly on iOS and android (on eframe web)!
https://github.com/user-attachments/assets/b0aa1084-0755-4e47-a0b3-0ce6890aca85
- via #8045 by @umajho (and @rustbasic who helped a lot with testing)
Drag to reopen panels
You can now reopen closed panels by dragging the handle:
https://github.com/user-attachments/assets/e02895c4-248e-4e22-9694-bdfcd9839bfd
Window decoration theme is now synced with app theme
Previously, when switching themes, the window chrome (OS titlebar) stayed in the OS theme. Now, it syncs with the app theme:
https://github.com/user-attachments/assets/6b393057-fdfc-431b-b997-744bc183a8ac
⭐ Added
- Add
BoxedWidget: dynamically dispatched widgets #8378 by @emilk - Add
WidgetText::size#8377 by @emilk - Add
LayoutJob::clear#8376 by @emilk - Sync window theme with egui theme #8299 by @lucasmerlin
- Add
egui::Window::title_frame#8353 by @Its-Just-Nans - Add
extra_text_line_spacingto control vertical spacing between text lines #8040 by @rustbasic - Add drag-to-open for collapsible panels #8363 by @emilk
🔧 Changed
- Rerun
sizing_passwhen reopening popup #8315 by @yay - Update MSRV from 1.92 to 1.95 #8348 by @emilk
- Treat a press that leaves a widget as a drag #8365 by @emilk
🔥 Removed
- Remove
ModifiersfromRawInputand make it aegui::Event#8336 by @lucasmerlin - Remove
clip_rect_margin#8366 by @emilk
🐛 Fixed
- Improve backtrace trimming for cranelift #8294 by @emilk
- Prevent accidentally dropping
TexturesDelta#8356 by @lucasmerlin - Make non-interactive tooltips not interactable #8362 by @lucasmerlin
- Panels: Take separator line width into account #8367 by @emilk
- Fix TextEdit hint text not following horizontal_align/vertical_align #8332 by @thedavidweng
- Fix ScrollArea failure by handling horizontal and vertical scrolling separately in the missing place #8275 by @rustbasic
- Fix window with a
Gridbeing widenable but not shrinkable again #8386 by @emilk
-
0.35.025 Jun 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
Highlights
- New egui_mcp crate based on eguis new inspection protocol
- Set classes on your
Uis to modify widget behavior based on surrounding context - Improved IME
Egui 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 newInspectionPluginin theegui_inspectioncrate.
Eframe includes a newinspectionfeature. When enabled, you can enable inspection by launching the app with
EGUI_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 viacargo install --git https://github.com/rerun-io/kittest_inspector egui_mcpand then add it to your
agent viaclaude 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- Add
egui_inspectionprotocol and plugin #8234 by @lucasmerlin
Classes
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:ui.scope_builder(UiBuilder::new().with_class("my_container"), |ui| { ... });
In your widget, check if we're in
my_container, to e.g. change sizes or colors:let in_container = ui.stack().iter().any(|s| s.classes.has("my_container"));
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.- Add
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianne
Better 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
- Add
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianne - Drag-to-close panels #8182 by @emilk
- Add
AtomKind::Layout, for nestingAtomLayout#8219 by @lucasmerlin - Add
AtomLayout::direction#8221 by @lucasmerlin - Make the size of tabs and thin space configurable #8070 by @emilk
- Add
subpixel_binningtoTextOptionsandFontTweak#8072 by @emilk - Allow
AtomsinUi::small_button#8159 by @lucasmerlin - Atom support for
egui::WindowTitlebar #8154 by @lucasmerlin - Add
AsIdandIdSalt#8184 by @emilk - Add Context::set_cursor_image for OS-level custom cursors #8155 by @all3f0r1
- Add
ViewportBuilder::with_monitor+ViewportCommand::SetMonitor#8140 by @Le-Syl21 - Add modifier keys to
egui::Key#8127 by @Le-Syl21 - Expose interactive rects from the last pass #8211 by @psyche314
- Add
AtomLayout::selectablefor opt-in text selection #8224 by @akagifreeez - Add
LayoutJob::format_at_byte#8244 by @emilk - Add
atoms()helpers to getAtomsfrom widgets #8128 by @Nashvill375
🔧 Changed
- Improve IME handling, add public method
owns_ime_eventsonMemory#7983 by @umajho - Use
harfrustfor better kerning and ligatures #8031 by @gcailly - Rework
Windowmargins and setclip_rect_marginto zero #7725 by @emilk - Slide panels when animating them #8175 by @emilk
- Slow down animation time from 0.1s to 0.2s #8176 by @emilk
- Smoother CollapsingHeader animation #8177 by @emilk
- Drag-to-scroll: now only on touch screens #8181 by @emilk
Window: move only by dragging title bar #8183 by @emilk- Rename
Panelmethods #8192 by @emilk - Panels: double-click resize edge to toggle #8193 by @emilk
- Rename
AlphaFromCoveragetoFontColorTransferFunction#8201 by @emilk - Smoother collapsed-panel animation #8202 by @emilk
- Improve
Debug-formatting ofIdin debug-builds #8190 by @emilk - Use strongly typed
CharIndexandByteIndex+ bug fixes #8245 by @emilk - Allow downscaling image in
GetScreenshotinspection request #8248 by @lucasmerlin - Announce pressed state of selectable buttons to screen readers #8130 by @antoinecellerier
- Pre-populate font variation axes in the
FontTweakUI #8258 by @emilk - Make font hinting target configurable via
FontTweak#8262 by @emilk
🔥 Removed
- Remove everything that was marked
#[deprecated]#8105 by @emilk - Remove 64-bit atomics in main crate #8037 by @kay-lambdadelta
- Remove
impl Into<f32>arguments #8194 by @emilk
🐛 Fixed
- Don't hide whitespaces in centered and right aligned text edits #8102 by @lucasmerlin
- Don't allow resizing past minimum content size #8152 by @lucasmerlin
- Fix resizing of
Grid#8170 by @lucasmerlin - Fix glyph caching on font variations #8189 by @emilk
Panel: never overflow available width, normax_width#8198 by @emilk- Fixes color picker hue drift at low alpha values #8208 by @aedm
- Fix: ScrollArea layout jitter with floating bars and zoom levels #7944 by @rustbasic
- Fix #2142 - lost_focus not firing after a mid-frame focus transfer #8210 by @ufoscout
- Fix label selection in deferred viewports #8242 by @yay
Release notes
Open source →Highlights
- New egui_mcp crate based on eguis new inspection protocol
- Set classes on your
Uis to modify widget behavior based on surrounding context - Improved IME
Egui 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 newinspectionfeature. 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 your agent viaclaude 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):
https://github.com/user-attachments/assets/c3dd0456-acfc-428c-8efe-f4a244c9e3ba
- Add
egui_inspectionprotocol and plugin #8234 by @lucasmerlin
Classes
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:
ui.scope_builder(UiBuilder::new().with_class("my_container"), |ui| { ... });In your widget, check if we're in
my_container, to e.g. change sizes or colors:let in_container = ui.stack().iter().any(|s| s.classes.has("my_container"));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.
- Add
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianne
Better IME composition
IME visuals received an overhaul, they are now indicated by an underline and properly show the cursor during composition:
https://github.com/user-attachments/assets/487c7e7c-ef6d-4a86-8dbc-8c71871b4470
⭐ Added
- Add
ClassestoUiBuilderand some Widgets #7843 by @AdrienZianne - Drag-to-close panels #8182 by @emilk
- Add
AtomKind::Layout, for nestingAtomLayout#8219 by @lucasmerlin - Add
AtomLayout::direction#8221 by @lucasmerlin - Make the size of tabs and thin space configurable #8070 by @emilk
- Add
subpixel_binningtoTextOptionsandFontTweak#8072 by @emilk - Allow
AtomsinUi::small_button#8159 by @lucasmerlin - Atom support for
egui::WindowTitlebar #8154 by @lucasmerlin - Add
AsIdandIdSalt#8184 by @emilk - Add Context::set_cursor_image for OS-level custom cursors #8155 by @all3f0r1
- Add
ViewportBuilder::with_monitor+ViewportCommand::SetMonitor#8140 by @Le-Syl21 - Add modifier keys to
egui::Key#8127 by @Le-Syl21 - Expose interactive rects from the last pass #8211 by @psyche314
- Add
AtomLayout::selectablefor opt-in text selection #8224 by @akagifreeez - Add
LayoutJob::format_at_byte#8244 by @emilk - Add
atoms()helpers to getAtomsfrom widgets #8128 by @Nashvill375
🔧 Changed
- Improve IME handling, add public method
owns_ime_eventsonMemory#7983 by @umajho - Use
harfrustfor better kerning and ligatures #8031 by @gcailly - Rework
Windowmargins and setclip_rect_marginto zero #7725 by @emilk - Slide panels when animating them #8175 by @emilk
- Slow down animation time from 0.1s to 0.2s #8176 by @emilk
- Smoother CollapsingHeader animation #8177 by @emilk
- Drag-to-scroll: now only on touch screens #8181 by @emilk
Window: move only by dragging title bar #8183 by @emilk- Rename
Panelmethods #8192 by @emilk - Panels: double-click resize edge to toggle #8193 by @emilk
- Rename
AlphaFromCoveragetoFontColorTransferFunction#8201 by @emilk - Smoother collapsed-panel animation #8202 by @emilk
- Improve
Debug-formatting ofIdin debug-builds #8190 by @emilk - Use strongly typed
CharIndexandByteIndex+ bug fixes #8245 by @emilk - Allow downscaling image in
GetScreenshotinspection request #8248 by @lucasmerlin - Announce pressed state of selectable buttons to screen readers #8130 by @antoinecellerier
- Pre-populate font variation axes in the
FontTweakUI #8258 by @emilk - Make font hinting target configurable via
FontTweak#8262 by @emilk
🔥 Removed
- Remove everything that was marked
#[deprecated]#8105 by @emilk - Remove 64-bit atomics in main crate #8037 by @kay-lambdadelta
- Remove
impl Into<f32>arguments #8194 by @emilk
🐛 Fixed
- Don't hide whitespaces in centered and right aligned text edits #8102 by @lucasmerlin
- Don't allow resizing past minimum content size #8152 by @lucasmerlin
- Fix resizing of
Grid#8170 by @lucasmerlin - Fix glyph caching on font variations #8189 by @emilk
Panel: never overflow available width, normax_width#8198 by @emilk- Fixes color picker hue drift at low alpha values #8208 by @aedm
- Fix: ScrollArea layout jitter with floating bars and zoom levels #7944 by @rustbasic
- Fix #2142 - lost_focus not firing after a mid-frame focus transfer #8210 by @ufoscout
- Fix label selection in deferred viewports #8242 by @yay
-
0.34.327 May 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
⭐ Added
🐛 Fixed
- Fix random hangs by improving
wgpu::Surfacelifecycle handling #8171 by @grtlr - Fix
ScrollArea::scroll_to_*calls whenstick_to_bottomis Active #8033 by @AmmarAbouZor
🔧 Changed
Release notes
Open source →- Fix
ScrollArea::scroll_to_*calls whenstick_to_bottomis Active #8033 by @AmmarAbouZor
Release notes
Open source → - Fix random hangs by improving
-
0.34.204 May 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
⭐ Added
🐛 Fixed
- Fix wrong color of last glyph of selected text #8075 by @emilk
- Fix text selection of centered and right-aligned text #8076 by @emilk
- Fix
Context::is_pointer_over_eguiandContext::egui_wants_pointer_input#8081 by @emilk - Fix centered & right aligned
TextEdit#8082 by @lucasmerlin
🚀 Performance
- Optimize text selection performance for large documents #7917 by @rustbasic
Release notes
Open source →⭐ Added
🐛 Fixed
- Fix wrong color of last glyph of selected text #8075 by @emilk
- Fix text selection of centered and right-aligned text #8076 by @emilk
- Fix
Context::is_pointer_over_eguiandContext::egui_wants_pointer_input#8081 by @emilk - Fix centered & right aligned
TextEdit#8082 by @lucasmerlin
🚀 Performance
- Optimize text selection performance for large documents #7917 by @rustbasic
Release notes
Open source → -
0.34.127 Mar 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
eframe 0.34.1 changelog
-
0.34.026 Mar 2026Release notes
Open source →
egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
egui 0.34.0 changelog
Highlights from this release
- Sharper text unlocked by switching font rendering crate to
skrifa - Fade out edges of
ScrollAreas - Use
Uias the main entrypoint
Skrifa and font hinting
The font rendering backend was switched from
ab_glyphtoskrifa+vello_cpu. This enabled us support
font 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 likeRichText::bold.Font hinting makes text more clear (look at the =):
Screen.Recording.2026-03-26.at.10.49.43.movWe 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)- Replace ab_glyph with Skrifa + vello_cpu; enable font hinting #7694 by @valadaptive
- Add font variations API #7859 by @valadaptive
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 havingContextbe the main entrypoint, and instead provide whole-appUi.
In egui we've replacedContext::runwithContext::run_ui, and changed viewports to be given a&mut Uiinstead ofContext.
Ineframewe'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 nakedContexts.
Contextcan still be useful though, since they implementCloneand can be sent to other threads so you can call.request_repainton them.- Add
Context::run_ui#7736 by @emilk - Add
Deref<Target = Context>forUi#7770 by @emilk - Replace
App::updatewithfn logicandfn ui#7775 by @emilk - Rename
Context::styletoglobal_style; avoid confusion w/Ui::style#7772 by @emilk - Rename functions in
Contextto avoid confusion #7773 by @emilk - Viewports: give the caller a
Uiinstead ofContext#7779 by @emilk
Changed 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 onContext. Use theshow_insidefunctions instead, acting onUis.This unification and simplification will make it easier to maintain and improve panels going forward.
- Add
Panelto replaceSidePanelandTopBottomPanel#5659 by @sharky98 - Deprecate using
Paneldirectly on aContext#7781 by @emilk - Deprecate
CentralPanel::show#7783 by @emilk - Deprecate
Context::used_sizeandContext::available_rect#7788 by @emilk
⭐ Added
- Add
is_scrolling/is_smooth_scrollingutil, checking for active scroll action #7669 by @IsseW - Allow multiple atoms in
Button::shortcut_textandright_text#7696 by @emilk - Add
ScrollArea::content_margin#7722 by @emilk - Per-widget style #7667 by @AdrienZianne
- Plugin: export
TypedPluginGuardandTypedPluginHandle#7780 by @apekros - Add
ViewportInfo::occludedandvisible#7948 by @emilk - Add
Atomprefix/suffix support toDragValue#7949 by @lucasmerlin - ⚠️ Atom improvements:
Atom::id,align,closure,max_size#7958 by @lucasmerlin - Add
DebugOptions::warn_if_rect_changes_id#7984 by @emilk TextEditAtomprefix/suffix #7587 by @lucasmerlin- Add
Button::left_text#7955 by @rustbasic - Add
Response::parent_id#8010 by @lucasmerlin - Add
Context::text_edit_focused#8014 by @emilk - Add
Context::time#8017 by @emilk - Add
Ui::is_tooltip#8016 by @emilk - Add
UiStack::bg_color#8020 by @emilk - Make
egui::IdSetpublic #8019 by @lucasmerlin - Add raw key methods to TypeIdMap #8007 by @AlexanderSchuetz97
🔧 Changed
- Remove
accesskitfeature and always depend onaccesskit#7701 by @emilk - Update MSRV from 1.88 to 1.92 #7793 by @JasperBRiedel
- Improve modifier handling when scrolling #7678 by @emilk
- Apply preferred font weight when loading variable fonts #7790 by @pmnxis
- Make scroll bars and resize splitters visible to accesskit #7804 by @emilk
- Allow moving existing widgets to the top of interaction stack #7805 by @emilk
- Slightly change interact behavior around thin splitters #7806 by @emilk
- Move window resize interaction to be over contents #7807 by @emilk
- Don't expand widgets on hover #7808 by @emilk
- Make
FrameCache::getreturn a reference instead of cloning the cached value #7834 by @KonaeAkira - Update selected dependencies #7920 by @oscargus
- Make
Galley::pos_from_layout_cursorpub#7864 by @dionb - Update accesskit to 0.24.0 (and related deps) #7850 by @delan
- Quit on Ctrl-Q #7985 by @emilk
- Fade out the edges of
ScrollAreas#8018 by @emilk
🔥 Removed
🐛 Fixed
- Fix: ensure
CentralPanel::show_insideallocates space in parent #7778 by @emilk - Heed constrain rect when auto-positioning windows #7786 by @emilk
- Fix jitter when hovering edge of scroll area close to resize splitter #7803 by @emilk
- Don't focus Areas, Windows and ScrollAreas #7827 by @lucasmerlin
- Fix backspacing leaving last character in IME prediction not removed on macOS native and Safari #7810 by @umajho
- Implemented distance threshold for double/triple clicks #7817 by @bl4ze4447
- Fix
CentralPanel::show_inside_dynto roundpanel_rect#7868 by @ripopov - Stop ctrl+arrow etc from moving focus #7897 by @emilk
- Fix scroll area not consuming scroll events #7904 by @lucasmerlin
- Pass in an explicit id in
UiBuilder, to avoid wrapping passed in ids with Id::new() #7925 by @lucasmerlin - Fix crash when dragging a DragValue through small floats #7939 by @Fyrecean
- Fix emoji icon font #7940 by @Jhynjhiruu
- Fixes the overly aggressive overflow elision in
truncate()and similar for os scaling other than 100% #7867 by @RndUsr123 - Fix text color when selecting newline character #7951 by @emilk
- Fix: repaint on drag-and-drop files #7953 by @emilk
- Fix instable IDs following animated panels #7994 by @emilk
- Enables every combination of
TextEditandLayoutJobalignments #7831 by @RndUsr123 - Fix
horizontal_wrappingrow height after usingtext_edit_multiline#8000 by @optozorax - Fix menu keyboard toggle for open submenus #7957 by @fjkorf
- Fix:
Visuals::interact_cursorsupport inButton#7986 by @mango766
🚀 Performance
Release notes
Open source →Highlights from this release
- Sharper text unlocked by switching font rendering crate to
skrifa - Fade out edges of
ScrollAreas - Use
Uias the main entrypoint
Skrifa and font hinting
The font rendering backend was switched from
ab_glyphtoskrifa+vello_cpu. This enabled us support font 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 likeRichText::bold.Font hinting makes text more clear (look at the =):
https://github.com/user-attachments/assets/ea9151ec-869f-4c05-ab59-836114683417
We now support setting variable font parameters:
https://github.com/user-attachments/assets/0febde1c-ebf6-4d85-8f96-86ec0f934ecf
(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)
- Replace ab_glyph with Skrifa + vello_cpu; enable font hinting #7694 by @valadaptive
- Add font variations API #7859 by @valadaptive
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 havingContextbe the main entrypoint, and instead provide whole-appUi. In egui we've replacedContext::runwithContext::run_ui, and changed viewports to be given a&mut Uiinstead ofContext. Ineframewe'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 nakedContexts.Contextcan still be useful though, since they implementCloneand can be sent to other threads so you can call.request_repainton them.- Add
Context::run_ui#7736 by @emilk - Add
Deref<Target = Context>forUi#7770 by @emilk - Replace
App::updatewithfn logicandfn ui#7775 by @emilk - Rename
Context::styletoglobal_style; avoid confusion w/Ui::style#7772 by @emilk - Rename functions in
Contextto avoid confusion #7773 by @emilk - Viewports: give the caller a
Uiinstead ofContext#7779 by @emilk
Changed 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 onContext. Use theshow_insidefunctions instead, acting onUis.This unification and simplification will make it easier to maintain and improve panels going forward.
- Add
Panelto replaceSidePanelandTopBottomPanel#5659 by @sharky98 - Deprecate using
Paneldirectly on aContext#7781 by @emilk - Deprecate
CentralPanel::show#7783 by @emilk - Deprecate
Context::used_sizeandContext::available_rect#7788 by @emilk
⭐ Added
- Add
is_scrolling/is_smooth_scrollingutil, checking for active scroll action #7669 by @IsseW - Allow multiple atoms in
Button::shortcut_textandright_text#7696 by @emilk - Add
ScrollArea::content_margin#7722 by @emilk - Per-widget style #7667 by @AdrienZianne
- Plugin: export
TypedPluginGuardandTypedPluginHandle#7780 by @apekros - Add
ViewportInfo::occludedandvisible#7948 by @emilk - Add
Atomprefix/suffix support toDragValue#7949 by @lucasmerlin - ⚠️ Atom improvements:
Atom::id,align,closure,max_size#7958 by @lucasmerlin - Add
DebugOptions::warn_if_rect_changes_id#7984 by @emilk TextEditAtomprefix/suffix #7587 by @lucasmerlin- Add
Button::left_text#7955 by @rustbasic - Add
Response::parent_id#8010 by @lucasmerlin - Add
Context::text_edit_focused#8014 by @emilk - Add
Context::time#8017 by @emilk - Add
Ui::is_tooltip#8016 by @emilk - Add
UiStack::bg_color#8020 by @emilk - Make
egui::IdSetpublic #8019 by @lucasmerlin - Add raw key methods to TypeIdMap #8007 by @AlexanderSchuetz97
🔧 Changed
- Remove
accesskitfeature and always depend onaccesskit#7701 by @emilk - Update MSRV from 1.88 to 1.92 #7793 by @JasperBRiedel
- Improve modifier handling when scrolling #7678 by @emilk
- Apply preferred font weight when loading variable fonts #7790 by @pmnxis
- Make scroll bars and resize splitters visible to accesskit #7804 by @emilk
- Allow moving existing widgets to the top of interaction stack #7805 by @emilk
- Slightly change interact behavior around thin splitters #7806 by @emilk
- Move window resize interaction to be over contents #7807 by @emilk
- Don't expand widgets on hover #7808 by @emilk
- Make
FrameCache::getreturn a reference instead of cloning the cached value #7834 by @KonaeAkira - Update selected dependencies #7920 by @oscargus
- Make
Galley::pos_from_layout_cursorpub#7864 by @dionb - Update accesskit to 0.24.0 (and related deps) #7850 by @delan
- Quit on Ctrl-Q #7985 by @emilk
- Fade out the edges of
ScrollAreas#8018 by @emilk
🔥 Removed
🐛 Fixed
- Fix: ensure
CentralPanel::show_insideallocates space in parent #7778 by @emilk - Heed constrain rect when auto-positioning windows #7786 by @emilk
- Fix jitter when hovering edge of scroll area close to resize splitter #7803 by @emilk
- Don't focus Areas, Windows and ScrollAreas #7827 by @lucasmerlin
- Fix backspacing leaving last character in IME prediction not removed on macOS native and Safari #7810 by @umajho
- Implemented distance threshold for double/triple clicks #7817 by @bl4ze4447
- Fix
CentralPanel::show_inside_dynto roundpanel_rect#7868 by @ripopov - Stop ctrl+arrow etc from moving focus #7897 by @emilk
- Fix scroll area not consuming scroll events #7904 by @lucasmerlin
- Pass in an explicit id in
UiBuilder, to avoid wrapping passed in ids with Id::new() #7925 by @lucasmerlin - Fix crash when dragging a DragValue through small floats #7939 by @Fyrecean
- Fix emoji icon font #7940 by @Jhynjhiruu
- Fixes the overly aggressive overflow elision in
truncate()and similar for os scaling other than 100% #7867 by @RndUsr123 - Fix text color when selecting newline character #7951 by @emilk
- Fix: repaint on drag-and-drop files #7953 by @emilk
- Fix instable IDs following animated panels #7994 by @emilk
- Enables every combination of
TextEditandLayoutJobalignments #7831 by @RndUsr123 - Fix
horizontal_wrappingrow height after usingtext_edit_multiline#8000 by @optozorax - Fix menu keyboard toggle for open submenus #7957 by @fjkorf
- Fix:
Visuals::interact_cursorsupport inButton#7986 by @mango766
🚀 Performance
Release notes
Open source →⭐ Added
🔧 Changed
- Put the
capturemodule behind a feature flag, make theeguidependency optional #7698 by @StT191 - Attach stencil buffer #7702 by @jgraef
- Update wgpu to 28.0.0 #7853 by @SuchAFuriousDeath
- Update to wgpu 29 #7990 by @cwfitzgerald
🐛 Fixed
- Sharper text unlocked by switching font rendering crate to
-
0.33.311 Dec 2025Release notes
Open source →egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
egui
- Treat
.as a word-splitter in text navigation #7741 by @emilk - Change text color of selected text #7691 by @emilk
egui_kittest changelog
- Enforce consistent snapshot updates #7744 by @lucasmerlin
kittest: add drag-and-drop helpers #7690 by @emilk
egui_extras changelog
- Bump
ehttpto 0.6.0 #7757 by @jprochazk
- Treat
-
0.33.213 Nov 2025Release notes
Open source →egui is an easy-to-use immediate mode GUI for Rust that runs on both web and native.
Try it now: https://www.egui.rs/
egui development is sponsored by Rerun, a startup building an SDK for visualizing streams of multimodal data.
egui changelog
⭐ Added
- Add
Plugin::on_widget_under_pointerto support widget inspector #7652 by @juancampa - Add
Response::total_drag_deltaandPointerState::total_drag_delta#7708 by @emilk
🔧 Changed
- Improve accessibility and testability of
ComboBox#7658 by @lucasmerlin
🐛 Fixed
- Fix
profiling::scopecompile error when profiling usingtracingbackend #7646 by @PPakalns - Fix edge cases in "smart aiming" in sliders #7680 by @emilk
- Hide scroll bars when dragging other things #7689 by @emilk
- Prevent widgets sometimes appearing to move relative to each other #7710 by @emilk
- Fix
ui.response().interact(Sense::click())being flakey #7713 by @lucasmerlin
eframe changelog
- Fix jittering during window resize on MacOS for WGPU/Metal #7641 by @aspcartman
- Make sure
native_pixels_per_pointis set during app creation #7683 by @emilk
Release notes
Open source →⭐ Added
- Add
Plugin::on_widget_under_pointerto support widget inspector #7652 by @juancampa - Add
Response::total_drag_deltaandPointerState::total_drag_delta#7708 by @emilk
🔧 Changed
- Improve accessibility and testability of
ComboBox#7658 by @lucasmerlin
🐛 Fixed
- Fix
profiling::scopecompile error when profiling usingtracingbackend #7646 by @PPakalns - Fix edge cases in "smart aiming" in sliders #7680 by @emilk
- Hide scroll bars when dragging other things #7689 by @emilk
- Prevent widgets sometimes appearing to move relative to each other #7710 by @emilk
- Fix
ui.response().interact(Sense::click())being flakey #7713 by @lucasmerlin
Release notes
Open source →- Fix jittering during window resize on MacOS for WGPU/Metal #7641 by @aspcartman
- Add
-
0.33.009 Oct 2025Release notes
Open source →Highlights from this release:
egui::Plugina improved way to create and access egui plugins- kitdiff, a viewer for egui_kittest image snapshots (and a general image diff tool)
- better kerning
Improved 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 toon_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- going to https://rerun-io.github.io/kitdiff/ and pasting a PR or github artifact url
- linking to kitdiff via e.g. a github workflow
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):
https://github.com/user-attachments/assets/74640af1-09ba-435a-9d0c-2cbeee140c8f
Migration guide
egui::Mutexnow has a timeout as a simple deadlock detection- If you use a
egui::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)
- If you use a
screen_rectis deprecated- In order to support safe areas, egui now has
viewport_rectandcontent_rect. - Update all usages of
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.)
- In order to support safe areas, egui now has
⭐ Added
- New Plugin trait #7385 by @lucasmerlin
- Add
Ui::take_available_space()helper function, which sets the Ui's minimum size to the available space #7573 by @IsseW - Add support for the safe area on iOS #7578 by @irh
- Add
UiBuilder::global_scopeandUiBuilder::id#7372 by @Icekey - Add
emath::fast_midpoint#7435 by @emilk - Make the
hex_colormacroconst#7444 by @YgorSouza - Add
SurrenderFocusOnoption #7471 by @lucasmerlin - Add
Memory::move_focus#7476 by @darkwater - Support on hover tooltip that is noninteractable even with interactable content #5543 by @PPakalns
- Add rotation gesture support for trackpad sources #7453 by @thatcomputerguy0101
🔧 Changed
- Document platform compatibility on
viewport::WindowLeveland dependents #7432 by @lkdm - Deprecated
ImageButtonand removedWidgetType::ImageButton#7483 by @Stelios-Kourlis - More even text kerning #7431 by @valadaptive
- Increase default text size from 12.5 to 13.0 #7521 by @emilk
- Update accesskit to 0.21.0 #7550 by @fundon
- Update MSRV from 1.86 to 1.88 #7579 by @Wumpf
- Group AccessKit nodes by
Ui#7386 by @lucasmerlin
🔥 Removed
- Remove the
deadlock_detectionfeature #7497 by @lucasmerlin - Remove deprecated fields from
PlatformOutput#7523 by @emilk - Remove
logfeature #7583 by @emilk
🐛 Fixed
- Enable
clippy::iter_over_hash_typelint #7421 by @emilk - Fixes sense issues in TextEdit when vertical alignment is used #7436 by @RndUsr123
- Fix stuck menu when submenu vanishes #7589 by @lucasmerlin
- Change Spinner widget to account for width as well as height #7560 by @bryceberger
Release notes
Open source →🔧 Changed
- Update wgpu to 26 and wasm-bindgen to 0.2.100 #7540 by @Kumpelinus
- Warn if
DYLD_LIBRARY_PATHis set and we find no wgpu adapter #7572 by @emilk - Update MSRV from 1.86 to 1.88 #7579 by @Wumpf
- Update wgpu to 27.0.0 #7580 by @Wumpf
- Create
egui_wgpu::RendererOptions#7601 by @emilk - Use software texture filtering in kittest #7602 by @emilk
-
0.32.312 Sep 2025Release notes
Open source →- Preserve text format in truncated label tooltip #7514 #7535 by @lucasmerlin
- Fix
TextEdit's in RTL layouts #5547 by @zakarumych
-
0.32.204 Sep 2025Release notes
Open source →- Fix:
SubMenushould not display when ui is disabled #7428 by @ozwaldorf - Remove line breaks when pasting into single line TextEdit #7441 by @YgorSouza
- Panic mutexes that can't lock for 30 seconds, in debug builds #7468 by @emilk
- Add
Ui::place, to place widgets without changing the cursor #7359 by @lucasmerlin - Fix: prevent calendar popup from closing on dropdown change #7409 by @AStrizh
- Fix:
-
0.32.115 Aug 2025Release notes
Open source →⭐ Added
- Add
ComboBox::popup_style#7360 by @lucasmerlin
🐛 Fixed
- Fix glyph rendering: clamp coverage to [0, 1] #7415 by @emilk
- Fix manual
Popupnot closing #7383 by @lucasmerlin - Fix
WidgetText::Textignoring fallback font and overrides #7361 by @lucasmerlin - Fix
override_text_colorpriority #7439 by @YgorSouza - Fix debug-panic in ScrollArea if contents fit without scrolling #7440 by @YgorSouza
Release notes
Open source →- Enable wgpu default features in eframe / egui_wgpu default features #7344 by @lucasmerlin
- Add
-
0.32.010 Jul 2025Release notes
Open 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::Atomis the new, indivisible building blocks of egui (hence their name). AnAtomis 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 whatButtoncould do before. There is a newIntoAtomstrait that works with tuples ofAtoms. Each atom can be customized with theAtomExttrait which works on everything that implementsInto<Atom>, so e.g.RichTextorImage. So to create aButtonwith 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 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 ofAtomLayout). TheButtonimplementation 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::customto add custom content to Widgets. Here is a button in a button:https://github.com/user-attachments/assets/8c649784-dcc5-4979-85f8-e735b9cdd090
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_uito get aAtomResponsewhich will have theRectto use, but in the future this could be streamlined, e.g. by adding aAtomKind::Callbackor by passing the Rects back withegui::Response.Basing our widgets on
AtomLayoutalso allowed us to improveResponse::intrinsic_size, which will now report the correct 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
- Add
AtomLayout, abstracting layouting within widgets #5830 by @lucasmerlin - Add
Galley::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:https://github.com/user-attachments/assets/74e45243-7d05-4fc3-b446-2387e1412c05
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):https://github.com/user-attachments/assets/0c5adb6b-8310-4e0a-b936-646bb4ec02f7
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
- Add
PopupandTooltip, unifying the previous behaviours #5713 by @lucasmerlin - Add
Ui::closeandResponse::should_close#5729 by @lucasmerlin - ⚠️ Improved menu based on
egui::Popup#5716 by @lucasmerlin - Add a toggle for the compact menu style #5777 by @s-nie
- Use the new
PopupAPI for the color picker button #7137 by @lucasmerlin - ⚠️ Close popup if
Memory::keep_popup_openisn't called #5814 by @juancampa - Fix tooltips sometimes changing position each frame #7304 by @emilk
- Change popup memory to be per-viewport #6753 by @mkalte666
- Deprecate
Memory::popupAPI in favor of newPopupAPI #7317 by @emilk
▲ 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 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
- Support text in SVGs #5979 by @cernec1999
- Fix sometimes blurry SVGs #7071 by @emilk
- Fix incorrect color fringe colors on SVG:s #7069 by @emilk
- Make
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
- Improve text sharpness #5838 by @emilk
- Improve text rendering in light mode #7290 by @emilk
- Improve texture filtering by doing it in gamma space #7311 by @emilk
- Make text underline and strikethrough pixel perfect crisp #5857 by @emilk
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:
You can also change the behavior only for a single SubMenu by using// 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 */ });SubMenuButton, but by default it should be passed to any submenus when usingMenuButton.
- remove the
Memory::is_popup_openapi now requires calls toMemory::keep_popup_open- The popup will immediately close if
keep_popup_openis not called. - It's recommended to use the new
Popupapi 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
- Add
Label::show_tooltip_when_elided#5710 by @bryceberger - Deprecate
Ui::allocate_new_uiin favor ofUi::scope_builder#5764 by @lucasmerlin - Add
expand_bgto customize size of text background #5365 by @MeGaGiGaGon - Add assert messages and print bad argument values in asserts #5216 by @bircni
- Use
TextBufferforlayouterinTextEditinstead of&str#5712 by @kernelkind - Add a
Slider::update_while_editing(bool)API #5978 by @mbernat - Add
Scene::drag_pan_buttonsoption. Allows specifying which pointer buttons pan the scene by dragging #5892 by @mitchmindtree - Add
Scene::senseto customize howSceneresponds to user input #5893 by @mitchmindtree - Rework
TextEditarrow navigation to handle Unicode graphemes #5812 by @MStarha ScrollAreaimprovements for user configurability #5443 by @MStarha- Add
Response::clicked_with_open_in_background#7093 by @emilk - Add
Modifiers::matches_any#7123 by @emilk - Add
Context::format_modifiers#7125 by @emilk - Add
OperatingSystem::is_mac#7122 by @emilk - Support vertical-only scrolling by holding down Alt #7124 by @emilk
- Support for back-button on Android #7073 by @ardocrat
- Select all text in DragValue when gaining focus via keyboard #7107 by @Azkellas
- Add
Context::current_pass_index#7276 by @emilk - Add
Context::cumulative_frame_nr#7278 by @emilk - Add
Visuals::text_edit_bg_color#7283 by @emilk - Add
Visuals::weak_text_alphaandweak_text_color#7285 by @emilk - Add support for scrolling via accesskit / kittest #7286 by @lucasmerlin
- Update area struct to allow force resizing #7114 by @blackberryfloat
- Add
egui::Sidesshrink_left/shrink_right#7295 by @lucasmerlin - Set intrinsic size for Label #7328 by @lucasmerlin
🔧 Changed
- Raise MSRV to 1.85 #6848 by @torokati44, #7279 by @emilk
- Set
hint_textinWidgetInfo#5724 by @bircni - Implement
DefaultforThemePreference#5702 by @MichaelGrupp - Align
available_rectdocs with the new reality after #4590 #5701 by @podusowski - Clarify platform-specific details for
Viewportpositioning #5715 by @aspiringLich - Simplify the text cursor API #5785 by @valadaptive
- Bump accesskit to 0.19 #7040 by @valadaptive
- Better define the meaning of
SizeHint#7079 by @emilk - Move all input-related options into
InputOptions#7121 by @emilk Buttoninherits thealt_textof theImagein it, if any #7136 by @emilk- Change API of
Tooltipslightly #7151 by @emilk - Use Rust edition 2024 #7280 by @emilk
- Change
ui.disable()to modify opacity #7282 by @emilk - Make the font atlas use a color image #7298 by @valadaptive
- Implement
BitOrandBitOrAssignforRect#7319 by @lucasmerlin
🔥 Removed
- Remove things that have been deprecated for over a year #7099 by @emilk
- Remove
SelectableLabel#7277 by @lucasmerlin
🐛 Fixed
Scene: makescene_rectfull size on reset #5801 by @graydenshandScene:TextEditselection when placed in aScene#5791 by @karhuScene: Set transform layer before calling user content #5884 by @mitchmindtree- Fix: transform
TextShapeunderline width #5865 by @emilk - Fix missing repaint after
consume_key#7134 by @lucasmerlin - Update
emoji-icon-fontwith fix for fullwidth latin characters #7067 by @emilk - Mark all keys as released if the app loses focus #5743 by @emilk
- Fix scroll handle extending outside of
ScrollArea#5286 by @gilbertoalexsantos - Fix
Response::clicked_elsewherenot returningtruesometimes #5798 by @lucasmerlin - Fix kinetic scrolling on touch devices #5778 by @lucasmerlin
- Fix
DragValueexpansion when editing #5809 by @MStarha - Fix disabled
DragValueeating focus, causing focus to reset #5826 by @KonaeAkira - Fix semi-transparent colors appearing too bright #5824 by @emilk
- Improve drag-to-select text (add margins) #5797 by @hankjordan
- Fix bug in pointer movement detection #5329 by @rustbasic
- Protect against NaN in hit-test code #6851 by @Skgland
- Fix image button panicking with tiny
available_space#6900 by @lucasmerlin - Fix links and text selection in horizontal_wrapped layout #6905 by @lucasmerlin
- Fix
leading_spacesometimes being ignored during paragraph splitting #7031 by @afishhh - Fix typo in deprecation message for
ComboBox::from_id_source#7055 by @aelmizeb - Bug fix: make sure
end_passis called for all loaders #7072 by @emilk - Report image alt text as text if widget contains no other text #7142 by @lucasmerlin
- Slider: move by at least the next increment when using fixed_decimals #7066 by @0x53A
- Fix crash when using infinite widgets #7296 by @emilk
- Fix
debug_asserttriggered bymenu/intersect_ray#7299 by @emilk - Change
Rect::areato return zero for negative rectangles #7305 by @emilk
🚀 Performance
- Optimize editing long text by caching each paragraph #5411 by @afishhh
- Make
WidgetTextsmaller and faster #6903 by @lucasmerlin
-
0.31.105 Mar 2025 -
0.31.004 Feb 2025Release notes
Open source →Highlights ✨
Scene container
This release adds the
Scenecontainer to egui. It is a pannable, zoomable canvas that can containWidgets and childUis. This will make it easier to e.g. implement a graph editor.Clearer, pixel perfect rendering
The tessellator has been updated for improved rendering quality and better performance. It will produce fewer vertices and shapes will have less overdraw. We've also defined what
CornerRadius(previouslyRounding) means.We've also added a tessellator test to the demo app, where you can play around with different values to see what's produced:
https://github.com/user-attachments/assets/adf55e3b-fb48-4df0-aaa2-150ee3163684
Check the PR for more details.
CornerRadius,Margin,Shadowsize reductionIn order to pave the path for more complex and customizable styling solutions, we've reduced the size of
CornerRadius,MarginandShadowvalues toi8andu8.Migration guide
- Add a
StrokeKindto all yourPainter::rectcalls #5648 StrokeKind::defaultwas removed, since the 'normal' value depends on the context #5658- You probably want to use
StrokeKind::Insidewhen drawing rectangles - You probably want to use
StrokeKind::Middlewhen drawing open paths
- You probably want to use
- Rename
RoundingtoCornerRadius#5673 CornerRadius,MarginandShadowhave been updated to usei8andu8#5563, #5567, #5568- Remove the .0 from your values
- Cast dynamic values with
as i8/as u8oras _if you want Rust to infer the type- Rust will do a 'saturating' cast, so if your
f32value is bigger than127it will be clamped to127
- Rust will do a 'saturating' cast, so if your
RectShapeparameters changed #5565- Prefer to use the builder methods to create it instead of initializing it directly
Framenow takes theStrokewidth into account for its sizing, so check all views of your app to make sure they still look right. Read the PR for more info.
⭐ Added
- Add
egui::Scenefor panning/zooming aUi#5505 by @grtlr - Animated WebP support #5470 by @Aely0
- Improve tessellation quality #5669 by @emilk
- Add
OutputCommandfor copying text and opening URL:s #5532 by @emilk - Add
Context::copy_image#5533 by @emilk - Add
WidgetType::ImageandImage::alt_text#5534 by @lucasmerlin - Add
epaint::Brushfor controllingRectShapetexturing #5565 by @emilk - Implement
nohash_hasher::IsEnabledforId#5628 by @emilk - Add keys for
!,{,}#5548 by @Its-Just-Nans - Add
RectShape::stroke_kindto control if stroke is inside/outside/centered #5647 by @emilk
🔧 Changed
- ⚠️
Framenow includes stroke width as part of padding #5575 by @emilk - Rename
RoundingtoCornerRadius#5673 by @emilk - Require a
StrokeKindwhen painting rectangles with strokes #5648 by @emilk - Round widget coordinates to even multiple of 1/32 #5517 by @emilk
- Make all lines and rectangles crisp #5518 by @emilk
- Tweak window resize handles #5524 by @emilk
🔥 Removed
🐛 Fixed
- Use correct minimum version of
profilingcrate #5494 by @lucasmerlin - Fix interactive widgets sometimes being incorrectly marked as hovered #5523 by @emilk
- Fix panic due to non-total ordering in
Area::compare_order()#5569 by @HactarCE - Fix hovering through custom menu button #5555 by @M4tthewDE
🚀 Performance
- Use
u8inCornerRadius, and introduceCornerRadiusF32#5563 by @emilk - Store
Marginusingi8to reduce its size #5567 by @emilk - Shrink size of
Shadowby usingi8/u8instead off32#5568 by @emilk - Avoid allocations for loader cache lookup #5584 by @mineichen
- Use bitfield instead of bools in
ResponseandSense#5556 by @polwel
- Add a
-
0.30.016 Dec 2024Release notes
Open source →✨ Highlights
- Add
Modal, a popup that blocks input to the rest of the application (#5358 by @lucasmerlin) - Improved support for transform layers (#5465, #5468, #5429)
egui_kittestThis release welcomes a new crate to the family: egui_kittest.
egui_kittestis a testing framework for egui, allowing you to test both automation (simulated clicks and other events), and also do screenshot testing (useful for regression tests).egui_kittestis built usingkittest, which is a general GUI testing framework that aims to work with any Rust GUI (not just egui!).kittestuses the accessibility libraryAccessKitfor automatation and to query the widget tree.kittestandegui_kittestare written by @lucasmerlin.Here's a quick example of how to use
egui_kittestto test a checkbox:use egui::accesskit::Toggled; use egui_kittest::{Harness, kittest::Queryable}; fn main() { let mut checked = false; let app = |ui: &mut egui::Ui| { ui.checkbox(&mut checked, "Check me!"); }; let mut harness = egui_kittest::Harness::new_ui(app); let checkbox = harness.get_by_label("Check me!"); assert_eq!(checkbox.toggled(), Some(Toggled::False)); checkbox.click(); harness.run(); let checkbox = harness.get_by_label("Check me!"); assert_eq!(checkbox.toggled(), Some(Toggled::True)); // You can even render the ui and do image snapshot tests #[cfg(all(feature = "wgpu", feature = "snapshot"))] harness.wgpu_snapshot("readme_example"); }⭐ Added
- Add
ModalandMemory::set_modal_layer#5358 by @lucasmerlin - Add
UiBuilder::layer_idand removelayer_idfromUi::new#5195 by @emilk - Allow easier setting of background color for
TextEdit#5203 by @bircni - Set
Response::intrinsic_sizeforTextEdit#5266 by @lucasmerlin - Expose center position in
MultiTouchInfo#5247 by @lucasmerlin Context::add_font#5228 by @frederik-uni- Impl from
Box<str>forWidgetText,RichText#5309 by @dimtpap - Add
Window::scroll_bar_visibility#5231 by @Zeenobit - Add
ComboBox::close_behavior#5305 by @avalsch - Add
painter.line()#5291 by @bircni - Allow attaching custom user data to a screenshot command #5416 by @emilk
- Add
Button::image_tint_follows_text_color#5430 by @emilk - Consume escape keystroke when bailing out from a drag operation #5433 by @abey79
- Add
Context::layer_transform_to_global&layer_transform_from_global#5465 by @emilk
🔧 Changed
- Update MSRV to Rust 1.80 #5421, #5457 by @emilk
- Expand max font atlas size from 8k to 16k #5257 by @rustbasic
- Put font data into
Arcto reduce memory consumption #5276 by @StarStarJ - Move
egui::util::cachetoegui::cache; addFramePublisher#5426 by @emilk - Remove
Order::PanelResizeLine#5455 by @emilk - Drag-and-drop: keep cursor set by user, if any #5467 by @abey79
- Use
profilingcrate to support more profiler backends #5150 by @teddemunnik - Improve hit-test of thin widgets, and widgets across layers #5468 by @emilk
🐛 Fixed
- Update
ScrollAreadrag velocity when drag stopped #5175 by @valadaptive - Fix bug causing wrong-fire of
ViewportCommand::Visible#5244 by @rustbasic - Fix:
Ui::new_childdoes not consider thesizing_passfield ofUiBuilder#5262 by @zhatuokun - Fix Ctrl+Shift+Z redo shortcut #5258 by @YgorSouza
- Fix:
Window::default_posdoes not work #5315 by @rustbasic - Fix:
Sidesdid not apply the layout position correctly #5303 by @zhatuokun - Respect
Style::override_font_idinRichText#5310 by @MStarha - Fix disabled widgets "eating" focus #5370 by @lucasmerlin
- Fix cursor clipping in
TextEditinside aScrollArea#3660 by @juancampa - Make text cursor always appear on click #5420 by @juancampa
- Fix
on_hover_text_at_pointerfor transformed layers #5429 by @emilk - Fix: don't interact with
Areaoutside itsconstrain_rect#5459 by @MScottMcBee - Fix broken images on egui.rs (move from git lfs to normal git) #5480 by @emilk
- Fix:
ui.new_childshould now respectdisabled#5483 by @emilk - Fix zero-width strokes still affecting the feathering color of boxes #5485 by @emilk
Release notes
Open source →- Fix docs.rs build #5204 by @lucasmerlin
- Free textures after submitting queue instead of before with wgpu renderer #5226 by @Rusty-Cube
- Add option to initialize with existing wgpu instance/adapter/device/queue #5319 by @ArthurBrussee
- Updare to
wgpu23.0.0 andwasm-bindgento 0.2.95 #5330 by @torokati44 - Support wgpu-tracing with same mechanism as wgpu examples #5450 by @EriKWDev
- Add
-
0.29.101 Oct 2024 -
0.29.026 Sep 2024Release notes
Open source →✨ Highlights
This release adds initial support for multi-pass layout, which is a tool to circumvent a common limitation of immediate mode. You can use the new
UiBuilder::sizing_pass(#4969) to instruct theUiand widgets to shrink to their minimum size, then store that size. Then call the newContext::request_discard(#5059) to discard the visual output and do another pass immediately after the current finishes. Together, this allows more advanced layouts that is normally not possible in immediate mode. So far this is only used byegui::Gridto hide the "first-frame jitters" that would sometimes happen before, but 3rd party libraries can also use it to do much more advanced things.There is also a new
UiBuilderfor more flexible construction ofUis (#4969). By specifying asensefor theUiyou can make it respond to clicks and drags, reading the result with the newUi::response(#5054). Among other things, you can use this to create buttons that contain arbitrary widgets.0.29 also adds improve support for automatic switching between light and dark mode. You can now set up a custom
Stylefor both dark and light mode, and have egui follow the system preference (#4744 #4860).There also has been several small improvements to the look of egui:
- Fix vertical centering of text (e.g. in buttons) (#5117)
- Sharper rendering of lines and outlines (#4943)
- Nicer looking text selection, especially in light mode (#5017)
The new text selection
<img width="198" alt="New text selection in light mode" src="https://github.com/user-attachments/assets/bd342946-299c-44ab-bc2d-2aa8ddbca8eb"> <img width="187" alt="New text selection in dark mode" src="https://github.com/user-attachments/assets/352bed32-5150-49b9-a9f9-c7679a0d30b2">
What text selection used to look like
<img width="143" alt="Old text selection in light mode" src="https://github.com/user-attachments/assets/f3cbd798-cfed-4ad4-aa3a-d7480efcfa3c"> <img width="143" alt="Old text selection in dark mode" src="https://github.com/user-attachments/assets/9925d18d-da82-4a44-8a98-ea6857ecc14f">
🧳 Migration
id_sourceis now calledid_salteverywhere (#5025)Ui::newnow takes aUiBuilder(#4969)- Deprecated (replaced with
UiBuilder):ui.add_visible_uiui.allocate_ui_at_rectui.child_uiui.child_ui_with_id_sourceui.push_stack_info
⭐ Added
- Create a
UiBuilderfor buildingUis #4969 by @emilk - Add
egui::Sidesfor adding UI on left and right sides #5036 by @emilk - Make light & dark visuals customizable when following the system theme #4744 #4860 by @bash
- Interactive
Ui:s: addUiBuilder::senseandUi::response#5054 by @lucasmerlin - Add a menu button with text and image #4748 by @NicolasBircksZR
- Add
Ui::columns_const()#4764 by @v0x0g - Add
Slider::max_decimals_opt#4953 by @bircni - Add
Label::halign#4975 by @rustbasic - Add
ui.shrink_clip_rect#5068 by @emilk - Add
ScrollArea::scroll_bar_rect#5070 by @emilk - Add
Options::input_optionsfor click-delay etc #4942 by @girtsf - Add
WidgetType::RadioGroup#5081 by @bash - Add return value to
with_accessibility_parent#5083 by @bash - Add
Ui::with_visual_transform#5055 by @lucasmerlin - Make
SliderandDragValuecompatible withNonZeroUsizeetc #5105 by @emilk - Add
Context::request_discardfor multi-pass layouts #5059 by @emilk - Add UI to modify
FontTweaklive #5125 by @emilk - Add
Response::intrinsic_sizeto enable better layout in 3rd party crates #5082 by @lucasmerlin - Add support for mipmap textures #5146 by @nolanderc
- Add
DebugOptions::show_unaligned#5165 by @emilk - Add
Slider::clampingfor precise clamp control #5119 by @emilk
🚀 Performance
- Optimize
Color32::from_rgba_unmultipliedwith LUT #5088 by @YgorSouza
🔧 Changed
- Rename
id_sourcetoid_salt#5025 by @bircni - Avoid some
Idclashes by seeding auto-ids with child id #4840 by @ironpeak - Nicer looking text selection, especially in light mode #5017 by @emilk
- Fix blurry lines by aligning to pixel grid #4943 by @juancampa
- Center-align all text vertically #5117 by @emilk
- Clamp margin values in
Margin::ui#4873 by @rustbasic - Make
scroll_to_*animations configurable #4305 by @lucasmerlin - Update
Buttonto correctly align contained image #4891 by @PrimmR - Deprecate
ahashre-exports #4979 by @oscargus - Fix: Ensures correct IME behavior when the text input area gains or loses focus #4896 by @rustbasic
- Enable rustdoc
generate-link-to-definitionfeature on docs.rs #5030 by @GuillaumeGomez - Make some
Memorymethods public #5046 by @bircni - Deprecate
ui.set_sizing_pass#5074 by @emilk - Export module
egui::frame#5087 by @simgt - Use
logcrate instead ofeprintln& remove some unwraps #5010 by @bircni - Fix:
Event::CopyandEvent::Cutbehave as if they select the entire text when there is no selection #5115 by @rustbasic
🐛 Fixed
- Prevent text shrinking in tooltips; round wrap-width to integer #5161 by @emilk
- Fix bug causing tooltips with dynamic content to shrink #5168 by @emilk
- Remove some debug asserts #4826 by @emilk
- Handle the IME event first in
TextEditto fix some bugs #4794 by @rustbasic - Slider: round to decimals after applying
step_by#4822 by @AurevoirXavier - Fix: hint text follows the alignment set on the
TextEdit#4889 by @PrimmR - Request focus on a
TextEditwhen clicked #4991 by @Zoxc - Fix
Idclash inFramestyling widget #4967 by @YgorSouza - Prevent
ScrollAreacontents from exceeding the container size #5006 by @DouglasDwyer - Fix bug in size calculation of truncated text #5076 by @emilk
- Fix: Make sure
RawInput::takeclears all events, like it says it does #5104 by @emilk - Fix
DragValuerange clamping #5118 by @emilk - Fix: panic when dragging window between monitors of different pixels_per_point #4868 by @rustbasic
Release notes
Open source →⭐ Added
🔧 Changed
- Upgrade to wgpu 22.0.0 #4847 by @KeKsBoTer
- Introduce dithering to reduce banding #4497 by @jwagner
- Ensure that
WgpuConfigurationisSend + Sync#4803 by @murl-digital - Wgpu render pass on paint callback has now
'staticlifetime #5149 by @Wumpf
🐛 Fixed
- Update sampler along with texture on wgpu backend #5122 by @valadaptive
-
0.28.105 Jul 2024 -
0.28.003 Jul 2024Release notes
Open source →✨ Highlights
- Automatic sizing of menus/popups/tooltips with no jittering, using new sizing pass #4557, #4579 by @emilk
- Support interactive widgets in tooltips #4596 by @emilk
- Add a
ui.stack()with info about all ancestorUis, with optional tags #4588 by @abey79, #4617 by @emilk - GIF support #4620 by @JustFrederik
- Blinking text cursor in
TextEdit#4279 by @emilk
🧳 Migration
- Update MSRV to 1.76 (#4411)
- The
wrap/truncatefunctions onLabel/Button/ComboBoxno longer take bools as arguments. Use.wrap_mode(…)instead for more fine control (#4556) Style::wraphas been deprecated in favor ofStyle::wrap_mode(#4556)Ui::newandui.child_uinow takes a new parameter for theUiStack(#4588)- The
extra_assertsandextra_debug_assertsfeature flags have been removed (#4478) - Remove
Event::Scrolland handle it in egui. UseEvent::MouseWheelinstead (#4524) Event::Zoomis no longer emitted on ctrl+scroll. UseInputState::smooth_scroll_deltainstead (#4524)ui.set_enabledandset_visiblehave been deprecated (#4614)DragValue::clamp_rangerenamed torange((#4728)
⭐ Added
- Overload operators for
Rect + Margin,Rect - Marginetc #4277 by @emilk - Add
Window::order#4301 by @alexparlett - Add a way to specify Undoer settings and construct Undoers more easily #4357 by @valadaptive
- Add xtask crate #4293 by @YgorSouza
- Add
ViewportCommand::RequestCut,RequestCopyandRequestPasteto trigger clipboard actions #4035 by @bu5hm4nn - Added ability to define colors at UV coordinates along a path #4353 by @murl-digital
- Add a
Displayimpl forVec2,Pos2, andRect#4428 by @tgross35 - Easing functions #4630 by @emilk
- Add
Options::line_scroll_speedandscroll_zoom_speed#4532 by @emilk - Add
TextEdit::hint_text_font#4517 by @zaaarf - Add
Options::reduce_texture_memoryto free up RAM #4431 by @varphone - Add support for text truncation to
egui::Style#4556 by @abey79 - Add
Response::show_tooltip_uiandshow_tooltip_text#4580 by @emilk - Add
opacityandmultiply_opacityfunctions toUiandPainter#4586 by @emilk - Add
Key::Quote#4683 by @mkeeter - Improve backtraces when hovering widgets with modifiers pressed #4696 by @emilk
- Add
PopupCloseBehavior#4636 by @Umatriz - Add basic test for egui accesskit output #4716 by @Wcubed
- Add
clamp_to_rangeoption to DragValue, renameclamp_rangetorange(deprecating the former) #4728 by @Wumpf - Add
Style::number_formatteras the default used byDragValue#4740 by @emilk
🔧 Changed
- Improve the UI for changing the egui theme #4257 by @emilk
- Change the resize cursor when you reach the resize limit #4275 by @emilk
- Make
TextEditan atomic widget #4276 by @emilk - Rename
fn scroll2tofn scroll#4282 by @emilk - Change
Frame::multiply_with_opacityto multiply in gamma space #4283 by @emilk - Use parent
Uis style for popups #4325 by @alexparlett - Take
roundinginto account when usingSlider::trailing_fill#4308 by @rustbasic - Allow users to create viewports larger than monitor on Windows & macOS #4337 by @lopo12123
- Improve
ViewportBuilder::with_icon()documentation #4408 by @roccoblues include_image!now accepts expressions #4521 by @YgorSouza- Remove scroll latency for smooth trackpads #4526 by @emilk
- Smooth out zooming with discreet scroll wheel #4530 by @emilk
- Make
TextEdit::return_keyoptional #4543 by @doonv - Better spacing and sizes for (menu) buttons #4558 by @emilk
ComboBox: fix justified layout of popup if wider than parent button #4570 by @emilk- Make
Areastate public #4576 by @emilk - Don't persist
Areasize #4749 by @emilk - Round text galley sizes to nearest UI point size #4578 by @emilk
- Once you have waited for a tooltip to show, show the next one right away #4585 by @emilk
- Fade in windows, tooltips, popups, etc #4587 by @emilk
- Make
egu::menutypes public #4544 by @sor-ca - The default constrain rect for
Area/Windowis nowctx.screen_rect#4590 by @emilk - Constrain
Areas to screen by default #4591 by @emilk Grid: set thesizing_passflag during the initial sizing pass #4612 by @emilk- Remove special case for 0 in DragValue default formatter #4639 by @YgorSouza
- Abort drags when pressing escape key #4678 by @emilk
- Allow setting a layer as a sublayer of another #4690 by @YgorSouza
- Close context menus with Escape #4711 by @emilk
- Cancel DragValue edit if Escape is pressed #4713 by @YgorSouza
- The default parser for
DragValueandSlidernow ignores whitespace #4739 by @emilk - Disabled widgets are now also disabled in the accesskit output #4750 by @Wcubed
- Make it easier to grab the handle of a floating scroll bar #4754 by @emilk
- When debugging widget rects on hover, show width and height #4762 by @emilk
- Make sure all tooltips close if you open a menu in the same layer #4766 by @emilk
🐛 Fixed
- Fix wrong replacement function in deprecation notice of
drag_released*#4314 by @sornas - Consider layer transform when positioning text agent #4319 by @juancampa
- Fix incorrect line breaks #4377 by @juancampa
- Fix
hex_color!macro by re-exportingcolor_hexcrate fromecolor#4372 by @dataphract - Change
Ui::allocate_painterto inherit properties fromUi#4343 by @varphone - Fix
Panelincorrect size #4351 by @zhatuokun - Improve IME support with new
Event::Ime#4358 by @rustbasic - Disable interaction for
ScrollAreaandPlotwhen UI is disabled #4457 by @varphone - Don't panic when replacement glyph is not found #4542 by @RyanBluth
- Fix
Ui::scroll_with_deltaonly scrolling if theScrollAreais focused #4303 by @lucasmerlin - Handle tooltips so large that they cover the widget #4623 by @emilk
- ScrollArea: Prevent drag interaction outside the area #4611 by @s-nie
- Fix buggy interaction with widgets outside of clip rect #4675 by @emilk
- Make sure contents of a panel don't overflow #4676 by @emilk
- Fix:
Response::hover_posreturns incorrect positions with layer transforms #4679 by @Creative0708 - Fix: Menu popups and tooltips don't respect layer transforms #4708 by @Creative0708
- Bug fix: report latest area size in
Area::showresponse #4710 by @emilk - Ensure
Windowscroll bars are at the window edges #4733 by @emilk - Prevent
TextEditwidgets from sending fake primary clicks #4751 by @Aliremu - Fix text selection when there's multiple viewports #4760 by @emilk
- Use correct cursor icons when resizing panels too wide or narrow #4769 by @emilk
Release notes
Open source →- Update to wgpu 0.20 #4433 by @KeKsBoTer
- Fix doclinks in egui-wgpu docs #4677 by @emilk
-
0.27.202 Apr 2024Release notes
Open source →🐛 Fixed
- Fix tooltips for non-interactive widgets #4291
- Fix problem clicking the edge of a
TextEdit#4272 - Fix:
Response::clicked_elsewheretakes clip rect into account #4274 - Fix incorrect
Response::interact_rectforArea/Window#4273
⭐ Added
- Allow disabling animations on a
ScrollArea#4309 (thanks @lucasmerlin!)
-
0.27.129 Mar 2024Release notes
Open source →🐛 Fixed
- Fix visual glitch on the right side of highly rounded rectangles #4244
- Prevent visual glitch when shadow blur width is very high #4245
- Fix
InputState::any_touchesand addInputState::has_touch_screen#4247 - Fix
Context::repaint_causesreturning no causes #4248 - Fix touch-and-hold to open context menu #4249
- Hide shortcut text on zoom buttons if
zoom_with_keyboardis false #4262
🔧 Changed
- Don't apply a clip rect to the contents of an
AreaorWindow#4258
-
0.27.026 Mar 2024Release notes
Open source →The hit test logic (what is the user clicking on?) has been completely rewritten, and should now be much more accurate and helpful. The hit test and interaction logic is run at the start of the frame, using the widgets rects from the previous frame, but the latest mouse coordinates. It enabled getting a
Responsefor a widget before creating it usingContext::read_response. This will in the future unlock more powerful widget styling options. The new hit test also allows clicking slightly outside a button and still hit it, improving the support for touch screens.The menus have also been improved so that they both act and feel better, with no change in API. Included in this is much nicer looking shadows, supporting an offset.
<img width="580" alt="Screenshot 2024-03-26 at 17 00 23" src="https://github.com/emilk/egui/assets/1148717/f1eea39f-17a7-41ca-a983-ee142b04ef26">
⚠️ BREAKING
Response::clicked*andResponse::dragged*may lock theContext, so don't call it from aContext-locking closure.Response::clicked_bywill no longer be true if clicked with keyboard. UseResponse::clickedinstead.Memory::focushas been renamedMemory::focusedArea::newnow takes anIdby argument #4115- Change the definition of
clicked_by#4192
☰ Menu related improvements
- Add some distance between parent menu and submenu #4230
- Add
Area::senseand improve hit-testing of buttons in menus #4234 - Improve logic for when submenus are kept open #4166
- Better align menus with the button that opened them #4233
- Hide hover UI when showing the context menu #4138 (thanks @abey79!)
- CSS-like
Shadowwith offset, spread, and blur #4232 - On touch screens, press-and-hold equals a secondary click #4195
⭐ Added
- Add with_taskbar to viewport builder #3958 (thanks @AnotherNathan!)
- Add F21 to F35 key bindings #4004 (thanks @oscargus!)
- Add
Options::debug_paint_interactive_widgets#4018 - Add
Ui::set_opacity#3965 (thanks @YgorSouza!) - Add
Response::paint_debug_info()to make it easy to visualize a widget's id and state #4056 (thanks @abey79!) - Add layer transforms, interaction in layer #3906 (thanks @Tweoss!)
- Add
ColorImage::from_gray_iter#3536 (thanks @wangxiaochuTHU!) - Add API for raw mouse motion #4063 (thanks @GiantBlargg!)
- Add accessibility to
ProgressBarandSpinner#4139 (thanks @DataTriny!) - Add x11 window type settings to viewport builder #4175 (thanks @psethwick!)
- Add an API for customizing the return key in TextEdit #4085 (thanks @lemon-sh!)
- Convenience
const fnforMargin,RoundingandShadow#4080 (thanks @0Qwel!) - Serde feature: add serde derives to input related structs #4100 (thanks @gweisert!)
- Give each menu
Areaan id distinct from the id of what was clicked #4114 epaint: AddedShape::{scale,translate}wrappers #4090 (thanks @varphone!)- A
Windowcan now be resizable in only one direction #4155 - Add
EllipseShape#4122 (thanks @TheTacBanana!) - Adjustable Slider rail height #4092 (thanks @rustbasic!)
- Expose state override for
HeaderResponse#4200 (thanks @Zeenobit!)
🔧 Changed
TextEdit: Changemarginproperty toegui::Margintype #3993 (thanks @bu5hm4nn!)- New widget interaction logic #4026
ui.dnd_drop_zone()now returnsInnerResponse. #4079 (thanks @sowbug!)- Support interacting with the background of a
Ui#4074 - Quickly animate scroll when calling
ui.scroll_to_cursoretc #4119 - Don't clear modifier state on focus change #4157 (thanks @ming08108!)
- Prevent
egui::Windowfrom becoming larger than viewport #4199 (thanks @rustbasic!) - Don't show URLs when hovering hyperlinks #4218
🐛 Fixed
- Fix incorrect handling of item spacing in
Windowtitle bar #3995 (thanks @varphone!) - Make
on_disabled_hover_uirespecttooltip_delay#4012 (thanks @YgorSouza!) - Fix
TextEditbeing too short whenever there is horizontal margin #4005 (thanks @gweisert!) - Fix
Response::interactandUi:interact_with_hovered#4013 - Fix:
Response.interact_pointer_posisSomeon click and drag released #4014 - Fix custom
WindowFrames #4009 (thanks @varphone!) - Fix: images with background color now respects rounding #4029 (thanks @vincent-sparks!)
- Fixed the incorrect display of the
Windowframe with a wide border or large rounding #4032 (thanks @varphone!) - TextEdit: fix crash when hitting SHIFT + TAB around non-ASCII text #3984 (thanks @rustbasic!)
- Fix two
ScrollAreabugs: leaking scroll target and broken animation to target offset #4174 (thanks @abey79!) - Fix bug in
Context::parent_viewport_id#4190 (thanks @rustbasic!) - Remove unnecessary allocation in
RepaintCause::new#4146 (thanks @valsteen!)
-
0.26.214 Feb 2024 -
0.26.111 Feb 2024Release notes
Open source →- Fix
Windowtitle bar incorrect handling spacing #3995 (thanks @varphone!) - Make
on_disabled_hover_uirespecttooltip_delay#4012 (thanks @YgorSouza!) - Fix
TextEditbeing too short whenever there is horizontal margin #4005 (thanks @gweisert!) - Fix
Response::interactandUi:interact_with_hovered#4013 - Fix:
Response.interact_pointer_posisSomeon click and drag released #4014 - Fix custom
WindowFrames #4009 (thanks @varphone!)
- Fix
-
0.26.005 Feb 2024Release notes
Open source →⚠️ BREAKING
- Always set
response.hoveredto false when dragging another widget #3860 InputState::scroll_deltahas been replaced byInputState::raw_scroll_deltaandInputState::smooth_scroll_delta#3884- Improve
Response.dragged,drag_startedandclicked#3888
⭐ Added
- Selectable text in Labels #3814 #3870
- Add some drag-and-drop-related APIs in
ResponseandMemory#3876 (thanks @abey79!) - Add drag-and-drop APIs with payloads storage #3887
ComboBox: add builder method for height #3001 (thanks @hinto-janai!)- Add keys
?,/,|#3820 - Add
Response::contains_pointer#3859 - Add
Align2::anchor_size#3863 - Add
Context::debug_text#3864 - Allow read access to shapes added to painter this frame #3866 (thanks @brunizzl!)
- Register callbacks with
Context::on_begin_frameandon_end_frame#3886 - Improve
FrameAPI to allow picking color until after adding content #3889 - Add opacity factor to
TextShape#3916 (thanks @StratusFearMe21!) Context::repaint_causes:file:lineof what caused a repaint #3949- Add
TextureOptions::wrap_mode#3954 (thanks @CodedNil!) - Add
Spacing::menu_width#3973
🔧 Changed
- Move text selection logic to own module #3843
- Smooth scrolling #3884
- Turn off text wrapping by default in combo-box popups #3912
Response.context_menunow returns the response of the context menu, if open #3904 (thanks @AufarZakiev!)- Update to puffin 0.19 #3940
- Wait with showing tooltip until mouse has been still for 300ms #3977
🐛 Fixed
- Fix: dragging to above/below a
TextEditorLabelwill select text to begin/end #3858 - Fix clickable widgets blocking scrolling on touch screens #3815 (thanks @lucasmerlin!)
- Fix
stable_dt#3832 - Bug Fix :
Response::is_pointer_button_down_onis now false the frame the button is released #3833 (thanks @rustbasic!) - Use runtime knowledge of OS for OS-specific text editing #3840
- Fix calling
request_repaint_afterevery frame causing immediate repaint #3978
🚀 Performance
Release notes
Open source →- Update wgpu to 0.19 #3824
- Add
WgpuConfiguration::desired_maximum_frame_latency#3874 - Disable the default features of
wgpu#3875 - If WebGPU fails, re-try adapter creation with WebGL #3895 (thanks @Wumpf!)
- Delay call to
get_current_texture(possible small performance win) #3914 - Add
x11andwaylandfeatures #3909 (thanks @YgorSouza!) - Pass
ScreenDescriptortoegui_wgpu::CallbackTrait::prepare#3960 (thanks @StratusFearMe21!) - Make
egui_wgpu::renderera private module #3979
- Always set
-
0.26.0-alpha.201 Feb 2024 pre-releaseNothing published for this version
-
0.26.0-alpha.101 Feb 2024 pre-releaseNothing published for this version
-
0.25.008 Jan 2024Release notes
Open source →⚠️ BREAKING
- Ignore extra SHIFT and ALT when matching modifiers #3769
- Replace
Key::PlusEqualswithKey::PlusandKey::Equals#3769 - Removed
WidgetTextGalley,WidgetTextJob,RichText::into_text_job,WidgetText::into_text_job#3727 - Rename
TextBuffer::replacetoreplace_with#3751
⭐ Added
- Replace a special
Color32::PLACEHOLDERwith widget fallback color #3727 - Add
Keys forCutCopyPaste[],\:.;+=#3725 #3373 #3649 #3769 (thanks @MarijnS95 and @mkrueger!) - Add
Key::from_name,Key::ALL#3649 - Add
Event::Key::physical_key#3649 - Add indeterminate state to checkbox #3605 (thanks @YgorSouza!)
- Add
Color32::from_hexandColor32::to_hex#3570 #3777 (thanks @YgorSouza!) - Add
DragValues for RGB(A) in the color picker #2734 (thanks @IVAN-MK7!) - Add option to customize progress bar rounding #2881 (thanks @YgorSouza!)
- Add methods to load/store
TextEditStateundoer #3479 (thanks @LoganDark!) ScrollArea: Add option to always scroll the only enabled direction #3710 (thanks @untbu!)
🔧 Changed
Gridnow followsstyle.visuals.stripedif not explicitly overwritten #3723 (thanks @Wcubed!)- Allow arrow keys to move away focus from a Slider #3641 (thanks @fornwall!)
- Keep submenus open until another one is hovered #3055 (thanks @DannyStoll1!)
- Highlight the header of the topmost
Window, controlled byVisuals.window_highlight_topmost#3515 (thanks @GuillaumeSchmid!)
🐛 Fixed
- Derive
serdeSerializeandDeserializeforKeyboardShortcut#3694 (thanks @zeozeozeo!) - Fix
Windowpositioning bug when badpivotis stored in app data #3721 (thanks @abey79!) - Impl
CloneforFonts#3737 - Add missing
ResizeDirection::East#3749 (thanks @dbuch!) - Fix: don't open context menu on drag #3767
- Fix IME input of
CompositionEndwithout aCompositionStart#3768 (thanks @FrankLeeC!) - Fix: allow using the full Private Use Area for custom fonts #3509 (thanks @varphone!)
- Fix: apply edited
DragValuewhen it looses focus #3776 - Fix: Non-resizable
Areas now ignore mouse input outside their bounds #3039 (thanks @fleabitdev!) - Highlight submenu buttons when hovered and open #3780
- Invalidate font atlas on any change to
pixels_per_point, not matter how small #3698 (thanks @StarStarJ!) - Fix zoom-in shortcut (
Cmd +) on non-English keyboards #3769
Release notes
Open source →- Only call wgpu paint callback if viewport is positive #3778 (thanks @msparkles!)
-
0.24.130 Nov 2023Release notes
Open source →- Fix buggy text with multiple viewports on monitors with different scales #3666
-
0.24.023 Nov 2023Release notes
Open source →✨ Highlights
You can now spawn multiple native windows on supported backends (e.g.
eframe), using the newviewportAPI (#3172).You can easily zoom any egui app using Cmd+Plus, Cmd+Minus or Cmd+0, just like in a browser (#3608).
Scrollbars are now hidden by default until you hover the
ScrollArea(#3539).⭐ Added
- Multiple viewports/windows #3172 (thanks @konkitoman!)
- Introduce global
zoom_factor#3608 - Floating scroll bars #3539
- Add redo support to
Undoer#3478 (thanks @LoganDark!) - Add
egui::Vec2b#3543 - Add max
Windowsize & other size helpers #3537 (thanks @arduano!) - Allow changing shape of slider handle #3429 (thanks @YgorSouza!)
RawInput::viewportscontains a list of all viewports. Access the current one withctx.input(|i| i.viewport())
🔧 Changed
🐛 Fixed
- Fix upside down slider in the vertical orientation #3424 (thanks @YgorSouza!)
- Make slider step account for range start #3488 (thanks @YgorSouza!)
- Fix rounding of
ImageButton#3531 (thanks @chriscate!) - Fix naming:
constraint_to->constrain_to#3438 (thanks @rinde!) - Fix Shift+Tab behavior when no widget is focused #3498 (thanks @DataTriny!)
- Fix scroll not sticking when scrollbar is hidden #3434 (thanks @LoganDark!)
- Add
#[inline]to all builder-pattern functions #3557 - Properly reverse bool animation if value changes before it's finished #3577 (thanks @YgorSouza!)
⚠️ BREAKING
egui::gui_zoom::zoom_with_keyboard_shortcutsis gone, replaced withOptions::zoom_with_keyboard, which istrueby defaultSpacing::scroll_bar_Xhas been moved toSpacing::scroll_bar.XContext::set_pixels_per_pointnow callsContext::set_zoom_level, and it may make sense for you to call that directly instead- If you are using
eframe, check out the breaking changes in theeframechangelog
For integrations
There are several changes relevant to integrations.
- Added
crate::RawInput::viewportswith information about all active viewports - The repaint callback set by
Context::set_request_repaint_callbacknow points to which viewport should be repainted Context::runnow returns a list ofViewportOutputinFullOutputwhich should result in their own independent windows- There is a new
Context::set_immediate_viewport_rendererfor setting up the immediate viewport integration - If you support viewports, you need to call
Context::set_embed_viewports(false), or all new viewports will be embedded (the default behavior)
-
0.23.028 Sep 2023Release notes
Open source →This release contains a simple and powerful image API:
// Load from web: ui.image("https://www.example.com/some_image.png"); // Include image in the binary using `include_bytes`: ui.image(egui::include_image!("../assets/ferris.svg")); // With options: ui.add( egui::Image::new("file://path/to/image.jpg") .max_width(200.0) .rounding(10.0), );The API is based on a plugin-system, where you can tell
eguihow to load the images, and from where.egui_extrascomes with loaders for you, so all you need to do is add the following to yourCargo.toml:egui_extras = { version = "0.23", features = ["all_loaders"] } image = { version = "0.24", features = ["jpeg", "png"] } # Add the types you want support forAnd this to your code:
egui_extras::install_image_loaders(egui_ctx);⚠️ BREAKING
⭐ Added
- A new image API #3297 #3315 #3328 #3338 #3342 #3343 #3402 (thanks @jprochazk!)
- Add option to truncate text at some width #3244
- Add control of line height and letter spacing #3302
- Support images with rounded corners #3257
- Change focused widget with arrow keys #3272 (thanks @TimonPost!)
- Add opt-in
puffinfeature to egui #3298 - Add debug-option to show a callstack to the widget under the mouse and removed the
trace!macro as this is more useful #3391 - Add
Context::open_urlandContext::copy_text#3380 - Add
Area::constrain_toandWindow::constrain_to#3396 - Add
Memory::area_rect#3161 (thanks @tosti007!) - Add
Margin::expand_rectandshrink_rect#3214 - Provide
into_inner()foregui::mutex::{Mutex, RwLock}#3110 (thanks @KmolYuan!) - Support multi-threaded Wasm #3236
- Change touch force to be
Option<f32>instead off32#3240 (thanks @lucasmerlin!) - Add option to always open hyperlink in a new browser tab #3242 (thanks @FreddyFunk!)
- Add
Window::drag_to_scroll#3118 (thanks @KYovchevski!) - Add
CollapsingState::removeto clear stored state #3252 (thanks @dmackdev!) - Add tooltip_delay option #3245 (thanks @YgorSouza!)
- Added
Context::is_context_menu_open()#3267 (thanks @dmlary!) - Add
mimefield toDroppedFile#3273 (thanks @abey79!) - Allow setting the progress bar height #3183 (thanks @s-nie!)
- Add
scroll_area::State::velocity#3300 (thanks @Barugon!) - Add
Visuals::interact_cursor#3312 (thanks @zkldi!) - Add method to
RichTextmaking it easier to construct layout jobs #3319 (thanks @OmegaJak!) - Add
Context::style_mut#3359 std::borrow::Cow<'_, str>now implementsTextBuffer#3164 (thanks @burtonageo!)
🔧 Changed
- Separate text cursor from selection visuals #3181 (thanks @lampsitter!)
DragValue: update value on each key press by default #2880 (thanks @Barugon!)- Replace uses of
RangeInclusive<f32>withemath::Rangef#3221 - Implement
Send + SyncforColorPickerFnandUi(#3148) #3233 (thanks @idanarye!) - Use the minus character instead of "dash" #3271
- Changing
menu_image_buttonto useImageButtonbuilder #3288 (thanks @v-kat!) - Prune old egui memory data when reaching some limit #3299
🐛 Fixed
- Fix TextEdit's character limit #3173 (thanks @Serverator!)
- Set the correct unicode character for "ctrl" shortcuts #3186 (thanks @abey79!)
- Fix crash in
DragValuewhen only settingmin_decimals#3231 - Fix clipping issued with
ScrollArea#2860 (thanks @Barugon!) - Fix moving slider with arrow keys #3354
- Fix problems with tabs in text #3355
- Fix interaction with moved color-picker #3395
-
0.22.023 May 2023Release notes
Open source →⭐ Added
- Scroll bar visibility options #2729 (thanks @IVAN-MK7!)
- Add
Grid::with_row_color#2519 (thanks @imgurbot12!) - Add raw mouse wheel event #2782 (thanks @YgorSouza!)
- Improved plot groups and bounds handling #2410 (thanks @s-nie!)
- Return plot transforms #2935
- Add
Pointer::is_decidedly_draggingandcould_any_button_be_click#2979 - Plot widget - allow disabling zoom and drag for x and y separately #2901 (thanks @OmegaJak!)
- Add character limit to
TextEdit#2816 (thanks @wzid!) - Add
egui::Modifiers::contains#2989 (thanks @Wumpf!)
🔧 Changed
- Improve vertical alignment of fonts #2724 (thanks @lictex!)
- Transpose the value/satuation panel of the color picker #2727 (thanks @IVAN-MK7!)
- Replace
ComboBox::show_indexStringwithInto<TextWidget>#2790 (thanks @tosti007!) - Replace
tracingwithlog#2928 - Only show id clash warnings in debug builds by default #2930
- ⚠️ BREAKING:
Plot::link_axisandPlot::link_cursornow take the name of the group #2410
🐛 Fixed
- Clear all keys and modifies on focus change, fixing "stuck keys" #2933
- Fix deadlock when using
show_blocking_widget#2753 (thanks @YgorSouza!) - Fix the OS check for windows #2832 (thanks @jleibs!)
- Fix scroll bars not appearing (#2826) #2827 (thanks @lunixbochs!)
- Fix UI
data()read mutability #2742 (thanks @IS2511!) - Menu State rect now uses menu frame rect instead of contents rect #2886 (thanks @hats-np!)
- Hide
Response::triple_clickedin docs #2867 (thanks @ccaven!) request_repaint_afterworks even when called from background thread #2939- Show alt key on Mac as
"Option", not"Alt"#2981 (thanks @Wumpf!) - Mention
storeinTextEditStatedoc comment #2988 (thanks @fxdave!) - Fix typos #2866 (thanks @fezjo!)
✨ Examples
- Fix resizable columns option in the table demo #2780 (thanks @Bobo1239!)
- Update serial window example #2756 (thanks @c-git!)
- Demo app: use
enuminstead of strings for demo-selector anchor #2781 (thanks @XyLyXyRR!) - Use
env_loggerin all examples #2934 - Rename
examples/user_attention/README.mgtoREADME.md#2948 (thanks @MAlba124!) - egui_demo_app: add some native window info b5c24d6
Release notes
Open source →- Update to wgpu 0.16 #2884 (thanks @niklaskorz!)
- Device configuration is now dependent on adapter #2951 (thanks @Wumpf!)
- Expose
wgpu::AdapterviaRenderState#2954 (thanks @Wumpf!) - Add
read_screen_rgbato the egui-wgpuPainter, to allow for capturing the current frame when using wgpu. Used in conjunction withFrame::request_screenshot#2676 - Improve performance of
update_buffers#2820 (thanks @Wumpf!) - Added support for multisampling (MSAA) #2878 (thanks @PPakalns!)
-
0.21.008 Feb 2023Release notes
Open source →- ⚠️ BREAKING:
egui::Contextnow use closures for locking (#2625):ctx.input().key_pressed(Key::A)->ctx.input(|i| i.key_pressed(Key::A))ui.memory().toggle_popup(popup_id)->ui.memory_mut(|mem| mem.toggle_popup(popup_id))
⭐ Added
- Add
Response::drag_started_byandResponse::drag_released_byfor convenience, similar todraggedanddragged_by(#2507). - Add
PointerState::*_pressedto check if the given button was pressed in this frame (#2507). Event::Keynow has arepeatfield that is set totrueif the event was the result of a key-repeat (#2435).- Add
Slider::drag_value_speed, which lets you ask for finer precision when dragging the slider value rather than the actual slider. - Add
Memory::any_popup_open, which returns true if any popup is currently open (#2464). - Add
Plot::clamp_gridto only show grid where there is data (#2480). - Add
ScrollArea::drag_to_scrollif you want to turn off that feature. - Add
Response::on_hover_and_drag_cursor. - Add
Window::default_open(#2539). - Add
ProgressBar::fillif you want to set the fill color manually. (#2618). - Add
Button::roundingto enable round buttons (#2616). - Add
WidgetVisuals::optional_bg_color- set it toColor32::TRANSPARENTto hide button backgrounds (#2621). - Add
Context::screen_rectandContext::set_cursor_icon(#2625). - You can turn off the vertical line left of indented regions with
Visuals::indent_has_left_vline(#2636). - Add
Response.highlightto highlight a widget (#2632). - Add
Separator::growandSeparator::shrink(#2665). - Add
Slider::trailing_fillfor trailing color behind the circle like aProgressBar(#2660).
🔧 Changed
- Improved plot grid appearance (#2412).
- Improved the algorithm for picking the number of decimals to show when hovering values in the
Plot. - Default
ComboBoxis now controlled withSpacing::combo_width(#2621). DragValueandSlidernow use the proportional font (#2638).ScrollAreais less aggressive about clipping its contents (#2665).- Updated to be compatible with a major breaking change in AccessKit that drastically reduces memory usage when accessibility is enabled (#2678).
- Improve
DragValuebehavior (#2649, #2650, #2688, #2638).
🐛 Fixed
- Trigger
PointerEvent::Releasedfor drags (#2507). - Expose
TextEdit's multiline flag to AccessKit (#2448). - Don't render
\r(Carriage Return) (#2452). - The
button_paddingstyle option works closer as expected with image+text buttons now (#2510). - Menus are now moved to fit on the screen.
- Fix
Window::pivotcausing windows to move around (#2694).
- ⚠️ BREAKING:
-
0.20.008 Dec 2022Release notes
Open source →- MSRV (Minimum Supported Rust Version) is now
1.65.0(#2314). - ⚠️ BREAKING: egui now expects integrations to do all color blending in gamma space (#2071).
- ⚠️ BREAKING: if you have overlapping interactive widgets, only the top widget (last added) will be interactive (#2244).
⭐ Added
- Added helper functions for animating panels that collapse/expand (#2190).
- Added
Context::os/Context::set_osto query/set what operating system egui believes it is running on (#2202). - Added
Button::shortcut_textfor showing keyboard shortcuts in menu buttons (#2202). - Added
egui::KeyboardShortcutfor showing keyboard shortcuts in menu buttons (#2202). - Texture loading now takes a
TextureOptionswith minification and magnification filters (#2224). - Added
Key::MinusandKey::Equals(#2239). - Added
egui::gui_zoommodule with helpers for scaling the whole GUI of an app (#2239). - You can now put one interactive widget on top of another, and only one will get interaction at a time (#2244).
- Added
spacing.menu_marginfor customizing menu spacing (#2036) - Added possibility to enable text wrap for the selected text of
egui::ComboBox(#2272) - Added
Area::constrainandWindow::constrainwhich constrains area to the screen bounds (#2270). - Added
Area::pivotandWindow::pivotwhich controls what part of the window to position (#2303). - Added support for thin space.
- Added optional integration with AccessKit for implementing platform accessibility APIs (#2294).
- Added
panel_fill,window_fillandwindow_stroketoVisualsfor your theming pleasure (#2406). - Plots:
🔧 Changed
- Panels always have a separator line, but no stroke on other sides. Their spacing has also changed slightly (#2261).
- Tooltips are only shown when mouse pointer is still (#2263).
- Make it slightly easier to click buttons (#2304).
egui::colorhas been renamedegui::ecolor(#2399).
🐛 Fixed
- ⚠️ BREAKING: Fix text being too small (#2069).
- Improve mixed CJK/Latin line-breaking (#1986).
- Improved text rendering (#2071).
- Constrain menu popups to the screen (#2191).
- Less jitter when calling
Context::set_pixels_per_point(#2239). - Fixed popups and color edit going outside the screen.
- Fixed keyboard support in
DragValue(#2342). - If you nest
ScrollAreasinside each other, the inner area will now move its scroll bar so it is always visible (#2371). - Ignore key-repeats for
input.key_pressed(#2334, #2389). - Fixed issue with calling
set_pixels_per_pointeach frame (#2352). - Fix bug in
ScrollArea::show_rows(#2258). - Fix bug in
plot::Line::fill(#2275). - Only emit
changedevents inradio_valueandselectable_valueif the value actually changed (#2343). - Fixed sizing bug in
Grid(#2384). ComboBox::widthnow correctly sets the outer width (#2406).
Release notes
Open source →- Renamed
RenderPasstoRenderer. - Renamed
RenderPass::executetoRenderPass::render. - Renamed
RenderPass::execute_with_renderpasstoRenderer::render(replacing existingRenderer::render) - Reexported
Renderer. - You can now use
egui-wgpuon web, using WebGL (#2107). Rendererno longer handles pass creation and depth buffer creation (#2136)PrepareCallbacknow passeswgpu::CommandEncoder(#2136)PrepareCallbackcan now returnswgpu::CommandBufferthat are bundled into a singlewgpu::Queue::submitcall (#2230)- Only a single vertex & index buffer is now created and resized when necessary (previously, vertex/index buffers were allocated for every mesh) (#2148).
Renderer::update_textureno longer creates a newwgpu::Samplerwith every new texture (#2198)Painter's instance/device/adapter/surface creation is now configurable viaWgpuConfiguration(#2207)- Fix panic on using a depth buffer (#2316)
- MSRV (Minimum Supported Rust Version) is now
-
0.19.020 Aug 2022Release notes
Open source →⭐ Added
- Added
*_released&*_clickedmethods forPointerState(#1582). - Added
PointerButton::Extra1andPointerButton::Extra2(#1592). - Added
egui::hex_color!to createColor32's from hex strings under thecolor-hexfeature (#1596). - Optimized painting of filled circles (e.g. for scatter plots) by 10x or more (#1616).
- Added opt-in feature
deadlock_detectionto detect double-lock of mutexes on the same thread (#1619). - Added
InputState::stable_dt: a more stable estimate for the delta-time in reactive mode (#1625). - You can now specify a texture filter for your textures (#1636).
- Added functions keys in
egui::Key(#1665). - Added support for using
PaintCallbackshapes with the WGPU backend (#1684). - Added
Context::request_repaint_after(#1694). ctrl-hnow acts like backspace inTextEdit(#1812).- Added
custom_formattermethod forSliderandDragValue(#1851). - Added
RawInput::has_focuswhich backends can set to indicate whether the UI as a whole has the keyboard focus (#1859). - Added
PointerState::button_double_clicked()andPointerState::button_triple_clicked()(#1906). - Added
custom_formatter,binary,octal, andhexadecimaltoDragValueandSlider(#1953)
🔧 Changed
- MSRV (Minimum Supported Rust Version) is now
1.61.0(#1846). PaintCallbackshapes now require the whole callback to be put in anArc<dyn Any>with the value being a backend-specific callback type (#1684).- Replaced
needs_repaintinFullOutputwithrepaint_after. Used to force repaint after the set duration in reactive mode (#1694). Layout::left_to_rightandLayout::right_to_leftnow takes the vertical align as an argument. Previous default wasAlign::Center.- Improved ergonomics of adding plot items. All plot items that take a series of 2D coordinates can now be created directly from
Vec<[f64; 2]>. TheValueandValuestypes were removed in favor ofPlotPointandPlotPointsrespectively (#1816). TextBufferno longer needs to implementAsRef<str>(#1824).
🐛 Fixed
- Fixed
Response::changedforui.toggle_value(#1573). - Fixed
ImageButton's changing background padding on hover (#1595). - Fixed
Plotauto-bounds bug (#1599). - Fixed dead-lock when alt-tabbing while also showing a tooltip (#1618).
- Fixed
ScrollAreascrolling when editing an unrelatedTextEdit(#1779). - Fixed
Slidernot always generating events on change (#1854). - Fixed jitter of anchored windows for the first frame (#1856).
- Fixed focus behavior when pressing Tab in a UI with no focused widget (#1861).
- Fixed automatic plot bounds (#1865).
- Added
-
0.18.015 May 2022Release notes
Open source →⭐ Added
- Added
Shape::Callbackfor backend-specific painting, with an example (#1351). - Added
Frame::canvas(#1362). Context::request_repaintwill now wake up UI thread, if integrations has calledContext::set_request_repaint_callback(#1366).- Added
Plot::allow_scroll,Plot::allow_zoomno longer affects scrolling (#1382). - Added
Ui::push_idto resolve id clashes (#1374). - Added
ComboBox::icon(#1405). - Added
Ui::scroll_with_delta. - Added
Frame::outer_margin. - Added
Painter::hlineandPainter::vline. - Added
Linkandui.link(#1506). - Added triple-click support; triple-clicking a TextEdit field will select the whole paragraph (#1512).
- Added
Plot::x_grid_spacerandPlot::y_grid_spacerfor custom grid spacing (#1180). - Added
Ui::spinner()shortcut method (#1494). - Added
CursorIcons for resizing columns, rows, and the eight cardinal directions. - Added
Ui::toggle_value. - Added ability to add any widgets to the header of a collapsing region (#1538).
🔧 Changed
- MSRV (Minimum Supported Rust Version) is now
1.60.0(#1467). ClippedMeshhas been replaced withClippedPrimitive(#1351).- Renamed
Frame::margintoFrame::inner_margin. - Renamed
AlphaImagetoFontImageto discourage any other use for it (#1412). - Warnings will be painted on screen when there is an
Idclash forGrid,PlotorScrollArea(#1452). CheckboxandRadioButtonwith an empty label ("") will now take up much less space (#1456).- Replaced
Memory::top_most_layerwith more flexibleMemory::layer_ids. - Renamed the feature
convert_bytemucktobytemuck(#1467). - Renamed the feature
serializetoserde(#1467). - Renamed
Painter::sub_regiontoPainter::with_clip_rect.
🐛 Fixed
- Fixed
ComboBoxes always being rendered left-aligned (#1304). - Fixed ui code that could lead to a deadlock (#1380).
- Text is darker and more readable in bright mode (#1412).
- Fixed a lot of broken/missing doclinks (#1419).
- Fixed
Ui::add_visiblesometimes leaving theUiin a disabled state (#1436). - Added line breaking rules for Japanese text (#1498).
☢️ Deprecated
- Deprecated
CollapsingHeader::selectable(#1538).
🔥 Removed
- Removed the
single_threaded/multi_threadedflags - egui is now always thread-safe (#1390).
Contributors 🙏
Release notes
Open source →First published version since moving the code into the
eguirepository from https://github.com/LU15W1R7H/eww. - Added
-
0.0.1-alpha.128 Jul 2021 pre-releaseNothing published for this version
-
0.0.1-alpha.015 May 2021 pre-releaseNothing published for this version
-
0.0.0-alpha.411 May 2021 pre-releaseNothing published for this version
-
0.0.0-alpha.302 May 2021 pre-releaseNothing published for this version
-
0.0.0-alpha.229 Apr 2021 pre-releaseNothing published for this version
-
0.0.0-alpha.112 Apr 2021 pre-releaseNothing published for this version
-
0.0.0-alpha.010 Apr 2021 pre-releaseNothing published for this version