-
Notifications
You must be signed in to change notification settings - Fork 105
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add widget id example to show how to make widgets that use ID or are …
…in an array of data. Also fix number input text default size to 12
- Loading branch information
genusistimelord
committed
Aug 16, 2023
1 parent
dd08aaa
commit 0a5735c
Showing
8 changed files
with
282 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"rust-analyzer.showUnlinkedFileNotification": false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
[package] | ||
name = "widget_id" | ||
version = "0.1.0" | ||
authors = ["Andrew Wheeler <genusistimelord@gmail.com>"] | ||
edition = "2021" | ||
|
||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||
|
||
[dependencies] | ||
iced_aw = { workspace = true, features = [ | ||
"number_input", | ||
"icons", | ||
] } | ||
iced.workspace = true | ||
num-traits = "0.2.16" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
use iced::{ | ||
alignment, font, | ||
theme::Theme, | ||
widget::{container, text, Column, Container, Row, Text}, | ||
window, Alignment, Application, Command, Element, Length, Settings, | ||
}; | ||
|
||
#[derive(Debug)] | ||
enum NumberInputDemo { | ||
Loading, | ||
Loaded(State), | ||
} | ||
|
||
#[derive(Debug)] | ||
pub struct State { | ||
value: [NumInput<f32, Message>; 2], | ||
} | ||
|
||
#[derive(Debug, Clone)] | ||
pub enum Message { | ||
Loaded(Result<(), String>), | ||
GenericF32Input((usize, NumInputMessage<f32>)), | ||
FontLoaded(Result<(), font::Error>), | ||
} | ||
|
||
fn main() -> iced::Result { | ||
NumberInputDemo::run(Settings { | ||
default_text_size: 12.0, | ||
window: window::Settings { | ||
size: (500, 400), | ||
..Default::default() | ||
}, | ||
..Settings::default() | ||
}) | ||
} | ||
|
||
mod numberinput; | ||
|
||
use numberinput::*; | ||
|
||
async fn load() -> Result<(), String> { | ||
Ok(()) | ||
} | ||
|
||
impl Application for NumberInputDemo { | ||
type Message = Message; | ||
type Theme = Theme; | ||
type Executor = iced::executor::Default; | ||
type Flags = (); | ||
|
||
fn new(_flags: ()) -> (NumberInputDemo, Command<Message>) { | ||
( | ||
NumberInputDemo::Loading, | ||
Command::batch(vec![ | ||
font::load(iced_aw::graphics::icons::ICON_FONT_BYTES).map(Message::FontLoaded), | ||
Command::perform(load(), Message::Loaded), | ||
]), | ||
) | ||
} | ||
|
||
fn title(&self) -> String { | ||
String::from("Number Input Demo") | ||
} | ||
|
||
fn update(&mut self, message: self::Message) -> Command<Message> { | ||
match self { | ||
NumberInputDemo::Loading => { | ||
if let Message::Loaded(_) = message { | ||
*self = NumberInputDemo::Loaded(State { | ||
value: [NumInput::new(27.0), NumInput::new(5.0)], | ||
}) | ||
} | ||
} | ||
NumberInputDemo::Loaded(State { value }) => { | ||
if let Message::GenericF32Input((id, val)) = message { | ||
value[id].value = val.get_data(); | ||
} | ||
} | ||
} | ||
|
||
Command::none() | ||
} | ||
|
||
fn view(&self) -> Element<Message> { | ||
match self { | ||
NumberInputDemo::Loading => container( | ||
text("Loading...") | ||
.horizontal_alignment(alignment::Horizontal::Center) | ||
.size(50), | ||
) | ||
.width(Length::Fill) | ||
.height(Length::Fill) | ||
.center_y() | ||
.center_x() | ||
.into(), | ||
NumberInputDemo::Loaded(State { value }) => { | ||
let mut column1 = Column::new(); | ||
|
||
for (id, val) in value.iter().enumerate() { | ||
let lb_minute = Text::new(format!("Number Input {}:", id)); | ||
let txt_minute = val.view(id, 1.0, 255.0, 0.5, Message::GenericF32Input, None); | ||
|
||
column1 = column1.push( | ||
Row::new() | ||
.spacing(10) | ||
.align_items(Alignment::Center) | ||
.push(lb_minute) | ||
.push(txt_minute), | ||
); | ||
} | ||
|
||
Container::new(column1) | ||
.width(Length::Fill) | ||
.height(Length::Fill) | ||
.center_x() | ||
.center_y() | ||
.into() | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
use iced::{Element, Length}; | ||
use iced_aw::{NumberInput, NumberInputStyles}; | ||
use num_traits::{Num, NumAssignOps}; | ||
use std::fmt::Display; | ||
use std::marker::PhantomData; | ||
use std::str::FromStr; | ||
|
||
#[derive(Debug, Default)] | ||
pub struct NumInput<V, M> { | ||
phantomdata: PhantomData<M>, | ||
pub value: V, | ||
} | ||
|
||
#[derive(Debug, Clone, PartialEq, Eq)] | ||
pub enum NumInputMessage<V> { | ||
Change(V), | ||
} | ||
|
||
impl<V> NumInputMessage<V> | ||
where | ||
V: Num + NumAssignOps + PartialOrd + Display + FromStr + Copy, | ||
{ | ||
pub fn get_data(&self) -> V { | ||
let NumInputMessage::Change(data) = self; | ||
*data | ||
} | ||
} | ||
|
||
impl<V> NumInputMessage<V> | ||
where | ||
V: Eq + Copy, | ||
{ | ||
pub fn get_enum(&self) -> V { | ||
let NumInputMessage::Change(data) = self; | ||
*data | ||
} | ||
} | ||
|
||
impl<V, M> NumInput<V, M> | ||
where | ||
V: Num + NumAssignOps + PartialOrd + Display + FromStr + Copy, | ||
M: Clone, | ||
{ | ||
pub fn new(value: V) -> NumInput<V, M> | ||
where | ||
V: 'static, | ||
{ | ||
NumInput { | ||
phantomdata: PhantomData, | ||
value, | ||
} | ||
} | ||
|
||
pub fn view<F>( | ||
&self, | ||
id: usize, | ||
min: V, | ||
max: V, | ||
step: V, | ||
on_change: F, | ||
style: Option<NumberInputStyles>, | ||
) -> Element<M> | ||
where | ||
F: 'static + Fn((usize, NumInputMessage<V>)) -> M + Copy, | ||
V: 'static, | ||
M: 'static, | ||
{ | ||
let mut input = NumberInput::new(self.value, max, NumInputMessage::Change) | ||
.step(step) | ||
.min(min) | ||
.width(Length::Shrink); | ||
|
||
if let Some(style) = style { | ||
input = input.style(style); | ||
} | ||
|
||
Element::new(input).map(move |i| on_change((id, i))) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters