Skip to content

Commit

Permalink
add widget id example to show how to make widgets that use ID or are …
Browse files Browse the repository at this point in the history
…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
Show file tree
Hide file tree
Showing 8 changed files with 282 additions and 40 deletions.
18 changes: 18 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,24 @@
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'widget_id'",
"cargo": {
"args": [
"build",
"--bin=widget_id",
"--package=widget_id"
],
"filter": {
"name": "widget_id",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
Expand Down
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"rust-analyzer.showUnlinkedFileNotification": false
}
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ members = [
"examples/split_scroller",
"examples/menu",
"examples/spinner",
"examples/context_menu"
"examples/context_menu",
"examples/WidgetIDReturn"
]

[workspace.dependencies.iced]
Expand Down
15 changes: 15 additions & 0 deletions examples/WidgetIDReturn/Cargo.toml
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"
121 changes: 121 additions & 0 deletions examples/WidgetIDReturn/src/main.rs
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()
}
}
}
}
79 changes: 79 additions & 0 deletions examples/WidgetIDReturn/src/numberinput.rs
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)))
}
}
2 changes: 1 addition & 1 deletion examples/number_input/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ pub enum Message {

fn main() -> iced::Result {
NumberInputDemo::run(Settings {
default_text_size: 65.0,
default_text_size: 12.0,
window: window::Settings {
size: (250, 200),
..Default::default()
Expand Down
81 changes: 43 additions & 38 deletions src/native/tab_bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -332,45 +332,50 @@ where
self.tab_labels
.iter()
.fold(Row::<Message, Renderer>::new(), |row, tab_label| {
let label = match tab_label {
TabLabel::Icon(icon) => Column::new().align_items(Alignment::Center).push(
Text::new(icon.to_string())
.size(self.icon_size)
.font(self.icon_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
),
TabLabel::Text(text) => Column::new().align_items(Alignment::Center).push(
Text::new(text)
.size(self.text_size)
.font(self.text_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
),
TabLabel::IconText(icon, text) => Column::new()
.align_items(Alignment::Center)
.push(
Text::new(icon.to_string())
.size(self.icon_size)
.font(self.icon_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
)
.push(
Text::new(text)
.size(self.text_size)
.width(self.tab_width)
.font(self.text_font.unwrap_or_default()),
),
}
.width(self.tab_width)
.height(self.height);

let mut label_row = Row::new()
.push(
match tab_label {
TabLabel::Icon(icon) => {
Column::new().align_items(Alignment::Center).push(
Text::new(icon.to_string())
.size(self.icon_size)
.font(self.icon_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
)
}
TabLabel::Text(text) => {
Column::new().align_items(Alignment::Center).push(
Text::new(text)
.size(self.text_size)
.font(self.text_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
)
}
TabLabel::IconText(icon, text) => Column::new()
.align_items(Alignment::Center)
.push(
Text::new(icon.to_string())
.size(self.icon_size)
.font(self.icon_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
)
.push(
Text::new(text)
.size(self.text_size)
.font(self.text_font.unwrap_or_default())
.horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center),
),
}
.width(self.tab_width)
.height(self.height),
)
.align_items(Alignment::Center)
.padding(self.padding)
.width(self.tab_width)
.push(label);
.width(self.tab_width);

if self.on_close.is_some() {
label_row = label_row.push(
Expand All @@ -386,7 +391,7 @@ where
.width(self.width)
.height(self.height)
.spacing(self.spacing)
.layout(renderer, limits)
.layout(renderer, &limits.loose())
}

fn on_event(
Expand Down Expand Up @@ -581,7 +586,7 @@ fn draw_tab<Renderer>(
size: icon_data.1,
color: style.icon_color,
font: icon_data.0,
horizontal_alignment: Horizontal::Center,
horizontal_alignment: Horizontal::Left,
vertical_alignment: Vertical::Center,
line_height: LineHeight::Relative(1.3),
shaping: iced_widget::text::Shaping::Advanced,
Expand Down

0 comments on commit 0a5735c

Please sign in to comment.