egui/CHANGELOG.md
Emil Ernerfeldt de1a1ba9b2
New text layout (#682)
This PR introduces a completely rewritten text layout engine which is simpler and more powerful. It allows mixing different text styles (heading, body, etc) and formats (color, underlining, strikethrough, …) in the same layout pass, and baked into the same `Galley`.

This opens up the door to having a syntax-highlighed code editor, or a WYSIWYG markdown editor.

One major change is the color is now baked in at layout time. However, many widgets changes text color on hovered. But we need to do the text layout before we know if it is hovered. Therefor the painter has an option to override the text color of a galley.


## Performance
Text layout alone is about 20% slower, but a lot of that is because more tessellation is done upfront. Text tessellation is now a lot faster, but text layout + tessellation still lands at a net loss of 5-10% in performance. There are however a few tricks to speed it up (like using `smallvec`) which I am saving for later. Text layout is also cached, meaning that in most cases (when all text isn't changing each frame) text tessellation is actually more important (and that's more than 2x faster!).

Sadly, the actual text cache lookup is significantly slower (300ns -> 600ns). That's because the `TextLayoutJob` is a lot bigger (it has more options, like underlining, fonts etc), so it is slower to hash and compare. I have an idea how to speed this up, but I need to do some other work before I can implement that.

All in all, the performance impact on `demo_with_tesselate__realistic` is about 5-6% in the red. Not great; not terrible. The benefits are worth it, but I also think with some work I can get that down significantly, hopefully down to the old levels.
2021-09-03 18:18:00 +02:00

19 KiB

egui changelog

All notable changes to the egui crate will be documented in this file.

NOTE: eframe, egui_web and egui_glium have their own changelogs!

Unreleased

Added

  • Add horizontal scrolling support to ScrollArea and Window (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.

Changed 🔧

  • Hyperlink will now word-wrap just like a Label.
  • All Ui:s must now have a finite max_rect.
    • Deprecated: max_rect_finite, available_size_before_wrap_finite and available_rect_before_wrap_finite.
  • Painter/Fonts: text layout now expect color when creating a Galley. You may override that color with Painter::galley_with_color.

Fixed 🐛

  • Fix wrongly sized multiline TextEdit in justified layouts.

0.14.2 - 2021-08-28 - Window resize fix

Fixed 🐛

  • Fix window resize bug introduced in 0.14.1.

0.14.1 - 2021-08-28 - Layout bug fixes

Added

  • Add Ui::horizontal_top.

Fixed 🐛

  • Fix 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 TextEdit contents expand to fill width if applicable.
  • ProgressBar: add a minimum width and fix for having it in an infinite layout.
  • Fix sometimes not being able to click inside a combo box or popup menu.

0.14.0 - 2021-08-24 - Ui panels and bug fixes

Added

  • Panels can now be added to any Ui.
  • Plot:
    • Line styles.
    • Add show_background and show_axes methods to Plot.
  • Progress bar.
  • Grid::num_columns: allow the last column to take up the rest of the space of the parent Ui.
  • Add an API for dropping files into egui (see RawInput).
  • CollapsingHeader can now optionally be selectable.

Changed 🔧

  • A single-line TextEdit will 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 🐛

  • Fix custom font definitions getting replaced when pixels_per_point is changed.
  • Fix lost_focus for TextEdit.
  • Clicking the edge of a menu button will now properly open the menu.
  • Fix hover detection close to an Area.
  • Fix case where Plot's min_auto_bounds could be ignored after the first call to Plot::ui.
  • Fix slow startup when using large font files.

Contributors 🙏

0.13.1 - 2021-06-28 - Plot fixes

Added

  • Plot: you can now set the stroke of a HLine/VLine.

Changed 🔧

  • Plot::new now takes an id_source: impl Hash instead of a name: impl ToString. Functionally it is the same.

0.13.0 - 2021-06-24 - Better panels, plots and new visual style

Added

  • Plot:
  • Panels:
    • Add right and bottom panels (SidePanel::right and Panel::bottom).
    • Panels can now be resized.
    • Add an option to overwrite frame of a Panel.
  • Improve accessibility / screen reader.
  • Add ScrollArea::show_rows for efficient scrolling of huge UI:s.
  • Add ScrollArea::enable_scrolling to allow freezing scrolling when editing TextEdit widgets within it
  • Add Ui::set_visible as a way to hide widgets.
  • Add Style::override_text_style to easily change the text style of everything in a Ui (or globally).
  • You can now change TextStyle on checkboxes, radio buttons and SelectableLabel.
  • Add support for cint under cint feature.
  • Add features extra_asserts and extra_debug_asserts to enable additional checks.
  • TextEdit now supports edits on a generic buffer using TextBuffer.
  • Add Context::set_debug_on_hover and egui::trace!(ui)

Changed 🔧

  • Minimum Rust version is now 1.51 (used to be 1.52)
  • Tweaked the default visuals style.
  • Plot: Renamed Curve to Line.
  • TopPanel::top is now TopBottomPanel::top.
  • SidePanel::left no longet takes the default width by argument, but by a builder call.
  • SidePanel::left is resizable by default.

Fixed 🐛

  • Fix uneven lettering on non-integral device scales ("extortion lettering").
  • Fix invisible scroll bar when native window is too narrow for egui.

0.12.0 - 2021-05-10 - Multitouch, user memory, window pivots, and improved plots

Added

  • Add 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()).
  • Add Response::request_focus and Response::surrender_focus.
  • Add TextEdit::code_editor (VERY basic).
  • Pan and zoom plots.
  • Add plot legends.
  • Users can now store custom state in egui::Memory.
  • Add Response::on_disabled_hover_text to show tooltip for disabled widgets.
  • Zoom input: ctrl-scroll and (on egui_web) trackpad-pinch gesture.
  • Support for raw multi touch events, enabling zoom, rotate, and more. Works with egui_web on mobile devices, and should work with egui_glium for certain touch devices/screens.
  • Add (optional) compatibility with mint.

Changed 🔧

  • Make Memory::has_focus public (again).
  • Plot must now be given a name that is unique within its scope.
  • Tab only selects labels if the screen_reader option is turned on.
  • Rename ui.wrap to ui.scope.

Fixed 🐛

Removed 🔥

  • Moved experimental markup language to egui_demo_lib

0.11.0 - 2021-04-05 - Optimization, screen reader & new layout logic

Added

  • 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
  • Add the option to restrict the dragging bounds of Window and Area to a specified area using drag_bounds(rect).
  • Add support for small and raised text.
  • Add ui.set_row_height.
  • Add DebugOptions::show_widgets to debug layouting by hovering widgets.
  • Add ComboBox to more easily customize combo boxes.
  • Add Slider::new and DragValue::new to replace old type-specific constructors.
  • Add TextEdit::password to hide input characters.

Changed 🔧

  • ui.advance_cursor is now called ui.add_space.
  • kb_focus is now just called focus.

Fixed 🐛

Deprecated ☢️

  • Deprectated combo_box_with_label in favor of new ComboBox.
  • Deprectated type-specific constructors for Slider and DragValue (Slider::f32, DragValue::usize etc).

0.10.0 - 2021-02-28 - Plot and polish

Added

  • Add egui::plot::Plot to plot some 2D data.
  • Add 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_point to control the scale of the UI.
  • Add Response::changed() to query if e.g. a slider was dragged, text was entered or a checkbox was clicked.
  • Add support for all integers in DragValue and Slider (except 128-bit).

Changed 🔧

  • Improve the positioning of tooltips.
  • Only show tooltips if mouse is still.
  • Slider will now show the value display by default, unless turned off with .show_value(false).
  • The Slider value is now a DragValue which when dragged can pick values outside of the slider range (unless clamp_to_range is set).

0.9.0 - 2021-02-07 - Light Mode and much more

Added

  • Add support for secondary and middle mouse buttons.
  • Add Label methods for code, strong, strikethrough, underline and italics.
  • Add ui.group(|ui| { … }) to visually group some widgets within a frame.
  • Add Ui helpers for doing manual layout (ui.put, ui.allocate_ui_at_rect and more).
  • Add ui.set_enabled(false) to disable all widgets in a Ui (grayed out and non-interactive).
  • Add TextEdit::hint_text for showing a weak hint text when empty.
  • egui::popup::popup_below_widget: show a popup area below another widget.
  • Add 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.
  • Add Grid::max_col_width.

Changed 🔧

  • 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 \n characters.
  • Widgets will now more intelligently choose wether or not to wrap text.
  • mouse has been renamed pointer everywhere (to make it clear it includes touches too).
  • Most parts of Response are now methods, so if ui.button("…").clicked { is now if ui.button("…").clicked() {.
  • Response::active is now gone. You can use response.dragged() or response.clicked() instead.
  • Backend: pointer (mouse/touch) position and buttons are now passed to egui in the event stream.
  • DragValue::range is now called clamp_range and also clamps incoming values.
  • Renamed Triangles to Mesh.
  • The tessellator now wraps the clip rectangle and mesh in struct ClippedMesh(Rect, Mesh).
  • Mesh::split_to_u16 now returns a 16-bit indexed Mesh16.

Fixed 🐛

  • 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°).

0.8.0 - 2021-01-17 - Grid layout & new visual style

Added

  • Added a simple grid layout (Grid).
  • Added ui.allocate_at_least and ui.allocate_exact_size.
  • Added function InputState::key_down.
  • Added Window::current_pos to position a window.

Changed 🔧

  • New simpler and sleeker look!
  • Rename PaintCmd to Shape.
  • Replace tuple (Rect, Shape) with tuple-struct ClippedShape.
  • Rename feature "serde" to "persistence".
  • Break out the modules math and paint into separate crates emath and epaint.

Fixed 🐛

  • Fixed a bug that would sometimes trigger a "Mismatching panels" panic in debug builds.
  • Image and ImageButton will no longer stretch to fill a justified layout.

0.7.0 - 2021-01-04

Added

  • Add ui.scroll_to_cursor and response.scroll_to_me (#81 by lucaspoffo).
  • Add window.id(…) and area.id(…) for overriding the default Id.

Changed 🔧

  • Renamed Srgba to Color32.
  • All color contructions now starts with from_, e.g. Color32::from_rgb.
  • Renamed FontFamily::VariableWidth to FontFamily::Proportional.
  • Removed pixels_per_point from FontDefinitions.

Fixed 🐛

  • RepaintSignal now implements Sync so it can be sent to a background thread.
  • TextEdit widgets are now slightly larger to accommodate their frames.

Deprecated ☢️

  • Deprecated color::srgba.

0.6.0 - 2020-12-26

Added

  • Turn off Window title bars with window.title_bar(false).
  • ImageButton - ui.add(ImageButton::new(...)).
  • ui.vertical_centered and ui.vertical_centered_justified.
  • ui.allocate_painter helper.
  • 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 Slider or DragValue.
  • Add egui::math::Rot2: rotation helper.
  • Response now contains the Id of the widget it pertains to.
  • ui.allocate_response that allocates space and checks for interactions.
  • Add response.interact(sense), e.g. to check for clicks on labels.

Changed 🔧

  • ui.allocate_space now returns an (Id, Rect) tuple.
  • Arc<Context> has been replaced with CtxRef everywhere.
  • Slight tweak of the default Style and font sizes.
  • SidePanel::left and TopPanel::top now takes impl Hash as first argument.
  • A Window may now cover an existing CentralPanel.
  • ui.image now takes impl Into<Vec2> as a size argument.
  • Made some more fields of RawInput optional.
  • Slider and DragValue uses fewer decimals by default. See the full precision by hovering over the value.
  • egui::App: added fn name(&self) and fn clear_color(&self).
  • Combo boxes has scroll bars when needed.
  • Expand Window + Resize containers to be large enough for last frames content
  • ui.columns: Columns now defaults to justified top-to-down layouts.
  • Rename Sense::nothing() to Sense::hover().
  • Replaced parking_lot dependency with atomic_refcell by default.

Fixed 🐛

  • The background for CentralPanel will now cover unused space too.
  • ui.columns: Improve allocated size estimation.

Deprecated ☢️

  • RawInput::screen_size - use RawInput::screen_rect instead.
  • left/centered/right column functions on Ui.
  • ui.interact_hover and ui.hovered.

0.5.0 - 2020-12-13

Added

  • 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 at max_size.
  • ui.horizontal_wrapped_for_text: Like ui.horizontal_wrapped, but with spacing made for embedding text.
  • ui.horizontal_for_text: Like ui.horizontal, but with spacing made for embedding text.
  • egui::Layout now supports justified layouts where contents is also centered, right-aligned, etc.
  • ui.allocate_ui(size, |ui| ...): Easily create a child-Ui of a given size.
  • SelectableLabel (ui.selectable_label and ui.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).
  • Add Resize::id_source and ScrollArea::id_source to let the user avoid Id clashes.

Changed 🔧

  • New default font: Ubuntu-Light.
  • Make it simpler to override fonts in FontDefinitions.
  • Remove minimum button width.
  • Refactor egui::Layout substantially, changing its interface.
  • Calling on_hover_text/on_hover_ui multiple times will stack tooltips underneath the previous ones.
  • Text wrapping on labels, buttons, checkboxes and radio buttons is now based on the layout.

Removed 🔥

  • Removed the label! macro.

0.4.0 - 2020-11-28

Added

  • TextEdit improvements:
    • Much improved text editing, with better navigation and selection.
    • Move focus between TextEdit widgets with tab and shift-tab.
    • Undo edtis in a TextEdit.
    • You can now check if a TextEdit lost keyboard focus with response.lost_focus.
    • Added ui.text_edit_singleline and ui.text_edit_multiline.
  • You can now debug why your Ui is unexpectedly wide with ui.style_mut().debug.show_expand_width = true;

Changed 🔧

  • Pressing enter in a single-line TextEdit will now surrender keyboard focus for it.
  • You must now be explicit when creating a TextEdit if you want it to be singeline or multiline.
  • Improved automatic Id generation, making Id clashes less likely.
  • egui now requires modifier key state from the integration
  • Added, renamed and removed some keys in the Key enum.
  • Fixed incorrect text wrapping width on radio buttons

Fixed 🐛

  • Fixed bug where a lost widget could still retain keyboard focus.

0.3.0 - 2020-11-07

Added

  • Panels: you can now create panels using SidePanel, TopPanel and CentralPanel.
  • You can now override the default egui fonts.
  • Add 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.

Changed 🔧

  • ui.horizontal(...) etc returns Response.
  • Refactored the interface for egui::app::App.
  • Windows are now constrained to the screen.
  • Context::begin_frame() no longer returns a Ui. Instead put your widgets into a SidePanel, TopPanel, CentralPanel, Window or Area.
  • Context::end_frame() now returns shapes that need to be converted to triangles with Context::tessellate().
  • Anti-aliasing is now off by default in debug builds.

Removed 🔥

  • You can no longer throw windows.

Fixed 🐛

  • Fix a bug where some regions would slowly grow for non-integral scales (pixels_per_point).

0.2.0 - 2020-10-10

  • 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.checkbox and ui.radio

0.1.4 - 2020-09-08

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