use std::borrow::Cow;
use std::collections::HashMap;
use std::path::PathBuf;
use crate::prelude::*;
use app_state::ScreenKind;
use commands::ArgValue;
use editor::position::Position;
use crate::issue_registry::{IssueId, NewIssue, Severity};
use crate::persistent_issues::PersistentNewIssue;
use crate::task_registry::{TaskId, TaskKey, TaskStatus, TaskTrigger};
#[derive(Debug, Clone)]
pub enum ExtensionConfigOp {
MoveUp,
MoveDown,
Select(usize),
SetStatus(usize),
}
#[derive(Debug, Clone)]
pub enum FileSelectorOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
SwitchPane,
CollapseOrLeft,
ExpandOrRight,
ToggleDir,
SetResults {
generation: u64,
paths: Vec<PathBuf>,
},
DirLoaded {
path: PathBuf,
entries: Vec<(PathBuf, bool)>,
},
}
#[derive(Debug, Clone)]
pub enum LogViewOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
}
#[derive(Debug, Clone)]
pub enum TaskArchiveOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
OpenSelected,
CancelSelected,
TaskUpdated { new_len: usize },
CloseDetail,
ShowDetail {
task_id: TaskId,
title: String,
status: TaskStatus,
lines: Vec<String>,
},
}
#[derive(Debug, Clone)]
pub enum IssueViewOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
OpenSelected,
ResolveSelected,
DismissSelected,
ToggleShowDismissed,
SetSeverityFilter(Option<Severity>),
CloseDetail,
RegistryChanged,
}
#[derive(Debug, Clone)]
pub enum CommandSelectorOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
SwitchPane,
CollapseOrLeft,
ExpandOrRight,
Confirm,
ArgNext,
ArgPrev,
ArgChanged(String),
ArgCancel,
}
#[derive(Debug, Clone)]
pub enum CommitOp {
SwitchTab,
SwitchPane,
ToggleFileStage,
MessageChanged(String),
MessageInsertChar(char),
MessageInsertNewline,
MessageBackspace,
MessageCursorLeft,
MessageCursorRight,
MessageCursorUp,
MessageCursorDown,
BranchInputOpen,
BranchInputCancel,
BranchChanged(String),
BranchCreate,
BranchSelectorOpen,
BranchSelectorCancel,
BranchCheckout(String),
Confirm,
EnterAmendMode,
ConfirmAmend,
CancelAmend,
DiffFocusToggle,
ToggleLineStage,
RevertLine,
LoadDiff {
path: PathBuf,
staged: bool,
},
StatusLoaded {
staged: Vec<crate::vcs::StatusEntry>,
unstaged: Vec<crate::vcs::StatusEntry>,
branches: Vec<String>,
current_branch: String,
},
DiffLoaded {
path: PathBuf,
staged: bool,
lines: Vec<crate::vcs::DiffLine>,
},
AmendModeSet(bool, Option<String>),
GitOpSuccess(String),
GitOpError(String),
GitModeDetected {
mode: crate::vcs::GitMode,
has_conflicts: bool,
message: String,
},
AbortRebase,
AbortMerge,
}
#[derive(Debug, Clone)]
pub struct LspCompletionItem {
pub label: String,
pub kind: Option<u8>,
pub detail: Option<String>,
pub insert_text: Option<String>,
}
#[derive(Debug, Clone)]
pub struct LspLocation {
pub path: PathBuf,
pub row: usize,
pub col: usize,
}
#[derive(Debug, Clone)]
pub enum GoToTarget {
LspRequest,
LspLocation(LspLocation),
FileLine {
path: std::path::PathBuf,
line: usize,
col: Option<usize>,
},
DiffLine {
repo: Option<std::path::PathBuf>,
commit: Option<String>,
path: std::path::PathBuf,
line: usize,
},
Symbol {
name: String,
scope: Option<String>,
},
UriRange {
uri: String,
start_line: usize,
start_char: usize,
},
}
#[derive(Debug, Clone)]
pub enum ClipOp {
Copy,
Cut,
Paste,
OpenHistory,
HistoryUp,
HistoryDown,
HistoryConfirm,
HistoryClose,
}
#[derive(Debug, Clone)]
pub enum SelectionOp {
Extend { head: Position },
SelectAll,
Clear,
}
#[derive(Debug, Clone)]
pub enum GoToLineOp {
Open,
Close,
Confirm,
Input(crate::widgets::input_field::InputFieldOp),
JumpTo { line: usize, column: usize },
}
#[derive(Debug, Clone)]
pub enum SearchOp {
Open {
replace: bool,
},
Close,
QueryInput(crate::widgets::input_field::InputFieldOp),
ReplacementInput(crate::widgets::input_field::InputFieldOp),
ToggleIgnoreCase,
ToggleRegex,
ToggleSmartCase,
FocusSwitch,
NextMatch,
PrevMatch,
ReplaceOne,
ReplaceAll,
AddProjectResult { file: PathBuf, result: MatchSpan, generation: u64 },
ClearProjectResults { generation: u64 },
SelectFile(usize),
ScrollMatchPanel(i8),
IncludeGlobInput(crate::widgets::input_field::InputFieldOp),
ExcludeGlobInput(crate::widgets::input_field::InputFieldOp),
TreeMoveUp,
TreeMoveDown,
TreeToggle,
TreeCollapse,
}
#[derive(Debug, Clone)]
pub enum LspOp {
CompletionResponse {
items: Vec<LspCompletionItem>,
trigger: Option<Position>,
version: Option<i32>,
},
CompletionLoading {
trigger: Position,
},
HoverResponse(Option<String>),
CompletionMoveUp,
CompletionMoveDown,
CompletionConfirm,
CompletionDismiss,
HoverDismiss,
}
#[derive(Debug, Clone)]
pub struct LspTextEdit {
pub start_line: u32,
pub start_char: u32,
pub end_line: u32,
pub end_char: u32,
pub new_text: String,
}
#[derive(Debug, Clone)]
pub struct LspFileEdit {
pub path: std::path::PathBuf,
pub edits: Vec<LspTextEdit>,
}
#[derive(Debug, Clone)]
pub enum LspRenameOp {
OpenPrompt { current_name: String },
Input(crate::widgets::input_field::InputFieldOp),
Dismiss,
}
#[derive(Debug, Clone)]
pub struct MatchSpan {
pub line: usize,
pub byte_start: usize,
pub byte_end: usize,
pub line_text: String,
}
#[derive(Debug, Clone)]
pub struct FileMatchResult {
pub path: PathBuf,
pub matches: Vec<MatchSpan>,
}
#[derive(Debug, Clone)]
pub enum GitHistoryOp {
FilterInput(crate::widgets::input_field::InputFieldOp),
CommitsLoaded {
generation: u64,
commits: Vec<crate::vcs::CommitInfo>,
},
SelectRevision,
FilesLoaded {
oid: String,
files: Vec<crate::vcs::FileChange>,
},
SelectFile,
DiffLoaded {
lines: Vec<crate::vcs::DiffLine>,
},
LoadError(String),
}
#[derive(Debug, Clone)]
pub enum BranchViewOp {
BranchesLoaded {
local: Vec<String>,
remote: Vec<String>,
current: String,
},
LoadError(String),
CheckoutBranch,
CheckoutCompleted(String),
CheckoutError(String),
NewBranchOpen,
NewBranchInput(crate::widgets::input_field::InputFieldOp),
NewBranchConfirm,
NewBranchCancel,
CreateCompleted(String),
CreateError(String),
DeleteRequested,
DeleteConfirmNeeded { branch: String, merged: bool },
DeleteConfirmed,
DeleteCompleted(String),
DeleteError(String),
}
#[derive(Debug, Clone)]
pub enum GitPullOp {
FetchCompleted {
can_fast_forward: bool,
upstream: String,
current_branch: String,
},
FetchError(String),
FastForwardCompleted,
FastForwardError(String),
RebaseCompleted,
RebaseError(String),
MergeCompleted,
MergeError(String),
ChoiceUp,
ChoiceDown,
ChoiceConfirm,
}
#[derive(Debug, Clone)]
pub enum HistoryEditorOp {
CommitsLoaded(Vec<crate::vcs::CommitInfo>),
OperationFailed(String),
OperationCompleted {
commits: Vec<crate::vcs::CommitInfo>,
pre_sha: Option<String>,
description: String,
},
MoveUp,
MoveDown,
ConfirmMove,
StartReword,
StartSquash { target_idx: usize },
ConfirmEdit,
DeleteCommit,
UndoLast,
EditorInsertChar(char),
EditorInsertNewline,
EditorBackspace,
EditorCursorLeft,
EditorCursorRight,
}
#[derive(Debug, Clone)]
pub enum TerminalOp {
Output { id: u64, data: Vec<u8> },
AppendScrollback { id: u64, lines: Vec<crate::vt_parser::StyledLine> },
NewTab { command: Option<String> },
CloseTab { id: u64 },
SwitchToTab { index: usize },
NextTab,
PrevTab,
ScrollReset,
SetLinkHighlight { enabled: bool },
OpenMenu { id: u64 },
CloseMenu,
MenuConfirm,
OpenRename { id: u64 },
ClearTab { id: u64 },
RenameChanged(String),
RenameConfirm,
RenameCancel,
OpenTabSelector,
Resize { cols: u16, rows: u16 },
ProcessExited { id: u64 },
}
#[derive(Debug, Clone)]
pub enum SearchReplaceOp {
QueryChanged(String),
ReplaceChanged(String),
IncludeGlobChanged(String),
ExcludeGlobChanged(String),
ToggleRegex,
ToggleCase,
ToggleSmartCase,
TreeExpandOrEnter,
TreeCollapseOrLeave,
ReplaceCurrentFile,
ReplaceAll,
Undo,
Redo,
SearchResultsReady {
results: Vec<FileMatchResult>,
generation: u64,
},
ReplaceComplete {
path: PathBuf,
replaced_count: usize,
},
AsyncError(String),
ProgressUpdate {
scanned: usize,
total: usize,
},
}
#[derive(Debug, Clone)]
pub enum Operation {
InsertText {
path: Option<PathBuf>,
#[allow(dead_code)]
cursor: Position,
text: String,
},
PasteText {
path: Option<PathBuf>,
text: String,
},
DeleteText {
path: Option<PathBuf>,
#[allow(dead_code)]
cursor: Position,
#[allow(dead_code)]
len: usize,
},
DeleteForward {
path: Option<PathBuf>,
#[allow(dead_code)]
cursor: Position,
},
DeleteWordBackward {
path: Option<PathBuf>,
},
DeleteWordForward {
path: Option<PathBuf>,
},
IndentLines {
path: Option<PathBuf>,
},
UnindentLines {
path: Option<PathBuf>,
},
DeleteLine {
path: Option<PathBuf>,
},
ReplaceRange {
path: Option<PathBuf>,
start: Position,
end: Position,
text: String,
},
MoveCursor {
path: Option<PathBuf>,
cursor: Position,
},
Undo {
path: Option<PathBuf>,
},
Redo {
path: Option<PathBuf>,
},
ToggleFold {
path: Option<PathBuf>,
line: usize,
},
ToggleMarker {
path: Option<PathBuf>,
line: usize,
},
ToggleWordWrap,
OpenFile {
path: PathBuf,
},
GoToProjectMatch {
file: PathBuf,
line: usize,
col: usize,
},
OpenUrl {
url: String,
},
SaveFile {
path: PathBuf,
},
ReloadFromDisk {
path: PathBuf,
accept_external: bool,
silent: bool,
},
SwitchScreen {
to: ScreenKind,
},
Close,
Quit,
Focus(crate::widgets::focusable::FocusOp),
NavigateUp,
NavigateDown,
NavigatePageUp,
NavigatePageDown,
NavigateHome,
NavigateEnd,
FileSelectorLocal(FileSelectorOp),
CommandSelectorLocal(CommandSelectorOp),
LogViewLocal(LogViewOp),
CommitLocal(CommitOp),
GitHistoryLocal(GitHistoryOp),
BranchViewLocal(BranchViewOp),
HistoryEditorLocal(HistoryEditorOp),
GitPullLocal(GitPullOp),
ExtensionConfig(ExtensionConfigOp),
LspTriggerCompletion {
#[allow(dead_code)]
path: Option<PathBuf>,
#[allow(dead_code)]
trigger_char: Option<String>,
},
LspTriggerHover {
#[allow(dead_code)]
path: Option<PathBuf>,
idle_generation: Option<u64>,
},
LspGoToDefinition {
#[allow(dead_code)]
path: Option<PathBuf>,
},
LspGoToDefinitionResult(Vec<LspLocation>),
GoTo {
target: GoToTarget,
},
LspTriggerCharactersReceived {
lang_id: String,
trigger_chars: Vec<String>,
},
LspLocal(LspOp),
LspTriggerRename {
#[allow(dead_code)]
path: Option<PathBuf>,
},
LspTriggerRenameWith {
new_name: String,
row: u32,
col: u32,
},
LspRenameResult(Vec<LspFileEdit>),
LspRenameLocal(LspRenameOp),
SearchLocal(SearchOp),
GoToLineLocal(GoToLineOp),
SelectionLocal(SelectionOp),
ClipboardLocal(ClipOp),
SearchReplaceLocal(SearchReplaceOp),
RunCommand {
id: crate::commands::CommandId,
args: HashMap<String, ArgValue>,
},
OpenContextMenu {
items: Vec<(String, crate::commands::CommandId, Option<bool>)>,
x: u16,
y: u16,
},
CloseContextMenu,
#[allow(dead_code)]
Generic {
source: Cow<'static, str>,
name: Cow<'static, str>,
payload: HashMap<String, ArgValue>,
},
ExtensionEvent {
name: String,
payload: HashMap<String, String>,
},
ShowNotification {
message: String,
level: NotificationLevel,
},
UpdateStatusBar {
text: String,
#[allow(unused)]
slot: StatusSlot,
},
CreateTerminal {
command: String,
},
TerminalInput {
id: u64,
data: Vec<u8>,
},
TerminalLocal(TerminalOp),
ShowPicker {
title: String,
items: Vec<PickerItem>,
},
SetEditorHighlights {
path: Option<std::path::PathBuf>,
version: editor::buffer::Version,
start_line: usize,
generation: u64,
spans: Vec<Vec<editor::highlight::StyledSpan>>,
},
SetEditorHighlightsChunk {
path: Option<std::path::PathBuf>,
version: editor::buffer::Version,
generation: u64,
spans: Vec<(usize, Vec<editor::highlight::StyledSpan>)>,
},
SetEditorGitChanges {
path: std::path::PathBuf,
changed_lines: std::collections::HashSet<usize>,
},
AddIssue { issue: NewIssue },
RemoveIssue { id: IssueId },
ResolveIssue { id: IssueId },
DismissIssue { id: IssueId },
ClearIssuesByMarker { marker: String },
PersistentIssueLocal(PersistentIssueOp),
IssueAdded { id: IssueId },
IssueRemoved { id: IssueId },
IssueUpdated { id: IssueId },
TaskScheduled(TaskId),
TaskStarted(TaskId),
TaskFinished {
id: TaskId,
status: TaskStatus,
},
TaskCancelled(TaskId),
ScheduleTask {
key: TaskKey,
trigger: TaskTrigger,
command: String,
},
CancelTask(TaskId),
OpenLogForTask { task_id: TaskId },
OpenTaskArchive,
ShowTaskOutput {
task_id: TaskId,
title: String,
status: TaskStatus,
lines: Vec<String>,
},
TaskArchiveLocal(TaskArchiveOp),
OpenIssueList,
IssueViewLocal(IssueViewOp),
}
#[derive(Debug, Clone)]
pub enum PersistentIssueOp {
Add { issue: PersistentNewIssue },
Remove { id: IssueId },
Resolve { id: IssueId },
Dismiss { id: IssueId },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NotificationLevel {
Info,
Warn,
Error,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StatusSlot {
Left,
Center,
Right,
}
#[derive(Debug, Clone)]
#[allow(unused)]
pub struct PickerItem {
#[allow(dead_code)]
pub label: String,
#[allow(dead_code)]
pub value: String,
}
#[derive(Debug, Clone)]
pub struct Event {
#[allow(dead_code)]
pub source: Cow<'static, str>,
#[allow(dead_code)]
pub kind: EventKind,
}
#[derive(Debug, Clone)]
pub enum EventKind {
#[allow(dead_code)]
Applied(Operation),
}
impl Event {
pub fn applied(source: impl Into<Cow<'static, str>>, op: Operation) -> Self {
Self {
source: source.into(),
kind: EventKind::Applied(op),
}
}
}