Merge pull request #1711 from iced-rs/feature/generic-pixel-units

Generic pixel units
This commit is contained in:
Héctor Ramón 2023-02-17 16:53:02 +01:00 committed by GitHub
commit 7dc1fb488d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
57 changed files with 505 additions and 482 deletions

View file

@ -1,5 +1,5 @@
/// The strategy used to fill space in a specific dimension. /// The strategy used to fill space in a specific dimension.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq)]
pub enum Length { pub enum Length {
/// Fill all the remaining space /// Fill all the remaining space
Fill, Fill,
@ -17,7 +17,7 @@ pub enum Length {
Shrink, Shrink,
/// Fill a fixed amount of space /// Fill a fixed amount of space
Units(u16), Fixed(f32),
} }
impl Length { impl Length {
@ -31,13 +31,19 @@ impl Length {
Length::Fill => 1, Length::Fill => 1,
Length::FillPortion(factor) => *factor, Length::FillPortion(factor) => *factor,
Length::Shrink => 0, Length::Shrink => 0,
Length::Units(_) => 0, Length::Fixed(_) => 0,
} }
} }
} }
impl From<f32> for Length {
fn from(amount: f32) -> Self {
Length::Fixed(amount)
}
}
impl From<u16> for Length { impl From<u16> for Length {
fn from(units: u16) -> Self { fn from(units: u16) -> Self {
Length::Units(units) Length::Fixed(f32::from(units))
} }
} }

View file

@ -35,6 +35,7 @@ mod content_fit;
mod font; mod font;
mod length; mod length;
mod padding; mod padding;
mod pixels;
mod point; mod point;
mod rectangle; mod rectangle;
mod size; mod size;
@ -47,6 +48,7 @@ pub use content_fit::ContentFit;
pub use font::Font; pub use font::Font;
pub use length::Length; pub use length::Length;
pub use padding::Padding; pub use padding::Padding;
pub use pixels::Pixels;
pub use point::Point; pub use point::Point;
pub use rectangle::Rectangle; pub use rectangle::Rectangle;
pub use size::Size; pub use size::Size;

View file

