All Versions
38
Latest Version
Avg Release Cycle
76 days
Latest Release
15 days ago

Changelog History
Page 2

  • v0.32.0 Changes

    July 10, 2025

    ๐ŸŒ 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.32.0 changelog

    ๐Ÿš€ This is a big egui release, with several exciting new features!

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

    Let's dive in!

    โš›๏ธ Atoms

    ๐Ÿ— egui::Atom is the new, indivisible building block of egui (hence the name).
    It lets you mix images and text in many places where you would previously only be able to add text.

    Atoms is the first step towards a more powerful layout engine in egui - more to come!

    Right now 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:

    letimage =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:

    pubstructALButton\<'a\>{al:AtomLayout\<'a\>,}impl\<'a\>ALButton\<'a\>{pubfnnew(content:implIntoAtoms\<'a\>)->Self{Self{al:AtomLayout::new(content.into\_atoms()).sense(Sense::click()),}}}impl\<'a\>WidgetforALButton\<'a\>{fnui(mutself,ui:&mutUi)->Response{letSelf{al}=self;letresponse = ui.ctx().read\_response(ui.next\_auto\_id());letvisuals = response.map\_or(&ui.style().visuals.widgets.inactive,|response|{ui.style().interact(&response)});letal = 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

    letcustom_button_id =Id::new("custom\_button");letresponse =Button::new((Atom::custom(custom_button_id,Vec2::splat(18.0)),"Look at my mini button!",)).atom\_ui(ui);ifletSome(rect)= response.rect(custom_button_id){ui.put(rect,Button::new("๐Ÿ”Ž").frame\_when\_inactive(false));}
    

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

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

    Details

    โ• Improved popups, tooltips, and menus

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

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

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

    ๐Ÿ’… Screen.Recording.2025-07-10.at.11.36.29.mov

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

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

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

    Details
    • โž• Add Popup and Tooltip, unifying the previous behaviours #5713 by @lucasmerlin
    • โž• Add Ui::close and Response::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 Popup API for the color picker button #7137 by @lucasmerlin
    • โš ๏ธ Close popup if Memory::keep_popup_open isn'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::popup API in favor of new Popup API #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 the svg feature enabled and a call to install_image_loaders).

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

    svg-scaling

    Details
    • ๐Ÿ‘Œ 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_at pixel-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.

    image

    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:

    wgpu backend features
    • ๐Ÿš€ wgpu 25 made the gles and vulkan backends optional

      • We missed this, so for now you need to manually opt in to those backends. Add the following to you Cargo.toml

      wgpu = "25" # enables the wgpu default features so we get the default backends

    0๏ธโƒฃ 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 sinc...
  • v0.31.1 Changes

    March 05, 2025

    ๐ŸŒ 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

    • ๐Ÿ›  Fix sizing bug in TextEdit::singleline #5640 by @IaVashik
    • ๐Ÿ›  Fix panic when rendering thin textured rectangles #5692 by @PPakalns

    egui_extras

    โœ… egui_kittest

    epaint

    • ๐Ÿ›  Fix panic when rendering thin textured rectangles #5692 by @PPakalns
  • v0.31.0 Changes

    February 04, 2025

    ๐ŸŒ 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 โœจ

    Scene container

    ๐Ÿš€ 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.

    scene

    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 (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.

    CornerRadius, Margin, Shadow size reduction

    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.

    Migration guide

    • โž• Add a StrokeKind to all your Painter::rect calls #5648
    • ๐Ÿšš StrokeKind::default was removed, since the 'normal' value depends on the context #5658

      • You probably want to use StrokeKind::Inside when drawing rectangles
      • You probably want to use StrokeKind::Middle when drawing open paths
    • ๐Ÿ“‡ Rename Rounding to CornerRadius #5673

    • โšก๏ธ CornerRadius, Margin and Shadow have been updated to use i8 and u8 #5563, #5567, #5568

      • Remove the .0 from your values
      • Cast dynamic values with as i8 / as u8 or as _ if you want Rust to infer the type
      • Rust will do a 'saturating' cast, so if your f32 value is bigger than 127 it will be clamped to 127
    • RectShape parameters changed #5565

      • Prefer to use the builder methods to create it instead of initializing it directly
    • Frame now takes the Stroke width 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::Scene for panning/zooming a Ui #5505 by @grtlr
    • ๐Ÿ‘ Animated WebP support #5470 by @Aely0
    • ๐Ÿ‘Œ Improve tessellation quality #5669 by @emilk
    • โž• Add OutputCommand for copying text and opening URL:s #5532 by @emilk
    • โž• Add Context::copy_image #5533 by @emilk
    • โž• Add WidgetType::Image and Image::alt_text #5534 by @lucasmerlin
    • โž• Add epaint::Brush for controlling RectShape texturing #5565 by @emilk
    • Implement nohash_hasher::IsEnabled for Id #5628 by @emilk
    • โž• Add keys for !, {, } #5548 by @Its-Just-Nans
    • โž• Add RectShape::stroke_kind to control if stroke is inside/outside/centered #5647 by @emilk

    ๐Ÿ”ง Changed

    • โš  โš ๏ธ Frame now includes stroke width as part of padding #5575 by @emilk
    • ๐Ÿ“‡ Rename Rounding to CornerRadius #5673 by @emilk
    • Require a StrokeKind when 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

    • โœ‚ Remove egui::special_emojis::TWITTER #5622 by @emilk
    • โœ‚ Remove StrokeKind::default #5658 by @emilk

    ๐Ÿ›  ๐Ÿ› Fixed

    • ๐Ÿ‘‰ Use correct minimum version of profiling crate #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 u8 in CornerRadius, and introduce CornerRadiusF32 #5563 by @emilk
    • Store Margin using i8 to reduce its size #5567 by @emilk
    • Shrink size of Shadow by using i8/u8 instead of f32 #5568 by @emilk
    • Avoid allocations for loader cache lookup #5584 by @mineichen
    • ๐Ÿ‘‰ Use bitfield instead of bools in Response and Sense #5556 by @polwel
  • v0.30.0 Changes

    December 16, 2024

    ๐ŸŒ 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_kittest

    โœ… 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:

    useegui::accesskit::Toggled;useegui_kittest::{Harness,kittest::Queryable};fnmain(){letmutchecked =false;letapp = |ui:&mutegui::Ui|{ui.checkbox(&mutchecked,"Check me!");};letmutharness = egui_kittest::Harness::new\_ui(app);letcheckbox = harness.get\_by\_label("Check me!");assert\_eq!(checkbox.toggled(),Some(Toggled::False));checkbox.click();harness.run();letcheckbox = 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");}
    

    egui changelog

    โœจ 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)

    โญ Added

    ๐Ÿ”ง 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 Arc to reduce memory consumption #5276 by @StarStarJ
    • ๐Ÿšš Move egui::util::cache to egui::cache; add FramePublisher #5426 by @emilk
    • โœ‚ Remove Order::PanelResizeLine #5455 by @emilk
    • Drag-and-drop: keep cursor set by user, if any #5467 by @abey79
    • ๐Ÿ‘‰ Use profiling crate to support more profiler backends #5150 by @teddemunnik
    • ๐Ÿ‘Œ Improve hit-test of thin widgets, and widgets across layers #5468 by @emilk

    ๐Ÿ›  ๐Ÿ› Fixed

    • โšก๏ธ Update ScrollArea drag velocity when drag stopped #5175 by @valadaptive
    • ๐Ÿ›  Fix bug causing wrong-fire of ViewportCommand::Visible #5244 by @rustbasic
    • Fix: Ui::new_child does not consider the sizing_pass field of UiBuilder #5262 by @zhatuokun
    • ๐Ÿ›  Fix Ctrl+Shift+Z redo shortcut #5258 by @YgorSouza
    • ๐Ÿ›  Fix: Window::default_pos does not work #5315 by @rustbasic
    • ๐Ÿ›  Fix: Sides did not apply the layout position correctly #5303 by @zhatuokun
    • Respect Style::override_font_id in RichText #5310 by @MStarha
    • ๐Ÿ›  Fix disabled widgets "eating" focus #5370 by @lucasmerlin
    • ๐Ÿ›  Fix cursor clipping in TextEdit inside a ScrollArea #3660 by @juancampa
    • ๐Ÿ‘‰ Make text cursor always appear on click #5420 by @juancampa
    • Fix on_hover_text_at_pointer for transformed layers #5429 by @emilk
    • ๐Ÿ›  Fix: don't interact with Area outside its constrain_rect #5459 by @MScottMcBee
    • ๐Ÿ›  Fix broken images on egui.rs (move from git lfs to normal git) #5480 by @emilk
    • ๐Ÿ›  Fix: ui.new_child should now respect disabled #5483 by @emilk
    • ๐Ÿ›  Fix zero-width strokes still affecting the feathering color of boxes #5485 by @emilk

    eframe changelog

    ๐Ÿ’ฅ BREAKING: you now need to enable the wayland and/or x11 features to get Linux support, including getting it to work on most CI systems.

    โญ Added

    ๐Ÿ”ง Changed

    ๐Ÿ›  ๐Ÿ› Fixed

    • ๐Ÿ’ป iOS: Support putting UI next to the dynamic island #5211 by @frederik-uni
    • Prevent panic when copying text outside of a secure context #5326 by @YgorSouza
    • ๐Ÿ›  Fix accidental change of FallbackEgl to PreferEgl #5408 by @e00E
  • v0.19.0 Changes

    August 20, 2022

    โž• Added โญ

    • ๐Ÿš€ Added *_released & *_clicked methods for PointerState (#1582).
    • โž• Added PointerButton::Extra1 and PointerButton::Extra2 (#1592).
    • โž• Added egui::hex_color! to create Color32's from hex strings under the color-hex feature (#1596).
    • โšก๏ธ Optimized painting of filled circles (e.g. for scatter plots) by 10x or more (#1616).
    • โž• Added opt-in feature deadlock_detection to 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 PaintCallback shapes with the WGPU backend (#1684).
    • Added Contex::request_repaint_after (#1694).
    • ctrl-h now acts like backspace in TextEdit (#1812).
    • โž• Added custom_formatter method for Slider and DragValue (#1851).
    • โž• Added RawInput::has_focus which backends can set to indicate whether the UI as a whole has the keyboard focus (#1859).
    • Added PointerState::button_double_clicked() and PointerState::button_triple_clicked() (#1906).
    • โž• Added custom_formatter, binary, octal, and hexadecimal to DragValue and Slider (#1953)

    ๐Ÿ”„ Changed ๐Ÿ”ง

    • ๐Ÿ‘ MSRV (Minimum Supported Rust Version) is now 1.61.0 (#1846).
    • PaintCallback shapes now require the whole callback to be put in an Arc<dyn Any> with the value being a backend-specific callback type (#1684).
    • Replaced needs_repaint in FullOutput with repaint_after. Used to force repaint after the set duration in reactive mode (#1694).
    • Layout::left_to_right and Layout::right_to_left now takes the vertical align as an argument. Previous default was Align::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]>. The Value and Values types were removed in favor of PlotPoint and PlotPoints respectively (#1816).
    • TextBuffer no longer needs to implement AsRef<str> (#1824).

    ๐Ÿ›  Fixed ๐Ÿ›

    • ๐Ÿ›  Fixed Response::changed for ui.toggle_value (#1573).
    • ๐Ÿ›  Fixed ImageButton's changing background padding on hover (#1595).
    • ๐Ÿ›  Fixed Plot auto-bounds bug (#1599).
    • ๐Ÿ›  Fixed dead-lock when alt-tabbing while also showing a tooltip (#1618).
    • ๐Ÿ›  Fixed ScrollArea scrolling when editing an unrelated TextEdit (#1779).
    • ๐Ÿ›  Fixed Slider not 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).
  • v0.18.1 Changes

    May 01, 2022
    • ๐Ÿ”„ Change Shape::Callback from &dyn Any to &mut dyn Any to support more backends.
  • v0.18.0 Changes

    April 30, 2022

    โž• Added โญ

    • Added Shape::Callback for backend-specific painting, with an example (#1351).
    • โž• Added Frame::canvas (#1362).
    • ๐Ÿ’ป Context::request_repaint will now wake up UI thread, if integrations has called Context::set_request_repaint_callback (#1366).
    • Added Plot::allow_scroll, Plot::allow_zoom no longer affects scrolling (#1382).
    • โž• Added Ui::push_id to resolve id clashes (#1374).
    • โž• Added ComboBox::icon (#1405).
    • Added Ui::scroll_with_delta.
    • โž• Added Frame::outer_margin.
    • โž• Added Painter::hline and Painter::vline.
    • โž• Added Link and ui.link (#1506).
    • โž• Added triple-click support; triple-clicking a TextEdit field will select the whole paragraph (#1512).
    • Added Plot::x_grid_spacer and Plot::y_grid_spacer for 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).
    • ClippedMesh has been replaced with ClippedPrimitive (#1351).
    • ๐Ÿ“‡ Renamed Frame::margin to Frame::inner_margin.
    • ๐Ÿ“‡ Renamed AlphaImage to FontImage to discourage any other use for it (#1412).
    • โš  Warnings will be painted on screen when there is an Id clash for Grid, Plot or ScrollArea (#1452).
    • Checkbox and RadioButton with an empty label ("") will now take up much less space (#1456).
    • Replaced Memory::top_most_layer with more flexible Memory::layer_ids.
    • ๐Ÿ“‡ Renamed the feature convert_bytemuck to bytemuck (#1467).
    • ๐Ÿ“‡ Renamed the feature serialize to serde (#1467).
    • Renamed Painter::sub_region to Painter::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_visible sometimes leaving the Ui in a disabled state (#1436).
    • โž• Added line breaking rules for Japanese text (#1498).

    ๐Ÿ—„ Deprecated โ˜ข๏ธ

    • ๐Ÿ—„ Deprecated CollapsingHeader::selectable (#1538).

    โœ‚ Removed ๐Ÿ”ฅ

    • Removed the single_threaded/multi_threaded flags - egui is now always thread-safe (#1390).

    Contributors ๐Ÿ™

  • v0.17.0 Changes

    February 22, 2022

    โž• Added โญ

    • Much improved font selection (#1154):
      • You can now select any font size and family using RichText::size amd RichText::family and the new FontId.
      • 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).
    • Plot:
      • Added Plot::x_axis_formatter and Plot::y_axis_formatter for 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).
    • ๐Ÿ’ป Context::load_texture to convert an image into a texture which can be displayed using e.g. ui.image(texture, size) (#1110).
    • ๐Ÿ‘€ Ui::input_mut to modify how subsequent widgets see the InputState and a convenience method InputState::consume_key for shortcuts or hotkeys (#1212).
    • ๐Ÿ’ป Added Ui::add_visible and Ui::add_visible_ui.
    • โž• Added CollapsingHeader::icon to override the default open/close icon using a custom function. (1147).
    • โž• Added ui.data(), ctx.data(), ctx.options() and ctx.tessellation_options() (#1175).
    • Added Response::on_hover_text_at_pointer as a convenience akin to Response::on_hover_text (1179).
    • โš  Opt-in dependency on tracing crate for logging warnings (#1192).
    • โž• Added ui.weak(text).
    • โž• Added Slider::step_by (1225).
    • Added Context::move_to_top and Context::top_most_layer for managing the layer on the top (#1242).
    • ๐Ÿ‘Œ Support a subset of macOS' emacs input field keybindings in TextEdit (#1243).
    • โž• Added ability to scroll an UI into view without specifying an alignment (1247).
    • Added Ui::scroll_to_rect (1252).

    ๐Ÿ”„ Changed ๐Ÿ”ง

    • ๐Ÿ”’ โš ๏ธ Context::input and Ui::input now locks a mutex. This can lead to a dead-lock is used in an if let binding!
      • 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 CtxRef to Context (#1050).
    • ๐Ÿ‘ฏ Context can now be cloned and stored between frames (#1050).
    • ๐Ÿ’ป Renamed Ui::visible to Ui::is_visible.
    • Split Event::Text into Event::Text and Event::Paste (#1058).
    • Replaced Style::body_text_style with more generic Style::text_styles (#1154).
    • ๐Ÿ’… TextStyle is no longer Copy (#1154).
    • ๐Ÿ’… Replaced TextEdit::text_style with TextEdit::font (#1154).
    • Plot::highlight now takes a bool argument (#1159).
    • ScrollArea::show now returns a ScrollAreaOutput, so you might need to add .inner after the call to it (#1166).
    • Replaced corner_radius: f32 with rounding: Rounding, allowing per-corner rounding settings (#1206).
    • Replaced Frame's margin: Vec2 with margin: Margin, allowing for different margins on opposing sides (#1219).
    • Renamed Plot::custom_label_func to Plot::label_formatter (#1235).
    • Areas::layer_id_at ignores non-interatable layers (i.e. Tooltips) (#1240).
    • ScrollArea:s will not shrink below a certain minimum size, set by min_scrolled_width/min_scrolled_height (1255).
    • For integrations:
      • Output has now been renamed PlatformOutput and Context::run now returns the new FullOutput (#1292).
      • FontImage has been replaced by TexturesDelta (found in FullOutput), describing what textures were loaded and freed each frame (#1110).
      • The painter must support partial texture updates (#1149).
      • Added RawInput::max_texture_side which should be filled in with e.g. GL_MAX_TEXTURE_SIZE (#1154).

    ๐Ÿ›  Fixed ๐Ÿ›

    • Plot Orientation was not public, although fields using this type were (#1130).
    • Context menus now respects the theme (#1043).
    • Calling Context::set_pixels_per_point before 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).

    Contributors ๐Ÿ™

  • v0.16.1 Changes

    December 31, 2021

    โž• Added โญ

    • Added back CtxRef::begin_frame,end_frame as an alternative to CtxRef::run.
  • v0.16.0 Changes

    December 29, 2021

    โž• Added โญ

    • Added context menus: See Ui::menu_button and Response::context_menu (#543).
    • ๐Ÿ‘ Most widgets containing text (Label, Button etc) now supports rich text (#855).
    • Plots:
      • Added bar charts and box plots (#863).
      • You can now query information about the plot (e.g. get the mouse position in plot coordinates, or the plot bounds) while adding items. Plot (#766 and #892).
    • 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::open to control if it is open or collapsed (#1006).
    • Added egui::widgets::color_picker::color_picker_color32 to show the color picker.

    ๐Ÿ”„ Changed ๐Ÿ”ง

    • ๐Ÿ‘ MSRV (Minimum Supported Rust Version) is now 1.56.0.
    • ๐Ÿ’ป ui.add(Button::new("โ€ฆ").text_color(โ€ฆ)) is now ui.button(RichText::new("โ€ฆ").color(โ€ฆ)) (same for Label )(#855).
    • Plots now provide a show method that has to be used to add items to and show the plot (#766).
    • ๐Ÿ’ป menu::menu(ui, ...) is now ui.menu_button(...) (#543)
    • Replaced CtxRef::begin_frame and end_frame with CtxRef::run (#872).
    • Replaced scroll_delta and zoom_delta in RawInput with Event::Scroll and Event::Zoom.
    • Unified the four Memory data buckets (data, data_temp, id_data and id_data_temp) into a single Memory::data, with a new interface (#836).
    • โœ… Replaced Ui::__test with egui::__run_test_ui (#872).

    ๐Ÿ›  Fixed ๐Ÿ›

    • ๐Ÿ›  Fixed ComboBox and 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 ๐Ÿ”ฅ

    • โœ‚ Removed egui::math (use egui::emath instead).
    • โœ‚ Removed egui::paint (use egui::epaint instead).

    Contributors ๐Ÿ™