Split ui.rs into modules based on UI element #200
@ -9,9 +9,10 @@ use ratatui::{
|
|||||||
widgets::{List, ListItem, Paragraph},
|
widgets::{List, ListItem, Paragraph},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::tui::app::WidgetState;
|
use crate::tui::{
|
||||||
|
app::WidgetState,
|
||||||
use super::{UiColor, UiDisplay};
|
ui::{display::UiDisplay, style::UiColor},
|
||||||
|
};
|
||||||
|
|
||||||
pub struct ArtistArea {
|
pub struct ArtistArea {
|
||||||
pub list: Rect,
|
pub list: Rect,
|
||||||
|
@ -5,6 +5,7 @@ mod matches;
|
|||||||
mod minibuffer;
|
mod minibuffer;
|
||||||
mod overlay;
|
mod overlay;
|
||||||
mod reload;
|
mod reload;
|
||||||
|
mod style;
|
||||||
|
|
||||||
use browse::{AlbumArea, AlbumState, ArtistArea, ArtistState, FrameArea, TrackArea, TrackState};
|
use browse::{AlbumArea, AlbumState, ArtistArea, ArtistState, FrameArea, TrackArea, TrackState};
|
||||||
use display::UiDisplay;
|
use display::UiDisplay;
|
||||||
@ -15,28 +16,16 @@ use musichoard::collection::{album::Album, track::Track, Collection};
|
|||||||
use overlay::{OverlayBuilder, OverlaySize};
|
use overlay::{OverlayBuilder, OverlaySize};
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
layout::{Alignment, Rect},
|
layout::{Alignment, Rect},
|
||||||
style::{Color, Style},
|
|
||||||
widgets::{Block, BorderType, Borders, Clear, List, Paragraph, Wrap},
|
widgets::{Block, BorderType, Borders, Clear, List, Paragraph, Wrap},
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
use reload::ReloadMenu;
|
|
||||||
|
|
||||||
use crate::tui::{
|
use crate::tui::{
|
||||||
app::{AppPublicState, AppState, Category, IAppAccess, Selection, WidgetState},
|
app::{AppPublicState, AppState, Category, IAppAccess, Selection, WidgetState},
|
||||||
lib::interface::musicbrainz::Match,
|
lib::interface::musicbrainz::Match,
|
||||||
|
ui::{reload::ReloadMenu, style::UiStyle},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct UiColor;
|
|
||||||
|
|
||||||
impl UiColor {
|
|
||||||
const BG: Color = Color::Black;
|
|
||||||
const BG_HL: Color = Color::DarkGray;
|
|
||||||
const FG: Color = Color::White;
|
|
||||||
const FG_ERR: Color = Color::Red;
|
|
||||||
const FG_WARN: Color = Color::LightYellow;
|
|
||||||
const FG_GOOD: Color = Color::LightGreen;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait IUi {
|
pub trait IUi {
|
||||||
fn render<APP: IAppAccess>(app: &mut APP, frame: &mut Frame);
|
fn render<APP: IAppAccess>(app: &mut APP, frame: &mut Frame);
|
||||||
}
|
}
|
||||||
@ -49,30 +38,8 @@ struct Column<'a> {
|
|||||||
pub struct Ui;
|
pub struct Ui;
|
||||||
|
|
||||||
impl Ui {
|
impl Ui {
|
||||||
fn style(_active: bool, error: bool) -> Style {
|
|
||||||
let style = Style::default().bg(UiColor::BG);
|
|
||||||
if error {
|
|
||||||
style.fg(UiColor::FG_ERR)
|
|
||||||
} else {
|
|
||||||
style.fg(UiColor::FG)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn block_style(active: bool, error: bool) -> Style {
|
|
||||||
Self::style(active, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn highlight_style(active: bool) -> Style {
|
|
||||||
// Do not set the fg color here as it will overwrite any list-specific customisation.
|
|
||||||
if active {
|
|
||||||
Style::default().bg(UiColor::BG_HL)
|
|
||||||
} else {
|
|
||||||
Style::default().bg(UiColor::BG)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn block<'a>(active: bool, error: bool) -> Block<'a> {
|
fn block<'a>(active: bool, error: bool) -> Block<'a> {
|
||||||
Block::default().style(Self::block_style(active, error))
|
Block::default().style(UiStyle::block_style(active, error))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn block_with_borders<'a>(title: &str, active: bool, error: bool) -> Block<'a> {
|
fn block_with_borders<'a>(title: &str, active: bool, error: bool) -> Block<'a> {
|
||||||
@ -92,9 +59,9 @@ impl Ui {
|
|||||||
frame: &mut Frame,
|
frame: &mut Frame,
|
||||||
) {
|
) {
|
||||||
frame.render_stateful_widget(
|
frame.render_stateful_widget(
|
||||||
list.highlight_style(Self::highlight_style(active))
|
list.highlight_style(UiStyle::highlight_style(active))
|
||||||
.highlight_symbol(">> ")
|
.highlight_symbol(">> ")
|
||||||
.style(Self::style(active, false))
|
.style(UiStyle::style(active, false))
|
||||||
.block(Self::block_with_borders(title, active, false)),
|
.block(Self::block_with_borders(title, active, false)),
|
||||||
area,
|
area,
|
||||||
&mut state.list,
|
&mut state.list,
|
||||||
@ -123,7 +90,7 @@ impl Ui {
|
|||||||
) {
|
) {
|
||||||
frame.render_widget(
|
frame.render_widget(
|
||||||
paragraph
|
paragraph
|
||||||
.style(Self::style(active, false))
|
.style(UiStyle::style(active, false))
|
||||||
.block(Self::block_with_borders(title, active, false)),
|
.block(Self::block_with_borders(title, active, false)),
|
||||||
area,
|
area,
|
||||||
);
|
);
|
||||||
@ -139,7 +106,7 @@ impl Ui {
|
|||||||
frame.render_widget(Clear, area);
|
frame.render_widget(Clear, area);
|
||||||
frame.render_widget(
|
frame.render_widget(
|
||||||
paragraph
|
paragraph
|
||||||
.style(Self::style(true, error))
|
.style(UiStyle::style(true, error))
|
||||||
.block(Self::block_with_borders(title, true, error)),
|
.block(Self::block_with_borders(title, true, error)),
|
||||||
area,
|
area,
|
||||||
);
|
);
|
||||||
@ -186,7 +153,7 @@ impl Ui {
|
|||||||
frame.render_widget(
|
frame.render_widget(
|
||||||
column
|
column
|
||||||
.paragraph
|
.paragraph
|
||||||
.style(Self::style(active, false))
|
.style(UiStyle::style(active, false))
|
||||||
.block(Self::block(active, false)),
|
.block(Self::block(active, false)),
|
||||||
column.area,
|
column.area,
|
||||||
);
|
);
|
||||||
|
38
src/tui/ui/style.rs
Normal file
38
src/tui/ui/style.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
use ratatui::style::{Color, Style};
|
||||||
|
|
||||||
|
pub struct UiColor;
|
||||||
|
|
||||||
|
impl UiColor {
|
||||||
|
pub const BG: Color = Color::Black;
|
||||||
|
pub const BG_HL: Color = Color::DarkGray;
|
||||||
|
pub const FG: Color = Color::White;
|
||||||
|
pub const FG_ERR: Color = Color::Red;
|
||||||
|
pub const FG_WARN: Color = Color::LightYellow;
|
||||||
|
pub const FG_GOOD: Color = Color::LightGreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct UiStyle;
|
||||||
|
|
||||||
|
impl UiStyle {
|
||||||
|
pub fn style(_active: bool, error: bool) -> Style {
|
||||||
|
let style = Style::default().bg(UiColor::BG);
|
||||||
|
if error {
|
||||||
|
style.fg(UiColor::FG_ERR)
|
||||||
|
} else {
|
||||||
|
style.fg(UiColor::FG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn block_style(active: bool, error: bool) -> Style {
|
||||||
|
Self::style(active, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn highlight_style(active: bool) -> Style {
|
||||||
|
// Do not set the fg color here as it will overwrite any list-specific customisation.
|
||||||
|
if active {
|
||||||
|
Style::default().bg(UiColor::BG_HL)
|
||||||
|
} else {
|
||||||
|
Style::default().bg(UiColor::BG)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user