All notable changes to the egui crate will be documented in this file.
This is just the changelog for the core egui crate. Every crate in this repository has their own changelog:
epaintchangelogegui-winitchangelogegui-wgpuchangelogegui_kittestchangelogegui_glowchangelogecolorchangelogeframechangelog
This file is updated upon each release.
Changes since the last release can be found at https://github.com/emilk/egui/compare/latest...HEAD or by running the scripts/generate_changelog.py script.
- Treat
.as a word-splitter in text navigation #7741 by @emilk - Change text color of selected text #7691 by @emilk
- Add
Plugin::on_widget_under_pointerto support widget inspector #7652 by @juancampa - Add
Response::total_drag_deltaandPointerState::total_drag_delta#7708 by @emilk
- Improve accessibility and testability of
ComboBox#7658 by @lucasmerlin
- 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
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
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:
We've added a new trait-based plugin api, meant to replace Context::on_begin_pass and Context::on_end_pass.
This makes it a lot easier to handle state in your plugins. Instead of having to write to egui memory it can live right on your plugin struct.
The trait based api also makes easier to add new hooks that plugins can use. In addition to on_begin_pass and on_end_pass, the Plugin trait now has a input_hook and output_hook which you can use to inspect / modify the RawInput / FullOutput.
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/kitdiff
Here is a video showing the kerning changes in kitdiff (try it yourself):
Screen.Recording.2025-10-09.at.13.43.19.mp4
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
- 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
- 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
- Remove the
deadlock_detectionfeature #7497 by @lucasmerlin - Remove deprecated fields from
PlatformOutput#7523 by @emilk - Remove
logfeature #7583 by @emilk
- 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
- Preserve text format in truncated label tooltip #7514 #7535 by @lucasmerlin
- Fix
TextEdit's in RTL layouts #5547 by @zakarumych
- 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
- Add
ComboBox::popup_style#7360 by @lucasmerlin
- 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
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!
egui::Atom is the new, indivisible building blocks of egui (hence their name).
An Atom is an enum that can be either WidgetText, Image, or Custom.
The new AtomLayout can be used within widgets to do basic layout.
The initial implementation is as minimal as possible, doing just enough to implement what Button could do before.
There is a new IntoAtoms trait that works with tuples of Atoms. Each atom can be customized with the AtomExt trait
which works on everything that implements Into<Atom>, so e.g. RichText or Image.
So to create a Button with text and image you can now do:
let image = include_image!("my_icon.png").atom_size(Vec2::splat(12.0));
ui.button((image, "Click me!"));Anywhere you see impl IntoAtoms you can add any number of images and text, in any order.
As of 0.32, we have ported the Button, Checkbox, RadioButton to use atoms
(meaning they support adding Atoms and are built on top of AtomLayout).
The Button implementation is not only more powerful now, but also much simpler, removing ~130 lines of layout math.
In combination with ui.read_response, custom widgets are really simple now, here is a minimal button implementation:
pub struct ALButton<'a> {
al: AtomLayout<'a>,
}
impl<'a> ALButton<'a> {
pub fn new(content: impl IntoAtoms<'a>) -> Self {
Self {
al: AtomLayout::new(content.into_atoms()).sense(Sense::click()),
}
}
}
impl<'a> Widget for ALButton<'a> {
fn ui(mut self, ui: &mut Ui) -> Response {
let Self { al } = self;
let response = ui.ctx().read_response(ui.next_auto_id());
let visuals = response.map_or(&ui.style().visuals.widgets.inactive, |response| {
ui.style().interact(&response)
});
let al = al.frame(
Frame::new()
.inner_margin(ui.style().spacing.button_padding)
.fill(visuals.bg_fill)
.stroke(visuals.bg_stroke)
.corner_radius(visuals.corner_radius),
);
al.show(ui).response
}
}You can even use Atom::custom to add custom content to Widgets. Here is a button in a button:
Screen.Recording.2025-07-10.at.13.10.52.mov
let custom_button_id = Id::new("custom_button");
let response = Button::new((
Atom::custom(custom_button_id, Vec2::splat(18.0)),
"Look at my mini button!",
))
.atom_ui(ui);
if let Some(rect) = response.rect(custom_button_id) {
ui.put(rect, Button::new("🔎").frame_when_inactive(false));
}Currently, you need to use atom_ui to get a AtomResponse which will have the Rect to use, but in the future
this could be streamlined, e.g. by adding a AtomKind::Callback or by passing the Rects back with egui::Response.
Basing our widgets on AtomLayout also allowed us to improve Response::intrinsic_size, which will now report the
correct size even if widgets are truncated. intrinsic_size is the size that a non-wrapped, non-truncated,
non-justified version of the widget would have, and can be useful in advanced layout
calculations like egui_flex.
- Add
AtomLayout, abstracting layouting within widgets #5830 by @lucasmerlin - Add
Galley::intrinsic_sizeand use it inAtomLayout#7146 by @lucasmerlin
Introduces a new egui::Popup api. Checkout the new demo on https://egui.rs:
Screen.Recording.2025-07-10.at.11.47.22.mov
We introduced a new RectAlign helper to align a rect relative to an other rect. The Popup will by default try to find the best RectAlign based on the source widgets position (previously submenus would annoyingly overlap if at the edge of the window):
Screen.Recording.2025-07-10.at.11.36.29.mov
Tooltip and menu have been rewritten based on the new Popup api. They are now compatible with each other, meaning you can just show a ui.menu_button() in any Popup to get a sub menu. There are now customizable MenuButton and SubMenuButton structs, to help with customizing your menu buttons. This means menus now also support PopupCloseBehavior so you can remove your close_menu calls from your click handlers!
The old tooltip and popup apis have been ported to the new api so there should be very little breaking changes. The old menu is still around but deprecated. ui.menu_button etc now open the new menu, if you can't update to the new one immediately you can use the old buttons from the deprecated egui::menu menu.
We also introduced ui.close() which closes the nearest container. So you can now conveniently close Windows, Collapsibles, Modals and Popups from within. To use this for your own containers, call UiBuilder::closable and then check for closing within that ui via ui.should_close().
- Add
PopupandTooltip, unifying the previous behaviours #5713 by @lucasmerlin - Add
Ui::closeandResponse::should_close#5729 by @lucasmerlin ⚠️ Improved menu based onegui::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 ifMemory::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
You can render SVG in egui with
ui.add(egui::Image::new(egui::include_image!("icon.svg"));(Requires the use of egui_extras, with the svg feature enabled and a call to install_image_loaders).
Previously this would sometimes result in a blurry SVG, epecially if the Image was set to be dynamically scale based on the size of the Ui that contained it. Now SVG:s are always pixel-perfect, for truly scalable graphics.
- 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
Non-SVG icons are also rendered better, and text sharpness has been improved, especially in light mode.
- 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
We have some silently breaking changes (code compiles fine but behavior changed) that require special care:
- 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
- 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(...) }
- 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
- 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
- Remove things that have been deprecated for over a year #7099 by @emilk
- Remove
SelectableLabel#7277 by @lucasmerlin
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
- Optimize editing long text by caching each paragraph #5411 by @afishhh
- Make
WidgetTextsmaller and faster #6903 by @lucasmerlin
- Fix sizing bug in
TextEdit::singleline#5640 by @IaVashik - Fix panic when rendering thin textured rectangles #5692 by @PPakalns
This release adds the Scene container to egui. It is a pannable, zoomable canvas that can contain Widgets and child Uis.
This will make it easier to e.g. implement a graph editor.
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 (previously Rounding) 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:
tessellator-test.mp4
Check the PR for more details.
In order to pave the path for more complex and customizable styling solutions, we've reduced the size of
CornerRadius, Margin and Shadow values to i8 and u8.
- 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.
- 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
⚠️ 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
- 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
- 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
Modal, a popup that blocks input to the rest of the application (#5358 by @lucasmerlin) - Improved support for transform layers (#5465, #5468, #5429)
This release welcomes a new crate to the family: egui_kittest.
egui_kittest is 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_kittest is built using kittest, which is a general GUI testing framework that aims to work with any Rust GUI (not just egui!).
kittest uses the accessibility library AccessKit for automatation and to query the widget tree.
kittest and egui_kittest are written by @lucasmerlin.
Here's a quick example of how to use egui_kittest to 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");
}- 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
- 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
- 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
- Remove debug-assert triggered by
with_layer_id/dnd_drag_source#5191 by @emilk - Fix id clash in
Ui::response#5192 by @emilk - Do not round panel rectangles to pixel grid #5196 by @emilk
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 the Ui and widgets to shrink to their minimum size, then store that size.
Then call the new Context::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 by egui::Grid to 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 UiBuilder for more flexible construction of Uis (#4969).
By specifying a sense for the Ui you can make it respond to clicks and drags, reading the result with the new Ui::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 Style for 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)
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
- 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
- Optimize
Color32::from_rgba_unmultipliedwith LUT #5088 by @YgorSouza
- 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
- 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
- Add
Image::uri()#4720 by @rustbasic
- Better documentation for
Event::Zoom#4778 by @emilk - Hide tooltips when scrolling #4784 by @emilk
- Smoother animations #4787 by @emilk
- Hide tooltip on click #4789 by @emilk
- Fix default height of top/bottom panels #4779 by @emilk
- Show the innermost debug rectangle when pressing all modifier keys #4782 by @emilk
- Fix occasional flickering of pointer-tooltips #4788 by @emilk
- 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
- 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)
- 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
- 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
- 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
- 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
- Allow disabling animations on a
ScrollArea#4309 (thanks @lucasmerlin!)
- 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
- Don't apply a clip rect to the contents of an
AreaorWindow#4258
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 Response for a widget before creating it using Context::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.
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
- 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
- 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!)
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
- 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!)
- 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!)
- 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
- 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
- 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
- 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
- Niche-optimize
Idso thatOption<Id>is the same size asId#3932 - Parallel tessellation with opt-in
rayonfeature #3934
- 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
- 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!)
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!)
- 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
- Fix buggy text with multiple viewports on monitors with different scales #3666
You can now spawn multiple native windows on supported backends (e.g. eframe), using the new viewport API (#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).
- 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())
- 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!)
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
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)
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 egui how to load the images, and from where.
egui_extras comes with loaders for you, so all you need to do is add the following to your Cargo.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);- 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!)
- 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
- 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
- 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!)
- 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
- 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!)
- 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
⚠️ 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))
- 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).
- 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).
- 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).
InputState: all press functions again include key repeats (like in egui 0.19) (#2429).- Improve the look of thin white lines (#2437).
- Fix key-repeats for
TextEdit,Sliders, etc (#2429).
- 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 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:
- 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).
⚠️ 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).
- 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)
- 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
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).
- Change
Shape::Callbackfrom&dyn Anyto&mut dyn Anyto support more backends.
- 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).
- 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
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
CollapsingHeader::selectable(#1538).
- Removed the
single_threaded/multi_threadedflags - egui is now always thread-safe (#1390).
- 4JX
- a-liashenko
- ascclemens
- awaken1ng
- bigfarts
- bobyclaws
- Bromeon
- cloudhead
- collin-kemper
- cpterry
- dbuch
- DusterTheFirst
- Edgeworth
- elwerene
- follower
- Friz64
- Hunter522
- Jake-Shadle
- jean-airoldie
- JelNiSlaw
- juancampa
- LU15W1R7H
- mbillingr
- nicklasmoeller
- rukai
- tami5
- Titaniumtown
- trevyn
- waynr
- zam-5
- Much improved font selection (#1154):
- You can now select any font size and family using
RichText::sizeamdRichText::familyand the newFontId. - Easily change text styles with
Style::text_styles. - Added
Ui::text_style_height. - Added
TextStyle::resolve. - Made the v-align and scale of user fonts tweakable (#1241).
- You can now select any font size and family using
- Plot:
- Added
Plot::x_axis_formatterandPlot::y_axis_formatterfor custom axis labels (#1130). - Added
Plot::allow_boxed_zoom(),Plot::boxed_zoom_pointer()for boxed zooming on plots (#1188). - Added plot pointer coordinates with
Plot::coordinates_formatter(#1235). - Added linked axis support for plots via
plot::LinkedAxisGroup(#1184).
- Added
Context::load_textureto convert an image into a texture which can be displayed using e.g.ui.image(texture, size)(#1110).Ui::input_mutto modify how subsequent widgets see theInputStateand a convenience methodInputState::consume_keyfor shortcuts or hotkeys (#1212).- Added
Ui::add_visibleandUi::add_visible_ui. - Added
CollapsingHeader::iconto override the default open/close icon using a custom function. (1147). - Added
ui.data(),ctx.data(),ctx.options()andctx.tessellation_options()(#1175). - Added
Response::on_hover_text_at_pointeras a convenience akin toResponse::on_hover_text(1179). - Opt-in dependency on
tracingcrate for logging warnings (#1192). - Added
ui.weak(text). - Added
Slider::step_by(1225). - Added
Context::move_to_topandContext::top_most_layerfor managing the layer on the top (#1242). - Support a subset of macOS' emacs input field keybindings in
TextEdit(#1243). - Added ability to scroll a UI into view without specifying an alignment (1247).
- Added
Ui::scroll_to_rect(1252).
⚠️ Context::inputandUi::inputnow locks a mutex. This can lead to a dead-lock is used in anif letbinding!if let Some(pos) = ui.input().pointer.latest_pos()and similar must now be rewritten on two lines.- Search for this problem in your code using the regex
if let .*input.
- Better contrast in the default light mode style (#1238).
- Renamed
CtxReftoContext(#1050). Contextcan now be cloned and stored between frames (#1050).- Renamed
Ui::visibletoUi::is_visible. - Split
Event::TextintoEvent::TextandEvent::Paste(#1058). - Replaced
Style::body_text_stylewith more genericStyle::text_styles(#1154). TextStyleis no longerCopy(#1154).- Replaced
TextEdit::text_stylewithTextEdit::font(#1154). Plot::highlightnow takes aboolargument (#1159).ScrollArea::shownow returns aScrollAreaOutput, so you might need to add.innerafter the call to it (#1166).- Replaced
corner_radius: f32withrounding: Rounding, allowing per-corner rounding settings (#1206). - Replaced Frame's
margin: Vec2withmargin: Margin, allowing for different margins on opposing sides (#1219). - Renamed
Plot::custom_label_functoPlot::label_formatter(#1235). Areas::layer_id_atignores non-interatable layers (i.e. Tooltips) (#1240).ScrollAreas will not shrink below a certain minimum size, set bymin_scrolled_width/min_scrolled_height(1255).- For integrations:
Outputhas now been renamedPlatformOutputandContext::runnow returns the newFullOutput(#1292).FontImagehas been replaced byTexturesDelta(found inFullOutput), describing what textures were loaded and freed each frame (#1110).- The painter must support partial texture updates (#1149).
- Added
RawInput::max_texture_sidewhich should be filled in with e.g.GL_MAX_TEXTURE_SIZE(#1154).
- Plot
Orientationwas not public, although fields using this type were (#1130). - Context menus now respects the theme (#1043).
- Calling
Context::set_pixels_per_pointbefore the first frame will now work. - Tooltips that don't fit the window don't flicker anymore (#1240).
- Scroll areas now follow text cursor (#1252).
- Slider: correctly respond with drag and focus events when interacting with the value directly (1270).
- 4JX
- 55nknown
- AlanRace
- a-liashenko
- awaken1ng
- BctfN0HUK7Yg
- Bromeon
- cat-state
- danielkeller
- dvec
- Friz64
- Gordon01
- HackerFoo
- juancampa
- justinj
- lampsitter
- LordMZTE
- manuel-i
- Mingun
- niklaskorz
- nongiach
- parasyte
- psiphi75
- s-nie
- t18b219k
- terhechte
- xudesheng
- yusdacra
- Added back
CtxRef::begin_frame,end_frameas an alternative toCtxRef::run.
- Added context menus: See
Ui::menu_buttonandResponse::context_menu(#543). - Most widgets containing text (
Label,Buttonetc) now supports rich text (#855). - Plots:
- You can now read and write the cursor of a
TextEdit(#848). - When using a custom font you can now specify a font index (#873).
- Added vertical sliders with
Slider::new(…).vertical()(#875). - Added
Button::image_and_text(#832). - Added
CollapsingHeader::opento control if it is open or collapsed (#1006). - Added
egui::widgets::color_picker::color_picker_color32to show the color picker.
- MSRV (Minimum Supported Rust Version) is now
1.56.0. ui.add(Button::new("…").text_color(…))is nowui.button(RichText::new("…").color(…))(same forLabel)(#855).- Plots now provide a
showmethod that has to be used to add items to and show the plot (#766). menu::menu(ui, ...)is nowui.menu_button(...)(#543)- Replaced
CtxRef::begin_frameandend_framewithCtxRef::run(#872). - Replaced
scroll_deltaandzoom_deltainRawInputwithEvent::ScrollandEvent::Zoom. - Unified the four
Memorydata buckets (data,data_temp,id_dataandid_data_temp) into a singleMemory::data, with a new interface (#836). - Replaced
Ui::__testwithegui::__run_test_ui(#872).
- Fixed
ComboBoxand other popups getting clipped to parent window (#885). - The color picker is now better at keeping the same hue even when saturation goes to zero (#886).
- Removed
egui::math(useegui::emathinstead). - Removed
egui::paint(useegui::epaintinstead).
- 5225225: #849.
- aevyrie: #966.
- B-Reif: #875.
- Bromeon: #863, #918.
- d10sfan: #832.
- EmbersArc: #766, #892.
- Hperigo: #905.
- isegal: #934.
- mankinskin: #543.
- niladic: #499, #863.
- singalen: #973.
- sumibi-yakitori: #830, #870.
- t18b219k: #868, #888.
- Added horizontal scrolling support to
ScrollAreaandWindow(opt-in). TextEdit::layouter: Add custom text layout for e.g. syntax highlighting or WYSIWYG.Fonts::layout_job: New text layout engine allowing mixing fonts, colors and styles, with underlining and strikethrough.- Added
ui.add_enabled(bool, widget)to easily add a possibly disabled widget. - Added
ui.add_enabled_ui(bool, |ui| …)to create a possibly disabled UI section. - Added feature
"serialize"separately from"persistence". - Added
egui::widgets::global_dark_light_mode_buttonsto easily add buttons for switching the egui theme. TextEditcan now be used to show text which can be selected and copied, but not edited.- Added
Memory::cachesfor caching things from one frame to the next.
- Change the default monospace font to Hack.
- Label text will now be centered, right-aligned and/or justified based on the layout of the
Uiit is in. Hyperlinkwill now word-wrap just like aLabel.- All
Uis must now have a finitemax_rect.- Deprecated:
max_rect_finite,available_size_before_wrap_finiteandavailable_rect_before_wrap_finite.
- Deprecated:
Painter/Fonts: text layout now expect a color when creating aGalley. You may override that color withPainter::galley_with_color.- MSRV (Minimum Supported Rust Version) is now
1.54.0. - By default,
DragValues no longer show a tooltip when hovered. Change withStyle::explanation_tooltips. - Smaller and nicer color picker.
ScrollAreawill auto-shrink to content size unless told otherwise usingScrollArea::auto_shrink.- By default,
Slider'sclamp_to_rangeis set to true. - Renamed
TextEdit::enabledtoTextEdit::interactive. ui.label(and friends) now takeimpl ToStringas argument instead ofimpl Into<Label>.
- Fixed wrongly sized multiline
TextEditin justified layouts. - Fixed clip rectangle of windows that don't fit the central area.
- Show tooltips above widgets on touch screens.
- Fixed popups sometimes getting clipped by panels.
- Replace
Button::enabledwithui.add_enabled.
- AlexApps99
- baysmith
- bpostlethwaite
- cwfitzgerald
- DrOptix
- JerzySpendel
- NiceneNerd
- parasyte
- spersson
- Stock84-dev
- sumibi-yakitori
- t18b219k
- TobTobXX
- zu1k
- Fixed window resize bug introduced in
0.14.1.
- Added
Ui::horizontal_top.
- Fixed
set_width/set_min_width/set_height/set_min_height/expand_to_include_x/expand_to_include_y. - Make minimum grid column width propagate properly.
- Make sure
TextEditcontents expand to fill width if applicable. ProgressBar: add a minimum width and fix for having it in an infinite layout.- Fixed sometimes not being able to click inside a combo box or popup menu.
- Panels can now be added to any
Ui. - Plot:
- Line styles.
- Added
show_backgroundandshow_axesmethods toPlot.
- Progress bar.
Grid::num_columns: allow the last column to take up the rest of the space of the parentUi.- Added an API for dropping files into egui (see
RawInput). CollapsingHeadercan now optionally be selectable.
- A single-line
TextEditwill now clip text that doesn't fit in it, and scroll. - Return closure return value from
Area::show,ComboBox::show_ui,ComboBox::combo_box_with_label,Window::show,popup::*,menu::menu. - Only move/resize windows with primary mouse button.
- Tooltips are now moved to not cover the widget they are attached to.
- Fixed custom font definitions getting replaced when
pixels_per_pointis changed. - Fixed
lost_focusforTextEdit. - Clicking the edge of a menu button will now properly open the menu.
- Fixed hover detection close to an
Area. - Fixed case where
Plot'smin_auto_boundscould be ignored after the first call toPlot::ui. - Fixed slow startup when using large font files.
- Plot: you can now set the stroke of a
HLine/VLine.
Plot::newnow takes anid_source: impl Hashinstead of aname: impl ToString. Functionally it is the same.
- Plot:
- Panels:
- Added right and bottom panels (
SidePanel::rightandPanel::bottom). - Panels can now be resized.
- Added an option to overwrite frame of a
Panel.
- Added right and bottom panels (
- Improve accessibility / screen reader.
- Added
ScrollArea::show_rowsfor efficient scrolling of huge UI:s. - Added
ScrollArea::enable_scrollingto allow freezing scrolling when editing TextEdit widgets within it - Added
Ui::set_visibleas a way to hide widgets. - Added
Style::override_text_styleto easily change the text style of everything in aUi(or globally). - You can now change
TextStyleon checkboxes, radio buttons andSelectableLabel. - Added support for cint under
cintfeature. - Added features
extra_assertsandextra_debug_assertsto enable additional checks. TextEditnow supports edits on a generic buffer usingTextBuffer.- Added
Context::set_debug_on_hoverandegui::trace!(ui)
- Minimum Rust version is now 1.51 (used to be 1.52)
- Tweaked the default visuals style.
- Plot: Renamed
CurvetoLine. TopPanel::topis nowTopBottomPanel::top.SidePanel::leftno longer takes the default width by argument, but by a builder call.SidePanel::leftis resizable by default.
- Fixed uneven lettering on non-integral device scales ("extortion lettering").
- Fixed invisible scroll bar when native window is too narrow for egui.
- Added anchors to windows and areas so you can put a window in e.g. the top right corner.
- Make labels interactive with
Label::sense(Sense::click()). - Added
Response::request_focusandResponse::surrender_focus. - Added
TextEdit::code_editor(VERY basic). - Pan and zoom plots.
- Add plot legends.
- Users can now store custom state in
egui::Memory. - Added
Response::on_disabled_hover_textto show tooltip for disabled widgets. - Zoom input: ctrl-scroll and (on
eframeweb) trackpad-pinch gesture. - Support for raw multi touch events,
enabling zoom, rotate, and more. Works with
eframeweb on mobile devices, and should work withegui_gliumfor certain touch devices/screens. - Added (optional) compatibility with mint.
- Make
Memory::has_focuspublic (again). Plotmust now be given a name that is unique within its scope.- Tab only selects labels if the
screen_readeroption is turned on. - Renamed
ui.wraptoui.scope.
- Fixed defocus-bug on touch screens.
- Fixed bug with the layout of wide
DragValues.
- Moved experimental markup language to
egui_demo_lib
- You can now give focus to any clickable widget with tab/shift-tab.
- Use space or enter to click the selected widget.
- Use arrow keys to adjust sliders and
DragValues.
- egui will now output events when widgets gain keyboard focus.
- This can be hooked up to a screen reader to aid the visually impaired
- Added the option to restrict the dragging bounds of
WindowandAreato a specified area usingdrag_bounds(rect). - Added support for small and raised text.
- Added
ui.set_row_height. - Added
DebugOptions::show_widgetsto debug layouting by hovering widgets. - Added
ComboBoxto more easily customize combo boxes. - Added
Slider::newandDragValue::newto replace old type-specific constructors. - Added
TextEdit::passwordto hide input characters.
ui.advance_cursoris now calledui.add_space.kb_focusis now just calledfocus.
- Fixed some bugs related to centered layouts.
- Fixed secondary-click to open a menu.
- Fix panic for zero-range sliders and zero-speed drag values.
- Fixed false id clash error for wrapping text.
- Fixed bug that would close a popup (e.g. the color picker) when clicking inside of it.
- Deprecated
combo_box_with_labelin favor of newComboBox. - Deprecated type-specific constructors for
SliderandDragValue(Slider::f32,DragValue::usizeetc).
- Added
egui::plot::Plotto plot some 2D data. - Added
Ui::hyperlink_to(label, url). - Sliders can now have a value prefix and suffix (e.g. the suffix
"°"works like a unit). Context::set_pixels_per_pointto control the scale of the UI.- Added
Response::changed()to query if e.g. a slider was dragged, text was entered or a checkbox was clicked. - Added support for all integers in
DragValueandSlider(except 128-bit).
- Improve the positioning of tooltips.
- Only show tooltips if mouse is still.
Sliderwill now show the value display by default, unless turned off with.show_value(false).- The
Slidervalue is now aDragValuewhich when dragged can pick values outside of the slider range (unlessclamp_to_rangeis set).
- Added support for secondary and middle mouse buttons.
- Added
Labelmethods for code, strong, strikethrough, underline and italics. - Added
ui.group(|ui| { … })to visually group some widgets within a frame. - Added
Uihelpers for doing manual layout (ui.put,ui.allocate_ui_at_rectand more). - Added
ui.set_enabled(false)to disable all widgets in aUi(grayed out and non-interactive). - Added
TextEdit::hint_textfor showing a weak hint text when empty. egui::popup::popup_below_widget: show a popup area below another widget.- Added
Slider::clamp_to_range(bool): if set, clamp the incoming and outgoing values to the slider range. - Add:
ui.spacing(),ui.spacing_mut(),ui.visuals(),ui.visuals_mut(). - Add:
ctx.set_visuals(). - You can now control text wrapping with
Style::wrap. - Added
Grid::max_col_width.
- Text will now wrap at newlines, spaces, dashes, punctuation or in the middle of a words if necessary, in that order of priority.
- Widgets will now always line break at
\ncharacters. - Widgets will now more intelligently choose whether or not to wrap text.
mousehas been renamedpointereverywhere (to make it clear it includes touches too).- Most parts of
Responseare now methods, soif ui.button("…").clicked {is nowif ui.button("…").clicked() {. Response::activeis now gone. You can useresponse.dragged()orresponse.clicked()instead.- Backend: pointer (mouse/touch) position and buttons are now passed to egui in the event stream.
DragValue::rangeis now calledclamp_rangeand also clamps incoming values.- Renamed
TrianglestoMesh. - The tessellator now wraps the clip rectangle and mesh in
struct ClippedMesh(Rect, Mesh). Mesh::split_to_u16now returns a 16-bit indexedMesh16.
- It is now possible to click widgets even when FPS is very low.
- Tessellator: handle sharp path corners better (switch to bevel instead of miter joints for > 90°).
- Added a simple grid layout (
Grid). - Added
ui.allocate_at_leastandui.allocate_exact_size. - Added function
InputState::key_down. - Added
Window::current_posto position a window.
- New simpler and sleeker look!
- Renamed
PaintCmdtoShape. - Replace tuple
(Rect, Shape)with tuple-structClippedShape. - Renamed feature
"serde"to"persistence". - Break out the modules
mathandpaintinto separate cratesemathandepaint.
- Fixed a bug that would sometimes trigger a "Mismatching panels" panic in debug builds.
ImageandImageButtonwill no longer stretch to fill a justified layout.
- Added
ui.scroll_to_cursorandresponse.scroll_to_me(#81 by lucaspoffo). - Added
window.id(…)andarea.id(…)for overriding the defaultId.
- Renamed
SrgbatoColor32. - All color constructors now starts with
from_, e.g.Color32::from_rgb. - Renamed
FontFamily::VariableWidthtoFontFamily::Proportional. - Removed
pixels_per_pointfromFontDefinitions.
RepaintSignalnow implementsSyncso it can be sent to a background thread.TextEditwidgets are now slightly larger to accommodate their frames.
- Deprecated
color::srgba.
- Turn off
Windowtitle bars withwindow.title_bar(false). ImageButton-ui.add(ImageButton::new(…)).ui.vertical_centeredandui.vertical_centered_justified.ui.allocate_painterhelper.- Mouse-over explanation to duplicate ID warning.
- You can now easily constrain egui to a portion of the screen using
RawInput::screen_rect. - You can now control the minimum and maixumum number of decimals to show in a
SliderorDragValue. - Added
egui::math::Rot2: rotation helper. Responsenow contains theIdof the widget it pertains to.ui.allocate_responsethat allocates space and checks for interactions.- Added
response.interact(sense), e.g. to check for clicks on labels.
ui.allocate_spacenow returns an(Id, Rect)tuple.Arc<Context>has been replaced withCtxRefeverywhere.- Slight tweak of the default
Styleand font sizes. SidePanel::leftandTopPanel::topnow takesimpl Hashas first argument.- A
Windowmay now cover an existingCentralPanel. ui.imagenow takesimpl Into<Vec2>as asizeargument.- Made some more fields of
RawInputoptional. SliderandDragValueuses fewer decimals by default. See the full precision by hovering over the value.egui::App: addedfn name(&self)andfn clear_color(&self).- Combo boxes has scroll bars when needed.
- Expand
Window+Resizecontainers to be large enough for last frames content ui.columns: Columns now defaults to justified top-to-down layouts.- Renamed
Sense::nothing()toSense::hover(). - Replaced
parking_lotdependency withatomic_refcellby default.
- The background for
CentralPanelwill now cover unused space too. ui.columns: Improve allocated size estimation.
RawInput::screen_size- useRawInput::screen_rectinstead.- left/centered/right column functions on
Ui. ui.interact_hoverandui.hovered.
- Emoji support: 1216 different emojis that work in any text.
- The Demo app comes with a Font Book to explore the available glyphs.
ui.horizontal_wrapped(|ui| …): Add widgets on a row but wrap atmax_size.ui.horizontal_wrapped_for_text: Likeui.horizontal_wrapped, but with spacing made for embedding text.ui.horizontal_for_text: Likeui.horizontal, but with spacing made for embedding text.egui::Layoutnow supports justified layouts where contents is also centered, right-aligned, etc.ui.allocate_ui(size, |ui| …): Easily create a child-Uiof a given size.SelectableLabel(ui.selectable_labelandui.selectable_value): A text-button that can be selected.ui.small_button: A smaller button that looks good embedded in text.ui.drag_angle_tau: For those who want to specify angles as fractions of τ (a full turn).- Added
Resize::id_sourceandScrollArea::id_sourceto let the user avoid Id clashes.
- New default font: Ubuntu-Light.
- Make it simpler to override fonts in
FontDefinitions. - Remove minimum button width.
- Refactor
egui::Layoutsubstantially, changing its interface. - Calling
on_hover_text/on_hover_uimultiple times will stack tooltips underneath the previous ones. - Text wrapping on labels, buttons, checkboxes and radio buttons is now based on the layout.
- Removed the
label!macro.
TextEditimprovements:- Much improved text editing, with better navigation and selection.
- Move focus between
TextEditwidgets with tab and shift-tab. - Undo edtis in a
TextEdit. - You can now check if a
TextEditlost keyboard focus withresponse.lost_focus. - Added
ui.text_edit_singlelineandui.text_edit_multiline.
- You can now debug why your
Uiis unexpectedly wide withui.style_mut().debug.show_expand_width = true;
- Pressing enter in a single-line
TextEditwill now surrender keyboard focus for it. - You must now be explicit when creating a
TextEditif you want it to be singeline or multiline. - Improved automatic
Idgeneration, makingIdclashes less likely. - egui now requires modifier key state from the integration
- Added, renamed and removed some keys in the
Keyenum. - Fixed incorrect text wrapping width on radio buttons
- Fixed bug where a lost widget could still retain keyboard focus.
- Panels: you can now create panels using
SidePanel,TopPanelandCentralPanel. - You can now override the default egui fonts.
- Added ability to override text color with
visuals.override_text_color. - The demo now includes a simple drag-and-drop example.
- The demo app now has a slider to scale all of egui.
ui.horizontal(…)etc returnsResponse.- Refactored the interface for
egui::app::App. - Windows are now constrained to the screen.
Context::begin_frame()no longer returns aUi. Instead put your widgets into aSidePanel,TopPanel,CentralPanel,WindoworArea.Context::end_frame()now returns shapes that need to be converted to triangles withContext::tessellate().- Anti-aliasing is now off by default in debug builds.
- You can no longer throw windows.
- Fixed a bug where some regions would slowly grow for non-integral scales (
pixels_per_point).
- Color picker
- Unicode characters in labels (limited by what the default font supports)
- Simple drop-down combo box menu
- Logarithmic sliders
- Optimization: coarse culling in the tessellator
- CHANGED: switch argument order of
ui.checkboxandui.radio
This is when I started the CHANGELOG.md, after almost two years of development. Better late than never.
- Widgets: label, text button, hyperlink, checkbox, radio button, slider, draggable value, text editing
- Layouts: horizontal, vertical, columns
- Text input: very basic, multiline, copy/paste
- Windows: move, resize, name, minimize and close. Automatically sized and positioned.
- Regions: resizing, vertical scrolling, collapsing headers (sections)
- Rendering: Anti-aliased rendering of lines, circles, text and convex polygons.
- Tooltips on hover
- 2020-08-10: renamed the project to "egui"
- 2020-05-30: first release on crates.io (0.1.0)
- 2020-04-01: serious work starts (pandemic project)
- 2019-03-12: gave a talk about what would later become egui: https://www.youtube.com/watch?v=-pmwLHw5Gbs
- 2018-12-23: initial commit
- 2018-11-04: started tinkering on a train







