use termusiclib::config::{SharedTuiSettings, v2::tui::theme::styles::ColorTermusic};
use tui_realm_stdlib::Paragraph;
use tuirealm::{
AttrValue, Attribute, Component, Event, MockComponent,
props::{Alignment, BorderType, Borders, PropPayload, TextModifiers, TextSpan},
};
use crate::ui::ids::Id;
use crate::ui::model::{Model, UserEvent};
use crate::ui::msg::Msg;
#[derive(MockComponent)]
pub struct MessagePopup {
component: Paragraph,
}
impl MessagePopup {
pub fn new<S: Into<String>>(config: &SharedTuiSettings, title: S, msg: S) -> Self {
let config_tui = config.read_recursive();
Self {
component: Paragraph::default()
.borders(
Borders::default()
.color(
config_tui
.settings
.theme
.get_color_from_theme(ColorTermusic::Cyan),
)
.modifiers(BorderType::Rounded),
)
.foreground(
config_tui
.settings
.theme
.get_color_from_theme(ColorTermusic::Green),
)
.background(config_tui.settings.theme.library_background())
.modifiers(TextModifiers::BOLD)
.alignment(Alignment::Center)
.title(title.into(), Alignment::Center)
.text(vec![TextSpan::from(msg)]),
}
}
}
impl Component<Msg, UserEvent> for MessagePopup {
fn on(&mut self, _ev: Event<UserEvent>) -> Option<Msg> {
None
}
}
impl Model {
pub fn mount_message(&mut self, title: &str, text: &str) {
assert!(
self.app
.remount(
Id::MessagePopup,
Box::new(MessagePopup::new(&self.config_tui, title, text)),
vec![]
)
.is_ok()
);
}
pub fn umount_message(&mut self, _title: &str, text: &str) {
if let Ok(Some(AttrValue::Payload(PropPayload::Vec(spans)))) =
self.app.query(&Id::MessagePopup, Attribute::Text)
&& let Some(display_text) = spans.into_iter().next()
{
let d = display_text.unwrap_text_span().content;
if text.eq(&d) {
self.app.umount(&Id::MessagePopup).ok();
}
}
}
}