@ -33,29 +33,29 @@ use crate::Size;
/// let widget = Widget::new().padding([10, 20]); // top/bottom, left/right /// let widget = Widget::new().padding([10, 20]); // top/bottom, left/right
/// let widget = Widget::new().padding([5, 10, 15, 20]); // top, right, bottom, left /// let widget = Widget::new().padding([5, 10, 15, 20]); // top, right, bottom, left
/// ``` /// ```
#[derive(Debug, Hash, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct Padding { pub struct Padding {
/// Top padding /// Top padding
pub top: u16, pub top: f32,
/// Right padding /// Right padding
pub right: u16, pub right: f32,
/// Bottom padding /// Bottom padding
pub bottom: u16, pub bottom: f32,
/// Left padding /// Left padding
pub left: u16, pub left: f32,
} }
impl Padding { impl Padding {
/// Padding of zero /// Padding of zero
pub const ZERO: Padding = Padding { pub const ZERO: Padding = Padding {
top: 0, top: 0.0,
right: 0, right: 0.0,
bottom: 0, bottom: 0.0,
left: 0, left: 0.0,
}; };
/// Create a Padding that is equal on all sides /// Create a Padding that is equal on all sides
pub const fn new(padding: u16) -> Padding { pub const fn new(padding: f32) -> Padding {
Padding { Padding {
top: padding, top: padding,
right: padding, right: padding,
@ -65,12 +65,12 @@ impl Padding {
} }
/// Returns the total amount of vertical [`Padding`]. /// Returns the total amount of vertical [`Padding`].
pub fn vertical(self) -> u16 { pub fn vertical(self) -> f32 {
self.top + self.bottom self.top + self.bottom
} }
/// Returns the total amount of horizontal [`Padding`]. /// Returns the total amount of horizontal [`Padding`].
pub fn horizontal(self) -> u16 { pub fn horizontal(self) -> f32 {
self.left + self.right self.left + self.right
} }
@ -79,16 +79,49 @@ impl Padding {
let available = (outer - inner).max(Size::ZERO); let available = (outer - inner).max(Size::ZERO);
Padding { Padding {
top: self.top.min((available.height as u16) / 2), top: self.top.min(available.height / 2.0),
right: self.right.min((available.width as u16) / 2), right: self.right.min(available.width / 2.0),
bottom: self.bottom.min((available.height as u16) / 2), bottom: self.bottom.min(available.height / 2.0),
left: self.left.min((available.width as u16) / 2), left: self.left.min(available.width / 2.0),
} }
} }
} }
impl From<u16> for Padding { impl From<u16> for Padding {
fn from(p: u16) -> Self { fn from(p: u16) -> Self {
Padding {
top: f32::from(p),
right: f32::from(p),
bottom: f32::from(p),
left: f32::from(p),
}
}
}
impl From<[u16; 2]> for Padding {
fn from(p: [u16; 2]) -> Self {
Padding {
top: f32::from(p[0]),
right: f32::from(p[1]),
bottom: f32::from(p[0]),
left: f32::from(p[1]),
}
}
}
impl From<[u16; 4]> for Padding {
fn from(p: [u16; 4]) -> Self {
Padding {
top: f32::from(p[0]),
right: f32::from(p[1]),
bottom: f32::from(p[2]),
left: f32::from(p[3]),
}
}
}
impl From<f32> for Padding {
fn from(p: f32) -> Self {
Padding { Padding {
top: p, top: p,
right: p, right: p,
@ -98,8 +131,8 @@ impl From<u16> for Padding {
} }
} }
impl From<[u16; 2]> for Padding { impl From<[f32; 2]> for Padding {
fn from(p: [u16; 2]) -> Self { fn from(p: [f32; 2]) -> Self {
Padding { Padding {
top: p[0], top: p[0],
right: p[1], right: p[1],
@ -109,8 +142,8 @@ impl From<[u16; 2]> for Padding {
} }
} }
impl From<[u16; 4]> for Padding { impl From<[f32; 4]> for Padding {
fn from(p: [u16; 4]) -> Self { fn from(p: [f32; 4]) -> Self {
Padding { Padding {
top: p[0], top: p[0],
right: p[1], right: p[1],

22
core/src/pixels.rs Normal file
View file

@ -0,0 +1,22 @@
/// An amount of logical pixels.
///
/// Normally used to represent an amount of space, or the size of something.
///
/// This type is normally asked as an argument in a generic way
/// (e.g. `impl Into<Pixels>`) and, since `Pixels` implements `From` both for
/// `f32` and `u16`, you should be able to provide both integers and float
/// literals as needed.
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct Pixels(pub f32);
impl From<f32> for Pixels {
fn from(amount: f32) -> Self {
Self(amount)
}
}
impl From<u16> for Pixels {
fn from(amount: u16) -> Self {
Self(f32::from(amount))
}
}

View file

@ -29,8 +29,8 @@ impl Size {
/// Increments the [`Size`] to account for the given padding. /// Increments the [`Size`] to account for the given padding.
pub fn pad(&self, padding: Padding) -> Self { pub fn pad(&self, padding: Padding) -> Self {
Size { Size {
width: self.width + padding.horizontal() as f32, width: self.width + padding.horizontal(),
height: self.height + padding.vertical() as f32, height: self.height + padding.vertical(),
} }
} }

View file

@ -301,11 +301,11 @@ impl<C: ColorSpace + Copy> ColorPicker<C> {
} }
row![ row![
text(C::LABEL).width(Length::Units(50)), text(C::LABEL).width(50),
slider(cr1, c1, move |v| C::new(v, c2, c3)), slider(cr1, c1, move |v| C::new(v, c2, c3)),
slider(cr2, c2, move |v| C::new(c1, v, c3)), slider(cr2, c2, move |v| C::new(c1, v, c3)),
slider(cr3, c3, move |v| C::new(c1, c2, v)), slider(cr3, c3, move |v| C::new(c1, c2, v)),
text(color.to_string()).width(Length::Units(185)).size(14), text(color.to_string()).width(185).size(14),
] ]
.spacing(10) .spacing(10)
.align_items(Alignment::Center) .align_items(Alignment::Center)

View file

@ -127,7 +127,7 @@ mod numeric_input {
.horizontal_alignment(alignment::Horizontal::Center) .horizontal_alignment(alignment::Horizontal::Center)
.vertical_alignment(alignment::Vertical::Center), .vertical_alignment(alignment::Vertical::Center),
) )
.width(Length::Units(50)) .width(50)
.on_press(on_press) .on_press(on_press)
}; };

View file

@ -93,7 +93,7 @@ impl Application for Events {
.width(Length::Fill) .width(Length::Fill)
.horizontal_alignment(alignment::Horizontal::Center), .horizontal_alignment(alignment::Horizontal::Center),
) )
.width(Length::Units(100)) .width(100)
.padding(10) .padding(10)
.on_press(Message::Exit); .on_press(Message::Exit);

View file

@ -42,7 +42,7 @@ impl Program for Controls {
let background_color = self.background_color; let background_color = self.background_color;
let sliders = Row::new() let sliders = Row::new()
.width(Length::Units(500)) .width(500)
.spacing(20) .spacing(20)
.push( .push(
Slider::new(0.0..=1.0, background_color.r, move |r| { Slider::new(0.0..=1.0, background_color.r, move |r| {

View file

@ -48,7 +48,7 @@ impl Program for Controls {
let text = &self.text; let text = &self.text;
let sliders = Row::new() let sliders = Row::new()
.width(Length::Units(500)) .width(500)
.spacing(20) .spacing(20)
.push( .push(
slider(0.0..=1.0, background_color.r, move |r| { slider(0.0..=1.0, background_color.r, move |r| {

View file

@ -156,7 +156,7 @@ impl Application for App {
] ]
.spacing(20), .spacing(20),
) )
.width(Length::Units(300)) .width(300)
.padding(10) .padding(10)
.style(theme::Container::Box); .style(theme::Container::Box);

View file

@ -43,10 +43,10 @@ impl Sandbox for Example {
.placeholder("Choose a language..."); .placeholder("Choose a language...");
let content = column![ let content = column![
vertical_space(Length::Units(600)), vertical_space(600),
"Which is your favorite language?", "Which is your favorite language?",
pick_list, pick_list,
vertical_space(Length::Units(600)), vertical_space(600),
] ]
.width(Length::Fill) .width(Length::Fill)
.align_items(Alignment::Center) .align_items(Alignment::Center)

View file

@ -58,7 +58,7 @@ impl Sandbox for QRGenerator {
.padding(15); .padding(15);
let mut content = column![title, input] let mut content = column![title, input]
.width(Length::Units(700)) .width(700)
.spacing(20) .spacing(20)
.align_items(Alignment::Center); .align_items(Alignment::Center);

View file

@ -187,9 +187,9 @@ impl Application for ScrollableDemo {
column![ column![
scroll_to_end_button(), scroll_to_end_button(),
text("Beginning!"), text("Beginning!"),
vertical_space(Length::Units(1200)), vertical_space(1200),
text("Middle!"), text("Middle!"),
vertical_space(Length::Units(1200)), vertical_space(1200),
text("End!"), text("End!"),
scroll_to_beginning_button(), scroll_to_beginning_button(),
] ]
@ -211,13 +211,13 @@ impl Application for ScrollableDemo {
row![ row![
scroll_to_end_button(), scroll_to_end_button(),
text("Beginning!"), text("Beginning!"),
horizontal_space(Length::Units(1200)), horizontal_space(1200),
text("Middle!"), text("Middle!"),
horizontal_space(Length::Units(1200)), horizontal_space(1200),
text("End!"), text("End!"),
scroll_to_beginning_button(), scroll_to_beginning_button(),
] ]
.height(Length::Units(450)) .height(450)
.align_items(Alignment::Center) .align_items(Alignment::Center)
.padding([0, 40, 0, 40]) .padding([0, 40, 0, 40])
.spacing(40), .spacing(40),
@ -237,26 +237,26 @@ impl Application for ScrollableDemo {
row![ row![
column![ column![
text("Let's do some scrolling!"), text("Let's do some scrolling!"),
vertical_space(Length::Units(2400)) vertical_space(2400)
], ],
scroll_to_end_button(), scroll_to_end_button(),
text("Horizontal - Beginning!"), text("Horizontal - Beginning!"),
horizontal_space(Length::Units(1200)), horizontal_space(1200),
//vertical content //vertical content
column![ column![
text("Horizontal - Middle!"), text("Horizontal - Middle!"),
scroll_to_end_button(), scroll_to_end_button(),
text("Vertical - Beginning!"), text("Vertical - Beginning!"),
vertical_space(Length::Units(1200)), vertical_space(1200),
text("Vertical - Middle!"), text("Vertical - Middle!"),
vertical_space(Length::Units(1200)), vertical_space(1200),
text("Vertical - End!"), text("Vertical - End!"),
scroll_to_beginning_button(), scroll_to_beginning_button(),
vertical_space(Length::Units(40)), vertical_space(40),
] ]
.align_items(Alignment::Fill) .align_items(Alignment::Fill)
.spacing(40), .spacing(40),
horizontal_space(Length::Units(1200)), horizontal_space(1200),
text("Horizontal - End!"), text("Horizontal - End!"),
scroll_to_beginning_button(), scroll_to_beginning_button(),
] ]

View file

@ -38,11 +38,11 @@ impl Sandbox for Slider {
let h_slider = let h_slider =
container(slider(0..=100, value, Message::SliderChanged)) container(slider(0..=100, value, Message::SliderChanged))
.width(Length::Units(250)); .width(250);
let v_slider = let v_slider =
container(vertical_slider(0..=100, value, Message::SliderChanged)) container(vertical_slider(0..=100, value, Message::SliderChanged))
.height(Length::Units(200)); .height(200);
let text = text(format!("{value}")); let text = text(format!("{value}"));

View file

@ -105,7 +105,7 @@ impl Application for Stopwatch {
text(label).horizontal_alignment(alignment::Horizontal::Center), text(label).horizontal_alignment(alignment::Horizontal::Center),
) )
.padding(10) .padding(10)
.width(Length::Units(80)) .width(80)
}; };
let toggle_button = { let toggle_button = {

View file

@ -108,14 +108,10 @@ impl Sandbox for Styling {
let progress_bar = progress_bar(0.0..=100.0, self.slider_value); let progress_bar = progress_bar(0.0..=100.0, self.slider_value);
let scrollable = scrollable( let scrollable = scrollable(
column![ column!["Scroll me!", vertical_space(800), "You did it!"]
"Scroll me!", .width(Length::Fill),
vertical_space(Length::Units(800)),
"You did it!"
]
.width(Length::Fill),
) )
.height(Length::Units(100)); .height(100);
let checkbox = checkbox( let checkbox = checkbox(
"Check me!", "Check me!",
@ -143,7 +139,7 @@ impl Sandbox for Styling {
column![checkbox, toggler].spacing(20) column![checkbox, toggler].spacing(20)
] ]
.spacing(10) .spacing(10)
.height(Length::Units(100)) .height(100)
.align_items(Alignment::Center), .align_items(Alignment::Center),
] ]
.spacing(20) .spacing(20)

View file

@ -460,7 +460,7 @@ fn empty_message(message: &str) -> Element<'_, Message> {
.style(Color::from([0.7, 0.7, 0.7])), .style(Color::from([0.7, 0.7, 0.7])),
) )
.width(Length::Fill) .width(Length::Fill)
.height(Length::Units(200)) .height(200)
.center_y() .center_y()
.into() .into()
} }
@ -474,7 +474,7 @@ const ICONS: Font = Font::External {
fn icon(unicode: char) -> Text<'static> { fn icon(unicode: char) -> Text<'static> {
text(unicode.to_string()) text(unicode.to_string())
.font(ICONS) .font(ICONS)
.width(Length::Units(20)) .width(20)
.horizontal_alignment(alignment::Horizontal::Center) .horizontal_alignment(alignment::Horizontal::Center)
.size(20) .size(20)
} }

View file

@ -513,14 +513,14 @@ impl<'a> Step {
text("Tip: You can use the scrollbar to scroll down faster!") text("Tip: You can use the scrollbar to scroll down faster!")
.size(16), .size(16),
) )
.push(vertical_space(Length::Units(4096))) .push(vertical_space(4096))
.push( .push(
text("You are halfway there!") text("You are halfway there!")
.width(Length::Fill) .width(Length::Fill)
.size(30) .size(30)
.horizontal_alignment(alignment::Horizontal::Center), .horizontal_alignment(alignment::Horizontal::Center),
) )
.push(vertical_space(Length::Units(4096))) .push(vertical_space(4096))
.push(ferris(300)) .push(ferris(300))
.push( .push(
text("You made it!") text("You made it!")
@ -605,7 +605,7 @@ fn ferris<'a>(width: u16) -> Container<'a, StepMessage> {
} else { } else {
image(format!("{}/images/ferris.png", env!("CARGO_MANIFEST_DIR"))) image(format!("{}/images/ferris.png", env!("CARGO_MANIFEST_DIR")))
} }
.width(Length::Units(width)), .width(width),
) )
.width(Length::Fill) .width(Length::Fill)
.center_x() .center_x()
@ -616,7 +616,7 @@ fn button<'a, Message: Clone>(label: &str) -> Button<'a, Message> {
text(label).horizontal_alignment(alignment::Horizontal::Center), text(label).horizontal_alignment(alignment::Horizontal::Center),
) )
.padding(12) .padding(12)
.width(Length::Units(100)) .width(100)
} }
fn color_slider<'a>( fn color_slider<'a>(

View file

@ -22,7 +22,7 @@ pub struct Backend {
quad_pipeline: quad::Pipeline, quad_pipeline: quad::Pipeline,
text_pipeline: text::Pipeline, text_pipeline: text::Pipeline,
triangle_pipeline: triangle::Pipeline, triangle_pipeline: triangle::Pipeline,
default_text_size: u16, default_text_size: f32,
} }
impl Backend { impl Backend {
@ -228,7 +228,7 @@ impl backend::Text for Backend {
const CHECKMARK_ICON: char = font::CHECKMARK_ICON; const CHECKMARK_ICON: char = font::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON; const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON;
fn default_size(&self) -> u16 { fn default_size(&self) -> f32 {
self.default_text_size self.default_text_size
} }

View file

@ -4,7 +4,7 @@ pub use iced_graphics::Antialiasing;
/// The settings of a [`Backend`]. /// The settings of a [`Backend`].
/// ///
/// [`Backend`]: crate::Backend /// [`Backend`]: crate::Backend
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq)]
pub struct Settings { pub struct Settings {
/// The bytes of the font that will be used by default. /// The bytes of the font that will be used by default.
/// ///
@ -13,8 +13,8 @@ pub struct Settings {
/// The default size of text. /// The default size of text.
/// ///
/// By default, it will be set to 20. /// By default, it will be set to `20.0`.
pub default_text_size: u16, pub default_text_size: f32,
/// If enabled, spread text workload in multiple threads when multiple cores /// If enabled, spread text workload in multiple threads when multiple cores
/// are available. /// are available.
@ -32,7 +32,7 @@ impl Default for Settings {
fn default() -> Settings { fn default() -> Settings {
Settings { Settings {
default_font: None, default_font: None,
default_text_size: 20, default_text_size: 20.0,
text_multithreading: false, text_multithreading: false,
antialiasing: None, antialiasing: None,
} }

View file

@ -32,7 +32,7 @@ pub trait Text {
const ARROW_DOWN_ICON: char; const ARROW_DOWN_ICON: char;
/// Returns the default size of text. /// Returns the default size of text.
fn default_size(&self) -> u16; fn default_size(&self) -> f32;
/// Measures the text contents with the given size and font, /// Measures the text contents with the given size and font,
/// returning the size of a laid out paragraph that fits in the provided /// returning the size of a laid out paragraph that fits in the provided

View file

@ -130,19 +130,18 @@ where
const CHECKMARK_ICON: char = B::CHECKMARK_ICON; const CHECKMARK_ICON: char = B::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = B::ARROW_DOWN_ICON; const ARROW_DOWN_ICON: char = B::ARROW_DOWN_ICON;
fn default_size(&self) -> u16 { fn default_size(&self) -> f32 {
self.backend().default_size() self.backend().default_size()
} }
fn measure( fn measure(
&self, &self,
content: &str, content: &str,
size: u16, size: f32,
font: Font, font: Font,
bounds: Size, bounds: Size,
) -> (f32, f32) { ) -> (f32, f32) {
self.backend() self.backend().measure(content, size, font, bounds)
.measure(content, f32::from(size), font, bounds)
} }
fn hit_test( fn hit_test(

View file

@ -100,13 +100,13 @@ impl<Message, Theme, P> Canvas<Message, Theme, P>
where where
P: Program<Message, Theme>, P: Program<Message, Theme>,
{ {
const DEFAULT_SIZE: u16 = 100; const DEFAULT_SIZE: f32 = 100.0;
/// Creates a new [`Canvas`]. /// Creates a new [`Canvas`].
pub fn new(program: P) -> Self { pub fn new(program: P) -> Self {
Canvas { Canvas {
width: Length::Units(Self::DEFAULT_SIZE), width: Length::Fixed(Self::DEFAULT_SIZE),
height: Length::Units(Self::DEFAULT_SIZE), height: Length::Fixed(Self::DEFAULT_SIZE),
program, program,
message_: PhantomData, message_: PhantomData,
theme_: PhantomData, theme_: PhantomData,
@ -114,14 +114,14 @@ where
} }
/// Sets the width of the [`Canvas`]. /// Sets the width of the [`Canvas`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Canvas`]. /// Sets the height of the [`Canvas`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
} }

View file

@ -42,7 +42,7 @@ where
content: RefCell::new(Content { content: RefCell::new(Content {
size: Size::ZERO, size: Size::ZERO,
layout: layout::Node::new(Size::ZERO), layout: layout::Node::new(Size::ZERO),
element: Element::new(horizontal_space(Length::Units(0))), element: Element::new(horizontal_space(0)),
}), }),
} }
} }

View file

@ -191,7 +191,7 @@ where
} }
} }
let pad = axis.pack(padding.left as f32, padding.top as f32); let pad = axis.pack(padding.left, padding.top);
let mut main = pad.0; let mut main = pad.0;
for (i, node) in nodes.iter_mut().enumerate() { for (i, node) in nodes.iter_mut().enumerate() {

View file

@ -42,17 +42,16 @@ impl Limits {
} }
/// Applies a width constraint to the current [`Limits`]. /// Applies a width constraint to the current [`Limits`].
pub fn width(mut self, width: Length) -> Limits { pub fn width(mut self, width: impl Into<Length>) -> Limits {
match width { match width.into() {
Length::Shrink => { Length::Shrink => {
self.fill.width = self.min.width; self.fill.width = self.min.width;
} }
Length::Fill | Length::FillPortion(_) => { Length::Fill | Length::FillPortion(_) => {
self.fill.width = self.fill.width.min(self.max.width); self.fill.width = self.fill.width.min(self.max.width);
} }
Length::Units(units) => { Length::Fixed(amount) => {
let new_width = let new_width = amount.min(self.max.width).max(self.min.width);
(units as f32).min(self.max.width).max(self.min.width);
self.min.width = new_width; self.min.width = new_width;
self.max.width = new_width; self.max.width = new_width;
@ -64,17 +63,17 @@ impl Limits {
} }
/// Applies a height constraint to the current [`Limits`]. /// Applies a height constraint to the current [`Limits`].
pub fn height(mut self, height: Length) -> Limits { pub fn height(mut self, height: impl Into<Length>) -> Limits {
match height { match height.into() {
Length::Shrink => { Length::Shrink => {
self.fill.height = self.min.height; self.fill.height = self.min.height;
} }
Length::Fill | Length::FillPortion(_) => { Length::Fill | Length::FillPortion(_) => {
self.fill.height = self.fill.height.min(self.max.height); self.fill.height = self.fill.height.min(self.max.height);
} }
Length::Units(units) => { Length::Fixed(amount) => {
let new_height = let new_height =
(units as f32).min(self.max.height).max(self.min.height); amount.min(self.max.height).max(self.min.height);
self.min.height = new_height; self.min.height = new_height;
self.max.height = new_height; self.max.height = new_height;
@ -86,43 +85,36 @@ impl Limits {
} }
/// Applies a minimum width constraint to the current [`Limits`]. /// Applies a minimum width constraint to the current [`Limits`].
pub fn min_width(mut self, min_width: u32) -> Limits { pub fn min_width(mut self, min_width: f32) -> Limits {
self.min.width = self.min.width = self.min.width.max(min_width).min(self.max.width);
self.min.width.max(min_width as f32).min(self.max.width);
self self
} }
/// Applies a maximum width constraint to the current [`Limits`]. /// Applies a maximum width constraint to the current [`Limits`].
pub fn max_width(mut self, max_width: u32) -> Limits { pub fn max_width(mut self, max_width: f32) -> Limits {
self.max.width = self.max.width = self.max.width.min(max_width).max(self.min.width);
self.max.width.min(max_width as f32).max(self.min.width);
self self
} }
/// Applies a minimum height constraint to the current [`Limits`]. /// Applies a minimum height constraint to the current [`Limits`].
pub fn min_height(mut self, min_height: u32) -> Limits { pub fn min_height(mut self, min_height: f32) -> Limits {
self.min.height = self.min.height = self.min.height.max(min_height).min(self.max.height);
self.min.height.max(min_height as f32).min(self.max.height);
self self
} }
/// Applies a maximum height constraint to the current [`Limits`]. /// Applies a maximum height constraint to the current [`Limits`].
pub fn max_height(mut self, max_height: u32) -> Limits { pub fn max_height(mut self, max_height: f32) -> Limits {
self.max.height = self.max.height = self.max.height.min(max_height).max(self.min.height);
self.max.height.min(max_height as f32).max(self.min.height);
self self
} }
/// Shrinks the current [`Limits`] to account for the given padding. /// Shrinks the current [`Limits`] to account for the given padding.
pub fn pad(&self, padding: Padding) -> Limits { pub fn pad(&self, padding: Padding) -> Limits {
self.shrink(Size::new( self.shrink(Size::new(padding.horizontal(), padding.vertical()))
padding.horizontal() as f32,
padding.vertical() as f32,
))
} }
/// Shrinks the current [`Limits`] by the given [`Size`]. /// Shrinks the current [`Limits`] by the given [`Size`].

View file

@ -81,7 +81,7 @@ pub use iced_core::alignment;
pub use iced_core::time; pub use iced_core::time;
pub use iced_core::{ pub use iced_core::{
color, Alignment, Background, Color, ContentFit, Font, Length, Padding, color, Alignment, Background, Color, ContentFit, Font, Length, Padding,
Point, Rectangle, Size, Vector, Pixels, Point, Rectangle, Size, Vector,
}; };
pub use iced_futures::{executor, futures}; pub use iced_futures::{executor, futures};
pub use iced_style::application; pub use iced_style::application;

View file

@ -11,8 +11,8 @@ use crate::widget::container::{self, Container};
use crate::widget::scrollable::{self, Scrollable}; use crate::widget::scrollable::{self, Scrollable};
use crate::widget::Tree; use crate::widget::Tree;
use crate::{ use crate::{
Clipboard, Color, Element, Layout, Length, Padding, Point, Rectangle, Clipboard, Color, Element, Layout, Length, Padding, Pixels, Point,
Shell, Size, Vector, Widget, Rectangle, Shell, Size, Vector, Widget,
}; };
pub use iced_style::menu::{Appearance, StyleSheet}; pub use iced_style::menu::{Appearance, StyleSheet};
@ -28,9 +28,9 @@ where
options: &'a [T], options: &'a [T],
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
last_selection: &'a mut Option<T>, last_selection: &'a mut Option<T>,
width: u16, width: f32,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -55,7 +55,7 @@ where
options, options,
hovered_option, hovered_option,
last_selection, last_selection,
width: 0, width: 0.0,
padding: Padding::ZERO, padding: Padding::ZERO,
text_size: None, text_size: None,
font: Default::default(), font: Default::default(),
@ -64,7 +64,7 @@ where
} }
/// Sets the width of the [`Menu`]. /// Sets the width of the [`Menu`].
pub fn width(mut self, width: u16) -> Self { pub fn width(mut self, width: f32) -> Self {
self.width = width; self.width = width;
self self
} }
@ -76,8 +76,8 @@ where
} }
/// Sets the text size of the [`Menu`]. /// Sets the text size of the [`Menu`].
pub fn text_size(mut self, text_size: u16) -> Self { pub fn text_size(mut self, text_size: impl Into<Pixels>) -> Self {
self.text_size = Some(text_size); self.text_size = Some(text_size.into().0);
self self
} }
@ -142,7 +142,7 @@ where
{ {
state: &'a mut Tree, state: &'a mut Tree,
container: Container<'a, Message, Renderer>, container: Container<'a, Message, Renderer>,
width: u16, width: f32,
target_height: f32, target_height: f32,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -219,7 +219,7 @@ where
}, },
), ),
) )
.width(Length::Units(self.width)); .width(self.width);
let mut node = self.container.layout(renderer, &limits); let mut node = self.container.layout(renderer, &limits);
@ -310,7 +310,7 @@ where
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
last_selection: &'a mut Option<T>, last_selection: &'a mut Option<T>,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -344,8 +344,7 @@ where
let size = { let size = {
let intrinsic = Size::new( let intrinsic = Size::new(
0.0, 0.0,
f32::from(text_size + self.padding.vertical()) text_size + self.padding.vertical() * self.options.len() as f32,
* self.options.len() as f32,
); );
limits.resolve(intrinsic) limits.resolve(intrinsic)
@ -386,7 +385,7 @@ where
*self.hovered_option = Some( *self.hovered_option = Some(
((cursor_position.y - bounds.y) ((cursor_position.y - bounds.y)
/ f32::from(text_size + self.padding.vertical())) / (text_size + self.padding.vertical()))
as usize, as usize,
); );
} }
@ -401,7 +400,7 @@ where
*self.hovered_option = Some( *self.hovered_option = Some(
((cursor_position.y - bounds.y) ((cursor_position.y - bounds.y)
/ f32::from(text_size + self.padding.vertical())) / (text_size + self.padding.vertical()))
as usize, as usize,
); );
@ -467,7 +466,7 @@ where
x: bounds.x, x: bounds.x,
y: bounds.y + (option_height * i) as f32, y: bounds.y + (option_height * i) as f32,
width: bounds.width, width: bounds.width,
height: f32::from(text_size + self.padding.vertical()), height: text_size + self.padding.vertical(),
}; };
if is_selected { if is_selected {
@ -485,12 +484,12 @@ where
renderer.fill_text(Text { renderer.fill_text(Text {
content: &option.to_string(), content: &option.to_string(),
bounds: Rectangle { bounds: Rectangle {
x: bounds.x + self.padding.left as f32, x: bounds.x + self.padding.left,
y: bounds.center_y(), y: bounds.center_y(),
width: f32::INFINITY, width: f32::INFINITY,
..bounds ..bounds
}, },
size: f32::from(text_size), size: text_size,
font: self.font.clone(), font: self.font.clone(),
color: if is_selected { color: if is_selected {
appearance.selected_text_color appearance.selected_text_color

View file

@ -44,14 +44,14 @@ impl text::Renderer for Null {
const CHECKMARK_ICON: char = '0'; const CHECKMARK_ICON: char = '0';
const ARROW_DOWN_ICON: char = '0'; const ARROW_DOWN_ICON: char = '0';
fn default_size(&self) -> u16 { fn default_size(&self) -> f32 {
20 20.0
} }
fn measure( fn measure(
&self, &self,
_content: &str, _content: &str,
_size: u16, _size: f32,
_font: Font, _font: Font,
_bounds: Size, _bounds: Size,
) -> (f32, f32) { ) -> (f32, f32) {

View file

@ -73,20 +73,20 @@ pub trait Renderer: crate::Renderer {
const ARROW_DOWN_ICON: char; const ARROW_DOWN_ICON: char;
/// Returns the default size of [`Text`]. /// Returns the default size of [`Text`].
fn default_size(&self) -> u16; fn default_size(&self) -> f32;
/// Measures the text in the given bounds and returns the minimum boundaries /// Measures the text in the given bounds and returns the minimum boundaries
/// that can fit the contents. /// that can fit the contents.
fn measure( fn measure(
&self, &self,
content: &str, content: &str,
size: u16, size: f32,
font: Self::Font, font: Self::Font,
bounds: Size, bounds: Size,
) -> (f32, f32); ) -> (f32, f32);
/// Measures the width of the text as if it were laid out in a single line. /// Measures the width of the text as if it were laid out in a single line.
fn measure_width(&self, content: &str, size: u16, font: Self::Font) -> f32 { fn measure_width(&self, content: &str, size: f32, font: Self::Font) -> f32 {
let (width, _) = self.measure(content, size, font, Size::INFINITY); let (width, _) = self.measure(content, size, font, Size::INFINITY);
width width

View file

@ -76,20 +76,20 @@ where
on_press: None, on_press: None,
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
padding: Padding::new(5), padding: Padding::new(5.0),
style: <Renderer::Theme as StyleSheet>::Style::default(), style: <Renderer::Theme as StyleSheet>::Style::default(),
} }
} }
/// Sets the width of the [`Button`]. /// Sets the width of the [`Button`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Button`]. /// Sets the height of the [`Button`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -434,7 +434,7 @@ pub fn layout<Renderer>(
let padding = padding.fit(content.size(), limits.max()); let padding = padding.fit(content.size(), limits.max());
let size = limits.pad(padding).resolve(content.size()).pad(padding); let size = limits.pad(padding).resolve(content.size()).pad(padding);
content.move_to(Point::new(padding.left.into(), padding.top.into())); content.move_to(Point::new(padding.left, padding.top));
layout::Node::with_children(size, vec![content]) layout::Node::with_children(size, vec![content])
} }

View file

@ -8,21 +8,21 @@ use crate::text;
use crate::touch; use crate::touch;
use crate::widget::{self, Row, Text, Tree}; use crate::widget::{self, Row, Text, Tree};
use crate::{ use crate::{
Alignment, Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Alignment, Clipboard, Element, Layout, Length, Pixels, Point, Rectangle,
Widget, Shell, Widget,
}; };
pub use iced_style::checkbox::{Appearance, StyleSheet}; pub use iced_style::checkbox::{Appearance, StyleSheet};
/// The icon in a [`Checkbox`]. /// The icon in a [`Checkbox`].
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq)]
pub struct Icon<Font> { pub struct Icon<Font> {
/// Font that will be used to display the `code_point`, /// Font that will be used to display the `code_point`,
pub font: Font, pub font: Font,
/// The unicode code point that will be used as the icon. /// The unicode code point that will be used as the icon.
pub code_point: char, pub code_point: char,
/// Font size of the content. /// Font size of the content.
pub size: Option<u16>, pub size: Option<f32>,
} }
/// A box that can be checked. /// A box that can be checked.
@ -52,9 +52,9 @@ where
on_toggle: Box<dyn Fn(bool) -> Message + 'a>, on_toggle: Box<dyn Fn(bool) -> Message + 'a>,
label: String, label: String,
width: Length, width: Length,
size: u16, size: f32,
spacing: u16, spacing: f32,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
icon: Icon<Renderer::Font>, icon: Icon<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
@ -66,10 +66,10 @@ where
Renderer::Theme: StyleSheet + widget::text::StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
/// The default size of a [`Checkbox`]. /// The default size of a [`Checkbox`].
const DEFAULT_SIZE: u16 = 20; const DEFAULT_SIZE: f32 = 20.0;
/// The default spacing of a [`Checkbox`]. /// The default spacing of a [`Checkbox`].
const DEFAULT_SPACING: u16 = 15; const DEFAULT_SPACING: f32 = 15.0;
/// Creates a new [`Checkbox`]. /// Creates a new [`Checkbox`].
/// ///
@ -102,26 +102,26 @@ where
} }
/// Sets the size of the [`Checkbox`]. /// Sets the size of the [`Checkbox`].
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.size = size; self.size = size.into().0;
self self
} }
/// Sets the width of the [`Checkbox`]. /// Sets the width of the [`Checkbox`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the spacing between the [`Checkbox`] and the text. /// Sets the spacing between the [`Checkbox`] and the text.
pub fn spacing(mut self, spacing: u16) -> Self { pub fn spacing(mut self, spacing: impl Into<Pixels>) -> Self {
self.spacing = spacing; self.spacing = spacing.into().0;
self self
} }
/// Sets the text size of the [`Checkbox`]. /// Sets the text size of the [`Checkbox`].
pub fn text_size(mut self, text_size: u16) -> Self { pub fn text_size(mut self, text_size: impl Into<Pixels>) -> Self {
self.text_size = Some(text_size); self.text_size = Some(text_size.into().0);
self self
} }
@ -172,11 +172,7 @@ where
.width(self.width) .width(self.width)
.spacing(self.spacing) .spacing(self.spacing)
.align_items(Alignment::Center) .align_items(Alignment::Center)
.push( .push(Row::new().width(self.size).height(self.size))
Row::new()
.width(Length::Units(self.size))
.height(Length::Units(self.size)),
)
.push( .push(
Text::new(&self.label) Text::new(&self.label)
.font(self.font.clone()) .font(self.font.clone())

View file

@ -6,18 +6,18 @@ use crate::overlay;
use crate::renderer; use crate::renderer;
use crate::widget::{Operation, Tree}; use crate::widget::{Operation, Tree};
use crate::{ use crate::{
Alignment, Clipboard, Element, Layout, Length, Padding, Point, Rectangle, Alignment, Clipboard, Element, Layout, Length, Padding, Pixels, Point,
Shell, Widget, Rectangle, Shell, Widget,
}; };
/// A container that distributes its contents vertically. /// A container that distributes its contents vertically.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Column<'a, Message, Renderer> { pub struct Column<'a, Message, Renderer> {
spacing: u16, spacing: f32,
padding: Padding, padding: Padding,
width: Length, width: Length,
height: Length, height: Length,
max_width: u32, max_width: f32,
align_items: Alignment, align_items: Alignment,
children: Vec<Element<'a, Message, Renderer>>, children: Vec<Element<'a, Message, Renderer>>,
} }
@ -33,11 +33,11 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
children: Vec<Element<'a, Message, Renderer>>, children: Vec<Element<'a, Message, Renderer>>,
) -> Self { ) -> Self {
Column { Column {
spacing: 0, spacing: 0.0,
padding: Padding::ZERO, padding: Padding::ZERO,
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
max_width: u32::MAX, max_width: f32::INFINITY,
align_items: Alignment::Start, align_items: Alignment::Start,
children, children,
} }
@ -48,8 +48,8 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
/// Custom margins per element do not exist in iced. You should use this /// Custom margins per element do not exist in iced. You should use this
/// method instead! While less flexible, it helps you keep spacing between /// method instead! While less flexible, it helps you keep spacing between
/// elements consistent. /// elements consistent.
pub fn spacing(mut self, units: u16) -> Self { pub fn spacing(mut self, amount: impl Into<Pixels>) -> Self {
self.spacing = units; self.spacing = amount.into().0;
self self
} }
@ -60,20 +60,20 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {
} }
/// Sets the width of the [`Column`]. /// Sets the width of the [`Column`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Column`]. /// Sets the height of the [`Column`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
/// Sets the maximum width of the [`Column`]. /// Sets the maximum width of the [`Column`].
pub fn max_width(mut self, max_width: u32) -> Self { pub fn max_width(mut self, max_width: impl Into<Pixels>) -> Self {
self.max_width = max_width; self.max_width = max_width.into().0;
self self
} }
@ -135,7 +135,7 @@ where
renderer, renderer,
&limits, &limits,
self.padding, self.padding,
self.spacing as f32, self.spacing,
self.align_items, self.align_items,
&self.children, &self.children,
) )

View file

@ -7,12 +7,10 @@ use crate::overlay;
use crate::renderer; use crate::renderer;
use crate::widget::{self, Operation, Tree}; use crate::widget::{self, Operation, Tree};
use crate::{ use crate::{
Background, Clipboard, Color, Element, Layout, Length, Padding, Point, Background, Clipboard, Color, Element, Layout, Length, Padding, Pixels,
Rectangle, Shell, Widget, Point, Rectangle, Shell, Widget,
}; };
use std::u32;
pub use iced_style::container::{Appearance, StyleSheet}; pub use iced_style::container::{Appearance, StyleSheet};
/// An element decorating some content. /// An element decorating some content.
@ -28,8 +26,8 @@ where
padding: Padding, padding: Padding,
width: Length, width: Length,
height: Length, height: Length,
max_width: u32, max_width: f32,
max_height: u32, max_height: f32,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
@ -51,8 +49,8 @@ where
padding: Padding::ZERO, padding: Padding::ZERO,
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
max_width: u32::MAX, max_width: f32::INFINITY,
max_height: u32::MAX, max_height: f32::INFINITY,
horizontal_alignment: alignment::Horizontal::Left, horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top, vertical_alignment: alignment::Vertical::Top,
style: Default::default(), style: Default::default(),
@ -73,26 +71,26 @@ where
} }
/// Sets the width of the [`Container`]. /// Sets the width of the [`Container`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Container`]. /// Sets the height of the [`Container`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
/// Sets the maximum width of the [`Container`]. /// Sets the maximum width of the [`Container`].
pub fn max_width(mut self, max_width: u32) -> Self { pub fn max_width(mut self, max_width: impl Into<Pixels>) -> Self {
self.max_width = max_width; self.max_width = max_width.into().0;
self self
} }
/// Sets the maximum height of the [`Container`] in pixels. /// Sets the maximum height of the [`Container`].
pub fn max_height(mut self, max_height: u32) -> Self { pub fn max_height(mut self, max_height: impl Into<Pixels>) -> Self {
self.max_height = max_height; self.max_height = max_height.into().0;
self self
} }
@ -294,8 +292,8 @@ pub fn layout<Renderer>(
limits: &layout::Limits, limits: &layout::Limits,
width: Length, width: Length,
height: Length, height: Length,
max_width: u32, max_width: f32,
max_height: u32, max_height: f32,
padding: Padding, padding: Padding,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
@ -312,7 +310,7 @@ pub fn layout<Renderer>(
let padding = padding.fit(content.size(), limits.max()); let padding = padding.fit(content.size(), limits.max());
let size = limits.pad(padding).resolve(content.size()); let size = limits.pad(padding).resolve(content.size());
content.move_to(Point::new(padding.left.into(), padding.top.into())); content.move_to(Point::new(padding.left, padding.top));
content.align( content.align(
Alignment::from(horizontal_alignment), Alignment::from(horizontal_alignment),
Alignment::from(vertical_alignment), Alignment::from(vertical_alignment),

View file

@ -1,7 +1,7 @@
//! Helper functions to create pure widgets. //! Helper functions to create pure widgets.
use crate::overlay; use crate::overlay;
use crate::widget; use crate::widget;
use crate::{Element, Length}; use crate::{Element, Length, Pixels};
use std::borrow::Cow; use std::borrow::Cow;
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
@ -247,21 +247,23 @@ pub fn image<Handle>(handle: impl Into<Handle>) -> widget::Image<Handle> {
/// Creates a new horizontal [`Space`] with the given [`Length`]. /// Creates a new horizontal [`Space`] with the given [`Length`].
/// ///
/// [`Space`]: widget::Space /// [`Space`]: widget::Space
pub fn horizontal_space(width: Length) -> widget::Space { pub fn horizontal_space(width: impl Into<Length>) -> widget::Space {
widget::Space::with_width(width) widget::Space::with_width(width)
} }
/// Creates a new vertical [`Space`] with the given [`Length`]. /// Creates a new vertical [`Space`] with the given [`Length`].
/// ///
/// [`Space`]: widget::Space /// [`Space`]: widget::Space
pub fn vertical_space(height: Length) -> widget::Space { pub fn vertical_space(height: impl Into<Length>) -> widget::Space {
widget::Space::with_height(height) widget::Space::with_height(height)
} }
/// Creates a horizontal [`Rule`] with the given height. /// Creates a horizontal [`Rule`] with the given height.
/// ///
/// [`Rule`]: widget::Rule /// [`Rule`]: widget::Rule
pub fn horizontal_rule<Renderer>(height: u16) -> widget::Rule<Renderer> pub fn horizontal_rule<Renderer>(
height: impl Into<Pixels>,
) -> widget::Rule<Renderer>
where where
Renderer: crate::Renderer, Renderer: crate::Renderer,
Renderer::Theme: widget::rule::StyleSheet, Renderer::Theme: widget::rule::StyleSheet,
@ -272,7 +274,9 @@ where
/// Creates a vertical [`Rule`] with the given width. /// Creates a vertical [`Rule`] with the given width.
/// ///
/// [`Rule`]: widget::Rule /// [`Rule`]: widget::Rule
pub fn vertical_rule<Renderer>(width: u16) -> widget::Rule<Renderer> pub fn vertical_rule<Renderer>(
width: impl Into<Pixels>,
) -> widget::Rule<Renderer>
where where
Renderer: crate::Renderer, Renderer: crate::Renderer,
Renderer::Theme: widget::rule::StyleSheet, Renderer::Theme: widget::rule::StyleSheet,

View file

@ -29,7 +29,7 @@ pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> {
/// ``` /// ```
/// ///
/// <img src="https://github.com/iced-rs/iced/blob/9712b319bb7a32848001b96bd84977430f14b623/examples/resources/ferris.png?raw=true" width="300"> /// <img src="https://github.com/iced-rs/iced/blob/9712b319bb7a32848001b96bd84977430f14b623/examples/resources/ferris.png?raw=true" width="300">
#[derive(Debug, Hash)] #[derive(Debug)]
pub struct Image<Handle> { pub struct Image<Handle> {
handle: Handle, handle: Handle,
width: Length, width: Length,
@ -49,14 +49,14 @@ impl<Handle> Image<Handle> {
} }
/// Sets the width of the [`Image`] boundaries. /// Sets the width of the [`Image`] boundaries.
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Image`] boundaries. /// Sets the height of the [`Image`] boundaries.
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }

View file

@ -6,8 +6,8 @@ use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
Clipboard, Element, Layout, Length, Point, Rectangle, Shell, Size, Vector, Clipboard, Element, Layout, Length, Pixels, Point, Rectangle, Shell, Size,
Widget, Vector, Widget,
}; };
use std::hash::Hash; use std::hash::Hash;
@ -15,7 +15,7 @@ use std::hash::Hash;
/// A frame that displays an image with the ability to zoom in/out and pan. /// A frame that displays an image with the ability to zoom in/out and pan.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Viewer<Handle> { pub struct Viewer<Handle> {
padding: u16, padding: f32,
width: Length, width: Length,
height: Length, height: Length,
min_scale: f32, min_scale: f32,
@ -28,7 +28,7 @@ impl<Handle> Viewer<Handle> {
/// Creates a new [`Viewer`] with the given [`State`]. /// Creates a new [`Viewer`] with the given [`State`].
pub fn new(handle: Handle) -> Self { pub fn new(handle: Handle) -> Self {
Viewer { Viewer {
padding: 0, padding: 0.0,
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
min_scale: 0.25, min_scale: 0.25,
@ -39,20 +39,20 @@ impl<Handle> Viewer<Handle> {
} }
/// Sets the padding of the [`Viewer`]. /// Sets the padding of the [`Viewer`].
pub fn padding(mut self, units: u16) -> Self { pub fn padding(mut self, padding: impl Into<Pixels>) -> Self {
self.padding = units; self.padding = padding.into().0;
self self
} }
/// Sets the width of the [`Viewer`]. /// Sets the width of the [`Viewer`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Viewer`]. /// Sets the height of the [`Viewer`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -124,7 +124,7 @@ where
// Only calculate viewport sizes if the images are constrained to a limited space. // Only calculate viewport sizes if the images are constrained to a limited space.
// If they are Fill|Portion let them expand within their alotted space. // If they are Fill|Portion let them expand within their alotted space.
match expansion_size { match expansion_size {
Length::Shrink | Length::Units(_) => { Length::Shrink | Length::Fixed(_) => {
let aspect_ratio = width as f32 / height as f32; let aspect_ratio = width as f32 / height as f32;
let viewport_aspect_ratio = size.width / size.height; let viewport_aspect_ratio = size.width / size.height;
if viewport_aspect_ratio > aspect_ratio { if viewport_aspect_ratio > aspect_ratio {

View file

@ -42,8 +42,8 @@ use crate::widget;
use crate::widget::container; use crate::widget::container;
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
Clipboard, Color, Element, Layout, Length, Point, Rectangle, Shell, Size, Clipboard, Color, Element, Layout, Length, Pixels, Point, Rectangle, Shell,
Vector, Widget, Size, Vector, Widget,
}; };
/// A collection of panes distributed using either vertical or horizontal splits /// A collection of panes distributed using either vertical or horizontal splits
@ -104,10 +104,10 @@ where
contents: Contents<'a, Content<'a, Message, Renderer>>, contents: Contents<'a, Content<'a, Message, Renderer>>,
width: Length, width: Length,
height: Length, height: Length,
spacing: u16, spacing: f32,
on_click: Option<Box<dyn Fn(Pane) -> Message + 'a>>, on_click: Option<Box<dyn Fn(Pane) -> Message + 'a>>,
on_drag: Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, on_drag: Option<Box<dyn Fn(DragEvent) -> Message + 'a>>,
on_resize: Option<(u16, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>, on_resize: Option<(f32, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -150,7 +150,7 @@ where
contents, contents,
width: Length::Fill, width: Length::Fill,
height: Length::Fill, height: Length::Fill,
spacing: 0, spacing: 0.0,
on_click: None, on_click: None,
on_drag: None, on_drag: None,
on_resize: None, on_resize: None,
@ -159,20 +159,20 @@ where
} }
/// Sets the width of the [`PaneGrid`]. /// Sets the width of the [`PaneGrid`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`PaneGrid`]. /// Sets the height of the [`PaneGrid`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
/// Sets the spacing _between_ the panes of the [`PaneGrid`]. /// Sets the spacing _between_ the panes of the [`PaneGrid`].
pub fn spacing(mut self, units: u16) -> Self { pub fn spacing(mut self, amount: impl Into<Pixels>) -> Self {
self.spacing = units; self.spacing = amount.into().0;
self self
} }
@ -205,11 +205,11 @@ where
/// The grabbable area of a split will have a length of `spacing + leeway`, /// The grabbable area of a split will have a length of `spacing + leeway`,
/// properly centered. In other words, a length of /// properly centered. In other words, a length of
/// `(spacing + leeway) / 2.0` on either side of the split line. /// `(spacing + leeway) / 2.0` on either side of the split line.
pub fn on_resize<F>(mut self, leeway: u16, f: F) -> Self pub fn on_resize<F>(mut self, leeway: impl Into<Pixels>, f: F) -> Self
where where
F: 'a + Fn(ResizeEvent) -> Message, F: 'a + Fn(ResizeEvent) -> Message,
{ {
self.on_resize = Some((leeway, Box::new(f))); self.on_resize = Some((leeway.into().0, Box::new(f)));
self self
} }
@ -485,14 +485,14 @@ pub fn layout<Renderer, T>(
node: &Node, node: &Node,
width: Length, width: Length,
height: Length, height: Length,
spacing: u16, spacing: f32,
contents: impl Iterator<Item = (Pane, T)>, contents: impl Iterator<Item = (Pane, T)>,
layout_content: impl Fn(T, &Renderer, &layout::Limits) -> layout::Node, layout_content: impl Fn(T, &Renderer, &layout::Limits) -> layout::Node,
) -> layout::Node { ) -> layout::Node {
let limits = limits.width(width).height(height); let limits = limits.width(width).height(height);
let size = limits.resolve(Size::ZERO); let size = limits.resolve(Size::ZERO);
let regions = node.pane_regions(f32::from(spacing), size); let regions = node.pane_regions(spacing, size);
let children = contents let children = contents
.filter_map(|(pane, content)| { .filter_map(|(pane, content)| {
let region = regions.get(&pane)?; let region = regions.get(&pane)?;
@ -522,11 +522,11 @@ pub fn update<'a, Message, T: Draggable>(
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
spacing: u16, spacing: f32,
contents: impl Iterator<Item = (Pane, T)>, contents: impl Iterator<Item = (Pane, T)>,
on_click: &Option<Box<dyn Fn(Pane) -> Message + 'a>>, on_click: &Option<Box<dyn Fn(Pane) -> Message + 'a>>,
on_drag: &Option<Box<dyn Fn(DragEvent) -> Message + 'a>>, on_drag: &Option<Box<dyn Fn(DragEvent) -> Message + 'a>>,
on_resize: &Option<(u16, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>, on_resize: &Option<(f32, Box<dyn Fn(ResizeEvent) -> Message + 'a>)>,
) -> event::Status { ) -> event::Status {
let mut event_status = event::Status::Ignored; let mut event_status = event::Status::Ignored;
@ -546,13 +546,13 @@ pub fn update<'a, Message, T: Draggable>(
); );
let splits = node.split_regions( let splits = node.split_regions(
f32::from(spacing), spacing,
Size::new(bounds.width, bounds.height), Size::new(bounds.width, bounds.height),
); );
let clicked_split = hovered_split( let clicked_split = hovered_split(
splits.iter(), splits.iter(),
f32::from(spacing + leeway), spacing + leeway,
relative_cursor, relative_cursor,
); );
@ -624,7 +624,7 @@ pub fn update<'a, Message, T: Draggable>(
let bounds = layout.bounds(); let bounds = layout.bounds();
let splits = node.split_regions( let splits = node.split_regions(
f32::from(spacing), spacing,
Size::new(bounds.width, bounds.height), Size::new(bounds.width, bounds.height),
); );
@ -698,8 +698,8 @@ pub fn mouse_interaction(
node: &Node, node: &Node,
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
spacing: u16, spacing: f32,
resize_leeway: Option<u16>, resize_leeway: Option<f32>,
) -> Option<mouse::Interaction> { ) -> Option<mouse::Interaction> {
if action.picked_pane().is_some() { if action.picked_pane().is_some() {
return Some(mouse::Interaction::Grabbing); return Some(mouse::Interaction::Grabbing);
@ -710,20 +710,15 @@ pub fn mouse_interaction(
resize_leeway.and_then(|leeway| { resize_leeway.and_then(|leeway| {
let bounds = layout.bounds(); let bounds = layout.bounds();
let splits = let splits = node.split_regions(spacing, bounds.size());
node.split_regions(f32::from(spacing), bounds.size());
let relative_cursor = Point::new( let relative_cursor = Point::new(
cursor_position.x - bounds.x, cursor_position.x - bounds.x,
cursor_position.y - bounds.y, cursor_position.y - bounds.y,
); );
hovered_split( hovered_split(splits.iter(), spacing + leeway, relative_cursor)
splits.iter(), .map(|(_, axis, _)| axis)
f32::from(spacing + leeway),
relative_cursor,
)
.map(|(_, axis, _)| axis)
}) })
}); });
@ -747,8 +742,8 @@ pub fn draw<Renderer, T>(
theme: &Renderer::Theme, theme: &Renderer::Theme,
default_style: &renderer::Style, default_style: &renderer::Style,
viewport: &Rectangle, viewport: &Rectangle,
spacing: u16, spacing: f32,
resize_leeway: Option<u16>, resize_leeway: Option<f32>,
style: &<Renderer::Theme as StyleSheet>::Style, style: &<Renderer::Theme as StyleSheet>::Style,
contents: impl Iterator<Item = (Pane, T)>, contents: impl Iterator<Item = (Pane, T)>,
draw_pane: impl Fn( draw_pane: impl Fn(
@ -770,12 +765,11 @@ pub fn draw<Renderer, T>(
.and_then(|(split, axis)| { .and_then(|(split, axis)| {
let bounds = layout.bounds(); let bounds = layout.bounds();
let splits = node.split_regions(f32::from(spacing), bounds.size()); let splits = node.split_regions(spacing, bounds.size());
let (_axis, region, ratio) = splits.get(&split)?; let (_axis, region, ratio) = splits.get(&split)?;
let region = let region = axis.split_line_bounds(*region, *ratio, spacing);
axis.split_line_bounds(*region, *ratio, f32::from(spacing));
Some((axis, region + Vector::new(bounds.x, bounds.y), true)) Some((axis, region + Vector::new(bounds.x, bounds.y), true))
}) })
@ -788,12 +782,11 @@ pub fn draw<Renderer, T>(
cursor_position.y - bounds.y, cursor_position.y - bounds.y,
); );
let splits = let splits = node.split_regions(spacing, bounds.size());
node.split_regions(f32::from(spacing), bounds.size());
let (_split, axis, region) = hovered_split( let (_split, axis, region) = hovered_split(
splits.iter(), splits.iter(),
f32::from(spacing + leeway), spacing + leeway,
relative_cursor, relative_cursor,
)?; )?;

View file

@ -249,10 +249,7 @@ where
) )
}; };
node.move_to(Point::new( node.move_to(Point::new(self.padding.left, self.padding.top));
self.padding.left.into(),
self.padding.top.into(),
));
layout::Node::with_children(node.size().pad(self.padding), vec![node]) layout::Node::with_children(node.size().pad(self.padding), vec![node])
} }

View file

@ -13,8 +13,8 @@ use crate::widget::container;
use crate::widget::scrollable; use crate::widget::scrollable;
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
Clipboard, Element, Layout, Length, Padding, Point, Rectangle, Shell, Size, Clipboard, Element, Layout, Length, Padding, Pixels, Point, Rectangle,
Widget, Shell, Size, Widget,
}; };
use std::borrow::Cow; use std::borrow::Cow;
@ -34,7 +34,7 @@ where
selected: Option<T>, selected: Option<T>,
width: Length, width: Length,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
handle: Handle<Renderer::Font>, handle: Handle<Renderer::Font>,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
@ -53,7 +53,7 @@ where
From<<Renderer::Theme as StyleSheet>::Style>, From<<Renderer::Theme as StyleSheet>::Style>,
{ {
/// The default padding of a [`PickList`]. /// The default padding of a [`PickList`].
pub const DEFAULT_PADDING: Padding = Padding::new(5); pub const DEFAULT_PADDING: Padding = Padding::new(5.0);
/// Creates a new [`PickList`] with the given list of options, the current /// Creates a new [`PickList`] with the given list of options, the current
/// selected value, and the message to produce when an option is selected. /// selected value, and the message to produce when an option is selected.
@ -83,8 +83,8 @@ where
} }
/// Sets the width of the [`PickList`]. /// Sets the width of the [`PickList`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
@ -95,8 +95,8 @@ where
} }
/// Sets the text size of the [`PickList`]. /// Sets the text size of the [`PickList`].
pub fn text_size(mut self, size: u16) -> Self { pub fn text_size(mut self, size: impl Into<Pixels>) -> Self {
self.text_size = Some(size); self.text_size = Some(size.into().0);
self self
} }
@ -297,14 +297,14 @@ impl<T> Default for State<T> {
} }
/// The handle to the right side of the [`PickList`]. /// The handle to the right side of the [`PickList`].
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq)]
pub enum Handle<Font> { pub enum Handle<Font> {
/// Displays an arrow icon (▼). /// Displays an arrow icon (▼).
/// ///
/// This is the default. /// This is the default.
Arrow { Arrow {
/// Font size of the content. /// Font size of the content.
size: Option<u16>, size: Option<f32>,
}, },
/// A custom static handle. /// A custom static handle.
Static(Icon<Font>), Static(Icon<Font>),
@ -326,14 +326,14 @@ impl<Font> Default for Handle<Font> {
} }
/// The icon of a [`Handle`]. /// The icon of a [`Handle`].
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq)]
pub struct Icon<Font> { pub struct Icon<Font> {
/// Font that will be used to display the `code_point`, /// Font that will be used to display the `code_point`,
pub font: Font, pub font: Font,
/// The unicode code point that will be used as the icon. /// The unicode code point that will be used as the icon.
pub code_point: char, pub code_point: char,
/// Font size of the content. /// Font size of the content.
pub size: Option<u16>, pub size: Option<f32>,
} }
/// Computes the layout of a [`PickList`]. /// Computes the layout of a [`PickList`].
@ -342,7 +342,7 @@ pub fn layout<Renderer, T>(
limits: &layout::Limits, limits: &layout::Limits,
width: Length, width: Length,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: &Renderer::Font, font: &Renderer::Font,
placeholder: Option<&str>, placeholder: Option<&str>,
options: &[T], options: &[T],
@ -354,12 +354,11 @@ where
use std::f32; use std::f32;
let limits = limits.width(width).height(Length::Shrink).pad(padding); let limits = limits.width(width).height(Length::Shrink).pad(padding);
let text_size = text_size.unwrap_or_else(|| renderer.default_size()); let text_size = text_size.unwrap_or_else(|| renderer.default_size());
let max_width = match width { let max_width = match width {
Length::Shrink => { Length::Shrink => {
let measure = |label: &str| -> u32 { let measure = |label: &str| -> f32 {
let (width, _) = renderer.measure( let (width, _) = renderer.measure(
label, label,
text_size, text_size,
@ -367,26 +366,25 @@ where
Size::new(f32::INFINITY, f32::INFINITY), Size::new(f32::INFINITY, f32::INFINITY),
); );
width.round() as u32 width.round()
}; };
let labels = options.iter().map(ToString::to_string); let labels = options.iter().map(ToString::to_string);
let labels_width = let labels_width = labels
labels.map(|label| measure(&label)).max().unwrap_or(100); .map(|label| measure(&label))
.fold(100.0, |candidate, current| current.max(candidate));
let placeholder_width = placeholder.map(measure).unwrap_or(100); let placeholder_width = placeholder.map(measure).unwrap_or(100.0);
labels_width.max(placeholder_width) labels_width.max(placeholder_width)
} }
_ => 0, _ => 0.0,
}; };
let size = { let size = {
let intrinsic = Size::new( let intrinsic =
max_width as f32 + f32::from(text_size) + f32::from(padding.left), Size::new(max_width + text_size + padding.left, text_size);
f32::from(text_size),
);
limits.resolve(intrinsic).pad(padding) limits.resolve(intrinsic).pad(padding)
}; };
@ -514,7 +512,7 @@ pub fn overlay<'a, T, Message, Renderer>(
layout: Layout<'_>, layout: Layout<'_>,
state: &'a mut State<T>, state: &'a mut State<T>,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
options: &'a [T], options: &'a [T],
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
@ -539,7 +537,7 @@ where
&mut state.hovered_option, &mut state.hovered_option,
&mut state.last_selection, &mut state.last_selection,
) )
.width(bounds.width.round() as u16) .width(bounds.width)
.padding(padding) .padding(padding)
.font(font) .font(font)
.style(style); .style(style);
@ -561,7 +559,7 @@ pub fn draw<'a, T, Renderer>(
layout: Layout<'_>, layout: Layout<'_>,
cursor_position: Point, cursor_position: Point,
padding: Padding, padding: Padding,
text_size: Option<u16>, text_size: Option<f32>,
font: &Renderer::Font, font: &Renderer::Font,
placeholder: Option<&str>, placeholder: Option<&str>,
selected: Option<&T>, selected: Option<&T>,
@ -613,7 +611,7 @@ pub fn draw<'a, T, Renderer>(
}; };
if let Some((font, code_point, size)) = handle { if let Some((font, code_point, size)) = handle {
let size = f32::from(size.unwrap_or_else(|| renderer.default_size())); let size = size.unwrap_or_else(|| renderer.default_size());
renderer.fill_text(Text { renderer.fill_text(Text {
content: &code_point.to_string(), content: &code_point.to_string(),
@ -621,7 +619,7 @@ pub fn draw<'a, T, Renderer>(
font, font,
color: style.handle_color, color: style.handle_color,
bounds: Rectangle { bounds: Rectangle {
x: bounds.x + bounds.width - f32::from(padding.horizontal()), x: bounds.x + bounds.width - padding.horizontal(),
y: bounds.center_y() - size / 2.0, y: bounds.center_y() - size / 2.0,
height: size, height: size,
..bounds ..bounds
@ -634,8 +632,7 @@ pub fn draw<'a, T, Renderer>(
let label = selected.map(ToString::to_string); let label = selected.map(ToString::to_string);
if let Some(label) = label.as_deref().or(placeholder) { if let Some(label) = label.as_deref().or(placeholder) {
let text_size = let text_size = text_size.unwrap_or_else(|| renderer.default_size());
f32::from(text_size.unwrap_or_else(|| renderer.default_size()));
renderer.fill_text(Text { renderer.fill_text(Text {
content: label, content: label,
@ -647,9 +644,9 @@ pub fn draw<'a, T, Renderer>(
style.placeholder_color style.placeholder_color
}, },
bounds: Rectangle { bounds: Rectangle {
x: bounds.x + f32::from(padding.left), x: bounds.x + padding.left,
y: bounds.center_y() - text_size / 2.0, y: bounds.center_y() - text_size / 2.0,
width: bounds.width - f32::from(padding.horizontal()), width: bounds.width - padding.horizontal(),
height: text_size, height: text_size,
}, },
horizontal_alignment: alignment::Horizontal::Left, horizontal_alignment: alignment::Horizontal::Left,

View file

@ -38,7 +38,7 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// The default height of a [`ProgressBar`]. /// The default height of a [`ProgressBar`].
pub const DEFAULT_HEIGHT: u16 = 30; pub const DEFAULT_HEIGHT: f32 = 30.0;
/// Creates a new [`ProgressBar`]. /// Creates a new [`ProgressBar`].
/// ///
@ -56,14 +56,14 @@ where
} }
/// Sets the width of the [`ProgressBar`]. /// Sets the width of the [`ProgressBar`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`ProgressBar`]. /// Sets the height of the [`ProgressBar`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = Some(height); self.height = Some(height.into());
self self
} }
@ -87,7 +87,7 @@ where
} }
fn height(&self) -> Length { fn height(&self) -> Length {
self.height.unwrap_or(Length::Units(Self::DEFAULT_HEIGHT)) self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT))
} }
fn layout( fn layout(
@ -97,7 +97,7 @@ where
) -> layout::Node { ) -> layout::Node {
let limits = limits let limits = limits
.width(self.width) .width(self.width)
.height(self.height.unwrap_or(Length::Units(Self::DEFAULT_HEIGHT))); .height(self.height.unwrap_or(Length::Fixed(Self::DEFAULT_HEIGHT)));
let size = limits.resolve(Size::ZERO); let size = limits.resolve(Size::ZERO);

View file

@ -8,8 +8,8 @@ use crate::text;
use crate::touch; use crate::touch;
use crate::widget::{self, Row, Text, Tree}; use crate::widget::{self, Row, Text, Tree};
use crate::{ use crate::{
Alignment, Clipboard, Color, Element, Layout, Length, Point, Rectangle, Alignment, Clipboard, Color, Element, Layout, Length, Pixels, Point,
Shell, Widget, Rectangle, Shell, Widget,
}; };
pub use iced_style::radio::{Appearance, StyleSheet}; pub use iced_style::radio::{Appearance, StyleSheet};
@ -50,9 +50,9 @@ where
on_click: Message, on_click: Message,
label: String, label: String,
width: Length, width: Length,
size: u16, size: f32,
spacing: u16, spacing: f32,
text_size: Option<u16>, text_size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -64,10 +64,10 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// The default size of a [`Radio`] button. /// The default size of a [`Radio`] button.
pub const DEFAULT_SIZE: u16 = 28; pub const DEFAULT_SIZE: f32 = 28.0;
/// The default spacing of a [`Radio`] button. /// The default spacing of a [`Radio`] button.
pub const DEFAULT_SPACING: u16 = 15; pub const DEFAULT_SPACING: f32 = 15.0;
/// Creates a new [`Radio`] button. /// Creates a new [`Radio`] button.
/// ///
@ -101,26 +101,26 @@ where
} }
/// Sets the size of the [`Radio`] button. /// Sets the size of the [`Radio`] button.
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.size = size; self.size = size.into().0;
self self
} }
/// Sets the width of the [`Radio`] button. /// Sets the width of the [`Radio`] button.
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the spacing between the [`Radio`] button and the text. /// Sets the spacing between the [`Radio`] button and the text.
pub fn spacing(mut self, spacing: u16) -> Self { pub fn spacing(mut self, spacing: impl Into<Pixels>) -> Self {
self.spacing = spacing; self.spacing = spacing.into().0;
self self
} }
/// Sets the text size of the [`Radio`] button. /// Sets the text size of the [`Radio`] button.
pub fn text_size(mut self, text_size: u16) -> Self { pub fn text_size(mut self, text_size: impl Into<Pixels>) -> Self {
self.text_size = Some(text_size); self.text_size = Some(text_size.into().0);
self self
} }
@ -163,11 +163,7 @@ where
.width(self.width) .width(self.width)
.spacing(self.spacing) .spacing(self.spacing)
.align_items(Alignment::Center) .align_items(Alignment::Center)
.push( .push(Row::new().width(self.size).height(self.size))
Row::new()
.width(Length::Units(self.size))
.height(Length::Units(self.size)),
)
.push(Text::new(&self.label).width(self.width).size( .push(Text::new(&self.label).width(self.width).size(
self.text_size.unwrap_or_else(|| renderer.default_size()), self.text_size.unwrap_or_else(|| renderer.default_size()),
)) ))

View file

@ -6,14 +6,14 @@ use crate::overlay;
use crate::renderer; use crate::renderer;
use crate::widget::{Operation, Tree}; use crate::widget::{Operation, Tree};
use crate::{ use crate::{
Alignment, Clipboard, Element, Length, Padding, Point, Rectangle, Shell, Alignment, Clipboard, Element, Length, Padding, Pixels, Point, Rectangle,
Widget, Shell, Widget,
}; };
/// A container that distributes its contents horizontally. /// A container that distributes its contents horizontally.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Row<'a, Message, Renderer> { pub struct Row<'a, Message, Renderer> {
spacing: u16, spacing: f32,
padding: Padding, padding: Padding,
width: Length, width: Length,
height: Length, height: Length,
@ -32,7 +32,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
children: Vec<Element<'a, Message, Renderer>>, children: Vec<Element<'a, Message, Renderer>>,
) -> Self { ) -> Self {
Row { Row {
spacing: 0, spacing: 0.0,
padding: Padding::ZERO, padding: Padding::ZERO,
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
@ -46,8 +46,8 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
/// Custom margins per element do not exist in iced. You should use this /// Custom margins per element do not exist in iced. You should use this
/// method instead! While less flexible, it helps you keep spacing between /// method instead! While less flexible, it helps you keep spacing between
/// elements consistent. /// elements consistent.
pub fn spacing(mut self, units: u16) -> Self { pub fn spacing(mut self, amount: impl Into<Pixels>) -> Self {
self.spacing = units; self.spacing = amount.into().0;
self self
} }
@ -58,14 +58,14 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {
} }
/// Sets the width of the [`Row`]. /// Sets the width of the [`Row`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Row`]. /// Sets the height of the [`Row`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -124,7 +124,7 @@ where
renderer, renderer,
&limits, &limits,
self.padding, self.padding,
self.spacing as f32, self.spacing,
self.align_items, self.align_items,
&self.children, &self.children,
) )

View file

@ -2,7 +2,9 @@
use crate::layout; use crate::layout;
use crate::renderer; use crate::renderer;
use crate::widget::Tree; use crate::widget::Tree;
use crate::{Color, Element, Layout, Length, Point, Rectangle, Size, Widget}; use crate::{
Color, Element, Layout, Length, Pixels, Point, Rectangle, Size, Widget,
};
pub use iced_style::rule::{Appearance, FillMode, StyleSheet}; pub use iced_style::rule::{Appearance, FillMode, StyleSheet};
@ -25,19 +27,19 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// Creates a horizontal [`Rule`] with the given height. /// Creates a horizontal [`Rule`] with the given height.
pub fn horizontal(height: u16) -> Self { pub fn horizontal(height: impl Into<Pixels>) -> Self {
Rule { Rule {
width: Length::Fill, width: Length::Fill,
height: Length::Units(height), height: Length::Fixed(height.into().0),
is_horizontal: true, is_horizontal: true,
style: Default::default(), style: Default::default(),
} }
} }
/// Creates a vertical [`Rule`] with the given width. /// Creates a vertical [`Rule`] with the given width.
pub fn vertical(width: u16) -> Self { pub fn vertical(width: impl Into<Pixels>) -> Self {
Rule { Rule {
width: Length::Units(width), width: Length::Fixed(width.into().0),
height: Length::Fill, height: Length::Fill,
is_horizontal: false, is_horizontal: false,
style: Default::default(), style: Default::default(),

View file

@ -10,8 +10,8 @@ use crate::widget;
use crate::widget::operation::{self, Operation}; use crate::widget::operation::{self, Operation};
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
Background, Clipboard, Color, Command, Element, Layout, Length, Point, Background, Clipboard, Color, Command, Element, Layout, Length, Pixels,
Rectangle, Shell, Size, Vector, Widget, Point, Rectangle, Shell, Size, Vector, Widget,
}; };
pub use iced_style::scrollable::StyleSheet; pub use iced_style::scrollable::StyleSheet;
@ -66,8 +66,8 @@ where
} }
/// Sets the height of the [`Scrollable`]. /// Sets the height of the [`Scrollable`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -108,17 +108,17 @@ where
/// Properties of a scrollbar within a [`Scrollable`]. /// Properties of a scrollbar within a [`Scrollable`].
#[derive(Debug)] #[derive(Debug)]
pub struct Properties { pub struct Properties {
width: u16, width: f32,
margin: u16, margin: f32,
scroller_width: u16, scroller_width: f32,
} }
impl Default for Properties { impl Default for Properties {
fn default() -> Self { fn default() -> Self {
Self { Self {
width: 10, width: 10.0,
margin: 0, margin: 0.0,
scroller_width: 10, scroller_width: 10.0,
} }
} }
} }
@ -131,21 +131,21 @@ impl Properties {
/// Sets the scrollbar width of the [`Scrollable`] . /// Sets the scrollbar width of the [`Scrollable`] .
/// Silently enforces a minimum width of 1. /// Silently enforces a minimum width of 1.
pub fn width(mut self, width: u16) -> Self { pub fn width(mut self, width: impl Into<Pixels>) -> Self {
self.width = width.max(1); self.width = width.into().0.max(1.0);
self self
} }
/// Sets the scrollbar margin of the [`Scrollable`] . /// Sets the scrollbar margin of the [`Scrollable`] .
pub fn margin(mut self, margin: u16) -> Self { pub fn margin(mut self, margin: impl Into<Pixels>) -> Self {
self.margin = margin; self.margin = margin.into().0;
self self
} }
/// Sets the scroller width of the [`Scrollable`] . /// Sets the scroller width of the [`Scrollable`] .
/// Silently enforces a minimum width of 1. /// Silently enforces a minimum width of 1.
pub fn scroller_width(mut self, scroller_width: u16) -> Self { pub fn scroller_width(mut self, scroller_width: impl Into<Pixels>) -> Self {
self.scroller_width = scroller_width.max(1); self.scroller_width = scroller_width.into().0.max(1.0);
self self
} }
} }
@ -398,11 +398,11 @@ pub fn layout<Renderer>(
layout_content: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node, layout_content: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node,
) -> layout::Node { ) -> layout::Node {
let limits = limits let limits = limits
.max_height(u32::MAX) .max_height(f32::INFINITY)
.max_width(if horizontal_enabled { .max_width(if horizontal_enabled {
u32::MAX f32::INFINITY
} else { } else {
limits.max().width as u32 limits.max().width
}) })
.width(width) .width(width)
.height(height); .height(height);
@ -1100,26 +1100,27 @@ impl Scrollbars {
// Adjust the height of the vertical scrollbar if the horizontal scrollbar // Adjust the height of the vertical scrollbar if the horizontal scrollbar
// is present // is present
let x_scrollbar_height = show_scrollbar_x.map_or(0.0, |h| { let x_scrollbar_height = show_scrollbar_x
(h.width.max(h.scroller_width) + h.margin) as f32 .map_or(0.0, |h| h.width.max(h.scroller_width) + h.margin);
});
let total_scrollbar_width = width.max(scroller_width) + 2 * margin; let total_scrollbar_width =
width.max(scroller_width) + 2.0 * margin;
// Total bounds of the scrollbar + margin + scroller width // Total bounds of the scrollbar + margin + scroller width
let total_scrollbar_bounds = Rectangle { let total_scrollbar_bounds = Rectangle {
x: bounds.x + bounds.width - total_scrollbar_width as f32, x: bounds.x + bounds.width - total_scrollbar_width,
y: bounds.y, y: bounds.y,
width: total_scrollbar_width as f32, width: total_scrollbar_width,
height: (bounds.height - x_scrollbar_height).max(0.0), height: (bounds.height - x_scrollbar_height).max(0.0),
}; };
// Bounds of just the scrollbar // Bounds of just the scrollbar
let scrollbar_bounds = Rectangle { let scrollbar_bounds = Rectangle {
x: bounds.x + bounds.width x: bounds.x + bounds.width
- f32::from(total_scrollbar_width / 2 + width / 2), - total_scrollbar_width / 2.0
- width / 2.0,
y: bounds.y, y: bounds.y,
width: width as f32, width,
height: (bounds.height - x_scrollbar_height).max(0.0), height: (bounds.height - x_scrollbar_height).max(0.0),
}; };
@ -1130,10 +1131,11 @@ impl Scrollbars {
let scroller_bounds = Rectangle { let scroller_bounds = Rectangle {
x: bounds.x + bounds.width x: bounds.x + bounds.width
- f32::from(total_scrollbar_width / 2 + scroller_width / 2), - total_scrollbar_width / 2.0
- scroller_width / 2.0,
y: (scrollbar_bounds.y + scroller_offset - x_scrollbar_height) y: (scrollbar_bounds.y + scroller_offset - x_scrollbar_height)
.max(0.0), .max(0.0),
width: scroller_width as f32, width: scroller_width,
height: scroller_height, height: scroller_height,
}; };
@ -1158,27 +1160,28 @@ impl Scrollbars {
// Need to adjust the width of the horizontal scrollbar if the vertical scrollbar // Need to adjust the width of the horizontal scrollbar if the vertical scrollbar
// is present // is present
let scrollbar_y_width = y_scrollbar.map_or(0.0, |_| { let scrollbar_y_width = y_scrollbar.map_or(0.0, |_| {
(vertical.width.max(vertical.scroller_width) + vertical.margin) vertical.width.max(vertical.scroller_width) + vertical.margin
as f32
}); });
let total_scrollbar_height = width.max(scroller_width) + 2 * margin; let total_scrollbar_height =
width.max(scroller_width) + 2.0 * margin;
// Total bounds of the scrollbar + margin + scroller width // Total bounds of the scrollbar + margin + scroller width
let total_scrollbar_bounds = Rectangle { let total_scrollbar_bounds = Rectangle {
x: bounds.x, x: bounds.x,
y: bounds.y + bounds.height - total_scrollbar_height as f32, y: bounds.y + bounds.height - total_scrollbar_height,
width: (bounds.width - scrollbar_y_width).max(0.0), width: (bounds.width - scrollbar_y_width).max(0.0),
height: total_scrollbar_height as f32, height: total_scrollbar_height,
}; };
// Bounds of just the scrollbar // Bounds of just the scrollbar
let scrollbar_bounds = Rectangle { let scrollbar_bounds = Rectangle {
x: bounds.x, x: bounds.x,
y: bounds.y + bounds.height y: bounds.y + bounds.height
- f32::from(total_scrollbar_height / 2 + width / 2), - total_scrollbar_height / 2.0
- width / 2.0,
width: (bounds.width - scrollbar_y_width).max(0.0), width: (bounds.width - scrollbar_y_width).max(0.0),
height: width as f32, height: width,
}; };
let ratio = bounds.width / content_bounds.width; let ratio = bounds.width / content_bounds.width;
@ -1190,11 +1193,10 @@ impl Scrollbars {
x: (scrollbar_bounds.x + scroller_offset - scrollbar_y_width) x: (scrollbar_bounds.x + scroller_offset - scrollbar_y_width)
.max(0.0), .max(0.0),
y: bounds.y + bounds.height y: bounds.y + bounds.height
- f32::from( - total_scrollbar_height / 2.0
total_scrollbar_height / 2 + scroller_width / 2, - scroller_width / 2.0,
),
width: scroller_length, width: scroller_length,
height: scroller_width as f32, height: scroller_width,
}; };
Some(Scrollbar { Some(Scrollbar {

View file

@ -8,8 +8,8 @@ use crate::renderer;
use crate::touch; use crate::touch;
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
Background, Clipboard, Color, Element, Layout, Length, Point, Rectangle, Background, Clipboard, Color, Element, Layout, Length, Pixels, Point,
Shell, Size, Widget, Rectangle, Shell, Size, Widget,
}; };
use std::ops::RangeInclusive; use std::ops::RangeInclusive;
@ -54,7 +54,7 @@ where
on_change: Box<dyn Fn(T) -> Message + 'a>, on_change: Box<dyn Fn(T) -> Message + 'a>,
on_release: Option<Message>, on_release: Option<Message>,
width: Length, width: Length,
height: u16, height: f32,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -66,7 +66,7 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// The default height of a [`Slider`]. /// The default height of a [`Slider`].
pub const DEFAULT_HEIGHT: u16 = 22; pub const DEFAULT_HEIGHT: f32 = 22.0;
/// Creates a new [`Slider`]. /// Creates a new [`Slider`].
/// ///
@ -116,14 +116,14 @@ where
} }
/// Sets the width of the [`Slider`]. /// Sets the width of the [`Slider`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Slider`]. /// Sets the height of the [`Slider`].
pub fn height(mut self, height: u16) -> Self { pub fn height(mut self, height: impl Into<Pixels>) -> Self {
self.height = height; self.height = height.into().0;
self self
} }
@ -172,9 +172,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
let limits = let limits = limits.width(self.width).height(self.height);
limits.width(self.width).height(Length::Units(self.height));
let size = limits.resolve(Size::ZERO); let size = limits.resolve(Size::ZERO);
layout::Node::new(size) layout::Node::new(size)

View file

@ -15,23 +15,26 @@ pub struct Space {
impl Space { impl Space {
/// Creates an amount of empty [`Space`] with the given width and height. /// Creates an amount of empty [`Space`] with the given width and height.
pub fn new(width: Length, height: Length) -> Self { pub fn new(width: impl Into<Length>, height: impl Into<Length>) -> Self {
Space { width, height } Space {
width: width.into(),
height: height.into(),
}
} }
/// Creates an amount of horizontal [`Space`]. /// Creates an amount of horizontal [`Space`].
pub fn with_width(width: Length) -> Self { pub fn with_width(width: impl Into<Length>) -> Self {
Space { Space {
width, width: width.into(),
height: Length::Shrink, height: Length::Shrink,
} }
} }
/// Creates an amount of vertical [`Space`]. /// Creates an amount of vertical [`Space`].
pub fn with_height(height: Length) -> Self { pub fn with_height(height: impl Into<Length>) -> Self {
Space { Space {
width: Length::Shrink, width: Length::Shrink,
height, height: height.into(),
} }
} }
} }

View file

@ -56,15 +56,15 @@ where
/// Sets the width of the [`Svg`]. /// Sets the width of the [`Svg`].
#[must_use] #[must_use]
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Svg`]. /// Sets the height of the [`Svg`].
#[must_use] #[must_use]
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }

View file

@ -4,7 +4,7 @@ use crate::layout;
use crate::renderer; use crate::renderer;
use crate::text; use crate::text;
use crate::widget::Tree; use crate::widget::Tree;
use crate::{Element, Layout, Length, Point, Rectangle, Size, Widget}; use crate::{Element, Layout, Length, Pixels, Point, Rectangle, Size, Widget};
use std::borrow::Cow; use std::borrow::Cow;
@ -32,7 +32,7 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
content: Cow<'a, str>, content: Cow<'a, str>,
size: Option<u16>, size: Option<f32>,
width: Length, width: Length,
height: Length, height: Length,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
@ -61,8 +61,8 @@ where
} }
/// Sets the size of the [`Text`]. /// Sets the size of the [`Text`].
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.size = Some(size); self.size = Some(size.into().0);
self self
} }
@ -84,14 +84,14 @@ where
} }
/// Sets the width of the [`Text`] boundaries. /// Sets the width of the [`Text`] boundaries.
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the height of the [`Text`] boundaries. /// Sets the height of the [`Text`] boundaries.
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -185,7 +185,7 @@ pub fn draw<Renderer>(
style: &renderer::Style, style: &renderer::Style,
layout: Layout<'_>, layout: Layout<'_>,
content: &str, content: &str,
size: Option<u16>, size: Option<f32>,
font: Renderer::Font, font: Renderer::Font,
appearance: Appearance, appearance: Appearance,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
@ -209,7 +209,7 @@ pub fn draw<Renderer>(
renderer.fill_text(crate::text::Text { renderer.fill_text(crate::text::Text {
content, content,
size: f32::from(size.unwrap_or_else(|| renderer.default_size())), size: size.unwrap_or_else(|| renderer.default_size()),
bounds: Rectangle { x, y, ..bounds }, bounds: Rectangle { x, y, ..bounds },
color: appearance.color.unwrap_or(style.text_color), color: appearance.color.unwrap_or(style.text_color),
font, font,

View file

@ -25,7 +25,7 @@ use crate::widget::operation::{self, Operation};
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::window; use crate::window;
use crate::{ use crate::{
Clipboard, Color, Command, Element, Layout, Length, Padding, Point, Clipboard, Color, Command, Element, Layout, Length, Padding, Pixels, Point,
Rectangle, Shell, Size, Vector, Widget, Rectangle, Shell, Size, Vector, Widget,
}; };
@ -64,7 +64,7 @@ where
font: Renderer::Font, font: Renderer::Font,
width: Length, width: Length,
padding: Padding, padding: Padding,
size: Option<u16>, size: Option<f32>,
on_change: Box<dyn Fn(String) -> Message + 'a>, on_change: Box<dyn Fn(String) -> Message + 'a>,
on_paste: Option<Box<dyn Fn(String) -> Message + 'a>>, on_paste: Option<Box<dyn Fn(String) -> Message + 'a>>,
on_submit: Option<Message>, on_submit: Option<Message>,
@ -94,7 +94,7 @@ where
is_secure: false, is_secure: false,
font: Default::default(), font: Default::default(),
width: Length::Fill, width: Length::Fill,
padding: Padding::new(5), padding: Padding::new(5.0),
size: None, size: None,
on_change: Box::new(on_change), on_change: Box::new(on_change),
on_paste: None, on_paste: None,
@ -133,8 +133,8 @@ where
self self
} }
/// Sets the width of the [`TextInput`]. /// Sets the width of the [`TextInput`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
@ -145,8 +145,8 @@ where
} }
/// Sets the text size of the [`TextInput`]. /// Sets the text size of the [`TextInput`].
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.size = Some(size); self.size = Some(size.into().0);
self self
} }
@ -379,7 +379,7 @@ pub fn layout<Renderer>(
limits: &layout::Limits, limits: &layout::Limits,
width: Length, width: Length,
padding: Padding, padding: Padding,
size: Option<u16>, size: Option<f32>,
) -> layout::Node ) -> layout::Node
where where
Renderer: text::Renderer, Renderer: text::Renderer,
@ -387,14 +387,10 @@ where
let text_size = size.unwrap_or_else(|| renderer.default_size()); let text_size = size.unwrap_or_else(|| renderer.default_size());
let padding = padding.fit(Size::ZERO, limits.max()); let padding = padding.fit(Size::ZERO, limits.max());
let limits = limits.width(width).pad(padding).height(text_size);
let limits = limits
.width(width)
.pad(padding)
.height(Length::Units(text_size));
let mut text = layout::Node::new(limits.resolve(Size::ZERO)); let mut text = layout::Node::new(limits.resolve(Size::ZERO));
text.move_to(Point::new(padding.left.into(), padding.top.into())); text.move_to(Point::new(padding.left, padding.top));
layout::Node::with_children(text.size().pad(padding), vec![text]) layout::Node::with_children(text.size().pad(padding), vec![text])
} }
@ -409,7 +405,7 @@ pub fn update<'a, Message, Renderer>(
clipboard: &mut dyn Clipboard, clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
value: &mut Value, value: &mut Value,
size: Option<u16>, size: Option<f32>,
font: &Renderer::Font, font: &Renderer::Font,
is_secure: bool, is_secure: bool,
on_change: &dyn Fn(String) -> Message, on_change: &dyn Fn(String) -> Message,
@ -815,7 +811,7 @@ pub fn draw<Renderer>(
state: &State, state: &State,
value: &Value, value: &Value,
placeholder: &str, placeholder: &str,
size: Option<u16>, size: Option<f32>,
font: &Renderer::Font, font: &Renderer::Font,
is_secure: bool, is_secure: bool,
style: &<Renderer::Theme as StyleSheet>::Style, style: &<Renderer::Theme as StyleSheet>::Style,
@ -969,7 +965,7 @@ pub fn draw<Renderer>(
width: f32::INFINITY, width: f32::INFINITY,
..text_bounds ..text_bounds
}, },
size: f32::from(size), size,
horizontal_alignment: alignment::Horizontal::Left, horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Center, vertical_alignment: alignment::Vertical::Center,
}); });
@ -1128,7 +1124,7 @@ fn offset<Renderer>(
renderer: &Renderer, renderer: &Renderer,
text_bounds: Rectangle, text_bounds: Rectangle,
font: Renderer::Font, font: Renderer::Font,
size: u16, size: f32,
value: &Value, value: &Value,
state: &State, state: &State,
) -> f32 ) -> f32
@ -1162,7 +1158,7 @@ fn measure_cursor_and_scroll_offset<Renderer>(
renderer: &Renderer, renderer: &Renderer,
text_bounds: Rectangle, text_bounds: Rectangle,
value: &Value, value: &Value,
size: u16, size: f32,
cursor_index: usize, cursor_index: usize,
font: Renderer::Font, font: Renderer::Font,
) -> (f32, f32) ) -> (f32, f32)
@ -1185,7 +1181,7 @@ fn find_cursor_position<Renderer>(
renderer: &Renderer, renderer: &Renderer,
text_bounds: Rectangle, text_bounds: Rectangle,
font: Renderer::Font, font: Renderer::Font,
size: Option<u16>, size: Option<f32>,
value: &Value, value: &Value,
state: &State, state: &State,
x: f32, x: f32,
@ -1201,7 +1197,7 @@ where
renderer renderer
.hit_test( .hit_test(
&value.to_string(), &value.to_string(),
size.into(), size,
font, font,
Size::INFINITY, Size::INFINITY,
Point::new(x + offset, text_bounds.height / 2.0), Point::new(x + offset, text_bounds.height / 2.0),

View file

@ -7,8 +7,8 @@ use crate::renderer;
use crate::text; use crate::text;
use crate::widget::{self, Row, Text, Tree}; use crate::widget::{self, Row, Text, Tree};
use crate::{ use crate::{
Alignment, Clipboard, Element, Event, Layout, Length, Point, Rectangle, Alignment, Clipboard, Element, Event, Layout, Length, Pixels, Point,
Shell, Widget, Rectangle, Shell, Widget,
}; };
pub use iced_style::toggler::{Appearance, StyleSheet}; pub use iced_style::toggler::{Appearance, StyleSheet};
@ -38,10 +38,10 @@ where
on_toggle: Box<dyn Fn(bool) -> Message + 'a>, on_toggle: Box<dyn Fn(bool) -> Message + 'a>,
label: Option<String>, label: Option<String>,
width: Length, width: Length,
size: u16, size: f32,
text_size: Option<u16>, text_size: Option<f32>,
text_alignment: alignment::Horizontal, text_alignment: alignment::Horizontal,
spacing: u16, spacing: f32,
font: Renderer::Font, font: Renderer::Font,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -52,7 +52,7 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// The default size of a [`Toggler`]. /// The default size of a [`Toggler`].
pub const DEFAULT_SIZE: u16 = 20; pub const DEFAULT_SIZE: f32 = 20.0;
/// Creates a new [`Toggler`]. /// Creates a new [`Toggler`].
/// ///
@ -78,27 +78,27 @@ where
size: Self::DEFAULT_SIZE, size: Self::DEFAULT_SIZE,
text_size: None, text_size: None,
text_alignment: alignment::Horizontal::Left, text_alignment: alignment::Horizontal::Left,
spacing: 0, spacing: 0.0,
font: Renderer::Font::default(), font: Renderer::Font::default(),
style: Default::default(), style: Default::default(),
} }
} }
/// Sets the size of the [`Toggler`]. /// Sets the size of the [`Toggler`].
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.size = size; self.size = size.into().0;
self self
} }
/// Sets the width of the [`Toggler`]. /// Sets the width of the [`Toggler`].
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: impl Into<Length>) -> Self {
self.width = width; self.width = width.into();
self self
} }
/// Sets the text size o the [`Toggler`]. /// Sets the text size o the [`Toggler`].
pub fn text_size(mut self, text_size: u16) -> Self { pub fn text_size(mut self, text_size: impl Into<Pixels>) -> Self {
self.text_size = Some(text_size); self.text_size = Some(text_size.into().0);
self self
} }
@ -109,8 +109,8 @@ where
} }
/// Sets the spacing between the [`Toggler`] and the text. /// Sets the spacing between the [`Toggler`] and the text.
pub fn spacing(mut self, spacing: u16) -> Self { pub fn spacing(mut self, spacing: impl Into<Pixels>) -> Self {
self.spacing = spacing; self.spacing = spacing.into().0;
self self
} }
@ -169,11 +169,7 @@ where
); );
} }
row = row.push( row = row.push(Row::new().width(2.0 * self.size).height(self.size));
Row::new()
.width(Length::Units(2 * self.size))
.height(Length::Units(self.size)),
);
row.layout(renderer, limits) row.layout(renderer, limits)
} }

View file

@ -9,8 +9,8 @@ use crate::widget::container;
use crate::widget::overlay; use crate::widget::overlay;
use crate::widget::{Text, Tree}; use crate::widget::{Text, Tree};
use crate::{ use crate::{
Clipboard, Element, Event, Layout, Length, Padding, Point, Rectangle, Clipboard, Element, Event, Layout, Length, Padding, Pixels, Point,
Shell, Size, Vector, Widget, Rectangle, Shell, Size, Vector, Widget,
}; };
use std::borrow::Cow; use std::borrow::Cow;
@ -25,8 +25,8 @@ where
content: Element<'a, Message, Renderer>, content: Element<'a, Message, Renderer>,
tooltip: Text<'a, Renderer>, tooltip: Text<'a, Renderer>,
position: Position, position: Position,
gap: u16, gap: f32,
padding: u16, padding: f32,
snap_within_viewport: bool, snap_within_viewport: bool,
style: <Renderer::Theme as container::StyleSheet>::Style, style: <Renderer::Theme as container::StyleSheet>::Style,
} }
@ -37,7 +37,7 @@ where
Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
/// The default padding of a [`Tooltip`] drawn by this renderer. /// The default padding of a [`Tooltip`] drawn by this renderer.
const DEFAULT_PADDING: u16 = 5; const DEFAULT_PADDING: f32 = 5.0;
/// Creates a new [`Tooltip`]. /// Creates a new [`Tooltip`].
/// ///
@ -51,7 +51,7 @@ where
content: content.into(), content: content.into(),
tooltip: Text::new(tooltip), tooltip: Text::new(tooltip),
position, position,
gap: 0, gap: 0.0,
padding: Self::DEFAULT_PADDING, padding: Self::DEFAULT_PADDING,
snap_within_viewport: true, snap_within_viewport: true,
style: Default::default(), style: Default::default(),
@ -59,7 +59,7 @@ where
} }
/// Sets the size of the text of the [`Tooltip`]. /// Sets the size of the text of the [`Tooltip`].
pub fn size(mut self, size: u16) -> Self { pub fn size(mut self, size: impl Into<Pixels>) -> Self {
self.tooltip = self.tooltip.size(size); self.tooltip = self.tooltip.size(size);
self self
} }
@ -73,14 +73,14 @@ where
} }
/// Sets the gap between the content and its [`Tooltip`]. /// Sets the gap between the content and its [`Tooltip`].
pub fn gap(mut self, gap: u16) -> Self { pub fn gap(mut self, gap: impl Into<Pixels>) -> Self {
self.gap = gap; self.gap = gap.into().0;
self self
} }
/// Sets the padding of the [`Tooltip`]. /// Sets the padding of the [`Tooltip`].
pub fn padding(mut self, padding: u16) -> Self { pub fn padding(mut self, padding: impl Into<Pixels>) -> Self {
self.padding = padding; self.padding = padding.into().0;
self self
} }
@ -272,8 +272,8 @@ pub fn draw<Renderer>(
cursor_position: Point, cursor_position: Point,
viewport: &Rectangle, viewport: &Rectangle,
position: Position, position: Position,
gap: u16, gap: f32,
padding: u16, padding: f32,
snap_within_viewport: bool, snap_within_viewport: bool,
style: &<Renderer::Theme as container::StyleSheet>::Style, style: &<Renderer::Theme as container::StyleSheet>::Style,
layout_text: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node, layout_text: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node,
@ -293,7 +293,6 @@ pub fn draw<Renderer>(
let bounds = layout.bounds(); let bounds = layout.bounds();
if bounds.contains(cursor_position) { if bounds.contains(cursor_position) {
let gap = f32::from(gap);
let style = theme.appearance(style); let style = theme.appearance(style);
let defaults = renderer::Style { let defaults = renderer::Style {
@ -311,7 +310,6 @@ pub fn draw<Renderer>(
.pad(Padding::new(padding)), .pad(Padding::new(padding)),
); );
let padding = f32::from(padding);
let text_bounds = text_layout.bounds(); let text_bounds = text_layout.bounds();
let x_center = bounds.x + (bounds.width - text_bounds.width) / 2.0; let x_center = bounds.x + (bounds.width - text_bounds.width) / 2.0;
let y_center = bounds.y + (bounds.height - text_bounds.height) / 2.0; let y_center = bounds.y + (bounds.height - text_bounds.height) / 2.0;

View file

@ -9,7 +9,7 @@ use crate::event::{self, Event};
use crate::widget::tree::{self, Tree}; use crate::widget::tree::{self, Tree};
use crate::{ use crate::{
layout, mouse, renderer, touch, Background, Clipboard, Color, Element, layout, mouse, renderer, touch, Background, Clipboard, Color, Element,
Layout, Length, Point, Rectangle, Shell, Size, Widget, Layout, Length, Pixels, Point, Rectangle, Shell, Size, Widget,
}; };
/// An vertical bar and a handle that selects a single value from a range of /// An vertical bar and a handle that selects a single value from a range of
@ -47,7 +47,7 @@ where
value: T, value: T,
on_change: Box<dyn Fn(T) -> Message + 'a>, on_change: Box<dyn Fn(T) -> Message + 'a>,
on_release: Option<Message>, on_release: Option<Message>,
width: u16, width: f32,
height: Length, height: Length,
style: <Renderer::Theme as StyleSheet>::Style, style: <Renderer::Theme as StyleSheet>::Style,
} }
@ -60,7 +60,7 @@ where
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet,
{ {
/// The default width of a [`VerticalSlider`]. /// The default width of a [`VerticalSlider`].
pub const DEFAULT_WIDTH: u16 = 22; pub const DEFAULT_WIDTH: f32 = 22.0;
/// Creates a new [`VerticalSlider`]. /// Creates a new [`VerticalSlider`].
/// ///
@ -110,14 +110,14 @@ where
} }
/// Sets the width of the [`VerticalSlider`]. /// Sets the width of the [`VerticalSlider`].
pub fn width(mut self, width: u16) -> Self { pub fn width(mut self, width: impl Into<Pixels>) -> Self {
self.width = width; self.width = width.into().0;
self self
} }
/// Sets the height of the [`VerticalSlider`]. /// Sets the height of the [`VerticalSlider`].
pub fn height(mut self, height: Length) -> Self { pub fn height(mut self, height: impl Into<Length>) -> Self {
self.height = height; self.height = height.into();
self self
} }
@ -166,9 +166,7 @@ where
_renderer: &Renderer, _renderer: &Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
let limits = let limits = limits.width(self.width).height(self.height);
limits.width(Length::Units(self.width)).height(self.height);
let size = limits.resolve(Size::ZERO); let size = limits.resolve(Size::ZERO);
layout::Node::new(size) layout::Node::new(size)

View file

@ -28,8 +28,8 @@ pub struct Settings<Flags> {
/// The text size that will be used by default. /// The text size that will be used by default.
/// ///
/// The default value is 20. /// The default value is `20.0`.
pub default_text_size: u16, pub default_text_size: f32,
/// If enabled, spread text workload in multiple threads when multiple cores /// If enabled, spread text workload in multiple threads when multiple cores
/// are available. /// are available.
@ -97,7 +97,7 @@ where
window: Default::default(), window: Default::default(),
flags: Default::default(), flags: Default::default(),
default_font: Default::default(), default_font: Default::default(),
default_text_size: 20, default_text_size: 20.0,
text_multithreading: false, text_multithreading: false,
antialiasing: false, antialiasing: false,
exit_on_close_request: true, exit_on_close_request: true,

View file

@ -29,7 +29,7 @@ pub struct Backend {
#[cfg(any(feature = "image", feature = "svg"))] #[cfg(any(feature = "image", feature = "svg"))]
image_pipeline: image::Pipeline, image_pipeline: image::Pipeline,
default_text_size: u16, default_text_size: f32,
} }
impl Backend { impl Backend {
@ -265,7 +265,7 @@ impl backend::Text for Backend {
const CHECKMARK_ICON: char = font::CHECKMARK_ICON; const CHECKMARK_ICON: char = font::CHECKMARK_ICON;
const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON; const ARROW_DOWN_ICON: char = font::ARROW_DOWN_ICON;
fn default_size(&self) -> u16 { fn default_size(&self) -> f32 {
self.default_text_size self.default_text_size
} }

View file

@ -4,7 +4,7 @@ pub use crate::Antialiasing;
/// The settings of a [`Backend`]. /// The settings of a [`Backend`].
/// ///
/// [`Backend`]: crate::Backend /// [`Backend`]: crate::Backend
#[derive(Debug, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Clone, Copy, PartialEq)]
pub struct Settings { pub struct Settings {
/// The present mode of the [`Backend`]. /// The present mode of the [`Backend`].
/// ///
@ -21,8 +21,8 @@ pub struct Settings {
/// The default size of text. /// The default size of text.
/// ///
/// By default, it will be set to 20. /// By default, it will be set to `16.0`.
pub default_text_size: u16, pub default_text_size: f32,
/// If enabled, spread text workload in multiple threads when multiple cores /// If enabled, spread text workload in multiple threads when multiple cores
/// are available. /// are available.
@ -66,7 +66,7 @@ impl Default for Settings {
present_mode: wgpu::PresentMode::AutoVsync, present_mode: wgpu::PresentMode::AutoVsync,
internal_backend: wgpu::Backends::all(), internal_backend: wgpu::Backends::all(),
default_font: None, default_font: None,
default_text_size: 20, default_text_size: 20.0,
text_multithreading: false, text_multithreading: false,
antialiasing: None, antialiasing: None,
} }