2023-09-12 14:51:00 +02:00
|
|
|
use crate::text::LineHeight;
|
|
|
|
|
use crate::{Pixels, Point, Rectangle, Size};
|
|
|
|
|
|
|
|
|
|
pub trait Editor: Sized + Default {
|
|
|
|
|
type Font: Copy + PartialEq + Default;
|
|
|
|
|
|
|
|
|
|
/// Creates a new [`Editor`] laid out with the given text.
|
|
|
|
|
fn with_text(text: &str) -> Self;
|
|
|
|
|
|
|
|
|
|
fn cursor(&self) -> Cursor;
|
|
|
|
|
|
|
|
|
|
fn perform(&mut self, action: Action);
|
|
|
|
|
|
|
|
|
|
/// Returns the current boundaries of the [`Editor`].
|
|
|
|
|
fn bounds(&self) -> Size;
|
|
|
|
|
|
|
|
|
|
/// Returns the minimum boundaries that can fit the contents of the
|
|
|
|
|
/// [`Editor`].
|
|
|
|
|
fn min_bounds(&self) -> Size;
|
|
|
|
|
|
|
|
|
|
/// Updates the [`Editor`] with some new attributes.
|
|
|
|
|
fn update(
|
|
|
|
|
&mut self,
|
|
|
|
|
new_bounds: Size,
|
|
|
|
|
new_font: Self::Font,
|
|
|
|
|
new_size: Pixels,
|
|
|
|
|
new_line_height: LineHeight,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/// Returns the minimum width that can fit the contents of the [`Editor`].
|
|
|
|
|
fn min_width(&self) -> f32 {
|
|
|
|
|
self.min_bounds().width
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Returns the minimum height that can fit the contents of the [`Editor`].
|
|
|
|
|
fn min_height(&self) -> f32 {
|
|
|
|
|
self.min_bounds().height
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
|
|
|
pub enum Action {
|
|
|
|
|
MoveLeft,
|
|
|
|
|
MoveRight,
|
|
|
|
|
MoveUp,
|
|
|
|
|
MoveDown,
|
|
|
|
|
MoveLeftWord,
|
|
|
|
|
MoveRightWord,
|
|
|
|
|
MoveHome,
|
|
|
|
|
MoveEnd,
|
|
|
|
|
SelectWord,
|
|
|
|
|
SelectLine,
|
|
|
|
|
Insert(char),
|
2023-09-12 15:03:23 +02:00
|
|
|
Enter,
|
2023-09-12 14:51:00 +02:00
|
|
|
Backspace,
|
|
|
|
|
Delete,
|
|
|
|
|
Click(Point),
|
|
|
|
|
Drag(Point),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// The cursor of an [`Editor`].
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub enum Cursor {
|
|
|
|
|
/// Cursor without a selection
|
|
|
|
|
Caret(Point),
|
|
|
|
|
|
|
|
|
|
/// Cursor selecting a range of text
|
|
|
|
|
Selection(Vec<Rectangle>),
|
|
|
|
|
}
|