wiki-tui 0.8.2

A simple and easy to use Wikipedia Text User Interface
Documentation
use cursive::{theme::ColorStyle, Vec2, View};

use crate::wiki::language::Language;

const MIN_LENGTH_FULL: usize = 81;
const MIN_LENGTH_SHORT: usize = 39;

pub struct StatusBar {
    title: String,
    language: Language,
    available_languages: usize,
}

impl StatusBar {
    pub fn new() -> Self {
        StatusBar {
            title: String::new(),
            language: Language::default(),
            available_languages: 0,
        }
    }

    pub fn article_title(mut self, title: impl Into<String>) -> Self {
        self.title = title.into();
        self
    }

    pub fn language(mut self, language: &Language) -> Self {
        self.language = language.to_owned();
        self
    }

    pub fn available_languages(mut self, available_languages: usize) -> Self {
        self.available_languages = available_languages;
        self
    }
}

impl View for StatusBar {
    fn draw(&self, printer: &cursive::Printer) {
        printer.with_color(ColorStyle::highlight_inactive(), |printer| {
            printer.print_hline((0, 0), printer.size.x, " ")
        });

        if printer.size.x >= MIN_LENGTH_FULL {
            printer.print(
                (1, 0),
                &(" ".to_string()
                    + format!(
                        "wiki-tui | {} article '{}' | {} other languages available",
                        self.language.name(),
                        self.title,
                        self.available_languages
                    )
                    .as_str()),
            );
            debug!("draw status bar finished");
            return;
        }

        if printer.size.x >= MIN_LENGTH_SHORT {
            printer.print(
                (1, 0),
                &(" ".to_string()
                    + format!(
                        "wiki-tui | {} | {}",
                        self.language.name(),
                        self.available_languages
                    )
                    .as_str()),
            );
            debug!("draw status bar finished");
            return;
        }

        printer.print((1, 0), " wiki-tui");
    }

    fn required_size(&mut self, _: Vec2) -> Vec2 {
        Vec2::new(MIN_LENGTH_FULL, 1)
    }
}