summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-03-05 21:23:14 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-03-05 21:23:14 +0100
commitd735209fc32238185ea0f27f1f4d1d0044b90e06 (patch)
treec6c9896d9d498f4393d5cb4fd0c41520f0b7f2e0
parent330a6252054b729e4d4d3f5a5d09f32e06cec282 (diff)
downloadiced-d735209fc32238185ea0f27f1f4d1d0044b90e06.tar.gz
iced-d735209fc32238185ea0f27f1f4d1d0044b90e06.tar.bz2
iced-d735209fc32238185ea0f27f1f4d1d0044b90e06.zip
Move style types of `slider` to `iced_widget`
-rw-r--r--style/src/lib.rs1
-rw-r--r--style/src/slider.rs75
-rw-r--r--style/src/theme.rs38
-rw-r--r--widget/src/helpers.rs7
-rw-r--r--widget/src/slider.rs140
-rw-r--r--widget/src/vertical_slider.rs18
6 files changed, 136 insertions, 143 deletions
diff --git a/style/src/lib.rs b/style/src/lib.rs
index 7a6be69a..6da84b4d 100644
--- a/style/src/lib.rs
+++ b/style/src/lib.rs
@@ -23,7 +23,6 @@ pub mod pick_list;
pub mod progress_bar;
pub mod radio;
pub mod rule;
-pub mod slider;
pub mod svg;
pub mod text_editor;
pub mod theme;
diff --git a/style/src/slider.rs b/style/src/slider.rs
deleted file mode 100644
index 0c19e47d..00000000
--- a/style/src/slider.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-//! Change the apperance of a slider.
-use crate::core::border;
-use crate::core::{Color, Pixels};
-
-/// The appearance of a slider.
-#[derive(Debug, Clone, Copy)]
-pub struct Appearance {
- /// The colors of the rail of the slider.
- pub rail: Rail,
- /// The appearance of the [`Handle`] of the slider.
- pub handle: Handle,
-}
-
-impl Appearance {
- /// Changes the [`HandleShape`] of the [`Appearance`] to a circle
- /// with the given radius.
- pub fn with_circular_handle(mut self, radius: impl Into<Pixels>) -> Self {
- self.handle.shape = HandleShape::Circle {
- radius: radius.into().0,
- };
- self
- }
-}
-
-/// The appearance of a slider rail
-#[derive(Debug, Clone, Copy)]
-pub struct Rail {
- /// The colors of the rail of the slider.
- pub colors: (Color, Color),
- /// The width of the stroke of a slider rail.
- pub width: f32,
- /// The border radius of the corners of the rail.
- pub border_radius: border::Radius,
-}
-
-/// The appearance of the handle of a slider.
-#[derive(Debug, Clone, Copy)]
-pub struct Handle {
- /// The shape of the handle.
- pub shape: HandleShape,
- /// The [`Color`] of the handle.
- pub color: Color,
- /// The border width of the handle.
- pub border_width: f32,
- /// The border [`Color`] of the handle.
- pub border_color: Color,
-}
-
-/// The shape of the handle of a slider.
-#[derive(Debug, Clone, Copy)]
-pub enum HandleShape {
- /// A circular handle.
- Circle {
- /// The radius of the circle.
- radius: f32,
- },
- /// A rectangular shape.
- Rectangle {
- /// The width of the rectangle.
- width: u16,
- /// The border radius of the corners of the rectangle.
- border_radius: border::Radius,
- },
-}
-
-/// A set of rules that dictate the style of a slider.
-pub trait StyleSheet {
- fn default() -> fn(&Self, Status) -> Appearance;
-}
-
-pub enum Status {
- Active,
- Hovered,
- Dragging,
-}
diff --git a/style/src/theme.rs b/style/src/theme.rs
index 9038d730..2f8488c7 100644
--- a/style/src/theme.rs
+++ b/style/src/theme.rs
@@ -11,7 +11,6 @@ use crate::pick_list;
use crate::progress_bar;
use crate::radio;
use crate::rule;
-use crate::slider;
use crate::svg;
use crate::text_editor;
use crate::toggler;
@@ -279,43 +278,6 @@ impl<T: Fn(&Theme) -> application::Appearance> application::StyleSheet for T {
}
}
-impl slider::StyleSheet for Theme {
- fn default() -> fn(&Self, slider::Status) -> slider::Appearance {
- slider
- }
-}
-
-pub fn slider(theme: &Theme, status: slider::Status) -> slider::Appearance {
- let palette = theme.extended_palette();
-
- let handle = slider::Handle {
- shape: slider::HandleShape::Rectangle {
- width: 8,
- border_radius: 4.0.into(),
- },
- color: Color::WHITE,
- border_color: Color::WHITE,
- border_width: 1.0,
- };
-
- slider::Appearance {
- rail: slider::Rail {
- colors: (palette.primary.base.color, palette.secondary.base.color),
- width: 4.0,
- border_radius: 2.0.into(),
- },
- handle: slider::Handle {
- color: match status {
- slider::Status::Active => palette.background.base.color,
- slider::Status::Hovered => palette.primary.weak.color,
- slider::Status::Dragging => palette.primary.base.color,
- },
- border_color: palette.primary.base.color,
- ..handle
- },
- }
-}
-
/// The style of a menu.
#[derive(Clone, Default)]
pub enum Menu {
diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs
index 8f0dcd5c..c63a9706 100644
--- a/widget/src/helpers.rs
+++ b/widget/src/helpers.rs
@@ -20,7 +20,8 @@ use crate::text_editor::{self, TextEditor};
use crate::text_input::{self, TextInput};
use crate::toggler::{self, Toggler};
use crate::tooltip::{self, Tooltip};
-use crate::{Column, MouseArea, Row, Space, Themer, VerticalSlider};
+use crate::vertical_slider::{self, VerticalSlider};
+use crate::{Column, MouseArea, Row, Space, Themer};
use std::borrow::Borrow;
use std::ops::RangeInclusive;
@@ -240,7 +241,7 @@ pub fn slider<'a, T, Message, Theme>(
where
T: Copy + From<u8> + std::cmp::PartialOrd,
Message: Clone,
- Theme: slider::StyleSheet,
+ Theme: slider::Style,
{
Slider::new(range, value, on_change)
}
@@ -256,7 +257,7 @@ pub fn vertical_slider<'a, T, Message, Theme>(
where
T: Copy + From<u8> + std::cmp::PartialOrd,
Message: Clone,
- Theme: slider::StyleSheet,
+ Theme: vertical_slider::Style,
{
VerticalSlider::new(range, value, on_change)
}
diff --git a/widget/src/slider.rs b/widget/src/slider.rs
index ce02a0a6..e4dc809e 100644
--- a/widget/src/slider.rs
+++ b/widget/src/slider.rs
@@ -1,6 +1,7 @@
//! Display an interactive selector of a single value from a range of values.
//!
//! A [`Slider`] has some local [`State`].
+use crate::core::border;
use crate::core::event::{self, Event};
use crate::core::keyboard;
use crate::core::keyboard::key::{self, Key};
@@ -10,16 +11,13 @@ use crate::core::renderer;
use crate::core::touch;
use crate::core::widget::tree::{self, Tree};
use crate::core::{
- Border, Clipboard, Element, Layout, Length, Pixels, Point, Rectangle,
- Shell, Size, Widget,
+ Border, Clipboard, Color, Element, Layout, Length, Pixels, Point,
+ Rectangle, Shell, Size, Widget,
};
+use crate::style::Theme;
use std::ops::RangeInclusive;
-pub use iced_style::slider::{
- Appearance, Handle, HandleShape, Rail, Status, StyleSheet,
-};
-
/// An horizontal bar and a handle that selects a single value from a range of
/// values.
///
@@ -45,10 +43,7 @@ pub use iced_style::slider::{
///
/// ![Slider drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/slider.png?raw=true)
#[allow(missing_debug_implementations)]
-pub struct Slider<'a, T, Message, Theme = crate::Theme>
-where
- Theme: StyleSheet,
-{
+pub struct Slider<'a, T, Message, Theme = crate::Theme> {
range: RangeInclusive<T>,
step: T,
shift_step: Option<T>,
@@ -65,7 +60,6 @@ impl<'a, T, Message, Theme> Slider<'a, T, Message, Theme>
where
T: Copy + From<u8> + PartialOrd,
Message: Clone,
- Theme: StyleSheet,
{
/// The default height of a [`Slider`].
pub const DEFAULT_HEIGHT: f32 = 22.0;
@@ -80,6 +74,7 @@ where
/// `Message`.
pub fn new<F>(range: RangeInclusive<T>, value: T, on_change: F) -> Self
where
+ Theme: Style,
F: 'a + Fn(T) -> Message,
{
let value = if value >= *range.start() {
@@ -104,7 +99,7 @@ where
on_release: None,
width: Length::Fill,
height: Self::DEFAULT_HEIGHT,
- style: Theme::default(),
+ style: Theme::style(),
}
}
@@ -165,7 +160,6 @@ impl<'a, T, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
where
T: Copy + Into<f64> + num_traits::FromPrimitive,
Message: Clone,
- Theme: StyleSheet,
Renderer: crate::core::Renderer,
{
fn tag(&self) -> tree::Tag {
@@ -359,7 +353,7 @@ where
let style = (self.style)(
theme,
if state.is_dragging {
- Status::Dragging
+ Status::Dragged
} else if is_mouse_over {
Status::Hovered
} else {
@@ -468,7 +462,7 @@ impl<'a, T, Message, Theme, Renderer> From<Slider<'a, T, Message, Theme>>
where
T: Copy + Into<f64> + num_traits::FromPrimitive + 'a,
Message: Clone + 'a,
- Theme: StyleSheet + 'a,
+ Theme: 'a,
Renderer: crate::core::Renderer + 'a,
{
fn from(
@@ -483,3 +477,119 @@ struct State {
is_dragging: bool,
keyboard_modifiers: keyboard::Modifiers,
}
+
+/// The possible status of a [`Slider`].
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum Status {
+ /// The [`Slider`] can be interacted with.
+ Active,
+ /// The [`Slider`] is being hovered.
+ Hovered,
+ /// The [`Slider`] is being dragged.
+ Dragged,
+}
+
+/// The appearance of a slider.
+#[derive(Debug, Clone, Copy)]
+pub struct Appearance {
+ /// The colors of the rail of the slider.
+ pub rail: Rail,
+ /// The appearance of the [`Handle`] of the slider.
+ pub handle: Handle,
+}
+
+impl Appearance {
+ /// Changes the [`HandleShape`] of the [`Appearance`] to a circle
+ /// with the given radius.
+ pub fn with_circular_handle(mut self, radius: impl Into<Pixels>) -> Self {
+ self.handle.shape = HandleShape::Circle {
+ radius: radius.into().0,
+ };
+ self
+ }
+}
+
+/// The appearance of a slider rail
+#[derive(Debug, Clone, Copy)]
+pub struct Rail {
+ /// The colors of the rail of the slider.
+ pub colors: (Color, Color),
+ /// The width of the stroke of a slider rail.
+ pub width: f32,
+ /// The border radius of the corners of the rail.
+ pub border_radius: border::Radius,
+}
+
+/// The appearance of the handle of a slider.
+#[derive(Debug, Clone, Copy)]
+pub struct Handle {
+ /// The shape of the handle.
+ pub shape: HandleShape,
+ /// The [`Color`] of the handle.
+ pub color: Color,
+ /// The border width of the handle.
+ pub border_width: f32,
+ /// The border [`Color`] of the handle.
+ pub border_color: Color,
+}
+
+/// The shape of the handle of a slider.
+#[derive(Debug, Clone, Copy)]
+pub enum HandleShape {
+ /// A circular handle.
+ Circle {
+ /// The radius of the circle.
+ radius: f32,
+ },
+ /// A rectangular shape.
+ Rectangle {
+ /// The width of the rectangle.
+ width: u16,
+ /// The border radius of the corners of the rectangle.
+ border_radius: border::Radius,
+ },
+}
+
+/// The definiton of the default style of a [`TextInput`].
+pub trait Style {
+ /// Returns the default style of a [`TextInput`].
+ fn style() -> fn(&Self, Status) -> Appearance;
+}
+
+impl Style for Theme {
+ fn style() -> fn(&Self, Status) -> Appearance {
+ default
+ }
+}
+
+/// The default style of a [`Slider`].
+pub fn default(theme: &Theme, status: Status) -> Appearance {
+ let palette = theme.extended_palette();
+
+ let handle = Handle {
+ shape: HandleShape::Rectangle {
+ width: 8,
+ border_radius: 4.0.into(),
+ },
+ color: Color::WHITE,
+ border_color: Color::WHITE,
+ border_width: 1.0,
+ };
+
+ Appearance {
+ rail: Rail {
+ colors: (palette.primary.base.color, palette.secondary.base.color),
+ width: 4.0,
+ border_radius: 2.0.into(),
+ },
+ handle: Handle {
+ color: match status {
+ Status::Active => palette.background.base.color,
+ Status::Hovered => palette.primary.weak.color,
+ Status::Dragged => palette.primary.base.color,
+ },
+ border_color: palette.primary.base.color,
+ ..handle
+ },
+ }
+}
diff --git a/widget/src/vertical_slider.rs b/widget/src/vertical_slider.rs
index b6903001..b51aa2bf 100644
--- a/widget/src/vertical_slider.rs
+++ b/widget/src/vertical_slider.rs
@@ -3,8 +3,8 @@
//! A [`VerticalSlider`] has some local [`State`].
use std::ops::RangeInclusive;
-pub use crate::style::slider::{
- Appearance, Handle, HandleShape, Status, StyleSheet,
+pub use crate::slider::{
+ default, Appearance, Handle, HandleShape, Status, Style,
};
use crate::core;
@@ -44,10 +44,7 @@ use crate::core::{
/// VerticalSlider::new(0.0..=100.0, value, Message::SliderChanged);
/// ```
#[allow(missing_debug_implementations)]
-pub struct VerticalSlider<'a, T, Message, Theme = crate::Theme>
-where
- Theme: StyleSheet,
-{
+pub struct VerticalSlider<'a, T, Message, Theme = crate::Theme> {
range: RangeInclusive<T>,
step: T,
shift_step: Option<T>,
@@ -64,7 +61,6 @@ impl<'a, T, Message, Theme> VerticalSlider<'a, T, Message, Theme>
where
T: Copy + From<u8> + std::cmp::PartialOrd,
Message: Clone,
- Theme: StyleSheet,
{
/// The default width of a [`VerticalSlider`].
pub const DEFAULT_WIDTH: f32 = 22.0;
@@ -79,6 +75,7 @@ where
/// `Message`.
pub fn new<F>(range: RangeInclusive<T>, value: T, on_change: F) -> Self
where
+ Theme: Style,
F: 'a + Fn(T) -> Message,
{
let value = if value >= *range.start() {
@@ -103,7 +100,7 @@ where
on_release: None,
width: Self::DEFAULT_WIDTH,
height: Length::Fill,
- style: Theme::default(),
+ style: Theme::style(),
}
}
@@ -167,7 +164,6 @@ impl<'a, T, Message, Theme, Renderer> Widget<Message, Theme, Renderer>
where
T: Copy + Into<f64> + num_traits::FromPrimitive,
Message: Clone,
- Theme: StyleSheet,
Renderer: core::Renderer,
{
fn tag(&self) -> tree::Tag {
@@ -364,7 +360,7 @@ where
let style = (self.style)(
theme,
if state.is_dragging {
- Status::Dragging
+ Status::Dragged
} else if is_mouse_over {
Status::Hovered
} else {
@@ -474,7 +470,7 @@ impl<'a, T, Message, Theme, Renderer>
where
T: Copy + Into<f64> + num_traits::FromPrimitive + 'a,
Message: Clone + 'a,
- Theme: StyleSheet + 'a,
+ Theme: 'a,
Renderer: core::Renderer + 'a,
{
fn from(