rsvim_core 0.1.3-alpha.2

The core library for RSVIM text editor.
Documentation
//! Command-line widget.

pub mod indicator;
pub mod input;
pub mod message;

#[cfg(test)]
pub mod indicator_tests;

use crate::cmdltext::CmdlineTextWk;
use crate::inodify_impl;
use crate::prelude::*;
use crate::ui::tree::*;
use crate::ui::viewport::CursorViewport;
use crate::ui::viewport::CursorViewportArc;
use crate::ui::viewport::Viewport;
use crate::ui::viewport::ViewportArc;
use crate::ui::widget::Widgetable;
use crate::ui::widget::window::opt::WindowOptions;
use crate::ui::widget::window::opt::WindowOptionsBuilder;

#[derive(Debug, Clone)]
/// The Vim command-line.
pub struct Cmdline {
  __node: InodeBase,
  options: WindowOptions,

  input_panel_id: NodeId,
  indicator_id: NodeId,
  input_id: NodeId,
  message_id: NodeId,

  input_viewport: ViewportArc,
  input_cursor_viewport: CursorViewportArc,
  message_viewport: ViewportArc,
}

inodify_impl!(Cmdline);

impl Cmdline {
  pub fn new(
    id: NodeId,
    ctx: TreeContextWk,
    cmdline_text: CmdlineTextWk,
    input_panel_id: NodeId,
    indicator_id: NodeId,
    input_id: NodeId,
    input_size: &U16Size,
    message_id: NodeId,
    message_size: &U16Size,
  ) -> Self {
    // Force cmdline window options.
    let options = WindowOptionsBuilder::default()
      .wrap(false)
      .line_break(false)
      .scroll_off(0)
      .build()
      .unwrap();

    let (input_viewport, input_cursor_viewport, message_viewport) = {
      let cmdline_text = cmdline_text.upgrade().unwrap();
      let cmdline_text = lock!(cmdline_text);
      let input_viewport =
        Viewport::view(&options, cmdline_text.input(), input_size, 0, 0);
      let input_cursor_viewport = CursorViewport::from_top_left(
        &input_viewport,
        cmdline_text.input(),
        input_size,
      );

      let message_viewport =
        Viewport::view(&options, cmdline_text.message(), message_size, 0, 0);
      (input_viewport, input_cursor_viewport, message_viewport)
    };

    let input_viewport = Viewport::to_arc(input_viewport);
    let input_cursor_viewport = CursorViewport::to_arc(input_cursor_viewport);
    let message_viewport = Viewport::to_arc(message_viewport);

    Self {
      __node: InodeBase::new(id, ctx),
      options,
      input_panel_id,
      indicator_id,
      input_id,
      message_id,
      input_viewport,
      input_cursor_viewport,
      message_viewport,
    }
  }
}

impl Widgetable for Cmdline {}

impl Cmdline {
  /// Get window local options.
  pub fn options(&self) -> &WindowOptions {
    &self.options
  }

  /// Set window local options.
  pub fn set_options(&mut self, options: &WindowOptions) {
    self.options = *options;
  }

  /// Command-line input panel widget ID.
  pub fn input_panel_id(&self) -> NodeId {
    self.input_panel_id
  }

  /// Command-line indicator widget ID.
  pub fn indicator_id(&self) -> NodeId {
    self.indicator_id
  }

  /// Command-line input widget ID.
  pub fn input_id(&self) -> NodeId {
    self.input_id
  }

  /// Command-line message widget ID.
  pub fn message_id(&self) -> NodeId {
    self.message_id
  }
}

// Viewport {
impl Cmdline {
  /// Get input viewport.
  pub fn input_viewport(&self) -> ViewportArc {
    self.input_viewport.clone()
  }

  /// Get message viewport.
  pub fn message_viewport(&self) -> ViewportArc {
    self.message_viewport.clone()
  }

  /// Set viewport for input.
  pub fn set_input_viewport(&mut self, viewport: ViewportArc) {
    self.input_viewport = viewport;
  }

  /// Set viewport for message.
  pub fn set_message_viewport(&mut self, viewport: ViewportArc) {
    self.message_viewport = viewport;
  }

  /// Get cursor viewport for input.
  pub fn input_cursor_viewport(&self) -> CursorViewportArc {
    self.input_cursor_viewport.clone()
  }

  /// Set cursor viewport for input.
  pub fn set_input_cursor_viewport(
    &mut self,
    cursor_viewport: CursorViewportArc,
  ) {
    self.input_cursor_viewport = cursor_viewport;
  }
}
// Viewport }