Extract default view keybindings and widget

Move generic view rendering and keybinding logic into a new default
module and
replace inline implementations with calls to the new helpers.
This commit is contained in:
2026-03-12 23:06:55 +01:00
parent 70a8ac348e
commit 7226a09bb4
6 changed files with 50 additions and 36 deletions
+2 -11
View File
@@ -1,6 +1,6 @@
use crate::app::{
App, View,
keybindings::{Action, event_to_action, main_menu_keybindings},
keybindings::{default_view_keybindings, main_menu_keybindings},
};
use ratatui::crossterm::event::KeyEvent;
use std::io::Result;
@@ -8,16 +8,7 @@ use std::io::Result;
pub fn handle_keybindings(app: &mut App, key_event: KeyEvent) -> Result<()> {
match app.view {
View::MainMenu => main_menu_keybindings(app, &key_event),
_ => {
if let Some(action) = event_to_action(&key_event) {
match action {
Action::Quit => app.exit = true,
Action::Quit2 => app.exit = true,
Action::Esc => app.view = View::MainMenu,
_ => (),
}
}
}
_ => default_view_keybindings(app, &key_event),
}
Ok(())
+16
View File
@@ -0,0 +1,16 @@
use crate::app::{
App, View,
keybindings::{Action, event_to_action},
};
use ratatui::crossterm::event::KeyEvent;
pub fn default_view_keybindings(app: &mut App, key_event: &KeyEvent) {
if let Some(action) = event_to_action(&key_event) {
match action {
Action::Quit => app.exit = true,
Action::Quit2 => app.exit = true,
Action::Esc => app.view = View::MainMenu,
_ => (),
}
}
}
+2
View File
@@ -1,6 +1,8 @@
pub mod default;
pub mod keybindings;
pub mod main_menu;
pub use default::default_view_keybindings;
pub use keybindings::{
Action, Group, KEYBINDINGS, KeyBinding, binding_for, binding_for_view, event_to_action,
};
+3 -25
View File
@@ -1,13 +1,8 @@
use crate::app::{
App, View,
widgets::{KeybindingsWidget, main_menu_widget},
};
use ratatui::{
buffer::Buffer,
layout::{Alignment, Constraint, Layout, Rect},
style::Stylize,
widgets::{Block, Borders, Paragraph, Widget},
widgets::{default_view_widget, main_menu_widget},
};
use ratatui::{buffer::Buffer, layout::Rect, widgets::Widget};
impl Widget for &App {
fn render(self, area: Rect, buf: &mut Buffer)
@@ -16,24 +11,7 @@ impl Widget for &App {
{
match self.view {
View::MainMenu => main_menu_widget(self, area, buf),
_ => {
let vertical_layout: Layout =
Layout::vertical([Constraint::Fill(1), Constraint::Length(4)]);
let [main_area, keybindings_area] = vertical_layout.areas(area);
Paragraph::new("Work in progress")
.alignment(Alignment::Center)
.yellow()
.block(
Block::new()
.gray()
.borders(Borders::LEFT | Borders::TOP | Borders::RIGHT),
)
.render(main_area, buf);
KeybindingsWidget::new(self.view).render(keybindings_area, buf);
}
_ => default_view_widget(self, area, buf),
}
}
}
+25
View File
@@ -0,0 +1,25 @@
use crate::app::{App, widgets::KeybindingsWidget};
use ratatui::{
buffer::Buffer,
layout::{Alignment, Constraint, Layout, Rect},
style::Stylize,
widgets::{Block, Borders, Paragraph, Widget},
};
pub fn default_view_widget(app: &App, area: Rect, buf: &mut Buffer) {
let vertical_layout: Layout = Layout::vertical([Constraint::Fill(1), Constraint::Length(4)]);
let [main_area, keybindings_area] = vertical_layout.areas(area);
Paragraph::new("Work in progress")
.alignment(Alignment::Center)
.yellow()
.block(
Block::new()
.gray()
.borders(Borders::LEFT | Borders::TOP | Borders::RIGHT),
)
.render(main_area, buf);
KeybindingsWidget::new(app.view).render(keybindings_area, buf);
}
+2
View File
@@ -1,5 +1,7 @@
pub mod default;
pub mod keybindings;
pub mod main_menu;
pub use default::default_view_widget;
pub use keybindings::KeybindingsWidget;
pub use main_menu::main_menu_widget;