explore: remove Bottom and Right orientations (#10559)

The value rendering code in explore is _very_ flexible; values can be
rendered with orientation `Top`, `Left`, `Bottom`, or `Right`. The
default is `Top` for tables (header at the top) and `Left` for records
(header on the left).

This PR removes `Bottom` and `Right`; they are largely untested,
probably used by nobody, and they complicate the rendering code.

## Testing Performed

I've manually confirmed that tables and records still render the same
ass before, and the `t`/transpose command still works.
This commit is contained in:
Reilly Wood 2023-09-30 15:10:59 -05:00 committed by GitHub
parent fa2e6e5d53
commit 30c331e882
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 103 deletions

View file

@ -197,8 +197,8 @@ impl<'a> RecordView<'a> {
let layer = self.get_layer_last(); let layer = self.get_layer_last();
let (row, column) = match layer.orientation { let (row, column) = match layer.orientation {
Orientation::Top | Orientation::Bottom => (row, column), Orientation::Top => (row, column),
Orientation::Left | Orientation::Right => (column, row), Orientation::Left => (column, row),
}; };
layer.records[row][column].clone() layer.records[row][column].clone()
@ -227,11 +227,11 @@ impl<'a> RecordView<'a> {
fn update_cursors(&mut self, rows: usize, columns: usize) { fn update_cursors(&mut self, rows: usize, columns: usize) {
match self.get_layer_last().orientation { match self.get_layer_last().orientation {
Orientation::Top | Orientation::Bottom => { Orientation::Top => {
self.get_layer_last_mut().cursor.set_window(rows, columns); self.get_layer_last_mut().cursor.set_window(rows, columns);
} }
Orientation::Left | Orientation::Right => { Orientation::Left => {
self.get_layer_last_mut().cursor.set_window(rows, columns); self.get_layer_last_mut().cursor.set_window(rows, columns);
} }
} }
@ -350,9 +350,7 @@ impl View for RecordView<'_> {
if let Some(orientation) = hm.get("orientation").and_then(|v| v.as_string().ok()) { if let Some(orientation) = hm.get("orientation").and_then(|v| v.as_string().ok()) {
let orientation = match orientation.as_str() { let orientation = match orientation.as_str() {
"left" => Some(Orientation::Left), "left" => Some(Orientation::Left),
"right" => Some(Orientation::Right),
"top" => Some(Orientation::Top), "top" => Some(Orientation::Top),
"bottom" => Some(Orientation::Bottom),
_ => None, _ => None,
}; };
@ -375,9 +373,8 @@ fn get_element_info(
) -> Option<&ElementInfo> { ) -> Option<&ElementInfo> {
let with_head = with_head as usize; let with_head = with_head as usize;
let index = match orientation { let index = match orientation {
Orientation::Top | Orientation::Bottom => column * (count_rows + with_head) + row + 1, Orientation::Top => column * (count_rows + with_head) + row + 1,
Orientation::Left => (column + with_head) * count_rows + row, Orientation::Left => (column + with_head) * count_rows + row,
Orientation::Right => column * count_rows + row,
}; };
layout.data.get(index) layout.data.get(index)
@ -424,15 +421,15 @@ impl<'a> RecordLayer<'a> {
fn count_rows(&self) -> usize { fn count_rows(&self) -> usize {
match self.orientation { match self.orientation {
Orientation::Top | Orientation::Bottom => self.records.len(), Orientation::Top => self.records.len(),
Orientation::Left | Orientation::Right => self.columns.len(), Orientation::Left => self.columns.len(),
} }
} }
fn count_columns(&self) -> usize { fn count_columns(&self) -> usize {
match self.orientation { match self.orientation {
Orientation::Top | Orientation::Bottom => self.columns.len(), Orientation::Top => self.columns.len(),
Orientation::Left | Orientation::Right => self.records.len(), Orientation::Left => self.records.len(),
} }
} }

View file

@ -31,12 +31,11 @@ pub struct TableW<'a> {
style_computer: &'a StyleComputer<'a>, style_computer: &'a StyleComputer<'a>,
} }
// Basically: where's the header of the value being displayed? Usually at the top for tables, on the left for records
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Orientation { pub enum Orientation {
Top, Top,
Bottom,
Left, Left,
Right,
} }
#[derive(Debug, Default, Clone, Copy)] #[derive(Debug, Default, Clone, Copy)]
@ -99,7 +98,7 @@ impl StatefulWidget for TableW<'_> {
return; return;
} }
let is_horizontal = matches!(self.head_position, Orientation::Top | Orientation::Bottom); let is_horizontal = matches!(self.head_position, Orientation::Top);
if is_horizontal { if is_horizontal {
self.render_table_horizontal(area, buf, state); self.render_table_horizontal(area, buf, state);
} else { } else {
@ -126,39 +125,19 @@ impl<'a> TableW<'a> {
let mut data_y = area.y; let mut data_y = area.y;
let mut head_y = area.y; let mut head_y = area.y;
let is_head_top = matches!(self.head_position, Orientation::Top);
let is_head_bottom = matches!(self.head_position, Orientation::Bottom);
if show_head { if show_head {
if is_head_top { data_y += 1;
data_height -= 1;
if self.style.header_top {
data_y += 1; data_y += 1;
data_height -= 1; data_height -= 1;
head_y += 1
if self.style.header_top {
data_y += 1;
data_height -= 1;
head_y += 1
}
if self.style.header_bottom {
data_y += 1;
data_height -= 1;
}
} }
if is_head_bottom { if self.style.header_bottom {
data_y += 1;
data_height -= 1; data_height -= 1;
head_y = area.y + data_height;
if self.style.header_top && self.style.header_bottom {
data_height -= 2;
head_y -= 1
} else if self.style.header_top {
data_height -= 1;
} else if self.style.header_bottom {
data_height -= 1;
head_y -= 1
}
} }
} }
@ -178,12 +157,7 @@ impl<'a> TableW<'a> {
let bottom = self.style.header_bottom; let bottom = self.style.header_bottom;
if top || bottom { if top || bottom {
if is_head_top { render_header_borders(buf, area, 1, splitline_s, top, bottom);
render_header_borders(buf, area, 1, splitline_s, top, bottom);
} else if is_head_bottom {
let area = Rect::new(area.x, area.y + data_height, area.width, area.height);
render_header_borders(buf, area, 1, splitline_s, top, bottom);
}
} }
} }
@ -199,10 +173,9 @@ impl<'a> TableW<'a> {
); );
if self.style.index_line { if self.style.index_line {
let head_t = show_head && is_head_top && self.style.header_bottom; let head_t = show_head && self.style.header_bottom;
let head_b = show_head && is_head_bottom && self.style.header_top;
width += width +=
render_vertical(buf, width, data_y, data_height, head_t, head_b, splitline_s); render_vertical(buf, width, data_y, data_height, head_t, false, splitline_s);
} }
} }
@ -292,9 +265,8 @@ impl<'a> TableW<'a> {
} }
if self.style.shift_line && width < area.width { if self.style.shift_line && width < area.width {
let head_t = show_head && is_head_top && self.style.header_bottom; let head_t = show_head && self.style.header_bottom;
let head_b = show_head && is_head_bottom && self.style.header_top; width += render_vertical(buf, width, data_y, data_height, head_t, false, splitline_s);
width += render_vertical(buf, width, data_y, data_height, head_t, head_b, splitline_s);
} }
let rest = area.width.saturating_sub(width); let rest = area.width.saturating_sub(width);
@ -321,11 +293,7 @@ impl<'a> TableW<'a> {
let splitline_s = self.style.splitline_style; let splitline_s = self.style.splitline_style;
let shift_column_s = self.style.shift_line_style; let shift_column_s = self.style.shift_line_style;
let is_head_left = matches!(self.head_position, Orientation::Left);
let is_head_right = matches!(self.head_position, Orientation::Right);
let mut left_w = 0; let mut left_w = 0;
let mut right_w = 0;
if show_index { if show_index {
let area = Rect::new(area.x, area.y, area.width, area.height); let area = Rect::new(area.x, area.y, area.width, area.height);
@ -363,52 +331,29 @@ impl<'a> TableW<'a> {
.map(|s| head_row_text(s, self.style_computer)) .map(|s| head_row_text(s, self.style_computer))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if is_head_left { let have_index_line = show_index && self.style.index_line;
let have_index_line = show_index && self.style.index_line; if !have_index_line && self.style.header_top {
if !have_index_line && self.style.header_top {
let x = area.x + left_w;
left_w +=
render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
}
let x = area.x + left_w; let x = area.x + left_w;
left_w += render_space(buf, x, area.y, 1, padding_cell_l); left_w += render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
}
let x = area.x + left_w;
left_w += render_space(buf, x, area.y, 1, padding_cell_l);
let x = area.x + left_w;
left_w += render_column(buf, x, area.y, columns_width as u16, &columns);
let x = area.x + left_w;
left_w += render_space(buf, x, area.y, 1, padding_cell_r);
let layout_x = left_w - padding_cell_r - columns_width as u16;
for (i, (text, _)) in columns.iter().enumerate() {
state
.layout
.push(text, layout_x, area.y + i as u16, columns_width as u16, 1);
}
if self.style.header_bottom {
let x = area.x + left_w; let x = area.x + left_w;
left_w += render_column(buf, x, area.y, columns_width as u16, &columns); left_w += render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
let x = area.x + left_w;
left_w += render_space(buf, x, area.y, 1, padding_cell_r);
let layout_x = left_w - padding_cell_r - columns_width as u16;
for (i, (text, _)) in columns.iter().enumerate() {
state
.layout
.push(text, layout_x, area.y + i as u16, columns_width as u16, 1);
}
if self.style.header_bottom {
let x = area.x + left_w;
left_w +=
render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
}
} else if is_head_right {
if self.style.header_bottom {
let x = area.x + area.width - 1;
right_w +=
render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
}
let x = area.x + area.width - right_w - padding_cell_r;
right_w += render_space(buf, x, area.y, 1, padding_cell_r);
let x = area.x + area.width - right_w - columns_width as u16;
right_w += render_column(buf, x, area.y, columns_width as u16, &columns);
let x = area.x + area.width - right_w - padding_cell_l;
right_w += render_space(buf, x, area.y, 1, padding_cell_l);
if self.style.header_top {
let x = area.x + area.width - right_w - 1;
right_w +=
render_vertical(buf, x, area.y, area.height, false, false, splitline_s);
}
} }
} }
@ -426,7 +371,7 @@ impl<'a> TableW<'a> {
} }
let column_width = column_width as u16; let column_width = column_width as u16;
let available = area.width - left_w - right_w; let available = area.width - left_w;
let is_last = col + 1 == self.data.len(); let is_last = col + 1 == self.data.len();
let pad = padding_cell_l + padding_cell_r; let pad = padding_cell_l + padding_cell_r;
let (column_width, ok, shift) = let (column_width, ok, shift) =