summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--native/src/lib.rs2
-rw-r--r--native/src/widget/text_input/cursor.rs108
2 files changed, 65 insertions, 45 deletions
diff --git a/native/src/lib.rs b/native/src/lib.rs
index 5c6ab3ee..d17dd918 100644
--- a/native/src/lib.rs
+++ b/native/src/lib.rs
@@ -34,7 +34,7 @@
//! [`window::Renderer`]: window/trait.Renderer.html
//! [`UserInterface`]: struct.UserInterface.html
//! [renderer]: renderer/index.html
-//#![deny(missing_docs)]
+#![deny(missing_docs)]
#![deny(missing_debug_implementations)]
#![deny(unused_results)]
#![forbid(unsafe_code)]
diff --git a/native/src/widget/text_input/cursor.rs b/native/src/widget/text_input/cursor.rs
index d8938777..16e7a01b 100644
--- a/native/src/widget/text_input/cursor.rs
+++ b/native/src/widget/text_input/cursor.rs
@@ -1,15 +1,27 @@
//! Track the cursor of a text input.
use crate::widget::text_input::Value;
+/// The cursor of a text input.
#[derive(Debug, Copy, Clone)]
-pub enum State {
- Index(usize),
- Selection { start: usize, end: usize },
+pub struct Cursor {
+ state: State,
}
+/// The state of a [`Cursor`].
+///
+/// [`Cursor`]: struct.Cursor.html
#[derive(Debug, Copy, Clone)]
-pub struct Cursor {
- state: State,
+pub enum State {
+ /// Cursor without a selection
+ Index(usize),
+
+ /// Cursor selecting a range of text
+ Selection {
+ /// The start of the selection
+ start: usize,
+ /// The end of the selection
+ end: usize,
+ },
}
impl Default for Cursor {
@@ -21,19 +33,43 @@ impl Default for Cursor {
}
impl Cursor {
- pub fn move_to(&mut self, position: usize) {
+ /// Returns the [`State`] of the [`Cursor`].
+ ///
+ /// [`State`]: struct.State.html
+ /// [`Cursor`]: struct.Cursor.html
+ pub fn state(&self, value: &Value) -> State {
+ match self.state {
+ State::Index(index) => State::Index(index.min(value.len())),
+ State::Selection { start, end } => {
+ let start = start.min(value.len());
+ let end = end.min(value.len());
+
+ if start == end {
+ State::Index(start)
+ } else {
+ State::Selection { start, end }
+ }
+ }
+ }
+ }
+
+ pub(crate) fn move_to(&mut self, position: usize) {
self.state = State::Index(position);
}
- pub fn move_right(&mut self, value: &Value) {
+ pub(crate) fn move_right(&mut self, value: &Value) {
self.move_right_by_amount(value, 1)
}
- pub fn move_right_by_words(&mut self, value: &Value) {
+ pub(crate) fn move_right_by_words(&mut self, value: &Value) {
self.move_to(value.next_end_of_word(self.right(value)))
}
- pub fn move_right_by_amount(&mut self, value: &Value, amount: usize) {
+ pub(crate) fn move_right_by_amount(
+ &mut self,
+ value: &Value,
+ amount: usize,
+ ) {
match self.state(value) {
State::Index(index) => {
self.move_to(index.saturating_add(amount).min(value.len()))
@@ -42,7 +78,7 @@ impl Cursor {
}
}
- pub fn move_left(&mut self, value: &Value) {
+ pub(crate) fn move_left(&mut self, value: &Value) {
match self.state(value) {
State::Index(index) if index > 0 => self.move_to(index - 1),
State::Selection { start, end } => self.move_to(start.min(end)),
@@ -50,11 +86,11 @@ impl Cursor {
}
}
- pub fn move_left_by_words(&mut self, value: &Value) {
+ pub(crate) fn move_left_by_words(&mut self, value: &Value) {
self.move_to(value.previous_start_of_word(self.left(value)));
}
- pub fn select_range(&mut self, start: usize, end: usize) {
+ pub(crate) fn select_range(&mut self, start: usize, end: usize) {
if start == end {
self.state = State::Index(start);
} else {
@@ -62,7 +98,7 @@ impl Cursor {
}
}
- pub fn select_left(&mut self, value: &Value) {
+ pub(crate) fn select_left(&mut self, value: &Value) {
match self.state(value) {
State::Index(index) if index > 0 => {
self.select_range(index, index - 1)
@@ -74,7 +110,7 @@ impl Cursor {
}
}
- pub fn select_right(&mut self, value: &Value) {
+ pub(crate) fn select_right(&mut self, value: &Value) {
match self.state(value) {
State::Index(index) if index < value.len() => {
self.select_range(index, index + 1)
@@ -86,7 +122,7 @@ impl Cursor {
}
}
- pub fn select_left_by_words(&mut self, value: &Value) {
+ pub(crate) fn select_left_by_words(&mut self, value: &Value) {
match self.state(value) {
State::Index(index) => {
self.select_range(index, value.previous_start_of_word(index))
@@ -97,7 +133,7 @@ impl Cursor {
}
}
- pub fn select_right_by_words(&mut self, value: &Value) {
+ pub(crate) fn select_right_by_words(&mut self, value: &Value) {
match self.state(value) {
State::Index(index) => {
self.select_range(index, value.next_end_of_word(index))
@@ -108,27 +144,11 @@ impl Cursor {
}
}
- pub fn select_all(&mut self, value: &Value) {
+ pub(crate) fn select_all(&mut self, value: &Value) {
self.select_range(0, value.len());
}
- pub fn state(&self, value: &Value) -> State {
- match self.state {
- State::Index(index) => State::Index(index.min(value.len())),
- State::Selection { start, end } => {
- let start = start.min(value.len());
- let end = end.min(value.len());
-
- if start == end {
- State::Index(start)
- } else {
- State::Selection { start, end }
- }
- }
- }
- }
-
- pub fn start(&self, value: &Value) -> usize {
+ pub(crate) fn start(&self, value: &Value) -> usize {
let start = match self.state {
State::Index(index) => index,
State::Selection { start, .. } => start,
@@ -137,7 +157,7 @@ impl Cursor {
start.min(value.len())
}
- pub fn end(&self, value: &Value) -> usize {
+ pub(crate) fn end(&self, value: &Value) -> usize {
let end = match self.state {
State::Index(index) => index,
State::Selection { end, .. } => end,
@@ -146,6 +166,15 @@ impl Cursor {
end.min(value.len())
}
+ pub(crate) fn selection(&self) -> Option<(usize, usize)> {
+ match self.state {
+ 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,
@@ -159,13 +188,4 @@ impl Cursor {
State::Selection { start, end } => start.max(end),
}
}
-
- pub fn selection(&self) -> Option<(usize, usize)> {
- match self.state {
- State::Selection { start, end } => {
- Some((start.min(end), start.max(end)))
- }
- _ => None,
- }
- }
}