1use crate::grid::config::Entity;
2
3/// A trait which is responsible for configuration of a [`Table`].
4///
5/// [`Table`]: crate::Table
6pub trait TableOption<R, C, D> {
7 /// The function modificaties of records and a grid configuration.
8 fn change(self, records: &mut R, cfg: &mut C, dimension: &mut D);
9
10 /// A hint whether an [`TableOption`] is going to change table layout.
11 ///
12 /// Return [`None`] if no changes are being done.
13 /// Otherwise return:
14 ///
15 /// - [Entity::Global] - a grand layout changed. (a change which MIGHT require height/width update)
16 /// - [Entity::Row] - a certain row was changed. (a change which MIGHT require height update)
17 /// - [Entity::Column] - a certain column was changed. (a change which MIGHT require width update)
18 /// - [Entity::Cell] - a certain cell was changed. (a local change, no width/height update)
19 ///
20 /// By default it's considered to be a grand change.
21 ///
22 /// This methods primarily is used as an optimization,
23 /// to not make unnessary calculations if they're not needed, after using the [`TableOption`].
24 fn hint_change(&self) -> Option<Entity> {
25 Some(Entity::Global)
26 }
27}
28
29// todo: probably we could add one more hint but it likely require Vec<Entity>,
30// so, as I am not sure about exact interface it's better be commented.
31// /// A hint which layout part a [`TableOption`] is going to change.
32// ///
33// /// Return [`None`] if no part are being changed.
34// /// Otherwise return:
35// ///
36// /// - [Entity::Global] - a total layout affection.
37// /// - [Entity::Row] - a certain row affection.
38// /// - [Entity::Column] - a certain column affection.
39// /// - [Entity::Cell] - a certain cell affection.
40// ///
41// /// By default it's considered to be a grand change.
42// ///
43// /// This methods primarily is used as an optimization,
44// /// to not make unnessary calculations if they're not needed, after using the [`TableOption`].
45// fn hint_target(&self, records: &R) -> Option<Vec<Entity>> {
46// let _ = records;
47// Some(vec![Entity::Global])
48// }
49
50impl<T, R, C, D> TableOption<R, C, D> for &[T]
51where
52 for<'a> &'a T: TableOption<R, C, D>,
53{
54 fn change(self, records: &mut R, cfg: &mut C, dimension: &mut D) {
55 for opt: &T in self {
56 opt.change(records, cfg, dimension)
57 }
58 }
59}
60
61#[cfg(feature = "std")]
62impl<T, R, D, C> TableOption<R, C, D> for Vec<T>
63where
64 T: TableOption<R, C, D>,
65{
66 fn change(self, records: &mut R, cfg: &mut C, dimension: &mut D) {
67 for opt: T in self {
68 opt.change(records, cfg, dimension)
69 }
70 }
71}
72