Draft Editor API and TextEditor widget

This commit is contained in:
Héctor Ramón Jiménez 2023-09-12 14:51:00 +02:00
parent 346af3f8b0
commit 6448429103
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
25 changed files with 1384 additions and 92 deletions

68
core/src/text/editor.rs Normal file
View file

@ -0,0 +1,68 @@
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),
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>),
}