nexedit 0.2.2

A vim-like text editor, with simple shortcuts.
Documentation
use crate::errors::*;
use crate::presenters::{current_buffer_status_line_data, git_status_line_data};
use crate::view::{Colors, CursorType, StatusLineData, Style, View};
use git2::Repository;
use scribe::buffer::Position;
use scribe::Workspace;

pub fn display(
    workspace: &mut Workspace,
    view: &mut View,
    repo: &Option<Repository>,
) -> Result<()> {
    let mut presenter = view.build_presenter()?;
    let buffer_status = current_buffer_status_line_data(workspace);

    if let Some(buf) = workspace.current_buffer.as_ref() {
        let data = buf.data();
        presenter.print_buffer(buf, &data, &workspace.syntax_set, None, None)?;

        let colors = if buf.modified() {
            Colors::Warning
        } else {
            Colors::Inverted
        };

        presenter.print_status_line(&[
            StatusLineData {
                content: " NORMAL ".to_string(),
                style: Style::Default,
                colors,
            },
            buffer_status,
            git_status_line_data(repo, &buf.path),
        ]);

        presenter.set_cursor_type(CursorType::Block);

        presenter.present()?;
    } else {
        let content = [
            format!("Nexedit v{}", env!("CARGO_PKG_VERSION")),
            String::from("© 2024 d3vboi"),
            String::from(" "),
            String::from("Press \"?\" to view quick start guide"),
        ];
        let line_count = content.len();
        let vertical_offset = line_count / 2;

        for (line_no, line) in content.iter().enumerate() {
            let position = Position {
                line: (presenter.height() / 2 + line_no).saturating_sub(vertical_offset),
                offset: (presenter.width() / 2).saturating_sub(line.chars().count() / 2),
            };

            presenter.print(&position, Style::Default, Colors::Default, line);
        }

        presenter.set_cursor(None);
        presenter.present()?;
    }

    Ok(())
}