quinjet 0.0.35

A fast, live, keyboard-first Git source-control interface for the terminal
#[cfg_attr(not(test), expect(clippy::wildcard_imports, reason = "shared"))]
use super::*;

#[derive(Debug, Clone)]
pub(crate) enum SidebarHit {
    ChangeSection(ChangeSection),
    Change(usize),
    Commit(usize),
    PullRequestFiles,
    PullRequestOverview,
    PullRequestConversation,
    PullRequestChooseRepository,
    PullRequestLookup,
    RecentPullRequest(usize),
    PullRequestDirectory(PathBuf),
    PullRequestFile(usize),
    PullRequestCheckSection(CheckStatusSection),
    PullRequestCheck(usize),
}

#[derive(Debug, Clone)]
pub(crate) struct SidebarHitArea {
    pub area: Rect,
    pub target: SidebarHit,
}

#[derive(Debug, Clone)]
pub(crate) struct ContentFileHit {
    pub area: Rect,
    pub path: PathBuf,
}

#[derive(Debug, Clone)]
pub(crate) struct ContentStepHit {
    pub area: Rect,
    pub step: usize,
}

pub(crate) struct PullRequestContentRow {
    pub line: Line<'static>,
    pub step: Option<usize>,
    pub wide: bool,
}

#[derive(Debug, Clone)]
pub(crate) struct PullRequestContentLink {
    pub row: usize,
    pub start: usize,
    pub width: usize,
    pub target: OpenTarget,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum SideBySideRow {
    FileHeader(usize),
    FileFooter,
    Full { index: usize, boxed: bool },
    Split(Option<usize>, Option<usize>),
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum ScmAction {
    Stage(usize),
    Unstage(usize),
    Resolve(usize),
    StageSection(ChangeSection),
    UnstageSection(ChangeSection),
    ToggleCheck(usize),
    ToggleCheckSection(ChangeSection),
    Primary,
    RevertChecked,
    ToggleMenu,
    Menu(ScmMenuItem),
    PrPrimary,
    PrToggleMenu,
    PrMenu(PrMenuItem),
    JumpToBottom,
}

#[derive(Debug, Clone)]
pub(crate) struct HelpHit {
    pub area: Rect,
    pub index: usize,
}

#[derive(Debug, Clone)]
pub(crate) struct ScmActionHit {
    pub area: Rect,
    pub action: ScmAction,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) enum AuxiliaryPreview {
    Branch(HistoryBranch),
    Stash(Stash),
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[expect(
    variant_size_differences,
    reason = "both variants are pointer-sized in practice and boxing would cost an allocation per row"
)]
pub(crate) enum ChangeTarget {
    Section(ChangeSection),
    Change(usize),
}

#[derive(Debug, Clone, Default)]
pub(crate) struct UiGeometry {
    pub changes_tab: Rect,
    pub history_tab: Rect,
    pub pull_requests_tab: Rect,
    pub main: Rect,
    pub sidebar: Rect,
    pub sidebar_divider: Rect,
    pub content: Rect,
    pub diff_divider: Option<Rect>,
    pub sidebar_hits: Vec<SidebarHitArea>,
    pub scm_action_hits: Vec<ScmActionHit>,
    pub modal_action_hits: Vec<(Rect, ModalAction)>,
    pub content_file_hits: Vec<ContentFileHit>,
    pub content_step_hits: Vec<ContentStepHit>,
    pub link_hits: Vec<LinkHit>,
    pub help_hits: Vec<HelpHit>,
    pub project_hits: Vec<Rect>,
}