fix: Fixed UI bugs introduced as part of the hotkey refactor
This commit is contained in:
@@ -3,18 +3,16 @@ use super::message::Message;
|
||||
use super::popup::Size;
|
||||
use crate::models::stateful_table::StatefulTable;
|
||||
use crate::ui::styles::ManagarrStyle;
|
||||
use crate::ui::utils::{
|
||||
borderless_block, centered_rect, layout_block_top_border, title_block_centered,
|
||||
};
|
||||
use crate::ui::utils::{borderless_block, centered_rect, title_block_centered};
|
||||
use crate::ui::widgets::loading_block::LoadingBlock;
|
||||
use crate::ui::widgets::popup::Popup;
|
||||
use crate::ui::widgets::selectable_list::SelectableList;
|
||||
use crate::ui::HIGHLIGHT_SYMBOL;
|
||||
use derive_setters::Setters;
|
||||
use ratatui::buffer::Buffer;
|
||||
use ratatui::layout::{Alignment, Constraint, Layout, Position, Rect};
|
||||
use ratatui::layout::{Constraint, Layout, Position, Rect};
|
||||
use ratatui::prelude::{Style, Stylize, Text};
|
||||
use ratatui::widgets::{Block, ListItem, Paragraph, Row, StatefulWidget, Table, Widget, WidgetRef};
|
||||
use ratatui::widgets::{Block, ListItem, Row, StatefulWidget, Table, Widget, WidgetRef};
|
||||
use ratatui::Frame;
|
||||
use std::fmt::Debug;
|
||||
use std::sync::atomic::Ordering;
|
||||
@@ -36,8 +34,6 @@ where
|
||||
#[setters(skip)]
|
||||
constraints: Vec<Constraint>,
|
||||
row_mapper: F,
|
||||
footer: Option<String>,
|
||||
footer_alignment: Alignment,
|
||||
block: Block<'a>,
|
||||
margin: u16,
|
||||
#[setters(rename = "loading")]
|
||||
@@ -68,8 +64,6 @@ where
|
||||
table_headers: Vec::new(),
|
||||
constraints: Vec::new(),
|
||||
row_mapper,
|
||||
footer: None,
|
||||
footer_alignment: Alignment::Left,
|
||||
block: borderless_block(),
|
||||
margin: 0,
|
||||
is_loading: false,
|
||||
@@ -119,20 +113,12 @@ where
|
||||
|
||||
fn render_table(self, area: Rect, buf: &mut Buffer) {
|
||||
let table_headers = self.parse_headers();
|
||||
let table_area = if let Some(ref footer) = self.footer {
|
||||
let [content_area, footer_area] =
|
||||
Layout::vertical([Constraint::Fill(0), Constraint::Length(2)])
|
||||
.margin(self.margin)
|
||||
.areas(area);
|
||||
|
||||
Paragraph::new(Text::from(format!(" {footer}").help()))
|
||||
.block(layout_block_top_border())
|
||||
.alignment(self.footer_alignment)
|
||||
.render(footer_area, buf);
|
||||
let table_area = {
|
||||
let [content_area, _] = Layout::vertical([Constraint::Fill(1), Constraint::Fill(0)])
|
||||
.margin(self.margin)
|
||||
.areas(area);
|
||||
|
||||
content_area
|
||||
} else {
|
||||
area
|
||||
};
|
||||
let loading_block = LoadingBlock::new(self.is_loading, self.block.clone());
|
||||
|
||||
@@ -230,19 +216,11 @@ where
|
||||
|
||||
pub fn show_cursor(&self, f: &mut Frame<'_>, area: Rect) {
|
||||
let mut draw_cursor = |length: usize, offset: usize| {
|
||||
let table_area = if self.footer.is_some() {
|
||||
let [content_area, _] = Layout::vertical([Constraint::Fill(0), Constraint::Length(2)])
|
||||
.margin(self.margin)
|
||||
.areas(area);
|
||||
content_area
|
||||
} else {
|
||||
area
|
||||
};
|
||||
let popup_area = Rect {
|
||||
height: 7,
|
||||
..centered_rect(30, 20, table_area)
|
||||
..centered_rect(30, 20, area)
|
||||
};
|
||||
let [text_box_area, _] = Layout::vertical([Constraint::Length(3), Constraint::Length(1)])
|
||||
let [text_box_area, _] = Layout::vertical([Constraint::Fill(1), Constraint::Fill(0)])
|
||||
.margin(1)
|
||||
.areas(popup_area);
|
||||
f.set_cursor_position(Position {
|
||||
|
||||
@@ -6,7 +6,7 @@ mod tests {
|
||||
use crate::ui::utils::borderless_block;
|
||||
use crate::ui::widgets::managarr_table::ManagarrTable;
|
||||
use pretty_assertions::assert_eq;
|
||||
use ratatui::layout::{Alignment, Constraint};
|
||||
use ratatui::layout::Constraint;
|
||||
use ratatui::text::Text;
|
||||
use ratatui::widgets::{Cell, Row};
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
@@ -25,8 +25,6 @@ mod tests {
|
||||
assert_eq!(row_mapper(&"item1"), Row::new(vec![Cell::new("item1")]));
|
||||
assert_eq!(managarr_table.table_headers, Vec::<String>::new());
|
||||
assert_eq!(managarr_table.constraints, Vec::new());
|
||||
assert_eq!(managarr_table.footer, None);
|
||||
assert_eq!(managarr_table.footer_alignment, Alignment::Left);
|
||||
assert_eq!(managarr_table.block, borderless_block());
|
||||
assert_eq!(managarr_table.margin, 0);
|
||||
assert!(!managarr_table.is_loading);
|
||||
@@ -61,8 +59,6 @@ mod tests {
|
||||
assert_eq!(row_mapper(&"item1"), Row::new(vec![Cell::new("item1")]));
|
||||
assert_eq!(managarr_table.table_headers, Vec::<String>::new());
|
||||
assert_eq!(managarr_table.constraints, Vec::new());
|
||||
assert_eq!(managarr_table.footer, None);
|
||||
assert_eq!(managarr_table.footer_alignment, Alignment::Left);
|
||||
assert_eq!(managarr_table.block, borderless_block());
|
||||
assert_eq!(managarr_table.margin, 0);
|
||||
assert!(!managarr_table.is_loading);
|
||||
@@ -97,8 +93,6 @@ mod tests {
|
||||
assert_eq!(row_mapper(&"item1"), Row::new(vec![Cell::new("item1")]));
|
||||
assert_eq!(managarr_table.table_headers, Vec::<String>::new());
|
||||
assert_eq!(managarr_table.constraints, Vec::new());
|
||||
assert_eq!(managarr_table.footer, None);
|
||||
assert_eq!(managarr_table.footer_alignment, Alignment::Left);
|
||||
assert_eq!(managarr_table.block, borderless_block());
|
||||
assert_eq!(managarr_table.margin, 0);
|
||||
assert!(!managarr_table.is_loading);
|
||||
@@ -130,8 +124,6 @@ mod tests {
|
||||
assert_eq!(managarr_table.content.unwrap().items, items);
|
||||
assert_eq!(row_mapper(&"item1"), Row::new(vec![Cell::new("item1")]));
|
||||
assert_eq!(managarr_table.constraints, Vec::new());
|
||||
assert_eq!(managarr_table.footer, None);
|
||||
assert_eq!(managarr_table.footer_alignment, Alignment::Left);
|
||||
assert_eq!(managarr_table.block, borderless_block());
|
||||
assert_eq!(managarr_table.margin, 0);
|
||||
assert!(!managarr_table.is_loading);
|
||||
@@ -163,8 +155,6 @@ mod tests {
|
||||
assert_eq!(managarr_table.content.unwrap().items, items);
|
||||
assert_eq!(row_mapper(&"item1"), Row::new(vec![Cell::new("item1")]));
|
||||
assert_eq!(managarr_table.table_headers, Vec::<String>::new());
|
||||
assert_eq!(managarr_table.footer, None);
|
||||
assert_eq!(managarr_table.footer_alignment, Alignment::Left);
|
||||
assert_eq!(managarr_table.block, borderless_block());
|
||||
assert_eq!(managarr_table.margin, 0);
|
||||
assert!(!managarr_table.is_loading);
|
||||
|
||||
+13
-2
@@ -1,6 +1,6 @@
|
||||
use crate::ui::utils::{background_block, centered_rect};
|
||||
use ratatui::buffer::Buffer;
|
||||
use ratatui::layout::Rect;
|
||||
use ratatui::layout::{Constraint, Layout, Rect};
|
||||
use ratatui::widgets::{Block, Clear, Widget};
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -51,6 +51,7 @@ impl Size {
|
||||
|
||||
pub struct Popup<'a, T: Widget> {
|
||||
widget: T,
|
||||
margin: u16,
|
||||
percent_x: u16,
|
||||
percent_y: u16,
|
||||
block: Option<Block<'a>>,
|
||||
@@ -62,6 +63,7 @@ impl<'a, T: Widget> Popup<'a, T> {
|
||||
widget,
|
||||
percent_x: 0,
|
||||
percent_y: 0,
|
||||
margin: 0,
|
||||
block: None,
|
||||
}
|
||||
}
|
||||
@@ -84,6 +86,11 @@ impl<'a, T: Widget> Popup<'a, T> {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn margin(mut self, margin: u16) -> Self {
|
||||
self.margin = margin;
|
||||
self
|
||||
}
|
||||
|
||||
fn render_popup(self, area: Rect, buf: &mut Buffer) {
|
||||
let mut popup_area = centered_rect(self.percent_x, self.percent_y, area);
|
||||
let height = if popup_area.height < 3 {
|
||||
@@ -102,7 +109,11 @@ impl<'a, T: Widget> Popup<'a, T> {
|
||||
block.render(popup_area, buf);
|
||||
}
|
||||
|
||||
self.widget.render(popup_area, buf);
|
||||
let [content_area, _] = Layout::vertical([Constraint::Fill(1), Constraint::Fill(0)])
|
||||
.margin(self.margin)
|
||||
.areas(popup_area);
|
||||
|
||||
self.widget.render(content_area, buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ mod tests {
|
||||
assert_eq!(popup.percent_x, 0);
|
||||
assert_eq!(popup.percent_y, 0);
|
||||
assert_eq!(popup.block, None);
|
||||
assert_eq!(popup.margin, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -42,6 +43,7 @@ mod tests {
|
||||
assert_eq!(popup.percent_y, 40);
|
||||
assert_eq!(popup.widget, Block::new());
|
||||
assert_eq!(popup.block, None);
|
||||
assert_eq!(popup.margin, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -52,6 +54,7 @@ mod tests {
|
||||
assert_eq!(popup.percent_y, 50);
|
||||
assert_eq!(popup.widget, Block::new());
|
||||
assert_eq!(popup.block, None);
|
||||
assert_eq!(popup.margin, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -62,5 +65,17 @@ mod tests {
|
||||
assert_eq!(popup.widget, Block::new());
|
||||
assert_eq!(popup.percent_x, 0);
|
||||
assert_eq!(popup.percent_y, 0);
|
||||
assert_eq!(popup.margin, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_popup_margin() {
|
||||
let popup = Popup::new(Block::new()).margin(5);
|
||||
|
||||
assert_eq!(popup.margin, 5);
|
||||
assert_eq!(popup.widget, Block::new());
|
||||
assert_eq!(popup.percent_x, 0);
|
||||
assert_eq!(popup.percent_y, 0);
|
||||
assert_eq!(popup.block, None);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user