Make Clipboard argument in Widget trait mutable
This commit is contained in:
parent
35425001ed
commit
21971e0037
31 changed files with 173 additions and 127 deletions
|
|
@ -160,17 +160,17 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
if let event::Status::Captured = self.content.on_event(
|
||||
event.clone(),
|
||||
layout.children().next().unwrap(),
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
) {
|
||||
return event::Status::Captured;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -150,9 +150,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
_renderer: &Renderer,
|
||||
_clipboard: Option<&dyn Clipboard>,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
match event {
|
||||
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
|
||||
|
|
|
|||
|
|
@ -141,9 +141,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
self.children
|
||||
.iter_mut()
|
||||
|
|
@ -153,9 +153,9 @@ where
|
|||
event.clone(),
|
||||
layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
})
|
||||
.fold(event::Status::Ignored, event::Status::merge)
|
||||
|
|
|
|||
|
|
@ -151,17 +151,17 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
self.content.widget.on_event(
|
||||
event,
|
||||
layout.children().next().unwrap(),
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -155,9 +155,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
_messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
_clipboard: Option<&dyn Clipboard>,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
_messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
let bounds = layout.bounds();
|
||||
let is_mouse_over = bounds.contains(cursor_position);
|
||||
|
|
|
|||
|
|
@ -362,9 +362,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
let mut event_status = event::Status::Ignored;
|
||||
|
||||
|
|
@ -461,9 +461,9 @@ where
|
|||
event.clone(),
|
||||
layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
})
|
||||
.fold(event_status, event::Status::merge)
|
||||
|
|
|
|||
|
|
@ -143,9 +143,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
let mut event_status = event::Status::Ignored;
|
||||
|
||||
|
|
@ -156,9 +156,9 @@ where
|
|||
event.clone(),
|
||||
children.next().unwrap(),
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
);
|
||||
|
||||
children.next().unwrap()
|
||||
|
|
@ -170,9 +170,9 @@ where
|
|||
event,
|
||||
body_layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
);
|
||||
|
||||
event_status.merge(body_status)
|
||||
|
|
|
|||
|
|
@ -199,9 +199,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
if let Some(controls) = &mut self.controls {
|
||||
let mut children = layout.children();
|
||||
|
|
@ -215,9 +215,9 @@ where
|
|||
event,
|
||||
controls_layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
} else {
|
||||
event::Status::Ignored
|
||||
|
|
|
|||
|
|
@ -210,9 +210,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
_renderer: &Renderer,
|
||||
_clipboard: Option<&dyn Clipboard>,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
match event {
|
||||
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
|
||||
|
|
|
|||
|
|
@ -156,9 +156,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
_renderer: &Renderer,
|
||||
_clipboard: Option<&dyn Clipboard>,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
match event {
|
||||
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
|
||||
|
|
|
|||
|
|
@ -140,9 +140,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
self.children
|
||||
.iter_mut()
|
||||
|
|
@ -152,9 +152,9 @@ where
|
|||
event.clone(),
|
||||
layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
})
|
||||
.fold(event::Status::Ignored, event::Status::merge)
|
||||
|
|
|
|||
|
|
@ -162,9 +162,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
let bounds = layout.bounds();
|
||||
let is_mouse_over = bounds.contains(cursor_position);
|
||||
|
|
@ -205,9 +205,9 @@ where
|
|||
event.clone(),
|
||||
content,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -180,9 +180,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
_renderer: &Renderer,
|
||||
_clipboard: Option<&dyn Clipboard>,
|
||||
_clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
let mut change = || {
|
||||
let bounds = layout.bounds();
|
||||
|
|
|
|||
|
|
@ -243,9 +243,9 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
match event {
|
||||
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left))
|
||||
|
|
@ -503,43 +503,42 @@ where
|
|||
}
|
||||
keyboard::KeyCode::V => {
|
||||
if self.state.keyboard_modifiers.is_command_pressed() {
|
||||
if let Some(clipboard) = clipboard {
|
||||
let content = match self.state.is_pasting.take()
|
||||
{
|
||||
Some(content) => content,
|
||||
None => {
|
||||
let content: String = clipboard
|
||||
.read()
|
||||
.unwrap_or(String::new())
|
||||
.chars()
|
||||
.filter(|c| !c.is_control())
|
||||
.collect();
|
||||
let content = match self.state.is_pasting.take() {
|
||||
Some(content) => content,
|
||||
None => {
|
||||
let content: String = clipboard
|
||||
.read()
|
||||
.unwrap_or(String::new())
|
||||
.chars()
|
||||
.filter(|c| !c.is_control())
|
||||
.collect();
|
||||
|
||||
Value::new(&content)
|
||||
}
|
||||
};
|
||||
Value::new(&content)
|
||||
}
|
||||
};
|
||||
|
||||
let mut editor = Editor::new(
|
||||
&mut self.value,
|
||||
&mut self.state.cursor,
|
||||
);
|
||||
let mut editor = Editor::new(
|
||||
&mut self.value,
|
||||
&mut self.state.cursor,
|
||||
);
|
||||
|
||||
editor.paste(content.clone());
|
||||
editor.paste(content.clone());
|
||||
|
||||
let message =
|
||||
(self.on_change)(editor.contents());
|
||||
messages.push(message);
|
||||
let message = (self.on_change)(editor.contents());
|
||||
messages.push(message);
|
||||
|
||||
self.state.is_pasting = Some(content);
|
||||
}
|
||||
self.state.is_pasting = Some(content);
|
||||
} else {
|
||||
self.state.is_pasting = None;
|
||||
}
|
||||
}
|
||||
keyboard::KeyCode::A => {
|
||||
if self.state.keyboard_modifiers.is_command_pressed() {
|
||||
self.state.cursor.select_all(&self.value);
|
||||
}
|
||||
keyboard::KeyCode::A
|
||||
if self
|
||||
.state
|
||||
.keyboard_modifiers
|
||||
.is_command_pressed() =>
|
||||
{
|
||||
self.state.cursor.select_all(&self.value);
|
||||
}
|
||||
keyboard::KeyCode::Escape => {
|
||||
self.state.is_focused = false;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,18 @@ impl Cursor {
|
|||
}
|
||||
}
|
||||
|
||||
/// Returns the current selection of the [`Cursor`] for the given [`Value`].
|
||||
///
|
||||
/// `start` is guaranteed to be <= than `end`.
|
||||
pub fn selection(&self, value: &Value) -> Option<(usize, usize)> {
|
||||
match self.state(value) {
|
||||
State::Selection { start, end } => {
|
||||
Some((start.min(end), start.max(end)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn move_to(&mut self, position: usize) {
|
||||
self.state = State::Index(position);
|
||||
}
|
||||
|
|
@ -161,15 +173,6 @@ impl Cursor {
|
|||
end.min(value.len())
|
||||
}
|
||||
|
||||
pub(crate) fn selection(&self, value: &Value) -> Option<(usize, usize)> {
|
||||
match self.state(value) {
|
||||
State::Selection { start, end } => {
|
||||
Some((start.min(end), start.max(end)))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn left(&self, value: &Value) -> usize {
|
||||
match self.state(value) {
|
||||
State::Index(index) => index,
|
||||
|
|
|
|||
|
|
@ -73,6 +73,15 @@ impl Value {
|
|||
.unwrap_or(self.len())
|
||||
}
|
||||
|
||||
/// Returns a new [`Value`] containing the graphemes from `start` until the
|
||||
/// given `end`.
|
||||
pub fn select(&self, start: usize, end: usize) -> Self {
|
||||
let graphemes =
|
||||
self.graphemes[start.min(self.len())..end.min(self.len())].to_vec();
|
||||
|
||||
Self { graphemes }
|
||||
}
|
||||
|
||||
/// Returns a new [`Value`] containing the graphemes until the given
|
||||
/// `index`.
|
||||
pub fn until(&self, index: usize) -> Self {
|
||||
|
|
|
|||
|
|
@ -120,17 +120,17 @@ where
|
|||
event: Event,
|
||||
layout: Layout<'_>,
|
||||
cursor_position: Point,
|
||||
messages: &mut Vec<Message>,
|
||||
renderer: &Renderer,
|
||||
clipboard: Option<&dyn Clipboard>,
|
||||
clipboard: &mut dyn Clipboard,
|
||||
messages: &mut Vec<Message>,
|
||||
) -> event::Status {
|
||||
self.content.widget.on_event(
|
||||
event,
|
||||
layout,
|
||||
cursor_position,
|
||||
messages,
|
||||
renderer,
|
||||
clipboard,
|
||||
messages,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue