Skip to content

Commit 00e093c

Browse files
authored
feat(tui): De-duplicate describe view (#530)
Reuse Describe component directly in the table view to avoid code duplication.
1 parent 9f97966 commit 00e093c

File tree

7 files changed

+93
-149
lines changed

7 files changed

+93
-149
lines changed

openstack_tui/src/components/compute/flavors.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ impl<'a> Component for ComputeFlavors<'a> {
8787
KeyCode::End => self.cursor_last()?,
8888
KeyCode::PageUp => self.cursor_page_up()?,
8989
KeyCode::PageDown => self.cursor_page_down()?,
90+
KeyCode::Left => self.cursor_left()?,
91+
KeyCode::Right => self.cursor_right()?,
9092
KeyCode::Tab => self.key_tab()?,
9193
_ => {}
9294
}
@@ -99,7 +101,7 @@ impl<'a> Component for ComputeFlavors<'a> {
99101
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
100102
let areas = Layout::vertical([Constraint::Min(5), Constraint::Length(3)]).split(area);
101103

102-
self.render_content(TITLE, f, areas[0]);
104+
self.render_content(TITLE, f, areas[0])?;
103105
self.render_footer(f, areas[1]);
104106
Ok(())
105107
}

openstack_tui/src/components/compute/servers.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ impl<'a> Component for ComputeServers<'a> {
108108
KeyCode::End => self.cursor_last()?,
109109
KeyCode::PageUp => self.cursor_page_up()?,
110110
KeyCode::PageDown => self.cursor_page_down()?,
111+
KeyCode::Left => self.cursor_left()?,
112+
KeyCode::Right => self.cursor_right()?,
111113
KeyCode::Tab => self.key_tab()?,
112114
_ => {}
113115
}
@@ -120,7 +122,7 @@ impl<'a> Component for ComputeServers<'a> {
120122
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
121123
let areas = Layout::vertical([Constraint::Min(5), Constraint::Length(3)]).split(area);
122124

123-
self.render_content(TITLE, f, areas[0]);
125+
self.render_content(TITLE, f, areas[0])?;
124126
self.render_footer(f, areas[1]);
125127
Ok(())
126128
}

openstack_tui/src/components/describe.rs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ pub struct Describe {
3333
pub keymap: HashMap<KeyEvent, Action>,
3434
pub text: Vec<String>,
3535
pub last_events: Vec<KeyEvent>,
36-
wrap: bool,
36+
title: Option<String>,
37+
is_focused: bool,
3738
max_row_length: u16,
3839
content_scroll: (u16, u16),
3940
content_size: Size,
@@ -43,7 +44,10 @@ pub struct Describe {
4344

4445
impl Describe {
4546
pub fn new() -> Self {
46-
Self::default()
47+
Self {
48+
is_focused: true,
49+
..Default::default()
50+
}
4751
}
4852

4953
pub fn keymap(mut self, keymap: HashMap<KeyEvent, Action>) -> Self {
@@ -57,11 +61,11 @@ impl Describe {
5761

5862
pub fn render_tick(&mut self) {}
5963

60-
fn set_data(&mut self, data: Value) -> Result<()> {
64+
pub fn set_data(&mut self, data: Value) -> Result<()> {
6165
if data.is_string() {
6266
self.text = data
6367
.as_str()
64-
.ok_or_eyre("Cannot treat data as string")?
68+
.ok_or_eyre("Cannot access data as string")?
6569
.split("\n")
6670
.map(String::from)
6771
.collect::<Vec<_>>();
@@ -87,6 +91,16 @@ impl Describe {
8791
Ok(())
8892
}
8993

94+
pub fn set_title(&mut self, title: Option<String>) -> Result<()> {
95+
self.title = title;
96+
Ok(())
97+
}
98+
99+
pub fn set_focus(&mut self, focus: bool) -> Result<()> {
100+
self.is_focused = focus;
101+
Ok(())
102+
}
103+
90104
pub fn cursor_up(&mut self) -> Result<()> {
91105
if self.text.len() as u16 > self.content_size.height {
92106
self.content_scroll.0 = self.content_scroll.0.saturating_sub(1);
@@ -165,10 +179,21 @@ impl Describe {
165179

166180
fn render(&mut self, f: &mut Frame<'_>, area: Rect) {
167181
let block = Block::default()
168-
.title(Title::from(" Describe ").alignment(Alignment::Center))
182+
.title(
183+
Title::from(self.title.clone().unwrap_or(String::from(" Describe ")))
184+
.alignment(Alignment::Center),
185+
)
186+
.title_style(match self.is_focused {
187+
true => Style::new().white(),
188+
false => Style::default(),
189+
})
169190
.borders(Borders::ALL)
170191
.padding(Padding::horizontal(1))
171-
.border_style(Style::default().fg(PALETTES[0].c900));
192+
.border_style(Style::default().fg(PALETTES[0].c900))
193+
.style(match self.is_focused {
194+
true => Style::new(),
195+
false => Style::new().gray(),
196+
});
172197
self.content_size = block.inner(area).as_size();
173198

174199
let text: Vec<Line> = self.text.clone().into_iter().map(Line::from).collect();

openstack_tui/src/components/image/images.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ impl<'a> Component for Images<'a> {
100100
KeyCode::End => self.cursor_last()?,
101101
KeyCode::PageUp => self.cursor_page_up()?,
102102
KeyCode::PageDown => self.cursor_page_down()?,
103+
KeyCode::Left => self.cursor_left()?,
104+
KeyCode::Right => self.cursor_right()?,
103105
KeyCode::Tab => self.key_tab()?,
104106
_ => {}
105107
}
@@ -109,7 +111,7 @@ impl<'a> Component for Images<'a> {
109111
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
110112
let areas = Layout::vertical([Constraint::Min(5), Constraint::Length(3)]).split(area);
111113

112-
self.render_content(TITLE, f, areas[0]);
114+
self.render_content(TITLE, f, areas[0])?;
113115
self.render_footer(f, areas[1]);
114116
Ok(())
115117
}

openstack_tui/src/components/network/networks.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ impl<'a> Component for NetworkNetworks<'a> {
9090
KeyCode::End => self.cursor_last()?,
9191
KeyCode::PageUp => self.cursor_page_up()?,
9292
KeyCode::PageDown => self.cursor_page_down()?,
93+
KeyCode::Left => self.cursor_left()?,
94+
KeyCode::Right => self.cursor_right()?,
9395
KeyCode::Tab => self.key_tab()?,
9496
KeyCode::Enter => {
9597
if let Some(command_tx) = self.get_command_tx() {
@@ -113,7 +115,7 @@ impl<'a> Component for NetworkNetworks<'a> {
113115
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
114116
let areas = Layout::vertical([Constraint::Min(5), Constraint::Length(3)]).split(area);
115117

116-
self.render_content(TITLE, f, areas[0]);
118+
self.render_content(TITLE, f, areas[0])?;
117119
self.render_footer(f, areas[1]);
118120
Ok(())
119121
}

openstack_tui/src/components/network/subnets.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ impl<'a> Component for NetworkSubnets<'a> {
9191
KeyCode::End => self.cursor_last()?,
9292
KeyCode::PageUp => self.cursor_page_up()?,
9393
KeyCode::PageDown => self.cursor_page_down()?,
94+
KeyCode::Left => self.cursor_left()?,
95+
KeyCode::Right => self.cursor_right()?,
9496
KeyCode::Tab => self.key_tab()?,
9597
KeyCode::Char('0') => {
9698
return Ok(Some(Action::NetworkSubnetFilter(NetworkSubnetFilters {
@@ -109,7 +111,7 @@ impl<'a> Component for NetworkSubnets<'a> {
109111
fn draw(&mut self, f: &mut Frame<'_>, area: Rect) -> Result<()> {
110112
let areas = Layout::vertical([Constraint::Min(5), Constraint::Length(3)]).split(area);
111113

112-
self.render_content(TITLE, f, areas[0]);
114+
self.render_content(TITLE, f, areas[0])?;
113115
self.render_footer(f, areas[1]);
114116
Ok(())
115117
}

0 commit comments

Comments
 (0)