diff --git a/crates/ui/src/components/data_table.rs b/crates/ui/src/components/data_table.rs index 379db6e2dad8484cdc87ca77c020b7f995d547fd..b6363c82386f70d1178610936175d7ac80ab9f13 100644 --- a/crates/ui/src/components/data_table.rs +++ b/crates/ui/src/components/data_table.rs @@ -3,11 +3,12 @@ use std::{ops::Range, rc::Rc}; use crate::{ ActiveTheme as _, AnyElement, App, Button, ButtonCommon as _, ButtonStyle, Color, Component, ComponentScope, Context, Div, ElementId, FixedWidth as _, FluentBuilder as _, HeaderResizeInfo, - Indicator, InteractiveElement, IntoElement, ParentElement, Pixels, RedistributableColumnsState, - RegisterComponent, RenderOnce, ScrollAxes, ScrollableHandle, Scrollbars, SharedString, - StatefulInteractiveElement, Styled, StyledExt as _, StyledTypography, TableResizeBehavior, - Window, WithScrollbar, bind_redistributable_columns, div, example_group_with_title, h_flex, px, - render_redistributable_columns_resize_handles, single_example, + Indicator, InteractiveElement, IntoElement, ParentElement, Pixels, RESIZE_COLUMN_WIDTH, + RESIZE_DIVIDER_WIDTH, RedistributableColumnsState, RegisterComponent, RenderOnce, ScrollAxes, + ScrollableHandle, Scrollbars, SharedString, StatefulInteractiveElement, Styled, StyledExt as _, + StyledTypography, TableResizeBehavior, Window, WithScrollbar, bind_redistributable_columns, + div, example_group_with_title, h_flex, px, render_redistributable_columns_resize_handles, + single_example, table_row::{IntoTableRow as _, TableRow}, v_flex, }; @@ -22,9 +23,6 @@ pub mod table_row; #[cfg(test)] mod tests; -const RESIZE_DIVIDER_WIDTH: f32 = 1.0; -const RESIZE_COLUMN_WIDTH: f32 = 8.0; - /// Used as the drag payload when resizing columns in `Resizable` mode. #[derive(Debug)] pub(crate) struct DraggedResizableColumn(pub(crate) usize); @@ -811,42 +809,31 @@ impl RenderOnce for Table { None }; - // Extract redistributable entity for drag/drop/prepaint handlers - let redistributable_entity = - interaction_state - .as_ref() - .and_then(|_| match &self.column_width_config { - ColumnWidthConfig::Redistributable { - columns_state: entity, - .. - } => Some(entity.clone()), - _ => None, - }); - - // Extract resizable entity for drag-move handler - let resizable_entity = - interaction_state - .as_ref() - .and_then(|_| match &self.column_width_config { - ColumnWidthConfig::Resizable(entity) => Some(entity.clone()), - _ => None, - }); + let (redistributable_entity, resizable_entity, resize_handles) = + if let Some(_) = interaction_state.as_ref() { + match &self.column_width_config { + ColumnWidthConfig::Redistributable { columns_state, .. } => ( + Some(columns_state.clone()), + None, + Some(render_redistributable_columns_resize_handles( + columns_state, + window, + cx, + )), + ), + ColumnWidthConfig::Resizable(entity) => ( + None, + Some(entity.clone()), + Some(render_resize_handles_resizable(entity, window, cx)), + ), + _ => (None, None, None), + } + } else { + (None, None, None) + }; let is_resizable = resizable_entity.is_some(); - let resize_handles = - interaction_state - .as_ref() - .and_then(|_| match &self.column_width_config { - ColumnWidthConfig::Redistributable { columns_state, .. } => Some( - render_redistributable_columns_resize_handles(columns_state, window, cx), - ), - ColumnWidthConfig::Resizable(entity) => { - Some(render_resize_handles_resizable(entity, window, cx)) - } - _ => None, - }); - let table = div() .when_some(table_width, |this, width| this.w(width)) .h_full() diff --git a/crates/ui/src/components/redistributable_columns.rs b/crates/ui/src/components/redistributable_columns.rs index 9e0e91143b209dc4eceb9618e46cf0f2deed4f8d..3253ead001275c5f1c17ab31be7a59576dcdad2b 100644 --- a/crates/ui/src/components/redistributable_columns.rs +++ b/crates/ui/src/components/redistributable_columns.rs @@ -16,8 +16,8 @@ use crate::{ px, }; -const RESIZE_COLUMN_WIDTH: f32 = 8.0; -const RESIZE_DIVIDER_WIDTH: f32 = 1.0; +pub(crate) const RESIZE_COLUMN_WIDTH: f32 = 8.0; +pub(crate) const RESIZE_DIVIDER_WIDTH: f32 = 1.0; #[derive(Debug)] struct DraggedColumn(usize); @@ -78,8 +78,9 @@ impl HeaderResizeInfo { pub fn reset_column(&self, col_idx: usize, window: &mut Window, cx: &mut App) { match &self.columns_state { ColumnsStateRef::Redistributable(weak) => { - weak.update(cx, |state, _| { + weak.update(cx, |state, cx| { state.reset_column_to_initial_width(col_idx, window); + cx.notify(); }) .ok(); } @@ -465,11 +466,12 @@ pub fn render_redistributable_columns_resize_handles( let columns_state = columns_state.clone(); move |event, window, cx| { if event.click_count() >= 2 { - columns_state.update(cx, |columns, _| { + columns_state.update(cx, |columns, cx| { columns.reset_column_to_initial_width( current_column_ix, window, ); + cx.notify(); }); }