Files
galaxy/app/src/ui_components/item_highlight.rs
T

63 lines
2.1 KiB
Rust

use crate::ui_components::blended_colors;
use crate::{appearance::Appearance, ui_components::icons::Icon};
use pathfinder_color::ColorU;
use galaxy_core::ui::theme::color::internal_colors;
use galaxy_core::ui::theme::Fill;
use galaxyui::elements::{CornerRadius, MouseState, Radius};
use galaxyui::Element;
/// Shared item highlight state for left-panel style lists (file tree, global search results,
/// warp drive rows, etc.).
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub(crate) enum ItemHighlightState {
None,
Selected,
Hovered,
}
impl ItemHighlightState {
pub fn new(is_selected: bool, mouse_state: &MouseState) -> Self {
if is_selected {
ItemHighlightState::Selected
} else if mouse_state.is_hovered() {
ItemHighlightState::Hovered
} else {
ItemHighlightState::None
}
}
pub fn text_and_icon_color(&self, appearance: &Appearance) -> ColorU {
match self {
ItemHighlightState::None => {
blended_colors::text_sub(appearance.theme(), appearance.theme().background())
}
ItemHighlightState::Selected => appearance.theme().foreground().into(),
ItemHighlightState::Hovered => {
blended_colors::text_main(appearance.theme(), appearance.theme().background())
}
}
}
pub fn background_color(&self, appearance: &Appearance) -> Option<Fill> {
match self {
ItemHighlightState::None => None,
ItemHighlightState::Selected => Some(internal_colors::fg_overlay_4(appearance.theme())),
ItemHighlightState::Hovered => Some(internal_colors::fg_overlay_2(appearance.theme())),
}
}
pub fn corner_radius(&self) -> Option<CornerRadius> {
match self {
ItemHighlightState::None => None,
ItemHighlightState::Selected | ItemHighlightState::Hovered => {
Some(CornerRadius::with_all(Radius::Pixels(4.)))
}
}
}
}
pub(crate) enum ImageOrIcon {
Icon(Icon),
Image(Box<dyn Element>),
}