Update table to support to support toggle col selection. (#159)
- Add `border` method to enable/disable border, default: `true`. - Update `stripe` default to false. - Update theme to remove table head color, just use window bg like. <img width="1263" alt="image" src="https://github.com/user-attachments/assets/2e0994a9-7172-4812-a0e2-3b3ba4281112"> Closes #155
This commit is contained in:
parent
a79d1a3dc2
commit
4490618c4a
3 changed files with 49 additions and 8 deletions
|
|
@ -83,6 +83,7 @@ struct CustomerTableDelegate {
|
||||||
col_resize: bool,
|
col_resize: bool,
|
||||||
col_order: bool,
|
col_order: bool,
|
||||||
col_sort: bool,
|
col_sort: bool,
|
||||||
|
col_selection: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CustomerTableDelegate {
|
impl CustomerTableDelegate {
|
||||||
|
|
@ -109,6 +110,7 @@ impl CustomerTableDelegate {
|
||||||
col_resize: true,
|
col_resize: true,
|
||||||
col_order: true,
|
col_order: true,
|
||||||
col_sort: true,
|
col_sort: true,
|
||||||
|
col_selection: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -161,6 +163,10 @@ impl TableDelegate for CustomerTableDelegate {
|
||||||
return self.col_resize && col_ix > 1;
|
return self.col_resize && col_ix > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn can_select_col(&self, _: usize) -> bool {
|
||||||
|
return self.col_selection;
|
||||||
|
}
|
||||||
|
|
||||||
fn render_td(
|
fn render_td(
|
||||||
&self,
|
&self,
|
||||||
row_ix: usize,
|
row_ix: usize,
|
||||||
|
|
@ -363,12 +369,19 @@ impl TableStory {
|
||||||
fn toggle_col_sort(&mut self, checked: &bool, cx: &mut ViewContext<Self>) {
|
fn toggle_col_sort(&mut self, checked: &bool, cx: &mut ViewContext<Self>) {
|
||||||
let table = self.table.clone();
|
let table = self.table.clone();
|
||||||
table.update(cx, |table, cx| {
|
table.update(cx, |table, cx| {
|
||||||
println!("- toggle_col_sort: {}", checked);
|
|
||||||
table.delegate_mut().col_sort = *checked;
|
table.delegate_mut().col_sort = *checked;
|
||||||
cx.notify();
|
cx.notify();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn toggle_col_selection(&mut self, checked: &bool, cx: &mut ViewContext<Self>) {
|
||||||
|
let table = self.table.clone();
|
||||||
|
table.update(cx, |table, cx| {
|
||||||
|
table.delegate_mut().col_selection = *checked;
|
||||||
|
cx.notify();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn on_table_event(
|
fn on_table_event(
|
||||||
&mut self,
|
&mut self,
|
||||||
_: View<Table<CustomerTableDelegate>>,
|
_: View<Table<CustomerTableDelegate>>,
|
||||||
|
|
@ -419,6 +432,12 @@ impl Render for TableStory {
|
||||||
.label("Column Sort")
|
.label("Column Sort")
|
||||||
.selected(delegate.col_sort)
|
.selected(delegate.col_sort)
|
||||||
.on_click(cx.listener(Self::toggle_col_sort)),
|
.on_click(cx.listener(Self::toggle_col_sort)),
|
||||||
|
)
|
||||||
|
.child(
|
||||||
|
Checkbox::new("col-selection")
|
||||||
|
.label("Column Selection")
|
||||||
|
.selected(delegate.col_selection)
|
||||||
|
.on_click(cx.listener(Self::toggle_col_selection)),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.child(self.table.clone())
|
.child(self.table.clone())
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,8 @@ pub struct Table<D: TableDelegate> {
|
||||||
|
|
||||||
/// Set stripe style of the table.
|
/// Set stripe style of the table.
|
||||||
stripe: bool,
|
stripe: bool,
|
||||||
|
/// Set to use border style of the table.
|
||||||
|
border: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
|
|
@ -130,6 +132,11 @@ pub trait TableDelegate: Sized + 'static {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether the column at the given index can be selected. Default: false
|
||||||
|
fn can_select_col(&self, col_ix: usize) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the width of the column at the given index.
|
/// Returns the width of the column at the given index.
|
||||||
/// Return None, use auto width.
|
/// Return None, use auto width.
|
||||||
///
|
///
|
||||||
|
|
@ -210,7 +217,8 @@ where
|
||||||
selected_col: None,
|
selected_col: None,
|
||||||
resizing_col: None,
|
resizing_col: None,
|
||||||
bounds: Bounds::default(),
|
bounds: Bounds::default(),
|
||||||
stripe: true,
|
stripe: false,
|
||||||
|
border: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.prepare_col_groups(cx);
|
this.prepare_col_groups(cx);
|
||||||
|
|
@ -225,11 +233,18 @@ where
|
||||||
&mut self.delegate
|
&mut self.delegate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set to use stripe style of the table, default to false.
|
||||||
pub fn stripe(mut self, stripe: bool) -> Self {
|
pub fn stripe(mut self, stripe: bool) -> Self {
|
||||||
self.stripe = stripe;
|
self.stripe = stripe;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set to use border style of the table, default to true.
|
||||||
|
pub fn border(mut self, border: bool) -> Self {
|
||||||
|
self.border = border;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
fn prepare_col_groups(&mut self, cx: &mut ViewContext<Self>) {
|
fn prepare_col_groups(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
self.col_groups = (0..self.delegate.cols_count())
|
self.col_groups = (0..self.delegate.cols_count())
|
||||||
.map(|col_ix| ColGroup {
|
.map(|col_ix| ColGroup {
|
||||||
|
|
@ -266,6 +281,10 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_col_head_click(&mut self, col_ix: usize, cx: &mut ViewContext<Self>) {
|
fn on_col_head_click(&mut self, col_ix: usize, cx: &mut ViewContext<Self>) {
|
||||||
|
if !self.delegate.can_select_col(col_ix) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
self.set_selected_col(col_ix, cx)
|
self.set_selected_col(col_ix, cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -342,7 +361,10 @@ where
|
||||||
|
|
||||||
/// Show Column selection style, when the column is selected and the selection state is Column.
|
/// Show Column selection style, when the column is selected and the selection state is Column.
|
||||||
fn col_wrap(&self, col_ix: usize, cx: &mut ViewContext<Self>) -> Div {
|
fn col_wrap(&self, col_ix: usize, cx: &mut ViewContext<Self>) -> Div {
|
||||||
if self.selected_col == Some(col_ix) && self.selection_state == SelectionState::Column {
|
if self.delegate().can_select_col(col_ix)
|
||||||
|
&& self.selected_col == Some(col_ix)
|
||||||
|
&& self.selection_state == SelectionState::Column
|
||||||
|
{
|
||||||
h_flex().bg(cx.theme().table_active)
|
h_flex().bg(cx.theme().table_active)
|
||||||
} else {
|
} else {
|
||||||
h_flex()
|
h_flex()
|
||||||
|
|
@ -796,9 +818,9 @@ where
|
||||||
let view = cx.view().clone();
|
let view = cx.view().clone();
|
||||||
div()
|
div()
|
||||||
.size_full()
|
.size_full()
|
||||||
.rounded_md()
|
.when(self.border, |this| {
|
||||||
.border_1()
|
this.rounded_md().border_1().border_color(cx.theme().border)
|
||||||
.border_color(cx.theme().border)
|
})
|
||||||
.bg(cx.theme().table)
|
.bg(cx.theme().table)
|
||||||
.child(inner_table)
|
.child(inner_table)
|
||||||
.child(ScrollableMask::new(
|
.child(ScrollableMask::new(
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ impl Colors {
|
||||||
list: hsl(0.0, 0.0, 100.),
|
list: hsl(0.0, 0.0, 100.),
|
||||||
list_even: hsl(240.0, 5.0, 96.0),
|
list_even: hsl(240.0, 5.0, 96.0),
|
||||||
list_active: hsl(240.0, 7., 88.0).opacity(0.75),
|
list_active: hsl(240.0, 7., 88.0).opacity(0.75),
|
||||||
list_head: hsl(240.0, 0., 94.),
|
list_head: hsl(0.0, 0.0, 100.),
|
||||||
link: hsl(221.0, 83.0, 53.0),
|
link: hsl(221.0, 83.0, 53.0),
|
||||||
menu: hsl(0.0, 0.0, 97.0),
|
menu: hsl(0.0, 0.0, 97.0),
|
||||||
}
|
}
|
||||||
|
|
@ -244,7 +244,7 @@ impl Colors {
|
||||||
list: hsl(0.0, 0.0, 6.0),
|
list: hsl(0.0, 0.0, 6.0),
|
||||||
list_even: hsl(240.0, 3.7, 8.0),
|
list_even: hsl(240.0, 3.7, 8.0),
|
||||||
list_active: hsl(240.0, 3.7, 15.0),
|
list_active: hsl(240.0, 3.7, 15.0),
|
||||||
list_head: hsl(240.0, 3.7, 10.9),
|
list_head: hsl(0.0, 0.0, 6.0),
|
||||||
link: hsl(221.0, 83.0, 53.0),
|
link: hsl(221.0, 83.0, 53.0),
|
||||||
menu: hsl(300.0, 2.0, 12.),
|
menu: hsl(300.0, 2.0, 12.),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue