summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorClement Tsang <34804052+ClementTsang@users.noreply.github.com>2022-11-05 19:32:14 -0400
committerGitHub <noreply@github.com>2022-11-05 19:32:14 -0400
commit4d9f5093b22a700244c4349a86d42b4d1ecbe8c6 (patch)
tree99f349cf3b8b250fcbeadf3842ed984cf107974d /src
parente6e1e9d688e667539333a665b77a52ae2dca7095 (diff)
feature: basic sortable temp (#868)
* feature: basic sortable temp * add shortcuts * fix missing shortcut names in header * update changelog * update docs
Diffstat (limited to 'src')
-rw-r--r--src/app.rs56
-rw-r--r--src/app/widgets/process_table.rs2
-rw-r--r--src/app/widgets/temperature_table.rs69
-rw-r--r--src/bin/main.rs6
-rw-r--r--src/lib.rs7
5 files changed, 106 insertions, 34 deletions
diff --git a/src/app.rs b/src/app.rs
index e22da239..9029db5e 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -1206,6 +1206,7 @@ impl App {
}
}
+ // FIXME: Refactor this system...
fn handle_char(&mut self, caught_char: char) {
match caught_char {
'/' => {
@@ -1310,12 +1311,34 @@ impl App {
'L' | 'D' => self.move_widget_selection(&WidgetDirection::Right),
'K' | 'W' => self.move_widget_selection(&WidgetDirection::Up),
'J' | 'S' => self.move_widget_selection(&WidgetDirection::Down),
- 't' => self.toggle_tree_mode(),
+ 't' => {
+ if let BottomWidgetType::Proc = self.current_widget.widget_type {
+ self.toggle_tree_mode()
+ } else if let Some(temp) = self
+ .temp_state
+ .get_mut_widget_state(self.current_widget.widget_id)
+ {
+ temp.table.set_sort_index(1);
+ temp.force_data_update();
+ self.is_force_redraw = true;
+ }
+ }
'+' => self.on_plus(),
'-' => self.on_minus(),
'=' => self.reset_zoom(),
'e' => self.toggle_expand_widget(),
- 's' => self.toggle_sort_menu(),
+ 's' => {
+ if let BottomWidgetType::Proc = self.current_widget.widget_type {
+ self.toggle_sort_menu()
+ } else if let Some(temp) = self
+ .temp_state
+ .get_mut_widget_state(self.current_widget.widget_id)
+ {
+ temp.table.set_sort_index(0);
+ temp.force_data_update();
+ self.is_force_redraw = true;
+ }
+ }
'I' => self.invert_sort(),
'%' => self.toggle_percentages(),
_ => {}
@@ -2562,19 +2585,28 @@ impl App {
// We might have clicked on a header! Check if we only exceeded the table + border offset, and
// it's implied we exceeded the gap offset.
if clicked_entry == border_offset {
- if let BottomWidgetType::Proc = &self.current_widget.widget_type {
- if let Some(proc_widget_state) = self
- .proc_state
- .get_mut_widget_state(self.current_widget.widget_id)
- {
- if proc_widget_state
- .table
- .try_select_location(x, y)
- .is_some()
+ match &self.current_widget.widget_type {
+ BottomWidgetType::Proc => {
+ if let Some(state) = self
+ .proc_state
+ .get_mut_widget_state(self.current_widget.widget_id)
{
- proc_widget_state.force_data_update();
+ if state.table.try_select_location(x, y).is_some() {
+ state.force_data_update();
+ }
+ }
+ }
+ BottomWidgetType::Temp => {
+ if let Some(state) = self
+ .temp_state
+ .get_mut_widget_state(self.current_widget.widget_id)
+ {
+ if state.table.try_select_location(x, y).is_some() {
+ state.force_data_update();
+ }
}
}
+ _ => (),
}
}
}
diff --git a/src/app/widgets/process_table.rs b/src/app/widgets/process_table.rs
index f0253da2..bb268356 100644
--- a/src/app/widgets/process_table.rs
+++ b/src/app/widgets/process_table.rs
@@ -262,7 +262,7 @@ impl ProcWidget {
/// This function *only* updates the displayed process data. If there is a need to update the actual *stored* data,
/// call it before this function.
- pub fn update_displayed_process_data(&mut self, data_collection: &DataCollection) {
+ pub fn ingest_data(&mut self, data_collection: &DataCollection) {
let data = match &self.mode {
ProcWidgetMode::Grouped | ProcWidgetMode::Normal => {
self.get_normal_data(&data_collection.process_data.process_harvest)
diff --git a/src/app/widgets/temperature_table.rs b/src/app/widgets/temperature_table.rs
index 0be51ffe..a19d1fe5 100644
--- a/src/app/widgets/temperature_table.rs
+++ b/src/app/widgets/temperature_table.rs
@@ -8,10 +8,10 @@ use crate::{
app::{data_harvester::temperature::TemperatureType, AppConfigFields},
canvas::canvas_colours::CanvasColours,
components::data_table::{
- Column, ColumnHeader, DataTable, DataTableColumn, DataTableProps, DataTableStyling,
- DataToCell,
+ ColumnHeader, DataTableColumn, DataTableProps, DataTableStyling, DataToCell, SortColumn,
+ SortDataTable, SortDataTableProps, SortOrder, SortsRow,
},
- utils::gen_util::truncate_text,
+ utils::gen_util::{sort_partial_fn, truncate_text},
};
#[derive(Clone)]
@@ -29,8 +29,8 @@ pub enum TempWidgetColumn {
impl ColumnHeader for TempWidgetColumn {
fn text(&self) -> Cow<'static, str> {
match self {
- TempWidgetColumn::Sensor => "Sensor".into(),
- TempWidgetColumn::Temp => "Temp".into(),
+ TempWidgetColumn::Sensor => "Sensor(s)".into(),
+ TempWidgetColumn::Temp => "Temp(t)".into(),
}
}
}
@@ -72,34 +72,67 @@ impl DataToCell<TempWidgetColumn> for TempWidgetData {
}
}
+impl SortsRow for TempWidgetColumn {
+ type DataType = TempWidgetData;
+
+ fn sort_data(&self, data: &mut [Self::DataType], descending: bool) {
+ match self {
+ TempWidgetColumn::Sensor => {
+ data.sort_by(|a, b| sort_partial_fn(descending)(&a.sensor, &b.sensor));
+ }
+ TempWidgetColumn::Temp => {
+ data.sort_by(|a, b| {
+ sort_partial_fn(descending)(a.temperature_value, b.temperature_value)
+ });
+ }
+ }
+ }
+}
+
pub struct TempWidgetState {
- pub table: DataTable<TempWidgetData, TempWidgetColumn>,
+ pub table: SortDataTable<TempWidgetData, TempWidgetColumn>,
+ pub force_update_data: bool,
}
impl TempWidgetState {
pub fn new(config: &AppConfigFields, colours: &CanvasColours) -> Self {
- const COLUMNS: [Column<TempWidgetColumn>; 2] = [
- Column::soft(TempWidgetColumn::Sensor, Some(0.8)),
- Column::soft(TempWidgetColumn::Temp, None),
+ let columns = [
+ SortColumn::soft(TempWidgetColumn::Sensor, Some(0.8)),
+ SortColumn::soft(TempWidgetColumn::Temp, None).default_descending(),
];
- let props = DataTableProps {
- title: Some(" Temperatures ".into()),
- table_gap: config.table_gap,
- left_to_right: false,
- is_basic: config.use_basic_mode,
- show_table_scroll_position: config.show_table_scroll_position,
- show_current_entry_when_unfocused: false,
+ let props = SortDataTableProps {
+ inner: DataTableProps {
+ title: Some(" Temperatures ".into()),
+ table_gap: config.table_gap,
+ left_to_right: false,
+ is_basic: config.use_basic_mode,
+ show_table_scroll_position: config.show_table_scroll_position,
+ show_current_entry_when_unfocused: false,
+ },
+ sort_index: 0,
+ order: SortOrder::Ascending,
};
let styling = DataTableStyling::from_colours(colours);
Self {
- table: DataTable::new(COLUMNS, props, styling),
+ table: SortDataTable::new_sortable(columns, props, styling),
+ force_update_data: false,
}
}
+ /// Forces an update of the data stored.
+ #[inline]
+ pub fn force_data_update(&mut self) {
+ self.force_update_data = true;
+ }
+
pub fn ingest_data(&mut self, data: &[TempWidgetData]) {
- self.table.set_data(data.to_vec());
+ let mut data = data.to_vec();
+ if let Some(column) = self.table.columns.get(self.table.sort_index()) {
+ column.sort_by(&mut data, self.table.order());
+ }
+ self.table.set_data(data);
}
}
diff --git a/src/bin/main.rs b/src/bin/main.rs
index a5473b00..a5e87819 100644
--- a/src/bin/main.rs
+++ b/src/bin/main.rs
@@ -196,7 +196,11 @@ fn main() -> Result<()> {
app.converted_data.ingest_temp_data(
&app.data_collection,
app.app_config_fields.temperature_type,
- )
+ );
+
+ for temp in app.temp_state.widget_states.values_mut() {
+ temp.force_data_update();
+ }
}
// Memory
diff --git a/src/lib.rs b/src/lib.rs
index 7bfadfe4..8d5db159 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -330,7 +330,7 @@ pub fn update_data(app: &mut App) {
for proc in app.proc_state.widget_states.values_mut() {
if proc.force_update_data {
- proc.update_displayed_process_data(data_source);
+ proc.ingest_data(data_source);
proc.force_update_data = false;
}
}
@@ -353,7 +353,10 @@ pub fn update_data(app: &mut App) {
{
let data = &app.converted_data.temp_data;
for temp in app.temp_state.widget_states.values_mut() {
- temp.ingest_data(data);
+ if temp.force_update_data {
+ temp.ingest_data(data);
+ temp.force_update_data = false;
+ }
}
}
{