summaryrefslogtreecommitdiffstats
path: root/examples/styling
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-01-20 06:27:01 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-01-20 06:27:01 +0100
commit7cea7371150e6de28032827519936008592f112d (patch)
tree3bfd82272094ef69493de622af6c9b06389a7c27 /examples/styling
parent04086a90c9e933ebfb42de378054e1115b33529d (diff)
downloadiced-7cea7371150e6de28032827519936008592f112d.tar.gz
iced-7cea7371150e6de28032827519936008592f112d.tar.bz2
iced-7cea7371150e6de28032827519936008592f112d.zip
Package examples and remove `dev-dependencies`
Diffstat (limited to 'examples/styling')
-rw-r--r--examples/styling/Cargo.toml9
-rw-r--r--examples/styling/src/main.rs514
2 files changed, 523 insertions, 0 deletions
diff --git a/examples/styling/Cargo.toml b/examples/styling/Cargo.toml
new file mode 100644
index 00000000..eb729f93
--- /dev/null
+++ b/examples/styling/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "styling"
+version = "0.1.0"
+authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
+edition = "2018"
+publish = false
+
+[dependencies]
+iced = { path = "../.." }
diff --git a/examples/styling/src/main.rs b/examples/styling/src/main.rs
new file mode 100644
index 00000000..50095ec7
--- /dev/null
+++ b/examples/styling/src/main.rs
@@ -0,0 +1,514 @@
+use iced::{
+ button, scrollable, slider, text_input, Align, Button, Checkbox, Column,
+ Container, Element, Length, ProgressBar, Radio, Row, Sandbox, Scrollable,
+ Settings, Slider, Space, Text, TextInput,
+};
+
+pub fn main() {
+ Styling::run(Settings::default())
+}
+
+#[derive(Default)]
+struct Styling {
+ theme: style::Theme,
+ scroll: scrollable::State,
+ input: text_input::State,
+ input_value: String,
+ button: button::State,
+ slider: slider::State,
+ slider_value: f32,
+ toggle_value: bool,
+}
+
+#[derive(Debug, Clone)]
+enum Message {
+ ThemeChanged(style::Theme),
+ InputChanged(String),
+ ButtonPressed,
+ SliderChanged(f32),
+ CheckboxToggled(bool),
+}
+
+impl Sandbox for Styling {
+ type Message = Message;
+
+ fn new() -> Self {
+ Styling::default()
+ }
+
+ fn title(&self) -> String {
+ String::from("Styling - Iced")
+ }
+
+ fn update(&mut self, message: Message) {
+ match message {
+ Message::ThemeChanged(theme) => self.theme = theme,
+ Message::InputChanged(value) => self.input_value = value,
+ Message::ButtonPressed => (),
+ Message::SliderChanged(value) => self.slider_value = value,
+ Message::CheckboxToggled(value) => self.toggle_value = value,
+ }
+ }
+
+ fn view(&mut self) -> Element<Message> {
+ let choose_theme = style::Theme::ALL.iter().fold(
+ Column::new().spacing(10).push(Text::new("Choose a theme:")),
+ |column, theme| {
+ column.push(
+ Radio::new(
+ *theme,
+ &format!("{:?}", theme),
+ Some(self.theme),
+ Message::ThemeChanged,
+ )
+ .style(self.theme),
+ )
+ },
+ );
+
+ let text_input = TextInput::new(
+ &mut self.input,
+ "Type something...",
+ &self.input_value,
+ Message::InputChanged,
+ )
+ .padding(10)
+ .size(20)
+ .style(self.theme);
+
+ let button = Button::new(&mut self.button, Text::new("Submit"))
+ .padding(10)
+ .on_press(Message::ButtonPressed)
+ .style(self.theme);
+
+ let slider = Slider::new(
+ &mut self.slider,
+ 0.0..=100.0,
+ self.slider_value,
+ Message::SliderChanged,
+ )
+ .style(self.theme);
+
+ let progress_bar =
+ ProgressBar::new(0.0..=100.0, self.slider_value).style(self.theme);
+
+ let scrollable = Scrollable::new(&mut self.scroll)
+ .height(Length::Units(100))
+ .style(self.theme)
+ .push(Text::new("Scroll me!"))
+ .push(Space::with_height(Length::Units(800)))
+ .push(Text::new("You did it!"));
+
+ let checkbox = Checkbox::new(
+ self.toggle_value,
+ "Toggle me!",
+ Message::CheckboxToggled,
+ )
+ .style(self.theme);
+
+ let content = Column::new()
+ .spacing(20)
+ .padding(20)
+ .max_width(600)
+ .push(choose_theme)
+ .push(Row::new().spacing(10).push(text_input).push(button))
+ .push(slider)
+ .push(progress_bar)
+ .push(
+ Row::new()
+ .spacing(10)
+ .align_items(Align::Center)
+ .push(scrollable)
+ .push(checkbox),
+ );
+
+ Container::new(content)
+ .width(Length::Fill)
+ .height(Length::Fill)
+ .center_x()
+ .center_y()
+ .style(self.theme)
+ .into()
+ }
+}
+
+mod style {
+ use iced::{
+ button, checkbox, container, progress_bar, radio, scrollable, slider,
+ text_input,
+ };
+
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
+ pub enum Theme {
+ Light,
+ Dark,
+ }
+
+ impl Theme {
+ pub const ALL: [Theme; 2] = [Theme::Light, Theme::Dark];
+ }
+
+ impl Default for Theme {
+ fn default() -> Theme {
+ Theme::Light
+ }
+ }
+
+ impl From<Theme> for Box<dyn container::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::Container.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn radio::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::Radio.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn text_input::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::TextInput.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn button::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => light::Button.into(),
+ Theme::Dark => dark::Button.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn scrollable::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::Scrollable.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn slider::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::Slider.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn progress_bar::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::ProgressBar.into(),
+ }
+ }
+ }
+
+ impl From<Theme> for Box<dyn checkbox::StyleSheet> {
+ fn from(theme: Theme) -> Self {
+ match theme {
+ Theme::Light => Default::default(),
+ Theme::Dark => dark::Checkbox.into(),
+ }
+ }
+ }
+
+ mod light {
+ use iced::{button, Background, Color, Vector};
+
+ pub struct Button;
+
+ impl button::StyleSheet for Button {
+ fn active(&self) -> button::Style {
+ button::Style {
+ background: Some(Background::Color(Color::from_rgb(
+ 0.11, 0.42, 0.87,
+ ))),
+ border_radius: 12,
+ shadow_offset: Vector::new(1.0, 1.0),
+ text_color: Color::from_rgb8(0xEE, 0xEE, 0xEE),
+ ..button::Style::default()
+ }
+ }
+
+ fn hovered(&self) -> button::Style {
+ button::Style {
+ text_color: Color::WHITE,
+ shadow_offset: Vector::new(1.0, 2.0),
+ ..self.active()
+ }
+ }
+ }
+ }
+
+ mod dark {
+ use iced::{
+ button, checkbox, container, progress_bar, radio, scrollable,
+ slider, text_input, Background, Color,
+ };
+
+ const SURFACE: Color = Color::from_rgb(
+ 0x40 as f32 / 255.0,
+ 0x44 as f32 / 255.0,
+ 0x4B as f32 / 255.0,
+ );
+
+ const ACCENT: Color = Color::from_rgb(
+ 0x6F as f32 / 255.0,
+ 0xFF as f32 / 255.0,
+ 0xE9 as f32 / 255.0,
+ );
+
+ const ACTIVE: Color = Color::from_rgb(
+ 0x72 as f32 / 255.0,
+ 0x89 as f32 / 255.0,
+ 0xDA as f32 / 255.0,
+ );
+
+ const HOVERED: Color = Color::from_rgb(
+ 0x67 as f32 / 255.0,
+ 0x7B as f32 / 255.0,
+ 0xC4 as f32 / 255.0,
+ );
+
+ pub struct Container;
+
+ impl container::StyleSheet for Container {
+ fn style(&self) -> container::Style {
+ container::Style {
+ background: Some(Background::Color(Color::from_rgb8(
+ 0x36, 0x39, 0x3F,
+ ))),
+ text_color: Some(Color::WHITE),
+ ..container::Style::default()
+ }
+ }
+ }
+
+ pub struct Radio;
+
+ impl radio::StyleSheet for Radio {
+ fn active(&self) -> radio::Style {
+ radio::Style {
+ background: Background::Color(SURFACE),
+ dot_color: ACTIVE,
+ border_width: 1,
+ border_color: ACTIVE,
+ }
+ }
+
+ fn hovered(&self) -> radio::Style {
+ radio::Style {
+ background: Background::Color(Color { a: 0.5, ..SURFACE }),
+ ..self.active()
+ }
+ }
+ }
+
+ pub struct TextInput;
+
+ impl text_input::StyleSheet for TextInput {
+ fn active(&self) -> text_input::Style {
+ text_input::Style {
+ background: Background::Color(SURFACE),
+ border_radius: 2,
+ border_width: 0,
+ border_color: Color::TRANSPARENT,
+ }
+ }
+
+ fn focused(&self) -> text_input::Style {
+ text_input::Style {
+ border_width: 1,
+ border_color: ACCENT,
+ ..self.active()
+ }
+ }
+
+ fn hovered(&self) -> text_input::Style {
+ text_input::Style {
+ border_width: 1,
+ border_color: Color { a: 0.3, ..ACCENT },
+ ..self.focused()
+ }
+ }
+
+ fn placeholder_color(&self) -> Color {
+ Color::from_rgb(0.4, 0.4, 0.4)
+ }
+
+ fn value_color(&self) -> Color {
+ Color::WHITE
+ }
+ }
+
+ pub struct Button;
+
+ impl button::StyleSheet for Button {
+ fn active(&self) -> button::Style {
+ button::Style {
+ background: Some(Background::Color(ACTIVE)),
+ border_radius: 3,
+ text_color: Color::WHITE,
+ ..button::Style::default()
+ }
+ }
+
+ fn hovered(&self) -> button::Style {
+ button::Style {
+ background: Some(Background::Color(HOVERED)),
+ text_color: Color::WHITE,
+ ..self.active()
+ }
+ }
+
+ fn pressed(&self) -> button::Style {
+ button::Style {
+ border_width: 1,
+ border_color: Color::WHITE,
+ ..self.hovered()
+ }
+ }
+ }
+
+ pub struct Scrollable;
+
+ impl scrollable::StyleSheet for Scrollable {
+ fn active(&self) -> scrollable::Scrollbar {
+ scrollable::Scrollbar {
+ background: Some(Background::Color(SURFACE)),
+ border_radius: 2,
+ border_width: 0,
+ border_color: Color::TRANSPARENT,
+ scroller: scrollable::Scroller {
+ color: ACTIVE,
+ border_radius: 2,
+ border_width: 0,
+ border_color: Color::TRANSPARENT,
+ },
+ }
+ }
+
+ fn hovered(&self) -> scrollable::Scrollbar {
+ let active = self.active();
+
+ scrollable::Scrollbar {
+ background: Some(Background::Color(Color {
+ a: 0.5,
+ ..SURFACE
+ })),
+ scroller: scrollable::Scroller {
+ color: HOVERED,
+ ..active.scroller
+ },
+ ..active
+ }
+ }
+
+ fn dragging(&self) -> scrollable::Scrollbar {
+ let hovered = self.hovered();
+
+ scrollable::Scrollbar {
+ scroller: scrollable::Scroller {
+ color: Color::from_rgb(0.85, 0.85, 0.85),
+ ..hovered.scroller
+ },
+ ..hovered
+ }
+ }
+ }
+
+ pub struct Slider;
+
+ impl slider::StyleSheet for Slider {
+ fn active(&self) -> slider::Style {
+ slider::Style {
+ rail_colors: (ACTIVE, Color { a: 0.1, ..ACTIVE }),
+ handle: slider::Handle {
+ shape: slider::HandleShape::Circle { radius: 9 },
+ color: ACTIVE,
+ border_width: 0,
+ border_color: Color::TRANSPARENT,
+ },
+ }
+ }
+
+ fn hovered(&self) -> slider::Style {
+ let active = self.active();
+
+ slider::Style {
+ handle: slider::Handle {
+ color: HOVERED,
+ ..active.handle
+ },
+ ..active
+ }
+ }
+
+ fn dragging(&self) -> slider::Style {
+ let active = self.active();
+
+ slider::Style {
+ handle: slider::Handle {
+ color: Color::from_rgb(0.85, 0.85, 0.85),
+ ..active.handle
+ },
+ ..active
+ }
+ }
+ }
+
+ pub struct ProgressBar;
+
+ impl progress_bar::StyleSheet for ProgressBar {
+ fn style(&self) -> progress_bar::Style {
+ progress_bar::Style {
+ background: Background::Color(SURFACE),
+ bar: Background::Color(ACTIVE),
+ border_radius: 10,
+ }
+ }
+ }
+
+ pub struct Checkbox;
+
+ impl checkbox::StyleSheet for Checkbox {
+ fn active(&self, is_checked: bool) -> checkbox::Style {
+ checkbox::Style {
+ background: Background::Color(if is_checked {
+ ACTIVE
+ } else {
+ SURFACE
+ }),
+ checkmark_color: Color::WHITE,
+ border_radius: 2,
+ border_width: 1,
+ border_color: ACTIVE,
+ }
+ }
+
+ fn hovered(&self, is_checked: bool) -> checkbox::Style {
+ checkbox::Style {
+ background: Background::Color(Color {
+ a: 0.8,
+ ..if is_checked { ACTIVE } else { SURFACE }
+ }),
+ ..self.active(is_checked)
+ }
+ }
+ }
+ }
+}