Skip to content

Commit

Permalink
Notify Highlighter of topmost line change
Browse files Browse the repository at this point in the history
  • Loading branch information
hecrj committed Sep 17, 2023
1 parent 23d0044 commit 2897986
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 31 deletions.
9 changes: 7 additions & 2 deletions core/src/text/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,18 @@ pub enum Action {
Select(Motion),
SelectWord,
SelectLine,
Edit(Edit),
Click(Point),
Drag(Point),
}

#[derive(Debug, Clone, PartialEq)]
pub enum Edit {
Insert(char),
Paste(Arc<String>),
Enter,
Backspace,
Delete,
Click(Point),
Drag(Point),
}

#[derive(Debug, Clone, Copy, PartialEq)]
Expand Down
58 changes: 40 additions & 18 deletions graphics/src/text/editor.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
use crate::core::text::editor::{self, Action, Cursor, Direction, Motion};
use crate::core::text::editor::{
self, Action, Cursor, Direction, Edit, Motion,
};
use crate::core::text::highlighter::{self, Highlighter};
use crate::core::text::LineHeight;
use crate::core::{Font, Pixels, Point, Rectangle, Size};
use crate::text;

use cosmic_text::Edit;
use cosmic_text::Edit as _;

use std::fmt;
use std::sync::{self, Arc};
Expand Down Expand Up @@ -370,22 +372,42 @@ impl editor::Editor for Editor {
}

// Editing events
Action::Insert(c) => {
editor
.action(font_system.raw(), cosmic_text::Action::Insert(c));
}
Action::Paste(text) => {
editor.insert_string(&text, None);
}
Action::Enter => {
editor.action(font_system.raw(), cosmic_text::Action::Enter);
}
Action::Backspace => {
editor
.action(font_system.raw(), cosmic_text::Action::Backspace);
}
Action::Delete => {
editor.action(font_system.raw(), cosmic_text::Action::Delete);
Action::Edit(edit) => {
match edit {
Edit::Insert(c) => {
editor.action(
font_system.raw(),
cosmic_text::Action::Insert(c),
);
}
Edit::Paste(text) => {
editor.insert_string(&text, None);
}
Edit::Enter => {
editor.action(
font_system.raw(),
cosmic_text::Action::Enter,
);
}
Edit::Backspace => {
editor.action(
font_system.raw(),
cosmic_text::Action::Backspace,
);
}
Edit::Delete => {
editor.action(
font_system.raw(),
cosmic_text::Action::Delete,
);
}
}

let cursor = editor.cursor();
let selection = editor.select_opt().unwrap_or(cursor);

internal.topmost_line_changed =
Some(cursor.min(selection).line);
}

// Mouse events
Expand Down
25 changes: 14 additions & 11 deletions widget/src/text_editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use std::ops::DerefMut;
use std::sync::Arc;

pub use crate::style::text_editor::{Appearance, Highlight, StyleSheet};
pub use text::editor::{Action, Motion};
pub use text::editor::{Action, Edit, Motion};

pub struct TextEditor<'a, Highlighter, Message, Renderer = crate::Renderer>
where
Expand Down Expand Up @@ -301,7 +301,7 @@ where
Update::Release => {
state.drag_click = None;
}
Update::Edit(action) => {
Update::Action(action) => {
shell.publish(on_edit(action));
}
Update::Copy => {
Expand All @@ -311,7 +311,9 @@ where
}
Update::Paste => {
if let Some(contents) = clipboard.read() {
shell.publish(on_edit(Action::Paste(Arc::new(contents))));
shell.publish(on_edit(Action::Edit(Edit::Paste(
Arc::new(contents),
))));
}
}
}
Expand Down Expand Up @@ -457,7 +459,7 @@ enum Update {
Click(mouse::Click),
Unfocus,
Release,
Edit(Action),
Action(Action),
Copy,
Paste,
}
Expand All @@ -470,7 +472,8 @@ impl Update {
padding: Padding,
cursor: mouse::Cursor,
) -> Option<Self> {
let edit = |action| Some(Update::Edit(action));
let action = |action| Some(Update::Action(action));
let edit = |edit| action(Action::Edit(edit));

match event {
Event::Mouse(event) => match event {
Expand Down Expand Up @@ -499,7 +502,7 @@ impl Update {
let cursor_position = cursor.position_in(bounds)?
- Vector::new(padding.top, padding.left);

edit(Action::Drag(cursor_position))
action(Action::Drag(cursor_position))
}
_ => None,
},
Expand All @@ -518,17 +521,17 @@ impl Update {
motion
};

return edit(if modifiers.shift() {
return action(if modifiers.shift() {
Action::Select(motion)
} else {
Action::Move(motion)
});
}

match key_code {
keyboard::KeyCode::Enter => edit(Action::Enter),
keyboard::KeyCode::Backspace => edit(Action::Backspace),
keyboard::KeyCode::Delete => edit(Action::Delete),
keyboard::KeyCode::Enter => edit(Edit::Enter),
keyboard::KeyCode::Backspace => edit(Edit::Backspace),
keyboard::KeyCode::Delete => edit(Edit::Delete),
keyboard::KeyCode::Escape => Some(Self::Unfocus),
keyboard::KeyCode::C if modifiers.command() => {
Some(Self::Copy)
Expand All @@ -542,7 +545,7 @@ impl Update {
}
}
keyboard::Event::CharacterReceived(c) if state.is_focused => {
edit(Action::Insert(c))
edit(Edit::Insert(c))
}
_ => None,
},
Expand Down

0 comments on commit 2897986

Please sign in to comment.