list, table: Refactor to control loading by use delegate. (#562)
- Add `loading` method to `ListDelegate` and `TableDelegate` to control loading view display. ## Break Changes - Remove `loading`, `set_loading` method from List and Table, use `loading` method in delegate instead.
This commit is contained in:
parent
9f2cd84b23
commit
78ce573a52
4 changed files with 33 additions and 35 deletions
|
|
@ -180,6 +180,10 @@ impl ListDelegate for CompanyListDelegate {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn loading(&self, _: &AppContext) -> bool {
|
||||||
|
self.loading
|
||||||
|
}
|
||||||
|
|
||||||
fn can_load_more(&self, _: &AppContext) -> bool {
|
fn can_load_more(&self, _: &AppContext) -> bool {
|
||||||
return !self.loading && !self.is_eof;
|
return !self.loading && !self.is_eof;
|
||||||
}
|
}
|
||||||
|
|
@ -381,10 +385,11 @@ impl Render for ListStory {
|
||||||
.child(
|
.child(
|
||||||
Checkbox::new("loading")
|
Checkbox::new("loading")
|
||||||
.label("Loading")
|
.label("Loading")
|
||||||
.checked(self.company_list.read(cx).loading())
|
.checked(self.company_list.read(cx).delegate().loading)
|
||||||
.on_click(cx.listener(|this, check: &bool, cx| {
|
.on_click(cx.listener(|this, check: &bool, cx| {
|
||||||
this.company_list.update(cx, |this, cx| {
|
this.company_list.update(cx, |this, cx| {
|
||||||
this.set_loading(*check, cx);
|
this.delegate_mut().loading = *check;
|
||||||
|
cx.notify();
|
||||||
})
|
})
|
||||||
})),
|
})),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,7 @@ struct StockTableDelegate {
|
||||||
col_sort: bool,
|
col_sort: bool,
|
||||||
col_selection: bool,
|
col_selection: bool,
|
||||||
loading: bool,
|
loading: bool,
|
||||||
|
full_loading: bool,
|
||||||
fixed_cols: bool,
|
fixed_cols: bool,
|
||||||
is_eof: bool,
|
is_eof: bool,
|
||||||
visible_rows: Range<usize>,
|
visible_rows: Range<usize>,
|
||||||
|
|
@ -253,6 +254,7 @@ impl StockTableDelegate {
|
||||||
col_selection: true,
|
col_selection: true,
|
||||||
fixed_cols: false,
|
fixed_cols: false,
|
||||||
loading: false,
|
loading: false,
|
||||||
|
full_loading: false,
|
||||||
is_eof: false,
|
is_eof: false,
|
||||||
visible_cols: Range::default(),
|
visible_cols: Range::default(),
|
||||||
visible_rows: Range::default(),
|
visible_rows: Range::default(),
|
||||||
|
|
@ -263,6 +265,7 @@ impl StockTableDelegate {
|
||||||
self.stocks = random_stocks(size);
|
self.stocks = random_stocks(size);
|
||||||
self.is_eof = false;
|
self.is_eof = false;
|
||||||
self.loading = false;
|
self.loading = false;
|
||||||
|
self.full_loading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_value_cell(&self, val: f64, cx: &mut ViewContext<Table<Self>>) -> AnyElement {
|
fn render_value_cell(&self, val: f64, cx: &mut ViewContext<Table<Self>>) -> AnyElement {
|
||||||
|
|
@ -471,6 +474,10 @@ impl TableDelegate for StockTableDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn loading(&self, _: &AppContext) -> bool {
|
||||||
|
self.full_loading
|
||||||
|
}
|
||||||
|
|
||||||
fn can_load_more(&self, _: &AppContext) -> bool {
|
fn can_load_more(&self, _: &AppContext) -> bool {
|
||||||
return !self.loading && !self.is_eof;
|
return !self.loading && !self.is_eof;
|
||||||
}
|
}
|
||||||
|
|
@ -774,10 +781,11 @@ impl Render for TableStory {
|
||||||
.child(
|
.child(
|
||||||
Checkbox::new("loading")
|
Checkbox::new("loading")
|
||||||
.label("Loading")
|
.label("Loading")
|
||||||
.checked(self.table.read(cx).loading())
|
.checked(self.table.read(cx).delegate().full_loading)
|
||||||
.on_click(cx.listener(|this, check: &bool, cx| {
|
.on_click(cx.listener(|this, check: &bool, cx| {
|
||||||
this.table.update(cx, |this, cx| {
|
this.table.update(cx, |this, cx| {
|
||||||
this.set_loading(*check, cx);
|
this.delegate_mut().full_loading = *check;
|
||||||
|
cx.notify();
|
||||||
})
|
})
|
||||||
})),
|
})),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,11 @@ pub trait ListDelegate: Sized + 'static {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the loading state to show the loading view.
|
||||||
|
fn loading(&self, cx: &AppContext) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a Element to show when loading, default is built-in Skeleton loading view.
|
/// Returns a Element to show when loading, default is built-in Skeleton loading view.
|
||||||
fn render_loading(&self, cx: &mut ViewContext<List<Self>>) -> impl IntoElement {
|
fn render_loading(&self, cx: &mut ViewContext<List<Self>>) -> impl IntoElement {
|
||||||
Loading
|
Loading
|
||||||
|
|
@ -122,7 +127,6 @@ pub struct List<D: ListDelegate> {
|
||||||
last_query: Option<String>,
|
last_query: Option<String>,
|
||||||
selectable: bool,
|
selectable: bool,
|
||||||
querying: bool,
|
querying: bool,
|
||||||
loading: bool,
|
|
||||||
scrollbar_visible: bool,
|
scrollbar_visible: bool,
|
||||||
vertical_scroll_handle: UniformListScrollHandle,
|
vertical_scroll_handle: UniformListScrollHandle,
|
||||||
scrollbar_state: Rc<Cell<ScrollbarState>>,
|
scrollbar_state: Rc<Cell<ScrollbarState>>,
|
||||||
|
|
@ -162,7 +166,6 @@ where
|
||||||
scrollbar_visible: true,
|
scrollbar_visible: true,
|
||||||
selectable: true,
|
selectable: true,
|
||||||
querying: false,
|
querying: false,
|
||||||
loading: false,
|
|
||||||
size: Size::default(),
|
size: Size::default(),
|
||||||
_search_task: Task::ready(()),
|
_search_task: Task::ready(()),
|
||||||
_load_more_task: Task::ready(()),
|
_load_more_task: Task::ready(()),
|
||||||
|
|
@ -201,17 +204,6 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the loading state of the list.
|
|
||||||
pub fn loading(&self) -> bool {
|
|
||||||
self.loading
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets list loading state.
|
|
||||||
pub fn set_loading(&mut self, loading: bool, cx: &mut ViewContext<Self>) {
|
|
||||||
self.loading = loading;
|
|
||||||
cx.notify();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_query_input(&mut self, query_input: View<TextInput>, cx: &mut ViewContext<Self>) {
|
pub fn set_query_input(&mut self, query_input: View<TextInput>, cx: &mut ViewContext<Self>) {
|
||||||
cx.subscribe(&query_input, Self::on_query_input_event)
|
cx.subscribe(&query_input, Self::on_query_input_event)
|
||||||
.detach();
|
.detach();
|
||||||
|
|
@ -483,6 +475,7 @@ where
|
||||||
let view = cx.view().clone();
|
let view = cx.view().clone();
|
||||||
let vertical_scroll_handle = self.vertical_scroll_handle.clone();
|
let vertical_scroll_handle = self.vertical_scroll_handle.clone();
|
||||||
let items_count = self.delegate.items_count(cx);
|
let items_count = self.delegate.items_count(cx);
|
||||||
|
let loading = self.delegate.loading(cx);
|
||||||
let sizing_behavior = if self.max_height.is_some() {
|
let sizing_behavior = if self.max_height.is_some() {
|
||||||
ListSizingBehavior::Infer
|
ListSizingBehavior::Infer
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -518,10 +511,10 @@ where
|
||||||
.child(input),
|
.child(input),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.when(self.loading, |this| {
|
.when(loading, |this| {
|
||||||
this.child(self.delegate().render_loading(cx))
|
this.child(self.delegate().render_loading(cx))
|
||||||
})
|
})
|
||||||
.when(!self.loading, |this| {
|
.when(!loading, |this| {
|
||||||
this.on_action(cx.listener(Self::on_action_cancel))
|
this.on_action(cx.listener(Self::on_action_cancel))
|
||||||
.on_action(cx.listener(Self::on_action_confirm))
|
.on_action(cx.listener(Self::on_action_confirm))
|
||||||
.on_action(cx.listener(Self::on_action_select_next))
|
.on_action(cx.listener(Self::on_action_select_next))
|
||||||
|
|
|
||||||
|
|
@ -171,8 +171,6 @@ pub struct Table<D: TableDelegate> {
|
||||||
size: Size,
|
size: Size,
|
||||||
/// The visible range of the rows and columns.
|
/// The visible range of the rows and columns.
|
||||||
visible_range: VisibleRangeState,
|
visible_range: VisibleRangeState,
|
||||||
/// The loading state of the table.
|
|
||||||
loading: bool,
|
|
||||||
|
|
||||||
_load_more_task: Task<()>,
|
_load_more_task: Task<()>,
|
||||||
}
|
}
|
||||||
|
|
@ -280,6 +278,11 @@ pub trait TableDelegate: Sized + 'static {
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return true to show the loading view.
|
||||||
|
fn loading(&self, cx: &AppContext) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
/// Return a Element to show when table is loading, default is built-in Skeleton loading view.
|
/// Return a Element to show when table is loading, default is built-in Skeleton loading view.
|
||||||
///
|
///
|
||||||
/// The size is the size of the Table.
|
/// The size is the size of the Table.
|
||||||
|
|
@ -370,7 +373,6 @@ where
|
||||||
size: Size::default(),
|
size: Size::default(),
|
||||||
scrollbar_visible: Edges::all(true),
|
scrollbar_visible: Edges::all(true),
|
||||||
visible_range: VisibleRangeState::default(),
|
visible_range: VisibleRangeState::default(),
|
||||||
loading: false,
|
|
||||||
_load_more_task: Task::ready(()),
|
_load_more_task: Task::ready(()),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -424,17 +426,6 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the loading state of the list.
|
|
||||||
pub fn loading(&self) -> bool {
|
|
||||||
self.loading
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Sets list loading state.
|
|
||||||
pub fn set_loading(&mut self, loading: bool, cx: &mut ViewContext<Self>) {
|
|
||||||
self.loading = loading;
|
|
||||||
cx.notify();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// When we update columns or rows, we need to refresh the table.
|
/// When we update columns or rows, we need to refresh the table.
|
||||||
pub fn refresh(&mut self, cx: &mut ViewContext<Self>) {
|
pub fn refresh(&mut self, cx: &mut ViewContext<Self>) {
|
||||||
self.prepare_col_groups(cx);
|
self.prepare_col_groups(cx);
|
||||||
|
|
@ -1291,6 +1282,7 @@ where
|
||||||
let cols_count: usize = self.delegate.cols_count(cx);
|
let cols_count: usize = self.delegate.cols_count(cx);
|
||||||
let left_cols_count = self.fixed_cols.left;
|
let left_cols_count = self.fixed_cols.left;
|
||||||
let rows_count = self.delegate.rows_count(cx);
|
let rows_count = self.delegate.rows_count(cx);
|
||||||
|
let loading = self.delegate.loading(cx);
|
||||||
|
|
||||||
let row_height = self
|
let row_height = self
|
||||||
.vertical_scroll_handle
|
.vertical_scroll_handle
|
||||||
|
|
@ -1400,10 +1392,10 @@ where
|
||||||
this.rounded_md().border_1().border_color(cx.theme().border)
|
this.rounded_md().border_1().border_color(cx.theme().border)
|
||||||
})
|
})
|
||||||
.bg(cx.theme().table)
|
.bg(cx.theme().table)
|
||||||
.when(self.loading, |this| {
|
.when(loading, |this| {
|
||||||
this.child(self.delegate().render_loading(self.size, cx))
|
this.child(self.delegate().render_loading(self.size, cx))
|
||||||
})
|
})
|
||||||
.when(!self.loading, |this| {
|
.when(!loading, |this| {
|
||||||
this.child(inner_table)
|
this.child(inner_table)
|
||||||
.child(ScrollableMask::new(
|
.child(ScrollableMask::new(
|
||||||
cx.view().entity_id(),
|
cx.view().entity_id(),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue