NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #4923 most downloaded on crates.io
Docking system for egui - an immediate-mode GUI library for Rust
Last release 2 months ago
06 Aug 2026
Ships fairly regularly
a new release about every 3 months
Nearly every release is documented
notes for 41 of 43 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
43 releases · first in 2022
One column per quarter.
DockState serialised by previous versions of egui_dock failing to deserialise in 0.21.0.
DockState serialised by previous versions of egui_dock failing to deserialise in 0.21.0.
(#337)Hiding/showing tab bars for a given leaf.
"Widget changed layer_id" panic when undocking tabs.
### Breaking changes - Upgraded to egui 0.35.
Corrected outdated documentation.
Replaced all SurfaceIndex, NodeIndex, and TabIndex groupings with NodePath and TabPath in the argument lists of the following functions (#312):
SurfaceIndex, NodeIndex, and TabIndex groupings with NodePath and TabPath in the argument lists
of the following functions (#312):
DockState::set_active_tab,DockState::set_focused_node_and_surface,DockState::move_tab,DockState::detach_tab,DockState::remove_tab,DockState::remove_leaf,DockState::split,DockState::focused_leaf,TabViewer::context_menu,TabViewer::on_add,TabViewer::add_popup.DockState::iter_all_nodes now returns impl Iterator<Item = (NodePath, &Node<Tab>)>,DockState::iter_all_nodes_mut now returns impl Iterator<Item = (NodePath, &mut Node<Tab>)>,DockState::iter_all_tabs now returns impl Iterator<Item = (TabPath, &Tab)>,DockState::iter_all_tabs_mut now returns impl Iterator<Item = (TabPath, &mut Tab)>,DockState::iter_leaves now returns impl Iterator<Item = (NodePath, &LeafNode<Tab>)>,DockState::iter_leaves_mut now returns impl Iterator<Item = (NodePath, &mut LeafNode<Tab>)>,DockState::find_tab_from now returns Option<TabPath>,DockState::find_tab now returns Option<TabPath>,Surface::iter_all_tabs now returns impl Iterator<Item = ((NodeIndex, TabIndex), &Tab)>,Surface::iter_all_tabs_mut now returns impl Iterator<Item = ((NodeIndex, TabIndex), &mut Tab)>,Tree::set_active_tab now returns Result<()> (Err if any of the indices are invalid),LeafNode::::set_active_tab now returns Result<()> (Err if the tab index is invalid).impl From<(SurfaceIndex, NodeIndex, TabInsert)> for TabDestination was replaced with
impl From<(NodePath, TabInsert)> for TabDestination. (#312)NodePath and TabPath structs, useful for more consistent and terse indexing of nodes and tabs.
(#312)LeafNode with TabIndex. (#311)DockState using NodePath. (#312)DockState::node(_mut): returns a Node at a given NodePath,DockState::leaf(_mut): returns a LeafNode at a given NodePath,DockState::iter_surfaces(_mut)_indexed: returns a Surface iterator paired with its SurfaceIndex,Surface::iter_nodes(_mut)_indexed: returns a Node<Tab> iterator paired with its NodeIndex,Tree::leaf(_mut): returns a Result<&LeafNode<Tab>> at a given NodeIndex,Node::iter_tabs(_mut)_indexed: returns a Tab iterator paried with its TabIndex.DockArea::show - use DockArea::show_inside instead. (#314)Node separators are always clamped between their bounds.
Nodes underlying data has been split up into the LeafNode and SplitNode types, meaning that any match statements carried out on a node now needs to ac
Nodes underlying data has been split up into the LeafNode and SplitNode types, meaning that any match
statements carried out on a node now needs to account for this.Tree::set_active_tab now takes impl Into<NodeIndex> and impl Into<TabIndex> to make use slightly easier.Surface now implements Index<NodeIndex>/IndexMut<NodeIndex> which tries to access the surfaces node tree and
the node at the index. This will always panic when used on an empty surface as they do not have a node tree nor
nodes.DockState::iter_leaves and DockState::iter_leaves_mut - can be used to more efficiently iterate over leaf
nodes without needing to "unwrap" them from the Node enum.DockState::find_tab_from/Tree::find_tab_from - a more generalized version of the existing find_tab methods
which doesn't require the tab type to implement PartialEq.LeafNode which contains leaf node data and has the following methods:
new,set_active_tab,set_rect,rect,len,is_empty,tabs,tabs_mut,append_tab,insert_tab,remove_tab,retain_tabs,active_focused.SplitNode which contains data about node splits and has the following methods:
new,set_rect,rect.Node::get_leaf/Node::get_leaf_mut - an alternative way of trying to access leaf data in a node.TabBarStyle now has two new fields: inner_margin and
spacing. (#270)### Breaking changes - Upgraded to egui 0.31.
Each leaf can now be collapsed / closed individually. They are introduced as additional tab bar controls.
DockArea::show_leaf_close_all_buttons – shows a close all button which closes all open tabs in a leaf.DockArea::show_leaf_collapse_buttons – shows a collapsing button which collapses a leaf (no longer collapsing a
window).DockArea::show_secondary_button_hint – sets whether tooltip hints are shown for secondary buttons on tab bars.DockArea::show_leaf_collapse_buttons – shows a collapsing button which collapses a leaf (no longer collapsing a
window).DockArea::secondary_button_on_modifier – sets whether the secondary buttons on tab bars are activated by the
modifier key.DockArea::secondary_button_context_menu – sets whether the secondary buttons on tab bars are activated from a
context value by right-clicking primary buttons.LeafTranslations::close_all_buttonLeafTranslations::close_all_button_menu_hintLeafTranslations::close_all_button_modifier_hintLeafTranslations::close_all_button_modifier_menu_hintLeafTranslations::close_all_button_disabled_tooltipLeafTranslations::minimize_buttonLeafTranslations::minimize_button_menu_hintLeafTranslations::minimize_button_modifier_hintLeafTranslations::minimize_button_modifier_menu_hintNode::is_collapsed – returns whether the Node is collapsed.Node::collapsed_leaf_count – returns the number of collapsed layers of leaf subnodes.Node::set_collapsed – set the collapsing state of the Node.Node::set_collapsed_leaf_count – sets the number of collapsed layers of leaf subnodes.WindowState::minimized field – records whether a window is minimized.WindowState::expanded_height field – records the height of the window before it was fully collapsed.ButtonsStyle::{close_all_tabs, collapse_tabs, minimize_window}_colorButtonsStyle::{close_all_tabs, collapse_tabs, minimize_window}_active_colorButtonsStyle::{close_all_tabs, collapse_tabs, minimize_window}_bg_fillButtonsStyle::{close_all_tabs, collapse_tabs, minimize_window}_border_colorButtonsStyle::close_all_tabs_disabled_colorStyle::TAB_CLOSE_ALL_BUTTON_SIZEStyle::TAB_CLOSE_ALL_SIZEStyle::TAB_COLLAPSE_BUTTON_SIZEStyle::TAB_COLLAPSE_ARROW_SIZEStyle::TAB_EXPAND_BUTTON_SIZEStyle::TAB_EXPAND_ARROW_SIZETranslations::WindowTranslations to Translations::LeafTranslations.WindowTranslations::close_button_tooltip to LeafTranslations::close_button_disabled_tooltip.Translations::LeafTranslations now requires more fields to be constructed (see Added section).DockArea::show_window_close_buttons – no longer has any effect; consider using
DockArea::show_leaf_close_all_buttons
instead.DockArea::show_window_collapse_buttons – no longer has any effect; consider using
DockArea::show_leaf_collapse_buttons
instead.{DockState,Surface,Tree,Node}::{filter_map_tabs,map_tabs,filter_tabs,retain_tabs} no longer require the predicate to implement Clone.
{DockState,Surface,Tree,Node}::{filter_map_tabs,map_tabs,filter_tabs,retain_tabs} no longer require the predicate to
implement Clone. (#241)### Breaking changes - Upgraded to egui 0.28. - Changed MSRV to 1.76.
All Style structs are now serializable with serde.
Style structs are now serializable with serde. (#227)DockArea to resize a tiny bit on every frame.LeftRightOnly or TopBottomOnly.Tab body's background is now rounded with the value of TabBodyStyle::rounding.
TabBodyStyle::rounding.
(#232)filter_map_tabs sometimes deleting nodes when it shouldn't.
filter_map_tabs sometimes deleting nodes when it shouldn't.
(#230)Tabs now always appear at the pointer position while being dragged.
From #225:
Bug where tabs couldn't be re-docked onto the main surface if it's empty.
filter_map_tabs, filter_tabs, and retain_tabs.
Tabs, the close tab buttons and the add tab buttons are now focusable with the keyboard and interactable with the enter key and space bar.
TabStyle::active_with_kb_focus, TabStyle::inactive_with_kb_focus and TabStyle::focused_with_kb_focus for
style of tabs that are focused with the keyboard.Default implementations for {TabContextMenu,Window,}Translations with associated functions called
english. (#216)Fix crash after calling DockState::remove_tab.
DockState::remove_tab. (#208)Removed the deprecated DockState::iter.
DockArea::surfaces_countDockArea::iter_surfaces[_mut]DockArea::iter_all_tabs[_mut]DockArea::iter_all_nodes[_mut]Node::iter_tabs[_mut]Surface::iter_nodes[_mut]Surface::iter_all_tabs[_mut]DockState::iter.DockState::iter_nodes – use iter_all_nodes instead.DockState::iter_main_surface_nodes[_mut] – use dock_state.main_surface().iter() (and corresponding mut versions)
instead.Deserializing WindowState no longer crashes when screen_rect contains any f32::INFINITY values. Make sure to fix your last serialized app state by set
WindowState no longer crashes when screen_rect contains any f32::INFINITY values. Make sure to fix
your last serialized app state by setting screen_rect: null.
(#198)The tab bar no longer remains empty after it ends up having 0 width in any way.
Revised documentation for TabViewer.
egui to version 0.23.TabViewer.The "Eject" button is not available on tabs which are disallowed in windows.
TabViewer::clear_background now works as intended.
TabViewer::clear_background now works as intended. (#185)(Breaking) Renamed OverlayStyle::selection_storke_width to OverlayStyle::selection_stroke_width.
OverlayStyle::selection_storke_width to OverlayStyle::selection_stroke_width.TabInsert which replaces current TabDestination (see breaking changes).
This is the biggest update so far, introducing the long awaited undocking feature: tabs can now be dragged out into new egui windows. Massive thanks to Vickerinox for implementing it!
This update also includes an overhaul of the documentation, aiming to not only be more readable and correct, but also provide a guide of how to use the library.
Style::border
property. (#139)Style::main_surface_border_rounding for the rounding of the dock area border.TabStyle::active for the active style of a tab.TabStyle::inactive for the inactive style of a tab.TabStyle::focused for the focused style of a tab.TabStyle::hovered for the hovered style of a tab.TabStyle::tab_body for styling the body of the tab including background color, stroke color, rounding and inner
margin.TabStyle::minimum_width to set the minimum width of the tab.TabInteractionStyle to style the active/inactive/focused/hovered states of a tab.AllowedSplits enum which lets you choose in which directions a DockArea can be split.
(#145)DockState<Tab> containing the entire state of the tab hierarchies stored in a collection of Surfaces.Surface<Tab> enum which represents an area (e.g. a window) with its own Tree<Tab>.SurfaceIndex to identify a Surface stored in the DockState.Split::is_tob_bottom and Split::is_left_right.TabInsert which replaces current TabDestination (see breaking changes).impl From<(SurfaceIndex, NodeIndex, TabInsert)> for TabDestination.impl From<SurfaceIndex> for TabDestination.TabDestination::is_window (see breaking changes).Tree::root_node and Tree::root_node_mut.Node::rect returning the Rect occupied by the node.Node::tabs and Node::tabs_mut returning an optional slice of tabs if the node is a leaf.WindowState representing the current state of a Surface::Window and allowing you to manipulate the window.OverlayStyle (stored as Style::overlay) and OverlayFeel: they specify the look and feel of the drag-and-drop
overlay.OverlayType letting you choose if the overlay should be the new icon buttons or the old highlighted rectangles.LeafHighlighting specifying how a currently hovered leaf should be highlighted.DockArea::window_bounds setting the area which windows are constrained by.DockArea::show_window_close_buttons setting determining if windows should have a close button or not.DockArea::show_window_collapse_buttons setting determining if windows should have a collapse button or not.TabViewer::allowed_in_windows specifying if a given tab can be shown in a window.TabViewer::closable lets individual tabs be closable or not.
(#150)TabViewer::scroll_bars specifying if horizontal and vertical scrolling is enabled for given tab – replaces
DockArea::scroll_area_in_tabs (see breaking changes). (#160)Translations specifying what text will be displayed in some parts of the DockingArea, e.g. the tab context menus
(defined in TabContextMenuTranslations). (#178)TabStyle::inner_margin to TabBodyStyle::inner_margin.TabStyle::fill_tab_bar to TabBarStyle::fill_tab_bar.TabStyle::outline_color to TabInteractionStyle::outline_color.TabStyle::rounding to TabInteractionStyle::rounding.TabStyle::bg_fill to TabInteractionStyle::bg_fill.TabStyle::text_color_unfocused to TabStyle::inactive.text_color.TabStyle::text_color_active_focused to TabStyle::focused.text_color.TabStyle::text_color_active_unfocused to TabStyle::active.text_color.Style::tabs to Style::tab.TabStyle::text_color_focused. This style was practically never reachable.TabDestination now specifies if a tab will be moved to a Window, a Node, or an EmptySurface. Its original
purpose is now served by TabInsert.Tree::split now panics if supplied fraction is not in range 0..=1.Tree::move_tab to DockState::move_tab.Style::border to Style::main_surface_border_stroke.Style::selection_color to OverlayStyle::selection_color.DockArea::new now takes in a DockState instead of a Tree.DockArea::scroll_area_in_tabs – override TabViewer::scroll_bars
instead. (#160)TabViewer::{context_menu,on_add,add_popup} now take in an additional SurfaceIndex
parameter. (#167)Made the DockArea always allocate an area
DockArea always allocate an area (#143)Make the max_size of tabbar_inner_rect finite
max_size of tabbar_inner_rect finite (#141)Ensure rect size are calculated before drawing node bodies
Removed TabViewer::inner_margin_override – no deprecation as it's in direct conflict with TabViewer::tab_style_override
TabViewer::tab_style_override that lets you define a custom TabsStyle for an individual tab
(99333b0)ButtonsStyle::add_tab_border_color for the + button's left border
(99333b0)TabBarStyle::rounding for rounding of the tab bar, independent from tab rounding
(99333b0)from_egui methods for ButtonsStyle, SeparatorStyle, TabBarStyle, and TabStyle
(a660497)Removed
StyleBuilder (9a9b275)
Ensure rect size are calculated before drawing node bodies
Nothing published for this version
Ensure Tab have a stable egui::Id when moved
Tab have a stable egui::Id when moved (#121)draggable_tabs flag is unset
(#123)Tree::move_tab method that allows moving a tab from one node to the other
(#115)Tree::remove_leaf method that deletes a selected leaf node (#115)DockArea (#115)
show_add_popupshow_add_buttonsshow_close_buttonsdraggable_tabstab_context_menusscroll_area_in_tabsshow_tab_name_on_hoverTabViewer::id method that allows specifying a custom id for each tab
(#121)remove_empty_leaf which was used for internal usage and should not be needed by users
(#115)show_close_buttons from StyleBuilder (#115)Style to DockArea (#115)
show_add_popupshow_add_buttonsshow_close_buttonstabs_are_draggable (renamed to draggable_tabs)show_context_menu (renamed to tab_context_menus)tab_include_scrollarea (renamed to scroll_area_in_tabs)tab_hover_name (renamed to show_tab_name_on_hover)Style is now split up into smaller structs for maintainability and consistence with egui::Style
(#115)| Old names and locations | New names and locations |
|---|---|
Style::border_color and Style::border_width |
Style::border (which is now an egui::Stroke) |
Style::separator_width |
Separator::width |
Style::separator_extra |
Separator::extra |
Style::separator_color_idle |
Separator::color_idle |
Style::separator_color_hovered |
Separator::color_hovered |
Style::separator_color_dragged |
Separator::color_dragged |
Style::tab_bar_background_color |
TabBar::bg_fill |
Style::tab_bar_height |
TabBar::height |
Style::tab_outline_color |
Tabs::outline_color |
Style::hline_color |
Tabs::hline_color |
Style::hline_below_active_tab_name |
Tabs::hline_below_active_tab_name |
Style::tab_rounding |
Tabs::rounding |
Style::tab_background_color |
Tabs::bg_fill |
Style::tab_text_color_unfocused |
Tabs::text_color_unfocused |
Style::tab_text_color_focused |
Tabs::text_color_focused |
Style::tab_text_color_active_unfocused |
Tabs::text_color_active_unfocused |
Style::tab_text_color_active_focused |
Tabs::text_color_active_focused |
Style::expand_tabs |
Tabs::fill_tab_bar |
Style::close_tab_color |
Buttons::close_tab_color |
Style::close_tab_active_color |
Buttons::close_tab_active_color |
Style::close_tab_background_color |
Buttons::close_tab_bg_fill |
Style::add_tab_align |
Buttons::add_tab_align |
Style::add_tab_color |
Buttons::add_tab_color |
Style::add_tab_active_color |
Buttons::add_tab_active_color |
Style::add_tab_background_color |
Buttons::add_tab_bg_fill |
StyleBuilderTabViewer::clear_background works again
TabViewer::clear_background works again (#110)DockArea::show_inside no longer obscures previously added elements
Deleted dynamic_tab which was deprecated in 0.3.0
Style now includes an option to change the tab's height - tab_bar_height.
TabViewer::clear_background method that returns if current tab's background should be cleared.
TabViewer::clear_background method that returns if current tab's background should be cleared.
(#35)Style::show_close_buttons is true.
(#34)expand_tabs in Style and StyleBuiler causes tab titles to expand to match the width of their tab
bars.StyleBuilder::from_egui. (#40)Tree::find_active_focused. (#40)context_menu into TabViewer. (#46)ScrollArea inside a tab is now optional via Style. (#49)Tree::tabs: an iterator over the tabs in a tree. (#53)Style now includes an option to show the hovered tab's name. (#56)Style now includes an option to change default inner_margin. (#67)Tree::remove_tab (#70)TabViewer::inner_margin
to TabViewer::inner_margin_override. (#67)Style::with_separator_color has been split into separator_color_idle, separator_color_hovered,
separator_color_dragged (#68)egui to 0.20.0 #77dynamic_tab::TabContentdynamic_tab::OnClosedynamic_tab::ForceClosedynamic_tab::TabBuilderdynamic_tab::Tabdynamic_tab::BuiltTabdynamic_tab::DynamicTreedynamic_tab::DynamicTabViewerAdded opt-in serde feature to enable serialization of Tree.
serde feature to enable serialization of Tree.Style::tab_text_color_unfocused and Style::tab_text_color_focused.Tree::push_to_first_leaf no longer panics when used on an empty Tree.It is now possible to close tabs with a close button that can be shown/hidden through Style.
Style.Tree::push_to_focused_leaf will push the given tab to the currently active leaf.StyleBuilder for the Style.Style: separator_color, border_color, and border_width (last two for the cases when used
Margin).TabBuilder for the BuiltTab.Into<WidgetText> in tab titles.hello example.Tree::find_tab, TabViewer, DynamicTabViewer, DynamicTree.text_editor example.1.62.Tree is now generic over how you want to represent a tab.DockArea and is displayed with DockArea::show or DockArea::show_inside.Style::border_size to Style::border_width.Style::separator_size to Style::separator_width.Style::tab_text_color as you can now set the tab text color of a tab by passing RichText for its title.Tree::set_focused to Tree::set_focused_node.Node::None to Node::Empty.egui::ScrollArea, so it's now accessible in its entirety even if the tab is
too small to fit all of it.Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →