Implement some From traits for text_input::Id
This commit is contained in:
parent
f897442831
commit
1448c5bfa5
5 changed files with 38 additions and 23 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
|
use std::fmt;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
|
||||||
use std::sync::atomic::{self, AtomicU64};
|
use std::sync::atomic::{self, AtomicU64};
|
||||||
|
|
||||||
/// The id of the window.
|
/// The id of the window.
|
||||||
|
|
@ -14,3 +14,9 @@ impl Id {
|
||||||
Id(COUNT.fetch_add(1, atomic::Ordering::Relaxed))
|
Id(COUNT.fetch_add(1, atomic::Ordering::Relaxed))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Id {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
self.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ struct Window {
|
||||||
scale_input: String,
|
scale_input: String,
|
||||||
current_scale: f64,
|
current_scale: f64,
|
||||||
theme: Theme,
|
theme: Theme,
|
||||||
input_id: iced::widget::text_input::Id,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -86,7 +85,7 @@ impl Example {
|
||||||
}
|
}
|
||||||
Message::WindowOpened(id) => {
|
Message::WindowOpened(id) => {
|
||||||
let window = Window::new(self.windows.len() + 1);
|
let window = Window::new(self.windows.len() + 1);
|
||||||
let focus_input = text_input::focus(window.input_id.clone());
|
let focus_input = text_input::focus(format!("input-{id}"));
|
||||||
|
|
||||||
self.windows.insert(id, window);
|
self.windows.insert(id, window);
|
||||||
|
|
||||||
|
|
@ -163,7 +162,6 @@ impl Window {
|
||||||
scale_input: "1.0".to_string(),
|
scale_input: "1.0".to_string(),
|
||||||
current_scale: 1.0,
|
current_scale: 1.0,
|
||||||
theme: Theme::ALL[count % Theme::ALL.len()].clone(),
|
theme: Theme::ALL[count % Theme::ALL.len()].clone(),
|
||||||
input_id: text_input::Id::unique(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,7 +180,7 @@ impl Window {
|
||||||
text("Window title:"),
|
text("Window title:"),
|
||||||
text_input("Window Title", &self.title)
|
text_input("Window Title", &self.title)
|
||||||
.on_input(move |msg| { Message::TitleChanged(id, msg) })
|
.on_input(move |msg| { Message::TitleChanged(id, msg) })
|
||||||
.id(self.input_id.clone())
|
.id(format!("input-{id}"))
|
||||||
];
|
];
|
||||||
|
|
||||||
let new_window_button =
|
let new_window_button =
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ publish = false
|
||||||
iced.workspace = true
|
iced.workspace = true
|
||||||
iced.features = ["async-std", "debug"]
|
iced.features = ["async-std", "debug"]
|
||||||
|
|
||||||
once_cell.workspace = true
|
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
uuid = { version = "1.0", features = ["v4", "fast-rng", "serde"] }
|
uuid = { version = "1.0", features = ["v4", "fast-rng", "serde"] }
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,9 @@ use iced::widget::{
|
||||||
use iced::window;
|
use iced::window;
|
||||||
use iced::{Center, Element, Fill, Font, Subscription, Task as Command};
|
use iced::{Center, Element, Fill, Font, Subscription, Task as Command};
|
||||||
|
|
||||||
use once_cell::sync::Lazy;
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
static INPUT_ID: Lazy<text_input::Id> = Lazy::new(text_input::Id::unique);
|
|
||||||
|
|
||||||
pub fn main() -> iced::Result {
|
pub fn main() -> iced::Result {
|
||||||
#[cfg(not(target_arch = "wasm32"))]
|
#[cfg(not(target_arch = "wasm32"))]
|
||||||
tracing_subscriber::fmt::init();
|
tracing_subscriber::fmt::init();
|
||||||
|
|
@ -85,7 +82,7 @@ impl Todos {
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
text_input::focus(INPUT_ID.clone())
|
text_input::focus("new-task")
|
||||||
}
|
}
|
||||||
Todos::Loaded(state) => {
|
Todos::Loaded(state) => {
|
||||||
let mut saved = false;
|
let mut saved = false;
|
||||||
|
|
@ -198,7 +195,7 @@ impl Todos {
|
||||||
.align_x(Center);
|
.align_x(Center);
|
||||||
|
|
||||||
let input = text_input("What needs to be done?", input_value)
|
let input = text_input("What needs to be done?", input_value)
|
||||||
.id(INPUT_ID.clone())
|
.id("new-task")
|
||||||
.on_input(Message::InputChanged)
|
.on_input(Message::InputChanged)
|
||||||
.on_submit(Message::CreateTask)
|
.on_submit(Message::CreateTask)
|
||||||
.padding(15)
|
.padding(15)
|
||||||
|
|
|
||||||
|
|
@ -114,8 +114,8 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the [`Id`] of the [`TextInput`].
|
/// Sets the [`Id`] of the [`TextInput`].
|
||||||
pub fn id(mut self, id: Id) -> Self {
|
pub fn id(mut self, id: impl Into<Id>) -> Self {
|
||||||
self.id = Some(id);
|
self.id = Some(id.into());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1226,38 +1226,53 @@ impl From<Id> for widget::Id {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<&'static str> for Id {
|
||||||
|
fn from(id: &'static str) -> Self {
|
||||||
|
Self::new(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for Id {
|
||||||
|
fn from(id: String) -> Self {
|
||||||
|
Self::new(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that focuses the [`TextInput`] with the given [`Id`].
|
/// Produces a [`Task`] that focuses the [`TextInput`] with the given [`Id`].
|
||||||
pub fn focus<T>(id: Id) -> Task<T> {
|
pub fn focus<T>(id: impl Into<Id>) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::focusable::focus(id.0)))
|
task::effect(Action::widget(operation::focusable::focus(id.into().0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
||||||
/// end.
|
/// end.
|
||||||
pub fn move_cursor_to_end<T>(id: Id) -> Task<T> {
|
pub fn move_cursor_to_end<T>(id: impl Into<Id>) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::text_input::move_cursor_to_end(
|
task::effect(Action::widget(operation::text_input::move_cursor_to_end(
|
||||||
id.0,
|
id.into().0,
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
||||||
/// front.
|
/// front.
|
||||||
pub fn move_cursor_to_front<T>(id: Id) -> Task<T> {
|
pub fn move_cursor_to_front<T>(id: impl Into<Id>) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::text_input::move_cursor_to_front(
|
task::effect(Action::widget(operation::text_input::move_cursor_to_front(
|
||||||
id.0,
|
id.into().0,
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
/// Produces a [`Task`] that moves the cursor of the [`TextInput`] with the given [`Id`] to the
|
||||||
/// provided position.
|
/// provided position.
|
||||||
pub fn move_cursor_to<T>(id: Id, position: usize) -> Task<T> {
|
pub fn move_cursor_to<T>(id: impl Into<Id>, position: usize) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::text_input::move_cursor_to(
|
task::effect(Action::widget(operation::text_input::move_cursor_to(
|
||||||
id.0, position,
|
id.into().0,
|
||||||
|
position,
|
||||||
)))
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Produces a [`Task`] that selects all the content of the [`TextInput`] with the given [`Id`].
|
/// Produces a [`Task`] that selects all the content of the [`TextInput`] with the given [`Id`].
|
||||||
pub fn select_all<T>(id: Id) -> Task<T> {
|
pub fn select_all<T>(id: impl Into<Id>) -> Task<T> {
|
||||||
task::effect(Action::widget(operation::text_input::select_all(id.0)))
|
task::effect(Action::widget(operation::text_input::select_all(
|
||||||
|
id.into().0,
|
||||||
|
)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The state of a [`TextInput`].
|
/// The state of a [`TextInput`].
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue