From 190615cd35ae29893ebd4dcfcb741095f0909265 Mon Sep 17 00:00:00 2001 From: ClementTsang Date: Mon, 20 Dec 2021 19:32:12 -0500 Subject: [PATCH] Temp before ctx --- src/app.rs | 2 +- src/tuine/application.rs | 2 +- src/tuine/component/base/text_table.rs | 11 ++++---- .../base/text_table/table_scroll_state.rs | 12 +++++++- src/tuine/context.rs | 28 ++++++++++++++++++- src/tuine/key.rs | 6 ++++ src/tuine/runtime.rs | 2 +- src/tuine/state.rs | 2 +- 8 files changed, 54 insertions(+), 11 deletions(-) diff --git a/src/app.rs b/src/app.rs index 6f244b72..ed2238a3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -29,7 +29,7 @@ use frozen_state::FrozenState; use crate::{ canvas::Painter, constants, - tuine::{Application, Element, Flex}, + tuine::{Application, ComponentContext, Element, Flex}, units::data_units::DataUnit, Pid, }; diff --git a/src/tuine/application.rs b/src/tuine/application.rs index 85051e2d..c56d791d 100644 --- a/src/tuine/application.rs +++ b/src/tuine/application.rs @@ -4,7 +4,7 @@ use tui::Terminal; use super::{ runtime::{self, RuntimeEvent}, - Element, Event, + ComponentContext, Element, Event, }; /// An alias to the [`tui::backend::CrosstermBackend`] writing to [`std::io::Stdout`]. diff --git a/src/tuine/component/base/text_table.rs b/src/tuine/component/base/text_table.rs index a1f830a9..78964df6 100644 --- a/src/tuine/component/base/text_table.rs +++ b/src/tuine/component/base/text_table.rs @@ -1,7 +1,7 @@ pub mod table_column; mod table_scroll_state; -use std::{borrow::Cow, cmp::min}; +use std::{borrow::Cow, cmp::min, panic::Location}; use tui::{ backend::Backend, @@ -14,7 +14,7 @@ use unicode_segmentation::UnicodeSegmentation; use crate::{ constants::TABLE_GAP_HEIGHT_LIMIT, - tuine::{DrawContext, Event, Status, TmpComponent}, + tuine::{ComponentContext, DrawContext, Event, Status, TmpComponent}, }; pub use self::table_column::{TextColumn, TextColumnConstraint}; @@ -27,8 +27,6 @@ pub struct StyleSheet { table_header: Style, } -pub enum TextTableMsg {} - /// A sortable, scrollable table for text data. pub struct TextTable<'a, Message> { state: TextTableState, @@ -45,9 +43,12 @@ pub struct TextTable<'a, Message> { } impl<'a, Message> TextTable<'a, Message> { + #[track_caller] pub fn new>>(columns: Vec) -> Self { + let state = TextTableState::default(); + Self { - state: TextTableState::default(), + state, column_widths: vec![0; columns.len()], columns: columns .into_iter() diff --git a/src/tuine/component/base/text_table/table_scroll_state.rs b/src/tuine/component/base/text_table/table_scroll_state.rs index 695b7853..46a6da8f 100644 --- a/src/tuine/component/base/text_table/table_scroll_state.rs +++ b/src/tuine/component/base/text_table/table_scroll_state.rs @@ -16,7 +16,7 @@ impl Default for ScrollDirection { } /// We save the previous window index for future reference, but we must invalidate if the area changes. -#[derive(Default)] +#[derive(PartialEq, Default)] struct WindowIndex { index: usize, cached_area: Rect, @@ -39,6 +39,16 @@ pub struct ScrollState { tui_state: TableState, } +impl PartialEq for ScrollState { + fn eq(&self, other: &Self) -> bool { + self.current_index == other.current_index + && self.window_index == other.window_index + && self.scroll_direction == other.scroll_direction + && self.num_items == other.num_items + && (self.tui_state.selected() == other.tui_state.selected()) + } +} + impl Default for ScrollState { fn default() -> Self { let mut tui_state = TableState::default(); diff --git a/src/tuine/context.rs b/src/tuine/context.rs index 05dad611..0772351e 100644 --- a/src/tuine/context.rs +++ b/src/tuine/context.rs @@ -1,6 +1,32 @@ +use std::panic::Location; + +use rustc_hash::FxHashMap; use tui::layout::Rect; -use super::LayoutNode; +use super::{Key, LayoutNode, State}; + +#[derive(Default)] +pub struct ComponentContext { + key_counter: usize, + state_map: FxHashMap>, + stale_map: FxHashMap, +} + +impl ComponentContext { + pub fn access_or_new( + &mut self, location: &'static Location<'static>, + ) -> &mut Box { + let key = Key::new(location, self.key_counter); + self.key_counter += 1; + + *(self.stale_map.entry(key).or_insert(true)) = true; + self.state_map + .entry(key) + .or_insert_with(|| Box::new(S::default())) + } + + pub fn cycle(&mut self) {} +} pub struct DrawContext<'a> { current_node: &'a LayoutNode, diff --git a/src/tuine/key.rs b/src/tuine/key.rs index 11e00ee5..05e70152 100644 --- a/src/tuine/key.rs +++ b/src/tuine/key.rs @@ -8,6 +8,12 @@ use std::panic::Location; #[derive(Clone, Copy, Hash, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Caller(&'static Location<'static>); +impl From<&'static Location<'static>> for Caller { + fn from(location: &'static Location<'static>) -> Self { + Caller(location) + } +} + /// A unique key built around using the [`Location`] given by /// `#[track_caller]` and a sequence index. #[derive(Clone, Copy, Hash, Debug, PartialEq, Eq, PartialOrd, Ord)] diff --git a/src/tuine/runtime.rs b/src/tuine/runtime.rs index 23d6361c..1062ea0b 100644 --- a/src/tuine/runtime.rs +++ b/src/tuine/runtime.rs @@ -4,7 +4,7 @@ use tui::{backend::Backend, layout::Rect, Terminal}; use crate::tuine::Status; -use super::{build_layout_tree, Application, Element, Event, TmpComponent}; +use super::{build_layout_tree, Application, ComponentContext, Element, Event, TmpComponent}; #[derive(Clone, Copy, Debug)] pub enum RuntimeEvent { diff --git a/src/tuine/state.rs b/src/tuine/state.rs index b60ebf17..0228ab3a 100644 --- a/src/tuine/state.rs +++ b/src/tuine/state.rs @@ -1,5 +1,5 @@ //! State code is heavily inspired by crochet's work - see -//! [here](https://github.com/raphlinus/crochet/blob/master/src/state.rs) for the original. +//! [here](https://github.com/raphlinus/crochet/blob/master/src/state.rs) for the original work. use std::any::Any;