use super::Msg;
use tui_realm_stdlib::{Input, Table};
use tuirealm::command::{Cmd, CmdResult, Direction, Position};
use tuirealm::event::{Key, KeyEvent, KeyModifiers};
use tuirealm::props::{Alignment, BorderType, Borders, Color, InputType, TableBuilder, TextSpan};
use tuirealm::{Component, Event, MockComponent, NoUserEvent, State, StateValue};
#[derive(MockComponent)]
pub struct YSInputPopup {
component: Input,
}
impl Default for YSInputPopup {
fn default() -> Self {
Self {
component: Input::default()
.foreground(Color::Yellow)
.background(Color::Black)
.borders(
Borders::default()
.color(Color::Green)
.modifiers(BorderType::Rounded),
)
.input_type(InputType::Text)
.title("Download url or search:", Alignment::Left),
}
}
}
impl Component<Msg, NoUserEvent> for YSInputPopup {
fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> {
let cmd_result = match ev {
Event::Keyboard(KeyEvent {
code: Key::Left, ..
}) => self.perform(Cmd::Move(Direction::Left)),
Event::Keyboard(KeyEvent {
code: Key::Right, ..
}) => self.perform(Cmd::Move(Direction::Right)),
Event::Keyboard(KeyEvent {
code: Key::Home, ..
}) => self.perform(Cmd::GoTo(Position::Begin)),
Event::Keyboard(KeyEvent { code: Key::End, .. }) => {
self.perform(Cmd::GoTo(Position::End))
}
Event::Keyboard(KeyEvent {
code: Key::Delete, ..
}) => self.perform(Cmd::Cancel),
Event::Keyboard(KeyEvent {
code: Key::Backspace,
..
}) => self.perform(Cmd::Delete),
Event::Keyboard(KeyEvent {
code: Key::Char(ch),
modifiers: KeyModifiers::SHIFT | KeyModifiers::NONE,
}) => self.perform(Cmd::Type(ch)),
Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => {
return Some(Msg::YoutubeSearchInputPopupCloseCancel);
}
Event::Keyboard(KeyEvent {
code: Key::Enter, ..
}) => self.perform(Cmd::Submit),
_ => CmdResult::None,
};
match cmd_result {
CmdResult::Submit(State::One(StateValue::String(input_string))) => {
Some(Msg::YoutubeSearchInputPopupCloseOk(input_string))
}
_ => Some(Msg::None),
}
}
}
#[derive(MockComponent)]
pub struct YSTablePopup {
component: Table,
}
impl Default for YSTablePopup {
fn default() -> Self {
Self {
component: Table::default()
.borders(
Borders::default()
.modifiers(BorderType::Rounded)
.color(Color::Blue),
)
.background(Color::Black)
.title("Tab/Shift+Tab for next and previous page", Alignment::Left)
.scroll(true)
.highlighted_color(Color::LightBlue)
.highlighted_str("\u{1f680}")
.rewind(false)
.step(4)
.row_height(1)
.headers(&["Duration", "Name"])
.column_spacing(3)
.widths(&[20, 80])
.table(
TableBuilder::default()
.add_col(TextSpan::from("Empty result."))
.add_col(TextSpan::from("Loading..."))
.build(),
),
}
}
}
impl Component<Msg, NoUserEvent> for YSTablePopup {
fn on(&mut self, ev: Event<NoUserEvent>) -> Option<Msg> {
let cmd_result = match ev {
Event::Keyboard(KeyEvent { code: Key::Esc, .. }) => {
return Some(Msg::YoutubeSearchTablePopupCloseCancel)
}
Event::Keyboard(KeyEvent {
code: Key::Down | Key::Char('j'),
..
}) => self.perform(Cmd::Move(Direction::Down)),
Event::Keyboard(KeyEvent {
code: Key::Up | Key::Char('k'),
..
}) => self.perform(Cmd::Move(Direction::Up)),
Event::Keyboard(KeyEvent {
code: Key::PageDown,
..
}) => self.perform(Cmd::Scroll(Direction::Down)),
Event::Keyboard(KeyEvent {
code: Key::PageUp, ..
}) => self.perform(Cmd::Scroll(Direction::Up)),
Event::Keyboard(KeyEvent {
code: Key::Home | Key::Char('g'),
..
}) => self.perform(Cmd::GoTo(Position::Begin)),
Event::Keyboard(
KeyEvent { code: Key::End, .. }
| KeyEvent {
code: Key::Char('G'),
modifiers: KeyModifiers::SHIFT,
},
) => self.perform(Cmd::GoTo(Position::End)),
Event::Keyboard(KeyEvent {
code: Key::Tab,
modifiers: KeyModifiers::NONE,
}) => return Some(Msg::YoutubeSearchTablePopupNext),
Event::Keyboard(KeyEvent {
code: Key::BackTab,
modifiers: KeyModifiers::SHIFT,
}) => return Some(Msg::YoutubeSearchTablePopupPrevious),
Event::Keyboard(KeyEvent {
code: Key::Enter, ..
}) => {
if let State::One(StateValue::Usize(index)) = self.state() {
return Some(Msg::YoutubeSearchTablePopupCloseOk(index));
}
CmdResult::None
}
_ => CmdResult::None,
};
match cmd_result {
_ => Some(Msg::None),
}
}
}