pub mod cmds;
use crossterm::event::Event as CrossEvent;
use leetcode_api::dao::query::Query;
use rayon::prelude::*;
use tui_textarea::Input;
use self::cmds::{inputline, question, sync_bar};
use crate::fuzzy_search::filter;
#[derive(Clone)]
#[derive(Default)]
#[derive(Debug)]
pub struct SelectQS<'tab0> {
pub qs_state: question::QsState,
pub sync_bar: sync_bar::BarState,
pub inputline: inputline::InputLine<'tab0>,
}
impl SelectQS<'_> {
pub fn keymap_insert(&mut self, event: CrossEvent) -> bool {
match event.into() {
Input { key: tui_textarea::Key::Esc, .. } => self.out_edit(),
Input { key: tui_textarea::Key::Enter, .. } => false, input => {
let trigger = self.inputline.handle_input(input);
if trigger {
self.filter_by_input();
}
trigger
},
}
}
}
impl<'tab0> SelectQS<'tab0> {
pub async fn new() -> SelectQS<'tab0> {
let questions = Query::query_all_index()
.await
.unwrap_or_default();
Self {
qs_state: question::QsState::new(questions.into()),
sync_bar: sync_bar::BarState::default(),
..Default::default()
}
}
pub fn update_percent(&mut self, perc: f64) {
self.sync_bar.update(perc);
}
pub fn filter_by_input(&mut self) {
self.qs_state.filtered_qs = self
.qs_state
.all_questions
.par_iter()
.filter(|v| filter(self.inputline.first_line(), &v.to_string()))
.cloned()
.collect();
}
pub fn next_qs(&mut self) -> bool {
self.qs_state.next()
}
pub fn prev_qs(&mut self) -> bool {
self.qs_state.prev()
}
pub fn first_qs(&mut self) -> bool {
self.qs_state.first()
}
pub fn last_qs(&mut self) -> bool {
self.qs_state.last()
}
pub fn current_qs(&self) -> u32 {
self.qs_state.current_qs()
}
pub fn edit(&mut self) -> bool {
self.inputline.insert();
true
}
pub fn out_edit(&mut self) -> bool {
self.inputline.out_edit();
true
}
}