refactor: text input styling
This commit is contained in:
parent
4a554e9ec5
commit
9a9f2efecd
2 changed files with 53 additions and 51 deletions
|
|
@ -14,10 +14,14 @@ pub struct Appearance {
|
||||||
pub border_width: f32,
|
pub border_width: f32,
|
||||||
/// The border [`Color`] of the text input.
|
/// The border [`Color`] of the text input.
|
||||||
pub border_color: Color,
|
pub border_color: Color,
|
||||||
/// The icon [`Color`] of the text input.
|
|
||||||
pub icon_color: Color,
|
|
||||||
/// The label [`Color`] of the text input.
|
/// The label [`Color`] of the text input.
|
||||||
pub label_color: Color,
|
pub label_color: Color,
|
||||||
|
/// The text [`Color`] of the text input.
|
||||||
|
pub selected_text_color: Color,
|
||||||
|
/// The text [`Color`] of the text input.
|
||||||
|
pub text_color: Color,
|
||||||
|
/// The selected fill [`Color`] of the text input.
|
||||||
|
pub selected_fill: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A set of rules that dictate the style of a text input.
|
/// A set of rules that dictate the style of a text input.
|
||||||
|
|
@ -37,15 +41,6 @@ pub trait StyleSheet {
|
||||||
/// Produces the [`Color`] of the placeholder of a text input.
|
/// Produces the [`Color`] of the placeholder of a text input.
|
||||||
fn placeholder_color(&self, style: &Self::Style) -> Color;
|
fn placeholder_color(&self, style: &Self::Style) -> Color;
|
||||||
|
|
||||||
/// Produces the [`Color`] of the value of a text input.
|
|
||||||
fn value_color(&self, style: &Self::Style) -> Color;
|
|
||||||
|
|
||||||
/// Produces the [`Color`] of the value of a disabled text input.
|
|
||||||
fn disabled_color(&self, style: &Self::Style) -> Color;
|
|
||||||
|
|
||||||
/// Produces the [`Color`] of the selection of a text input.
|
|
||||||
fn selection_color(&self, style: &Self::Style) -> Color;
|
|
||||||
|
|
||||||
/// Produces the style of an hovered text input.
|
/// Produces the style of an hovered text input.
|
||||||
fn hovered(&self, style: &Self::Style) -> Appearance {
|
fn hovered(&self, style: &Self::Style) -> Appearance {
|
||||||
self.focused(style)
|
self.focused(style)
|
||||||
|
|
@ -80,7 +75,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 1.0,
|
border_width: 1.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: self.current_container().component.divider.into(),
|
border_color: self.current_container().component.divider.into(),
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::ExpandableSearch => Appearance {
|
TextInput::ExpandableSearch => Appearance {
|
||||||
|
|
@ -89,7 +86,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Search => Appearance {
|
TextInput::Search => Appearance {
|
||||||
|
|
@ -98,7 +97,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Inline => Appearance {
|
TextInput::Inline => Appearance {
|
||||||
|
|
@ -107,7 +108,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -127,7 +130,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 1.0,
|
border_width: 1.0,
|
||||||
border_offset: Some(2.0),
|
border_offset: Some(2.0),
|
||||||
border_color: Color::from(palette.destructive_color()),
|
border_color: Color::from(palette.destructive_color()),
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
||||||
|
|
@ -136,7 +141,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Inline => Appearance {
|
TextInput::Inline => Appearance {
|
||||||
|
|
@ -145,7 +152,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -165,7 +174,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 1.0,
|
border_width: 1.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: palette.accent.base.into(),
|
border_color: palette.accent.base.into(),
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
||||||
|
|
@ -174,7 +185,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Inline => Appearance {
|
TextInput::Inline => Appearance {
|
||||||
|
|
@ -183,7 +196,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -203,7 +218,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 1.0,
|
border_width: 1.0,
|
||||||
border_offset: Some(2.0),
|
border_offset: Some(2.0),
|
||||||
border_color: palette.accent.base.into(),
|
border_color: palette.accent.base.into(),
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
TextInput::Search | TextInput::ExpandableSearch => Appearance {
|
||||||
|
|
@ -212,7 +229,9 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: Some(2.0),
|
border_offset: Some(2.0),
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: self.current_container().on.into(),
|
text_color: self.current_container().on.into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
TextInput::Inline => Appearance {
|
TextInput::Inline => Appearance {
|
||||||
|
|
@ -221,7 +240,11 @@ impl StyleSheet for crate::Theme {
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_offset: None,
|
border_offset: None,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
icon_color: palette.accent.on.into(),
|
// TODO use regular text color here after text rendering handles multiple colors
|
||||||
|
// in this case, for selected and unselected text
|
||||||
|
text_color: palette.on_accent_color().into(),
|
||||||
|
selected_text_color: palette.on_accent_color().into(),
|
||||||
|
selected_fill: palette.accent_color().into(),
|
||||||
label_color: label_color.into(),
|
label_color: label_color.into(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -234,25 +257,6 @@ impl StyleSheet for crate::Theme {
|
||||||
neutral_9.into()
|
neutral_9.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn value_color(&self, _style: &Self::Style) -> Color {
|
|
||||||
let palette = self.cosmic();
|
|
||||||
|
|
||||||
palette.palette.neutral_9.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn selection_color(&self, _style: &Self::Style) -> Color {
|
|
||||||
let palette = self.cosmic();
|
|
||||||
|
|
||||||
palette.accent.base.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn disabled_color(&self, _style: &Self::Style) -> Color {
|
|
||||||
let palette = self.cosmic();
|
|
||||||
let mut neutral_9 = palette.palette.neutral_9;
|
|
||||||
neutral_9.alpha = 0.5;
|
|
||||||
neutral_9.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn disabled(&self, style: &Self::Style) -> Appearance {
|
fn disabled(&self, style: &Self::Style) -> Appearance {
|
||||||
self.active(style)
|
self.active(style)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
//! Display fields that can be filled with text.
|
//! Display fields that can be filled with text.
|
||||||
//!
|
//!
|
||||||
//! A [`TextInput`] has some local [`State`].
|
//! A [`TextInput`] has some local [`State`].
|
||||||
|
use crate::app;
|
||||||
use crate::theme::THEME;
|
use crate::theme::THEME;
|
||||||
|
|
||||||
use super::cursor;
|
use super::cursor;
|
||||||
|
|
@ -9,7 +10,6 @@ use super::editor::Editor;
|
||||||
use super::style::StyleSheet;
|
use super::style::StyleSheet;
|
||||||
pub use super::value::Value;
|
pub use super::value::Value;
|
||||||
|
|
||||||
use apply::Also;
|
|
||||||
use iced::Limits;
|
use iced::Limits;
|
||||||
use iced_core::event::{self, Event};
|
use iced_core::event::{self, Event};
|
||||||
use iced_core::keyboard;
|
use iced_core::keyboard;
|
||||||
|
|
@ -1798,7 +1798,7 @@ pub fn draw<'a, Message>(
|
||||||
renderer,
|
renderer,
|
||||||
theme,
|
theme,
|
||||||
&renderer::Style {
|
&renderer::Style {
|
||||||
text_color: appearance.icon_color,
|
text_color: appearance.text_color,
|
||||||
},
|
},
|
||||||
icon_layout,
|
icon_layout,
|
||||||
cursor_position,
|
cursor_position,
|
||||||
|
|
@ -1844,7 +1844,7 @@ pub fn draw<'a, Message>(
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
},
|
},
|
||||||
theme.value_color(style),
|
appearance.text_color,
|
||||||
)),
|
)),
|
||||||
offset,
|
offset,
|
||||||
)
|
)
|
||||||
|
|
@ -1893,7 +1893,7 @@ pub fn draw<'a, Message>(
|
||||||
border_width: 0.0,
|
border_width: 0.0,
|
||||||
border_color: Color::TRANSPARENT,
|
border_color: Color::TRANSPARENT,
|
||||||
},
|
},
|
||||||
theme.selection_color(style),
|
appearance.selected_fill,
|
||||||
)),
|
)),
|
||||||
if end == right {
|
if end == right {
|
||||||
right_offset
|
right_offset
|
||||||
|
|
@ -1917,10 +1917,8 @@ pub fn draw<'a, Message>(
|
||||||
|
|
||||||
let color = if text.is_empty() {
|
let color = if text.is_empty() {
|
||||||
theme.placeholder_color(style)
|
theme.placeholder_color(style)
|
||||||
} else if is_disabled {
|
|
||||||
theme.disabled_color(style)
|
|
||||||
} else {
|
} else {
|
||||||
theme.value_color(style)
|
appearance.text_color
|
||||||
};
|
};
|
||||||
|
|
||||||
let render = |renderer: &mut crate::Renderer| {
|
let render = |renderer: &mut crate::Renderer| {
|
||||||
|
|
@ -1966,7 +1964,7 @@ pub fn draw<'a, Message>(
|
||||||
renderer,
|
renderer,
|
||||||
theme,
|
theme,
|
||||||
&renderer::Style {
|
&renderer::Style {
|
||||||
text_color: appearance.icon_color,
|
text_color: appearance.text_color,
|
||||||
},
|
},
|
||||||
icon_layout,
|
icon_layout,
|
||||||
cursor_position,
|
cursor_position,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue