tui-canvas 0.8.10

Form/textarea/input for TUI
Documentation
#[cfg(feature = "keybindings")]
use crate::{
    canvas::modes::AppMode,
    keybindings::{CanvasKeyAction, KeyEventOutcome},
    textarea::{TextAreaDataProvider, TextAreaState},
};

#[cfg(feature = "keybindings")]
impl<P: TextAreaDataProvider> TextAreaState<P> {
    pub(crate) fn dispatch_shared_textarea_key_action(
        &mut self,
        action: &CanvasKeyAction,
        count: usize,
    ) -> Option<KeyEventOutcome> {
        match action {
            CanvasKeyAction::NextField if self.mode() == AppMode::Ins => {
                Some(self.consume_action(|this| this.insert_tab_spaces()))
            }
            CanvasKeyAction::DeleteCharBackward => Some(self.consume_action(|this| {
                for _ in 0..count {
                    this.delete_backward_preserving_mode();
                }
            })),
            CanvasKeyAction::DeleteCharForward => Some(self.consume_action(|this| {
                for _ in 0..count {
                    this.delete_forward_preserving_mode();
                }
            })),
            CanvasKeyAction::OpenLineBelow => Some(self.consume_action(|this| {
                for _ in 0..count {
                    this.open_line_below();
                }
            })),
            CanvasKeyAction::OpenLineAbove => Some(self.consume_action(|this| {
                for _ in 0..count {
                    this.open_line_above();
                }
            })),
            CanvasKeyAction::MoveHalfPageUp => {
                Some(self.consume_action(|this| this.move_half_page_up(count)))
            }
            CanvasKeyAction::MoveHalfPageDown => {
                Some(self.consume_action(|this| this.move_half_page_down(count)))
            }
            CanvasKeyAction::MovePageUp => {
                Some(self.consume_action(|this| this.move_page_up(count)))
            }
            CanvasKeyAction::MovePageDown => {
                Some(self.consume_action(|this| this.move_page_down(count)))
            }
            CanvasKeyAction::EnterEditModeLineStart => {
                Some(self.consume_action(|this| this.enter_line_start_insert_mode()))
            }
            CanvasKeyAction::EnterEditModeLineEnd => {
                Some(self.consume_action(|this| this.enter_line_end_insert_mode()))
            }
            CanvasKeyAction::DeleteLine => {
                Some(self.consume_action(|this| this.delete_current_lines(count)))
            }
            CanvasKeyAction::DeleteToLineEnd => {
                Some(self.consume_action(|this| this.delete_to_line_end()))
            }
            CanvasKeyAction::ChangeLine => {
                Some(self.consume_action(|this| this.change_current_line()))
            }
            CanvasKeyAction::ChangeToLineEnd => {
                Some(self.consume_action(|this| this.change_to_line_end()))
            }
            CanvasKeyAction::JoinLineBelow => {
                Some(self.consume_action(|this| this.join_lines_below(count)))
            }
            CanvasKeyAction::MoveLineUp => {
                Some(self.consume_action(|this| this.move_line_up(count)))
            }
            CanvasKeyAction::MoveLineDown => {
                Some(self.consume_action(|this| this.move_line_down(count)))
            }
            CanvasKeyAction::DuplicateLineUp => {
                Some(self.consume_action(|this| this.duplicate_line_up(count)))
            }
            CanvasKeyAction::DuplicateLineDown => {
                Some(self.consume_action(|this| this.duplicate_line_down(count)))
            }
            CanvasKeyAction::CopyLine => Some(self.consume_action(|this| this.copy_current_line())),
            CanvasKeyAction::CutLine => Some(self.consume_action(|this| this.cut_current_line())),
            _ => None,
        }
    }

    pub(crate) fn consume_action(&mut self, f: impl FnOnce(&mut Self)) -> KeyEventOutcome {
        f(self);
        KeyEventOutcome::Consumed(None)
    }

    pub(crate) fn execute_canvas_key_action(
        &mut self,
        action: &CanvasKeyAction,
        count: usize,
    ) -> KeyEventOutcome {
        let Some(canvas_action) = action.to_canvas_action() else {
            return KeyEventOutcome::NotMatched;
        };
        let mut result = crate::canvas::actions::ActionResult::Success;
        for _ in 0..count {
            result = self.core.execute(canvas_action.clone());
        }
        match result {
            crate::canvas::actions::ActionResult::Success => KeyEventOutcome::Consumed(None),
            crate::canvas::actions::ActionResult::Message(msg)
            | crate::canvas::actions::ActionResult::Error(msg) => {
                KeyEventOutcome::Consumed(Some(msg))
            }
        }
    }
}