Replace stateful widgets with new iced_pure API

This commit is contained in:
Héctor Ramón Jiménez 2022-07-27 06:49:20 +02:00
parent c44267b85f
commit ff2519b1d4
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
142 changed files with 3631 additions and 14494 deletions

View file

@ -11,5 +11,5 @@ A color palette generator, based on a user-defined root color.
You can run it with `cargo run`:
```
cargo run --package color_palette
cargo run --package pure_color_palette
```

View file

@ -1,7 +1,8 @@
use iced::canvas::{self, Cursor, Frame, Geometry, Path};
use iced::widget::canvas::{self, Canvas, Cursor, Frame, Geometry, Path};
use iced::widget::{column, row, text, Slider};
use iced::{
alignment, slider, Alignment, Canvas, Color, Column, Element, Length,
Point, Rectangle, Row, Sandbox, Settings, Size, Slider, Text, Vector,
alignment, Alignment, Color, Element, Length, Point, Rectangle, Sandbox,
Settings, Size, Vector,
};
use palette::{self, convert::FromColor, Hsl, Srgb};
use std::marker::PhantomData;
@ -59,7 +60,7 @@ impl Sandbox for ColorPalette {
self.theme = Theme::new(srgb);
}
fn view(&mut self) -> Element<Message> {
fn view(&self) -> Element<Message> {
let base = self.theme.base;
let srgb = palette::Srgb::from(base);
@ -69,17 +70,18 @@ impl Sandbox for ColorPalette {
let lab = palette::Lab::from_color(srgb);
let lch = palette::Lch::from_color(srgb);
Column::new()
.padding(10)
.spacing(10)
.push(self.rgb.view(base).map(Message::RgbColorChanged))
.push(self.hsl.view(hsl).map(Message::HslColorChanged))
.push(self.hsv.view(hsv).map(Message::HsvColorChanged))
.push(self.hwb.view(hwb).map(Message::HwbColorChanged))
.push(self.lab.view(lab).map(Message::LabColorChanged))
.push(self.lch.view(lch).map(Message::LchColorChanged))
.push(self.theme.view())
.into()
column![
self.rgb.view(base).map(Message::RgbColorChanged),
self.hsl.view(hsl).map(Message::HslColorChanged),
self.hsv.view(hsv).map(Message::HsvColorChanged),
self.hwb.view(hwb).map(Message::HwbColorChanged),
self.lab.view(lab).map(Message::LabColorChanged),
self.lch.view(lch).map(Message::LchColorChanged),
self.theme.view(),
]
.padding(10)
.spacing(10)
.into()
}
}
@ -139,7 +141,7 @@ impl Theme {
.chain(self.higher.iter())
}
pub fn view(&mut self) -> Element<Message> {
pub fn view(&self) -> Element<Message> {
Canvas::new(self)
.width(Length::Fill)
.height(Length::Fill)
@ -236,8 +238,11 @@ impl Theme {
}
impl<Message> canvas::Program<Message> for Theme {
type State = ();
fn draw(
&self,
_state: &Self::State,
_theme: &iced::Theme,
bounds: Rectangle,
_cursor: Cursor,
@ -267,7 +272,6 @@ fn color_hex_string(color: &Color) -> String {
#[derive(Default)]
struct ColorPicker<C: ColorSpace> {
sliders: [slider::State; 3],
color_space: PhantomData<C>,
}
@ -282,37 +286,30 @@ trait ColorSpace: Sized {
fn to_string(&self) -> String;
}
impl<C: 'static + ColorSpace + Copy> ColorPicker<C> {
fn view(&mut self, color: C) -> Element<C> {
impl<C: ColorSpace + Copy> ColorPicker<C> {
fn view(&self, color: C) -> Element<C> {
let [c1, c2, c3] = color.components();
let [s1, s2, s3] = &mut self.sliders;
let [cr1, cr2, cr3] = C::COMPONENT_RANGES;
fn slider<C: Clone>(
state: &mut slider::State,
fn slider<'a, C: Clone>(
range: RangeInclusive<f64>,
component: f32,
update: impl Fn(f32) -> C + 'static,
) -> Slider<f64, C, iced::Renderer> {
Slider::new(state, range, f64::from(component), move |v| {
update(v as f32)
})
.step(0.01)
update: impl Fn(f32) -> C + 'a,
) -> Slider<'a, f64, C, iced::Renderer> {
Slider::new(range, f64::from(component), move |v| update(v as f32))
.step(0.01)
}
Row::new()
.spacing(10)
.align_items(Alignment::Center)
.push(Text::new(C::LABEL).width(Length::Units(50)))
.push(slider(s1, cr1, c1, move |v| C::new(v, c2, c3)))
.push(slider(s2, cr2, c2, move |v| C::new(c1, v, c3)))
.push(slider(s3, cr3, c3, move |v| C::new(c1, c2, v)))
.push(
Text::new(color.to_string())
.width(Length::Units(185))
.size(14),
)
.into()
row![
text(C::LABEL).width(Length::Units(50)),
slider(cr1, c1, move |v| C::new(v, c2, c3)),
slider(cr2, c2, move |v| C::new(c1, v, c3)),
slider(cr3, c3, move |v| C::new(c1, c2, v)),
text(color.to_string()).width(Length::Units(185)).size(14),
]
.spacing(10)
.align_items(Alignment::Center)
.into()
}
}