Skip to content

Commit

Permalink
Render errors inline with other mode content
Browse files Browse the repository at this point in the history
  • Loading branch information
jmacdonald committed Nov 16, 2024
1 parent 35b68e5 commit 0e3dd95
Show file tree
Hide file tree
Showing 13 changed files with 272 additions and 148 deletions.
113 changes: 74 additions & 39 deletions src/models/application/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,58 +88,93 @@ impl Application {
fn render(&mut self) -> Result<()> {
if let Err(error) = self.present() {
presenters::error::display(&mut self.workspace, &mut self.view, &error)?;
} else if let Some(ref error) = self.error {
// Display an error from previous command invocation, if one exists.
presenters::error::display(&mut self.workspace, &mut self.view, error)?;
}

Ok(())
}

fn present(&mut self) -> Result<()> {
match self.mode {
Mode::Confirm(_) => {
presenters::modes::confirm::display(&mut self.workspace, &mut self.view)
}
Mode::Command(ref mut mode) => {
presenters::modes::search_select::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Insert => presenters::modes::insert::display(&mut self.workspace, &mut self.view),
Mode::Open(ref mut mode) => {
presenters::modes::open::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Search(ref mode) => {
presenters::modes::search::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Jump(ref mut mode) => {
presenters::modes::jump::display(&mut self.workspace, mode, &mut self.view)
}
Mode::LineJump(ref mode) => {
presenters::modes::line_jump::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Path(ref mode) => {
presenters::modes::path::display(&mut self.workspace, mode, &mut self.view)
}
Mode::SymbolJump(ref mut mode) => {
presenters::modes::search_select::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Syntax(ref mut mode) => {
presenters::modes::search_select::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Select(ref mode) => {
presenters::modes::select::display(&mut self.workspace, mode, &mut self.view)
}
Mode::SelectLine(ref mode) => {
presenters::modes::select_line::display(&mut self.workspace, mode, &mut self.view)
Mode::Confirm(_) => presenters::modes::confirm::display(
&mut self.workspace,
&mut self.view,
&self.error,
),
Mode::Command(ref mut mode) => presenters::modes::search_select::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Insert => {
presenters::modes::insert::display(&mut self.workspace, &mut self.view, &self.error)
}
Mode::Open(ref mut mode) => presenters::modes::open::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Search(ref mode) => presenters::modes::search::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Jump(ref mut mode) => presenters::modes::jump::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::LineJump(ref mode) => presenters::modes::line_jump::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Path(ref mode) => presenters::modes::path::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::SymbolJump(ref mut mode) => presenters::modes::search_select::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Syntax(ref mut mode) => presenters::modes::search_select::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Select(ref mode) => presenters::modes::select::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::SelectLine(ref mode) => presenters::modes::select_line::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Normal => presenters::modes::normal::display(
&mut self.workspace,
&mut self.view,
&self.repository,
&self.error,
),
Mode::Theme(ref mut mode) => presenters::modes::search_select::display(
&mut self.workspace,
mode,
&mut self.view,
&self.error,
),
Mode::Theme(ref mut mode) => {
presenters::modes::search_select::display(&mut self.workspace, mode, &mut self.view)
}
Mode::Exit => Ok(()),
}
}
Expand Down
20 changes: 12 additions & 8 deletions src/presenters/modes/confirm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,25 @@ use crate::errors::*;
use crate::view::{Colors, StatusLineData, Style, View};
use scribe::Workspace;

pub fn display(workspace: &mut Workspace, view: &mut View) -> Result<()> {
pub fn display(workspace: &mut Workspace, view: &mut View, error: &Option<Error>) -> Result<()> {
let mut presenter = view.build_presenter()?;
let buf = workspace.current_buffer.as_ref().ok_or(BUFFER_MISSING)?;
let data = buf.data();

// Draw the visible set of tokens to the terminal.
presenter.print_buffer(buf, &data, &workspace.syntax_set, None, None)?;

// Draw the status line as a search prompt.
let confirmation = "Are you sure? (y/n)".to_string();
presenter.print_status_line(&[StatusLineData {
content: confirmation,
style: Style::Bold,
colors: Colors::Warning,
}]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
// Draw the status line as a search prompt.
let confirmation = "Are you sure? (y/n)".to_string();
presenter.print_status_line(&[StatusLineData {
content: confirmation,
style: Style::Bold,
colors: Colors::Warning,
}]);
}

// Render the changes to the screen.
presenter.present()?;
Expand Down
22 changes: 13 additions & 9 deletions src/presenters/modes/insert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::presenters::current_buffer_status_line_data;
use crate::view::{Colors, CursorType, StatusLineData, Style, View};
use scribe::Workspace;

pub fn display(workspace: &mut Workspace, view: &mut View) -> Result<()> {
pub fn display(workspace: &mut Workspace, view: &mut View, error: &Option<Error>) -> Result<()> {
let mut presenter = view.build_presenter()?;
let buffer_status = current_buffer_status_line_data(workspace);
let buf = workspace.current_buffer.as_ref().ok_or(BUFFER_MISSING)?;
Expand All @@ -12,14 +12,18 @@ pub fn display(workspace: &mut Workspace, view: &mut View) -> Result<()> {
// Draw the visible set of tokens to the terminal.
presenter.print_buffer(buf, &data, &workspace.syntax_set, None, None)?;

presenter.print_status_line(&[
StatusLineData {
content: " INSERT ".to_string(),
style: Style::Default,
colors: Colors::Insert,
},
buffer_status,
]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
presenter.print_status_line(&[
StatusLineData {
content: " INSERT ".to_string(),
style: Style::Default,
colors: Colors::Insert,
},
buffer_status,
]);
}

// Show a blinking, vertical bar indicating input.
presenter.set_cursor_type(CursorType::BlinkingBar);
Expand Down
27 changes: 18 additions & 9 deletions src/presenters/modes/jump.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ use crate::presenters::current_buffer_status_line_data;
use crate::view::{Colors, StatusLineData, Style, View};
use scribe::Workspace;

pub fn display(workspace: &mut Workspace, mode: &mut JumpMode, view: &mut View) -> Result<()> {
pub fn display(
workspace: &mut Workspace,
mode: &mut JumpMode,
view: &mut View,
error: &Option<Error>,
) -> Result<()> {
let mut presenter = view.build_presenter()?;
let buffer_status = current_buffer_status_line_data(workspace);
let buf = workspace.current_buffer.as_ref().ok_or(BUFFER_MISSING)?;
Expand All @@ -15,14 +20,18 @@ pub fn display(workspace: &mut Workspace, mode: &mut JumpMode, view: &mut View)
// Draw the visible set of tokens to the terminal.
presenter.print_buffer(buf, &data, &workspace.syntax_set, None, Some(mode))?;

presenter.print_status_line(&[
StatusLineData {
content: " JUMP ".to_string(),
style: Style::Default,
colors: Colors::Inverted,
},
buffer_status,
]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
presenter.print_status_line(&[
StatusLineData {
content: " JUMP ".to_string(),
style: Style::Default,
colors: Colors::Inverted,
},
buffer_status,
]);
}

// Don't display a cursor.
presenter.set_cursor(None);
Expand Down
23 changes: 16 additions & 7 deletions src/presenters/modes/line_jump.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,29 @@ use crate::view::{Colors, CursorType, StatusLineData, Style, View};
use scribe::buffer::Position;
use scribe::Workspace;

pub fn display(workspace: &mut Workspace, mode: &LineJumpMode, view: &mut View) -> Result<()> {
pub fn display(
workspace: &mut Workspace,
mode: &LineJumpMode,
view: &mut View,
error: &Option<Error>,
) -> Result<()> {
let mut presenter = view.build_presenter()?;
let buf = workspace.current_buffer.as_ref().ok_or(BUFFER_MISSING)?;
let data = buf.data();
presenter.print_buffer(buf, &data, &workspace.syntax_set, None, None)?;

// Draw the status line as an input prompt.
let input_prompt = format!("Go to line: {}", mode.input);
let input_prompt_len = input_prompt.len();
presenter.print_status_line(&[StatusLineData {
content: input_prompt,
style: Style::Default,
colors: Colors::Default,
}]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
// Draw the status line as an input prompt.
presenter.print_status_line(&[StatusLineData {
content: input_prompt,
style: Style::Default,
colors: Colors::Default,
}]);
}

// Move the cursor to the end of the search query input.
let cursor_line = presenter.height() - 1;
Expand Down
25 changes: 15 additions & 10 deletions src/presenters/modes/normal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ pub fn display(
workspace: &mut Workspace,
view: &mut View,
repo: &Option<Repository>,
error: &Option<Error>,
) -> Result<()> {
let mut presenter = view.build_presenter()?;
let buffer_status = current_buffer_status_line_data(workspace);
Expand All @@ -25,16 +26,20 @@ pub fn display(
Colors::Inverted
};

// Build the status line mode and buffer title display.
presenter.print_status_line(&[
StatusLineData {
content: " NORMAL ".to_string(),
style: Style::Default,
colors,
},
buffer_status,
git_status_line_data(repo, &buf.path),
]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
// Build the status line mode and buffer title display.
presenter.print_status_line(&[
StatusLineData {
content: " NORMAL ".to_string(),
style: Style::Default,
colors,
},
buffer_status,
git_status_line_data(repo, &buf.path),
]);
}

// Restore the default cursor, suggesting non-input mode.
presenter.set_cursor_type(CursorType::Block);
Expand Down
27 changes: 18 additions & 9 deletions src/presenters/modes/open.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ use scribe::Workspace;
use std::cmp;
use unicode_segmentation::UnicodeSegmentation;

pub fn display(workspace: &mut Workspace, mode: &mut OpenMode, view: &mut View) -> Result<()> {
pub fn display(
workspace: &mut Workspace,
mode: &mut OpenMode,
view: &mut View,
error: &Option<Error>,
) -> Result<()> {
let data;
let padded_message;
let mut presenter = view.build_presenter()?;
Expand All @@ -21,14 +26,18 @@ pub fn display(workspace: &mut Workspace, mode: &mut OpenMode, view: &mut View)
data = buf.data();
presenter.print_buffer(buf, &data, &workspace.syntax_set, None, None)?;

presenter.print_status_line(&[
StatusLineData {
content: format!(" {mode} "),
style: Style::Default,
colors: Colors::Inverted,
},
buffer_status,
]);
if let Some(e) = error {
presenter.print_error(e.description());
} else {
presenter.print_status_line(&[
StatusLineData {
content: format!(" {mode} "),
style: Style::Default,
colors: Colors::Inverted,
},
buffer_status,
]);
}
}

if let Some(message) = mode.message() {
Expand Down
Loading

0 comments on commit 0e3dd95

Please sign in to comment.