From eef1cfe46e67a7f2c0a9e52ccbcccb0a8979f527 Mon Sep 17 00:00:00 2001 From: Matthew Turner Date: Sun, 1 Sep 2024 08:36:52 -0400 Subject: [PATCH 1/3] Fixes --- src/app/handlers/flightsql.rs | 1 + src/app/handlers/sql.rs | 1 + src/app/state/tabs/flightsql.rs | 7 +++++-- src/app/state/tabs/sql.rs | 8 +++++--- src/ui/convert.rs | 12 ++++++++++-- src/ui/tabs/flightsql.rs | 19 ++++++++++--------- src/ui/tabs/sql.rs | 20 +++++++++++--------- 7 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/app/handlers/flightsql.rs b/src/app/handlers/flightsql.rs index 0beb578..1de6033 100644 --- a/src/app/handlers/flightsql.rs +++ b/src/app/handlers/flightsql.rs @@ -139,6 +139,7 @@ pub fn editable_handler(app: &mut App, key: KeyEvent) { match (key.code, key.modifiers) { (KeyCode::Left, KeyModifiers::ALT) => app.state.flightsql_tab.previous_word(), (KeyCode::Right, KeyModifiers::ALT) => app.state.flightsql_tab.next_word(), + (KeyCode::Backspace, KeyModifiers::ALT) => app.state.flightsql_tab.delete_word(), (KeyCode::Esc, _) => app.state.flightsql_tab.exit_edit(), _ => app.state.flightsql_tab.update_editor_content(key), } diff --git a/src/app/handlers/sql.rs b/src/app/handlers/sql.rs index ccb6e6b..376b60f 100644 --- a/src/app/handlers/sql.rs +++ b/src/app/handlers/sql.rs @@ -104,6 +104,7 @@ pub fn editable_handler(app: &mut App, key: KeyEvent) { match (key.code, key.modifiers) { (KeyCode::Left, KeyModifiers::ALT) => app.state.sql_tab.previous_word(), (KeyCode::Right, KeyModifiers::ALT) => app.state.sql_tab.next_word(), + (KeyCode::Backspace, KeyModifiers::ALT) => app.state.sql_tab.delete_word(), (KeyCode::Esc, _) => app.state.sql_tab.exit_edit(), (KeyCode::Enter, KeyModifiers::CONTROL) => { let query = app.state.sql_tab.editor().lines().join(""); diff --git a/src/app/state/tabs/flightsql.rs b/src/app/state/tabs/flightsql.rs index 25b6ea1..644732b 100644 --- a/src/app/state/tabs/flightsql.rs +++ b/src/app/state/tabs/flightsql.rs @@ -99,8 +99,7 @@ impl<'app> FlightSQLTabState<'app> { pub fn new() -> Self { let empty_text = vec!["Enter a query here.".to_string()]; // TODO: Enable vim mode from config? - let mut textarea = TextArea::new(empty_text); - textarea.set_line_number_style(Style::default().bg(tailwind::GRAY.c400)); + let textarea = TextArea::new(empty_text); Self { editor: textarea, editor_editable: false, @@ -172,4 +171,8 @@ impl<'app> FlightSQLTabState<'app> { pub fn previous_word(&mut self) { self.editor.move_cursor(tui_textarea::CursorMove::WordBack) } + + pub fn delete_word(&mut self) { + self.editor.delete_word(); + } } diff --git a/src/app/state/tabs/sql.rs b/src/app/state/tabs/sql.rs index 9a169e7..b702ae8 100644 --- a/src/app/state/tabs/sql.rs +++ b/src/app/state/tabs/sql.rs @@ -20,7 +20,6 @@ use std::time::Duration; use datafusion::arrow::array::RecordBatch; use ratatui::crossterm::event::KeyEvent; -use ratatui::style::{palette::tailwind, Style}; use ratatui::widgets::TableState; use tui_textarea::TextArea; @@ -99,8 +98,7 @@ impl<'app> SQLTabState<'app> { pub fn new() -> Self { let empty_text = vec!["Enter a query here.".to_string()]; // TODO: Enable vim mode from config? - let mut textarea = TextArea::new(empty_text); - textarea.set_line_number_style(Style::default().bg(tailwind::GRAY.c400)); + let textarea = TextArea::new(empty_text); Self { editor: textarea, editor_editable: false, @@ -172,4 +170,8 @@ impl<'app> SQLTabState<'app> { pub fn previous_word(&mut self) { self.editor.move_cursor(tui_textarea::CursorMove::WordBack) } + + pub fn delete_word(&mut self) { + self.editor.delete_word(); + } } diff --git a/src/ui/convert.rs b/src/ui/convert.rs index af40108..f56e8b8 100644 --- a/src/ui/convert.rs +++ b/src/ui/convert.rs @@ -35,13 +35,17 @@ macro_rules! convert_array_values_to_cells { ($rows:expr, $arr:expr, $typ:ty) => { if let Some(a) = $arr.as_any().downcast_ref::<$typ>() { for i in 0..$rows.len() { - $rows[i].push(a.value(i).to_string().into()); + let cell = Cell::from(a.value(i).to_string()) + .bg(tailwind::BLACK) + .fg(tailwind::WHITE); + $rows[i].push(cell); } } }; } pub fn record_batch_to_table_header_cells(record_batch: &RecordBatch) -> Vec { + // let mut cells = vec![Cell::new("#")]; let mut cells = vec![Cell::new("#").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK)]; record_batch.schema_ref().fields().iter().for_each(|f| { let cell = Cell::new(f.name().as_str()) @@ -54,7 +58,11 @@ pub fn record_batch_to_table_header_cells(record_batch: &RecordBatch) -> Vec Vec { let cells: Vec = (0..record_batch.num_rows()) - .map(|i| Cell::new(i.to_string())) + .map(|i| { + Cell::new(i.to_string()) + .bg(tailwind::BLACK) + .fg(tailwind::WHITE) + }) .collect(); cells } diff --git a/src/ui/tabs/flightsql.rs b/src/ui/tabs/flightsql.rs index 6b6a646..3c12200 100644 --- a/src/ui/tabs/flightsql.rs +++ b/src/ui/tabs/flightsql.rs @@ -26,12 +26,13 @@ use crate::{app::App, ui::convert::record_batches_to_table}; pub fn render_sql_editor(area: Rect, buf: &mut Buffer, app: &App) { let border_color = if app.state.flightsql_tab.editor_editable() { - tailwind::ORANGE.c300 + tailwind::ORANGE.c500 } else { tailwind::WHITE }; + let title = Span::from(" Editor ").fg(tailwind::WHITE); let block = Block::default() - .title(" Editor ") + .title(title) .borders(Borders::ALL) .fg(border_color) .title_bottom(" Cmd+Enter to run query "); @@ -45,13 +46,13 @@ pub fn render_sql_results(area: Rect, buf: &mut Buffer, app: &App) { if let Some(q) = app.state.flightsql_tab.query() { if let Some(r) = q.results() { if let Some(s) = app.state.flightsql_tab.query_results_state() { - let block = block - .title_bottom(format!( - " {} rows in {}ms", - q.num_rows().unwrap_or(0), - q.execution_time().as_millis() - )) - .fg(tailwind::ORANGE.c500); + let stats = Span::from(format!( + " {} rows in {}ms ", + q.num_rows().unwrap_or(0), + q.execution_time().as_millis() + )) + .fg(tailwind::WHITE); + let block = block.title_bottom(stats).fg(tailwind::ORANGE.c500); let maybe_table = record_batches_to_table(r); match maybe_table { Ok(table) => { diff --git a/src/ui/tabs/sql.rs b/src/ui/tabs/sql.rs index 178766d..7654e3f 100644 --- a/src/ui/tabs/sql.rs +++ b/src/ui/tabs/sql.rs @@ -19,6 +19,7 @@ use ratatui::{ buffer::Buffer, layout::{Alignment, Constraint, Direction, Layout, Rect}, style::{palette::tailwind, Style, Stylize}, + text::Span, widgets::{Block, Borders, Paragraph, Row, StatefulWidget, Table, Widget}, }; @@ -26,12 +27,13 @@ use crate::{app::App, ui::convert::record_batches_to_table}; pub fn render_sql_editor(area: Rect, buf: &mut Buffer, app: &App) { let border_color = if app.state.sql_tab.editor_editable() { - tailwind::ORANGE.c300 + tailwind::ORANGE.c500 } else { tailwind::WHITE }; + let title = Span::from(" Editor ").fg(tailwind::WHITE); let block = Block::default() - .title(" Editor ") + .title(title) .borders(Borders::ALL) .fg(border_color) .title_bottom(" Cmd+Enter to run query "); @@ -45,13 +47,13 @@ pub fn render_sql_results(area: Rect, buf: &mut Buffer, app: &App) { if let Some(q) = app.state.sql_tab.query() { if let Some(r) = q.results() { if let Some(s) = app.state.sql_tab.query_results_state() { - let block = block - .title_bottom(format!( - " {} rows in {}ms ", - q.num_rows().unwrap_or(0), - q.execution_time().as_millis() - )) - .fg(tailwind::ORANGE.c500); + let stats = Span::from(format!( + " {} rows in {}ms ", + q.num_rows().unwrap_or(0), + q.execution_time().as_millis() + )) + .fg(tailwind::WHITE); + let block = block.title_bottom(stats).fg(tailwind::ORANGE.c500); let maybe_table = record_batches_to_table(r); match maybe_table { Ok(table) => { From b2f8fd959b321d408495d4d45ef32243f66b0613 Mon Sep 17 00:00:00 2001 From: Matthew Turner Date: Sun, 1 Sep 2024 08:39:01 -0400 Subject: [PATCH 2/3] Cleanup --- src/ui/convert.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/convert.rs b/src/ui/convert.rs index f56e8b8..edf4902 100644 --- a/src/ui/convert.rs +++ b/src/ui/convert.rs @@ -45,7 +45,6 @@ macro_rules! convert_array_values_to_cells { } pub fn record_batch_to_table_header_cells(record_batch: &RecordBatch) -> Vec { - // let mut cells = vec![Cell::new("#")]; let mut cells = vec![Cell::new("#").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK)]; record_batch.schema_ref().fields().iter().for_each(|f| { let cell = Cell::new(f.name().as_str()) From c486fc47036e159277df91502e58e20b998dd334 Mon Sep 17 00:00:00 2001 From: Matthew Turner Date: Sun, 1 Sep 2024 08:56:34 -0400 Subject: [PATCH 3/3] Fix tests --- src/ui/convert.rs | 165 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 133 insertions(+), 32 deletions(-) diff --git a/src/ui/convert.rs b/src/ui/convert.rs index edf4902..0dcd9cc 100644 --- a/src/ui/convert.rs +++ b/src/ui/convert.rs @@ -177,8 +177,16 @@ mod tests { header_cells, vec![ Cell::new("#").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK), - Cell::new("a").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK), - Cell::new("b").bg(tailwind::ORANGE.c300).fg(tailwind::BLACK) + Cell::new("a") + .bg(tailwind::BLACK) + .fg(tailwind::WHITE) + .bg(tailwind::ORANGE.c300) + .fg(tailwind::BLACK), + Cell::new("b") + .bg(tailwind::BLACK) + .fg(tailwind::WHITE) + .bg(tailwind::ORANGE.c300) + .fg(tailwind::BLACK) ] ); } @@ -190,9 +198,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("a")], - vec![Cell::new("1"), Cell::new("b")], - vec![Cell::new("2"), Cell::new("c")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("a").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("b").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("c").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(table_cells, expected); @@ -200,9 +217,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -210,9 +236,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -220,9 +255,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -230,9 +274,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -240,9 +293,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -250,9 +312,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -260,9 +331,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); @@ -270,9 +350,18 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1")], - vec![Cell::new("1"), Cell::new("2")], - vec![Cell::new("2"), Cell::new("3")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); } @@ -284,9 +373,21 @@ mod tests { let batch = RecordBatch::try_from_iter(vec![("a", a), ("b", b)]).unwrap(); let a_table_cells = record_batch_to_table_row_cells(&batch).unwrap(); let expected = vec![ - vec![Cell::new("0"), Cell::new("1"), Cell::new("a")], - vec![Cell::new("1"), Cell::new("2"), Cell::new("b")], - vec![Cell::new("2"), Cell::new("3"), Cell::new("c")], + vec![ + Cell::new("0").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("a").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("1").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("b").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], + vec![ + Cell::new("2").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("3").bg(tailwind::BLACK).fg(tailwind::WHITE), + Cell::new("c").bg(tailwind::BLACK).fg(tailwind::WHITE), + ], ]; assert_eq!(a_table_cells, expected); }