diff --git a/TODO.md b/TODO.md index e243aff..8ba0192 100644 --- a/TODO.md +++ b/TODO.md @@ -5,7 +5,7 @@ - [x] capture a safe database display name on successful saved-profile and CLI connections, including SQLite; use the connected database, not explorer selection or `Database::name()` (which returns the provider). Never expose raw connection strings/passwords; show a clear disconnected state and retain the previous identity after a failed switch. - [x] add Normal/Insert query editing with mode-aware key routing; define entry/navigation keys and make Esc leave Insert before returning to the explorer. Preserve query execution, multiline editing, paste, and focus cycling. - [x] keep connection/password forms direct-entry for now; make the mode indicator reflect the focused surface rather than a stale query mode. - - [x] expose position from the existing `Input` cursor instead of duplicating state; follow the focused query/form field, hide position outside inputs, and define Unicode column semantics consistently. + - [x] expose position from the existing `Input` cursor instead of duplicating state; follow the focused query/form field, show N/A outside inputs, and define Unicode column semantics consistently. - [x] keep relation/page/column status in pane borders and accommodate the separate help pane; do not add tabs, title templates, custom segments, or editor-specific status. - [x] handle narrow/short terminals without overlapping content: truncate the database label before mode/position, and let bars yield to content when height is insufficient. - [x] verify mode transitions/key precedence, focused-input Unicode positions, connection identity on successful/failed switches, and constrained layouts; smoke-run the TUI and ask for a visual check. @@ -19,5 +19,6 @@ - [x] remove the bottom navigation help panel and have a keybinding overview appear in a floating window when pressing `?` in normal mode - [x] remove the path from the database entry in the sidebar (can be viewed in the info panel) - [x] info panel should also pop up when pressing `i` on a child entry of that database entry in the sidebar (instead of only when the parent/database connection is hovered) -- [ ] `line:col` indicator in the bottom-right status bar should never disappear but instead display "N/A" in that case. -- [ ] database type indicator should be moved down just left of the "line:col" indicator like in the attached image \ No newline at end of file +- [x] `line:col` indicator in the bottom-right status bar should never disappear but instead display "N/A" in that case. +- [ ] database type indicator should be moved down just left of the "line:col" indicator like in the attached image +- [ ] introduce vim navigation inside the query input field. \ No newline at end of file diff --git a/src/connection.rs b/src/connection.rs index 6be5898..23ad65f 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -436,11 +436,9 @@ fn draw_bars( ); frame.render_widget(Paragraph::new("").style(base), bottom); let position = position.map(|(line, column)| format!(" {line}:{column} ")); - let mode_width = bottom.width.min(10); - let position_width = position - .as_ref() - .map_or(0, |text| text.len() as u16 + 2) - .min(bottom.width.saturating_sub(mode_width)); + let position = position.as_deref().unwrap_or(" N/A "); + let position_width = (position.len() as u16 + 2).min(bottom.width); + let mode_width = bottom.width.saturating_sub(position_width).min(10); let [mode, name_area, cursor] = Layout::horizontal([ Constraint::Length(mode_width), Constraint::Min(0), @@ -456,16 +454,14 @@ fn draw_bars( mode, ); frame.render_widget(Paragraph::new(format!(" {name}")).style(base), name_area); - if let Some(position) = position { - frame.render_widget( - Paragraph::new(Line::from(vec![ - Span::styled("░▓", edge), - Span::styled(position, badge), - ])) - .style(base), - cursor, - ); - } + frame.render_widget( + Paragraph::new(Line::from(vec![ + Span::styled("░▓", edge), + Span::styled(position, badge), + ])) + .style(base), + cursor, + ); } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -1198,6 +1194,28 @@ mod tests { Ok(()) } + #[test] + fn unavailable_position_keeps_its_badge_even_in_a_narrow_bar() -> Result<()> { + let mut terminal = ratatui::Terminal::new(ratatui::backend::TestBackend::new(7, 6))?; + terminal.draw(|frame| { + let [top, _, bottom] = shell_areas(frame.area()); + draw_bars( + frame, + top, + bottom, + "SQLite", + "long database name", + false, + None, + ); + })?; + let footer: String = (0..7) + .map(|x| terminal.backend().buffer()[(x, 5)].symbol()) + .collect(); + assert_eq!(footer, "░▓ N/A "); + Ok(()) + } + #[test] fn explorer_keeps_relations_under_the_connected_database() { use ExplorerEntry::{Database as Db, Relation as Rel}; diff --git a/src/main.rs b/src/main.rs index 69f00e7..345ddfa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -49,6 +49,7 @@ Navigation: Full-width bars show dbdash/provider/READ ONLY above and mode/database below. Only badges have colored backgrounds; the remaining bar area uses terminal defaults. Focused inputs show one-based line:column (Unicode characters, not screen cells). + The position badge shows N/A outside focused inputs, including in info/help popups. The query editor sits above rows/results; the explorer spans both panes. Explorer and rows/schema bottom borders align; table names appear in the top-right border, with page/column status below. Read errors appear above the query editor.