111 lines
3.3 KiB
Rust
111 lines
3.3 KiB
Rust
// src/components/handlers/intro.rs
|
|
use ratatui::{
|
|
layout::{Alignment, Constraint, Direction, Layout, Rect},
|
|
style::Style,
|
|
text::{Line, Span},
|
|
widgets::{Block, BorderType, Borders, Paragraph},
|
|
prelude::Margin,
|
|
Frame,
|
|
};
|
|
use crate::config::colors::themes::Theme;
|
|
|
|
pub struct IntroState {
|
|
pub selected_option: usize,
|
|
}
|
|
|
|
impl IntroState {
|
|
pub fn new() -> Self {
|
|
Self { selected_option: 0 }
|
|
}
|
|
|
|
pub fn render(&self, f: &mut Frame, area: Rect, theme: &Theme) {
|
|
let block = Block::default()
|
|
.borders(Borders::ALL)
|
|
.border_type(BorderType::Rounded)
|
|
.border_style(Style::default().fg(theme.accent))
|
|
.style(Style::default().bg(theme.bg));
|
|
|
|
let inner_area = block.inner(area);
|
|
f.render_widget(block, area);
|
|
|
|
// Center layout
|
|
let chunks = Layout::default()
|
|
.direction(Direction::Vertical)
|
|
.constraints([
|
|
Constraint::Percentage(35),
|
|
Constraint::Length(5),
|
|
Constraint::Percentage(35),
|
|
])
|
|
.split(inner_area);
|
|
|
|
// Title
|
|
let title = Line::from(vec![
|
|
Span::styled("multieko2", Style::default().fg(theme.highlight)),
|
|
Span::styled(" v", Style::default().fg(theme.fg)),
|
|
Span::styled(env!("CARGO_PKG_VERSION"), Style::default().fg(theme.secondary)),
|
|
]);
|
|
let title_para = Paragraph::new(title)
|
|
.alignment(Alignment::Center);
|
|
f.render_widget(title_para, chunks[1]);
|
|
|
|
// Buttons
|
|
let button_area = Layout::default()
|
|
.direction(Direction::Horizontal)
|
|
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
|
|
.split(chunks[1].inner(Margin {
|
|
horizontal: 1,
|
|
vertical: 1
|
|
}));
|
|
|
|
self.render_button(
|
|
f,
|
|
button_area[0],
|
|
"Continue",
|
|
self.selected_option == 0,
|
|
theme,
|
|
);
|
|
self.render_button(
|
|
f,
|
|
button_area[1],
|
|
"Admin",
|
|
self.selected_option == 1,
|
|
theme,
|
|
);
|
|
}
|
|
|
|
fn render_button(&self, f: &mut Frame, area: Rect, text: &str, selected: bool, theme: &Theme) {
|
|
let button_style = if selected {
|
|
Style::default()
|
|
.fg(theme.highlight)
|
|
.bg(theme.bg)
|
|
.add_modifier(ratatui::style::Modifier::BOLD)
|
|
} else {
|
|
Style::default().fg(theme.fg).bg(theme.bg)
|
|
};
|
|
|
|
let button = Paragraph::new(text)
|
|
.style(button_style)
|
|
.alignment(Alignment::Center)
|
|
.block(
|
|
Block::default()
|
|
.borders(Borders::ALL)
|
|
.border_type(BorderType::Double)
|
|
.border_style(if selected {
|
|
Style::default().fg(theme.accent)
|
|
} else {
|
|
Style::default().fg(theme.border)
|
|
}),
|
|
);
|
|
|
|
f.render_widget(button, area);
|
|
}
|
|
|
|
pub fn next_option(&mut self) {
|
|
self.selected_option = (self.selected_option + 1) % 2;
|
|
}
|
|
|
|
pub fn previous_option(&mut self) {
|
|
self.selected_option = if self.selected_option == 0 { 1 } else { 0 };
|
|
}
|
|
}
|