Update Rust crate egui to 0.32.0 #263
Reference in New Issue
Block a user
No description provided.
Delete Branch "renovate/egui-0.x"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
0.31.1
->0.32.0
Release Notes
emilk/egui (egui)
v0.32.0
Compare Source
This is a big egui release, with several exciting new features!
Let's dive in!
⚛️ Atoms
egui::Atom
is the new, indivisible building blocks of egui (hence their name).An
Atom
is anenum
that can be eitherWidgetText
,Image
, orCustom
.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 ofAtom
s. Each atom can be customized with theAtomExt
traitwhich works on everything that implements
Into<Atom>
, so e.g.RichText
orImage
.So to create a
Button
with text and image you can now do: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:You can even use
Atom::custom
to add custom content to Widgets. Here is a button in a button:https://github.com/user-attachments/assets/8c649784-dcc5-4979-85f8-e735b9cdd090
Currently, you need to use
atom_ui
to get aAtomResponse
which will have theRect
to use, but in the futurethis could be streamlined, e.g. by adding a
AtomKind::Callback
or by passing the Rects back withegui::Response
.Basing our widgets on
AtomLayout
also allowed us to improveResponse::intrinsic_size
, which will now report thecorrect 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
AtomLayout
, abstracting layouting within widgets #5830 by @lucasmerlinGalley::intrinsic_size
and use it inAtomLayout
#7146 by @lucasmerlin❕ Improved popups, tooltips, and menus
Introduces a new
egui::Popup
api. Checkout the new demo on https://egui.rs:https://github.com/user-attachments/assets/74e45243-7d05-4fc3-b446-2387e1412c05
We introduced a new
RectAlign
helper to align a rect relative to an other rect. ThePopup
will by default try to find the bestRectAlign
based on the source widgets position (previously submenus would annoyingly overlap if at the edge of the window):https://github.com/user-attachments/assets/0c5adb6b-8310-4e0a-b936-646bb4ec02f7
Tooltip
andmenu
have been rewritten based on the newPopup
api. They are now compatible with each other, meaning you can just show aui.menu_button()
in anyPopup
to get a sub menu. There are now customizableMenuButton
andSubMenuButton
structs, to help with customizing your menu buttons. This means menus now also supportPopupCloseBehavior
so you can remove yourclose_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 deprecatedegui::menu
menu.We also introduced
ui.close()
which closes the nearest container. So you can now conveniently closeWindow
s,Collapsible
s,Modal
s andPopup
s from within. To use this for your own containers, callUiBuilder::closable
and then check for closing within that ui viaui.should_close()
.Details
Popup
andTooltip
, unifying the previous behaviours #5713 by @lucasmerlinUi::close
andResponse::should_close
#5729 by @lucasmerlinegui::Popup
#5716 by @lucasmerlinPopup
API for the color picker button #7137 by @lucasmerlinMemory::keep_popup_open
isn't called #5814 by @juancampaMemory::popup
API in favor of newPopup
API #7317 by @emilk▲ Improved SVG support
You can render SVG in egui with
(Requires the use of
egui_extras
, with thesvg
feature enabled and a call toinstall_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 theUi
that contained it. Now SVG:s are always pixel-perfect, for truly scalable graphics.Details
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.
Details
Migration guide
We have some silently breaking changes (code compiles fine but behavior changed) that require special care:
Menus close on click by default
ui.close_menu()
calls from button click handlers since they are obsoletePopupCloseBehavior
:SubMenuButton
, but by default it should be passed to any submenus when usingMenuButton
.Memory::is_popup_open
api now requires calls toMemory::keep_popup_open
keep_popup_open
is not called.Popup
api which handles this for you.keep_popup_open
:⭐ Other improvements
Label::show_tooltip_when_elided
#5710 by @brycebergerUi::allocate_new_ui
in favor ofUi::scope_builder
#5764 by @lucasmerlinexpand_bg
to customize size of text background #5365 by @MeGaGiGaGonTextBuffer
forlayouter
inTextEdit
instead of&str
#5712 by @kernelkindSlider::update_while_editing(bool)
API #5978 by @mbernatScene::drag_pan_buttons
option. Allows specifying which pointer buttons pan the scene by dragging #5892 by @mitchmindtreeScene::sense
to customize howScene
responds to user input #5893 by @mitchmindtreeTextEdit
arrow navigation to handle Unicode graphemes #5812 by @MStarhaScrollArea
improvements for user configurability #5443 by @MStarhaResponse::clicked_with_open_in_background
#7093 by @emilkModifiers::matches_any
#7123 by @emilkContext::format_modifiers
#7125 by @emilkOperatingSystem::is_mac
#7122 by @emilkContext::current_pass_index
#7276 by @emilkContext::cumulative_frame_nr
#7278 by @emilkVisuals::text_edit_bg_color
#7283 by @emilkVisuals::weak_text_alpha
andweak_text_color
#7285 by @emilkegui::Sides
shrink_left
/shrink_right
#7295 by @lucasmerlin🔧 Changed
hint_text
inWidgetInfo
#5724 by @bircniDefault
forThemePreference
#5702 by @MichaelGruppavailable_rect
docs with the new reality after #4590 #5701 by @podusowskiViewport
positioning #5715 by @aspiringLichSizeHint
#7079 by @emilkInputOptions
#7121 by @emilkButton
inherits thealt_text
of theImage
in it, if any #7136 by @emilkTooltip
slightly #7151 by @emilkui.disable()
to modify opacity #7282 by @emilkBitOr
andBitOrAssign
forRect
#7319 by @lucasmerlin🔥 Removed
SelectableLabel
#7277 by @lucasmerlin🐛 Fixed
Scene
: makescene_rect
full size on reset #5801 by @graydenshandScene
:TextEdit
selection when placed in aScene
#5791 by @karhuScene
: Set transform layer before calling user content #5884 by @mitchmindtreeTextShape
underline width #5865 by @emilkconsume_key
#7134 by @lucasmerlinemoji-icon-font
with fix for fullwidth latin characters #7067 by @emilkScrollArea
#5286 by @gilbertoalexsantosResponse::clicked_elsewhere
not returningtrue
sometimes #5798 by @lucasmerlinDragValue
expansion when editing #5809 by @MStarhaDragValue
eating focus, causing focus to reset #5826 by @KonaeAkiraavailable_space
#6900 by @lucasmerlinleading_space
sometimes being ignored during paragraph splitting #7031 by @afishhhComboBox::from_id_source
#7055 by @aelmizebend_pass
is called for all loaders #7072 by @emilkdebug_assert
triggered bymenu
/intersect_ray
#7299 by @emilkRect::area
to return zero for negative rectangles #7305 by @emilk🚀 Performance
WidgetText
smaller and faster #6903 by @lucasmerlinConfiguration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.