use uuid::Uuid;
use tui_textarea::TextArea;
use crate::config::Config;
use crate::error::{Error, Result as InkResult};
use super::keymap::KeyChord;
use super::search_replace::SearchState;
pub(super) struct Keymap {
pub next_pane: KeyChord,
pub prev_pane: KeyChord,
pub search: KeyChord,
pub ai_prompt: KeyChord,
pub save: KeyChord,
pub page_up: KeyChord,
pub page_down: KeyChord,
pub meta_prefix: KeyChord,
pub bund_prefix: Option<KeyChord>,
pub view_prefix: Option<KeyChord>,
}
impl Keymap {
pub(super) fn from_config(cfg: &Config) -> InkResult<Self> {
let parse = |label: &str, s: &str| -> InkResult<KeyChord> {
KeyChord::parse(s).map_err(|e| Error::Config(format!("keys.{label}: {e}")))
};
let bund_prefix = if cfg.keys.bund_prefix.trim().is_empty() {
None
} else {
Some(parse("bund_prefix", &cfg.keys.bund_prefix)?)
};
let view_prefix = if cfg.keys.view_prefix.trim().is_empty() {
None
} else {
Some(parse("view_prefix", &cfg.keys.view_prefix)?)
};
Ok(Self {
next_pane: parse("next_pane", &cfg.keys.next_pane)?,
prev_pane: parse("prev_pane", &cfg.keys.prev_pane)?,
search: parse("search", &cfg.keys.search)?,
ai_prompt: parse("ai_prompt", &cfg.keys.ai_prompt)?,
save: parse("save", &cfg.keys.save)?,
page_up: parse("page_up", &cfg.keys.page_up)?,
page_down: parse("page_down", &cfg.keys.page_down)?,
meta_prefix: parse("meta_prefix", &cfg.keys.meta_prefix)?,
bund_prefix,
view_prefix,
})
}
}
#[derive(Debug, Clone, Copy)]
pub(super) enum ViewMdScope {
Buffer,
Subchapter,
Subtree,
}
#[derive(Debug, Clone, Copy)]
pub(super) enum MoveDir {
Up,
Down,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum LinkPickDirection {
Outgoing,
Incoming,
}
#[derive(Default)]
pub(super) struct ImportCounts {
pub branches: usize,
pub paragraphs: usize,
}
#[derive(Debug, Clone)]
pub(super) struct ChatSearchState {
pub query: String,
pub current: usize,
}
#[derive(Debug, Clone, Copy)]
pub(super) struct ChatSelectionState {
pub turn: usize,
}
#[derive(Debug, Clone)]
pub(super) struct DeletedParagraphStash {
pub parent_id: Option<Uuid>,
pub anchor_id: Option<Uuid>, pub title: String,
pub slug: String,
pub content: Vec<u8>,
pub tags: Vec<String>,
pub linked_paragraphs: Vec<Uuid>,
pub status: Option<String>,
pub target_words: Option<i32>,
pub content_type: Option<String>,
pub event: Option<crate::store::node::EventData>,
}
pub(super) struct OpenedDoc {
pub id: Uuid,
pub title: String,
pub rel_path: String,
pub textarea: TextArea<'static>,
pub dirty: bool,
pub scroll_row: usize,
pub scroll_col: usize,
pub block_anchor: Option<(usize, usize)>,
pub last_activity: std::time::Instant,
pub saved_lines: Vec<String>,
pub loaded_mtime: Option<std::time::SystemTime>,
pub split: Option<SplitView>,
pub search: Option<SearchState>,
pub read_only: bool,
pub content_type: Option<String>,
pub correction_baseline: Option<Vec<String>>,
pub typst_diagnostics: Vec<crate::typst_check::TypstDiagnostic>,
pub typst_diagnostics_checked_at: std::time::Instant,
pub typst_diag_last_fired: Option<(usize, String)>,
}
pub(super) struct SplitView {
pub snapshot_lines: Vec<String>,
pub scroll_row: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) struct ImageCallContext {
pub closing_quote_present: bool,
}
#[derive(Debug, Default)]
pub(super) struct BookStats {
pub chapters: usize,
pub subchapters: usize,
pub paragraphs: usize,
pub images: usize,
pub sentences: usize,
pub words: u64,
}