lingora-tui 0.4.14

Lingora is a free and open-source localization management program that analyses fluent translation files highlighting discrepancies between reference and target languages. This application provides a terminal user interface; run as `lingora-tui`.
Documentation
use crossterm::event::Event;
use lingora_core::prelude::{DioxusI18nConfigRenderer, LingoraToml, Workspace};
use rat_event::{HandleEvent, Outcome, Regular};
use rat_focus::{FocusBuilder, FocusFlag, HasFocus};
use ratatui::{prelude::*, widgets::Block};

use crate::{
    components::{LineNumberedTextView, LineNumberedTextViewState},
    theme::LingoraTheme,
};

#[derive(Debug)]
pub struct DioxusI18nConfigState {
    text_view_state: LineNumberedTextViewState,
    area: Rect,
}

impl DioxusI18nConfigState {
    pub fn new(settings: &LingoraToml, workspace: &Workspace) -> Self {
        let mut cursor = std::io::Cursor::new(Vec::new());
        let renderer = DioxusI18nConfigRenderer::new(settings, workspace, None);
        let _ = renderer.render(&mut cursor);

        let content = String::from_utf8_lossy(&cursor.into_inner()).to_string();
        let text_view_state = LineNumberedTextViewState::new(content);

        Self {
            text_view_state,
            area: Rect::default(),
        }
    }
}

impl HasFocus for DioxusI18nConfigState {
    fn build(&self, builder: &mut FocusBuilder) {
        builder.widget(&self.text_view_state);
    }

    fn focus(&self) -> FocusFlag {
        unreachable!()
    }

    fn area(&self) -> Rect {
        unreachable!()
    }
}

impl HandleEvent<Event, Regular, Outcome> for DioxusI18nConfigState {
    fn handle(&mut self, event: &Event, qualifier: Regular) -> Outcome {
        self.text_view_state.handle(event, qualifier)
    }
}

pub struct DioxusI18nConfig<'a> {
    theme: &'a LingoraTheme,
}

impl<'a> DioxusI18nConfig<'a> {
    pub fn new(theme: &'a LingoraTheme) -> Self {
        Self { theme }
    }
}

impl StatefulWidget for DioxusI18nConfig<'_> {
    type State = DioxusI18nConfigState;

    fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) {
        state.area = area;

        Block::bordered()
            .title(Line::from(" dioxus-i18n: config.rs "))
            .render(area, buf);

        let area = Rect::new(area.x + 1, area.y + 1, area.width - 2, area.height - 2);
        LineNumberedTextView::new(self.theme).render(area, buf, &mut state.text_view_state);
    }
}