quinjet 0.0.52

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,
}

#[derive(Debug, Clone)]
pub(crate) struct ContentReviewHit {
    pub area: Rect,
    pub thread_id: String,
}

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),
    JumpToTop,
    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, Copy, PartialEq, Eq)]
pub(crate) enum RepositoryTabAction {
    OpenProject,
    Close,
    CloseOthers,
    CloseAll,
}

impl RepositoryTabAction {
    pub(crate) const ALL: [Self; 4] = [
        Self::OpenProject,
        Self::Close,
        Self::CloseOthers,
        Self::CloseAll,
    ];

    pub(crate) const fn label(self) -> &'static str {
        match self {
            Self::OpenProject => "Open Project...",
            Self::Close => "Close",
            Self::CloseOthers => "Close Others",
            Self::CloseAll => "Close All",
        }
    }
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct RepositoryTabHit {
    pub area: Rect,
    pub close: Rect,
    pub id: TabId,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct RepositoryTabDrag {
    pub id: TabId,
    pub target: Option<TabId>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct RepositoryTabMenu {
    pub id: TabId,
    pub column: u16,
    pub row: u16,
    pub selected: usize,
}

#[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 repository_tab_hits: Vec<RepositoryTabHit>,
    pub repository_tab_open: Rect,
    pub repository_tab_previous: Rect,
    pub repository_tab_next: Rect,
    pub repository_tab_menu_hits: Vec<(Rect, RepositoryTabAction)>,
    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 modal_list_hits: Vec<(Rect, usize)>,
    pub modal_list_len: usize,
    pub modal_list_max_scroll: usize,
    pub content_file_hits: Vec<ContentFileHit>,
    pub content_step_hits: Vec<ContentStepHit>,
    pub content_review_hits: Vec<ContentReviewHit>,
    pub link_hits: Vec<LinkHit>,
    pub help_hits: Vec<HelpHit>,
    pub project_hits: Vec<Rect>,
    pub project_collapse_hits: Vec<(Rect, PathBuf)>,
}