system settings
git clone https://git.lucas.co/cce-system-interface.git
Add Breadcrumb section to Controls settings and introduce dynamic Background color selector
src/main.rs | 9 +++++++++
src/pages/interface.rs | 36 ++++++++++++++++++++++++++++++++++--
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/src/main.rs b/src/main.rs
index 670d3d3..45719eb 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -949,6 +949,9 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
// (ScrollingList child widgets)
link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[14], &mut self.ui_context);
+ // (Breadcrumb child widgets)
+ link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[15], &mut self.ui_context);
+
// (Spinbox child widgets)
link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.spinbox_height_spinbox, &mut self.ui_context);
@@ -1484,6 +1487,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => self.app.interface.toggle_enabled_color,
13 => self.app.interface.toggle_disabled_color,
14 => self.app.interface.scrollinglist_bg_color,
+ 15 => self.app.interface.breadcrumb_bg_color,
_ => self.app.interface.low_color,
};
if cp.color != state_color {
@@ -1503,6 +1507,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+ 15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
_ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
}));
color_changed = true;
@@ -2634,6 +2639,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => pages::interface::InterfaceMessage::PickToggleEnabledColor,
13 => pages::interface::InterfaceMessage::PickToggleDisabledColor,
14 => pages::interface::InterfaceMessage::PickScrollingListBgColor,
+ 15 => pages::interface::InterfaceMessage::PickBreadcrumbBgColor,
_ => pages::interface::InterfaceMessage::PickLowColor,
}));
}
@@ -2654,6 +2660,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+ 15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
_ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
}));
}
@@ -3531,6 +3538,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+ 15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
_ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
}));
}
@@ -4228,6 +4236,7 @@ fn collect_popover_rects(w: &dyn clear_ui::widget::Element, popovers: &mut Vec<(
12 => pages::interface::InterfaceMessage::SetToggleEnabledColor(cp.color),
13 => pages::interface::InterfaceMessage::SetToggleDisabledColor(cp.color),
14 => pages::interface::InterfaceMessage::SetScrollingListBgColor(cp.color),
+ 15 => pages::interface::InterfaceMessage::SetBreadcrumbBgColor(cp.color),
_ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
}));
}
diff --git a/src/pages/interface.rs b/src/pages/interface.rs
index b2ab726..0e4d47f 100644
--- a/src/pages/interface.rs
+++ b/src/pages/interface.rs
@@ -32,6 +32,7 @@ pub struct InterfaceState {
pub toggle_enabled_color: [u8; 3],
pub toggle_disabled_color: [u8; 3],
pub scrollinglist_bg_color: [u8; 3],
+ pub breadcrumb_bg_color: [u8; 3],
pub color_selectors: Vec<ColorSelector>,
pub menubar_opacity: f32,
pub menubar_opacity_spinbox: Spinbox,
@@ -145,6 +146,7 @@ impl Default for InterfaceState {
toggle_enabled_color: [104, 217, 165],
toggle_disabled_color: [135, 135, 148],
scrollinglist_bg_color: [81, 81, 97],
+ breadcrumb_bg_color: [81, 81, 97],
color_selectors: vec![
ColorSelector::new([71, 71, 81]).with_label("Low Color"), // 0: Plate - Low Color
ColorSelector::new([0x3e, 0x3e, 0x3e]).with_label("High Color"), // 1: Layout - High Color
@@ -161,6 +163,7 @@ impl Default for InterfaceState {
ColorSelector::new([104, 217, 165]).with_label("Enabled"), // 12: Toggles - Enabled
ColorSelector::new([135, 135, 148]).with_label("Disabled"), // 13: Toggles - Disabled
ColorSelector::new([81, 81, 97]).with_label("Background"), // 14: ScrollingList - Background
+ ColorSelector::new([81, 81, 97]).with_label("Background"), // 15: Breadcrumb - Background
],
paginator_tab_margin_x: 5,
paginator_tab_margin_y: 10,
@@ -276,6 +279,7 @@ pub enum InterfaceMessage {
SetToggleEnabledColor([u8; 3]),
SetToggleDisabledColor([u8; 3]),
SetScrollingListBgColor([u8; 3]),
+ SetBreadcrumbBgColor([u8; 3]),
SetTabMarginX(u16),
SetTabMarginY(u16),
SetTabPaddingX(u16),
@@ -323,6 +327,7 @@ pub enum InterfaceMessage {
PickToggleEnabledColor,
PickToggleDisabledColor,
PickScrollingListBgColor,
+ PickBreadcrumbBgColor,
Refreshed(InterfaceState),
TypefaceRefreshed(InterfaceState),
SetSans(String),
@@ -385,6 +390,8 @@ pub fn read_interface_config() -> InterfaceState {
let toggle_disabled = parse_color_from_key(&content, "toggle_disabled_color", [135, 135, 148]);
let scrollinglist_bg = parse_color_from_key(&content, "scrollinglist_bg_color", [81, 81, 97]);
+
+ let breadcrumb_bg = parse_color_from_key(&content, "breadcrumb_bg_color", scrollinglist_bg);
let paginator_tab_margin_general = parse_u16_from(&content, "paginator_tab_margin", 999);
let paginator_tab_margin_x = parse_u16_from(&content, "paginator_tab_margin_x", if paginator_tab_margin_general != 999 { paginator_tab_margin_general } else { 5 });
@@ -437,6 +444,7 @@ pub fn read_interface_config() -> InterfaceState {
toggle_enabled_color: toggle_enabled,
toggle_disabled_color: toggle_disabled,
scrollinglist_bg_color: scrollinglist_bg,
+ breadcrumb_bg_color: breadcrumb_bg,
color_selectors: vec![
ColorSelector::new(page_low).with_label("Low Color").with_font_family(&color_selector_font), // 0: Plate - Low Color
ColorSelector::new(border).with_label("High Color").with_font_family(&color_selector_font), // 1: Layout - High Color
@@ -453,6 +461,7 @@ pub fn read_interface_config() -> InterfaceState {
ColorSelector::new(toggle_enabled).with_label("Enabled").with_font_family(&color_selector_font), // 12: Toggles - Enabled
ColorSelector::new(toggle_disabled).with_label("Disabled").with_font_family(&color_selector_font), // 13: Toggles - Disabled
ColorSelector::new(scrollinglist_bg).with_label("Background").with_font_family(&color_selector_font), // 14: ScrollingList - Background
+ ColorSelector::new(breadcrumb_bg).with_label("Background").with_font_family(&color_selector_font), // 15: Breadcrumb - Background
],
paginator_tab_margin_x,
paginator_tab_margin_y,
@@ -781,6 +790,15 @@ fn apply_scrollinglist_bg_color(rgb: [u8; 3]) {
clear_ui::color::set_scrollinglist_bg_color([r, g, b, 0.3]);
}
+fn apply_breadcrumb_bg_color(rgb: [u8; 3]) {
+ let hex = format!("\"#{:02x}{:02x}{:02x}\"", rgb[0], rgb[1], rgb[2]);
+ write_config_value("breadcrumb_bg_color", &hex);
+ let r = clear_ui::color::srgb_to_linear(rgb[0] as f32 / 255.0);
+ let g = clear_ui::color::srgb_to_linear(rgb[1] as f32 / 255.0);
+ let b = clear_ui::color::srgb_to_linear(rgb[2] as f32 / 255.0);
+ clear_ui::color::set_breadcrumb_bg_color([r, g, b, 1.0]);
+}
+
fn apply_paginator_tab_margin_x(margin: u16) {
write_config_value("paginator_tab_margin_x", &margin.to_string());
send_ipc_command(&format!("layout paginator_tab_margin_x {}", margin));
@@ -1492,6 +1510,15 @@ pub fn view(state: &mut InterfaceState, cx: f32, cy: f32, cw: f32, ch: f32, sec_
});
sec.spacing(12.0);
+ // Breadcrumb Section
+ sec.add_section("Breadcrumb", false, |subsec| {
+ subsec.spacing(8.0);
+ state.color_selectors[15].color = state.breadcrumb_bg_color;
+ subsec.widget_full(&mut state.color_selectors[15], 40.0, ctx);
+ subsec.spacing(8.0);
+ });
+ sec.spacing(12.0);
+
// Spinbox Section
sec.add_section("Spinbox", false, |subsec| {
subsec.spacing(8.0);
@@ -1741,6 +1768,10 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
state.scrollinglist_bg_color = rgb;
apply_scrollinglist_bg_color(rgb);
}
+ InterfaceMessage::SetBreadcrumbBgColor(rgb) => {
+ state.breadcrumb_bg_color = rgb;
+ apply_breadcrumb_bg_color(rgb);
+ }
InterfaceMessage::SetTabMarginX(margin) => {
state.paginator_tab_margin_x = margin;
apply_paginator_tab_margin_x(margin);
@@ -1894,7 +1925,7 @@ pub fn update(state: &mut InterfaceState, msg: InterfaceMessage) {
send_ipc_command("reload");
status_interface_reload();
}
- InterfaceMessage::PickLowColor | InterfaceMessage::PickHighColor | InterfaceMessage::PickDisabledColor | InterfaceMessage::PickSeparatorColor | InterfaceMessage::PickVisualGuides | InterfaceMessage::PickSliderTrackColor | InterfaceMessage::PickPageLowColor | InterfaceMessage::PickColorBordersColor | InterfaceMessage::PickNormalColor | InterfaceMessage::PickPaginatorSidebarColor | InterfaceMessage::PickPrimaryHighlightColor | InterfaceMessage::PickMenubarTabLabelColor | InterfaceMessage::PickToggleEnabledColor | InterfaceMessage::PickToggleDisabledColor | InterfaceMessage::PickScrollingListBgColor => {}
+ InterfaceMessage::PickLowColor | InterfaceMessage::PickHighColor | InterfaceMessage::PickDisabledColor | InterfaceMessage::PickSeparatorColor | InterfaceMessage::PickVisualGuides | InterfaceMessage::PickSliderTrackColor | InterfaceMessage::PickPageLowColor | InterfaceMessage::PickColorBordersColor | InterfaceMessage::PickNormalColor | InterfaceMessage::PickPaginatorSidebarColor | InterfaceMessage::PickPrimaryHighlightColor | InterfaceMessage::PickMenubarTabLabelColor | InterfaceMessage::PickToggleEnabledColor | InterfaceMessage::PickToggleDisabledColor | InterfaceMessage::PickScrollingListBgColor | InterfaceMessage::PickBreadcrumbBgColor => {}
InterfaceMessage::Refreshed(new) => {
let was_mx_hovered = state.tab_margin_spinbox_x.hovered();
let was_my_hovered = state.tab_margin_spinbox_y.hovered();
@@ -2404,7 +2435,7 @@ mod tests {
#[test]
fn test_parse_color_from_key() {
- let content = "\n[layout]\nlow_color = \"#112233\"\nhigh_color = \"#445566\"\ndisabled_color = \"#778899\"\nstatus_separator_color = \"#aabbcc\"\nvisual_guides_color = \"#ddeeff\"\nslider_track_color = \"#123456\"\npage_low_color = \"#474751\"\ncolor_borders_color = \"#abcdef\"\nstatus_normal_color = \"#ccccd8\"\npaginator_sidebar_color = \"#5a5a65\"\nprimary_highlight_color = \"#ffffff\"\nmenubar_tab_label_color = \"#e6e6f2\"\ntoggle_enabled_color = \"#68d8a5\"\ntoggle_disabled_color = \"#878794\"\nscrollinglist_bg_color = \"#515161\"\n";
+ let content = "\n[layout]\nlow_color = \"#112233\"\nhigh_color = \"#445566\"\ndisabled_color = \"#778899\"\nstatus_separator_color = \"#aabbcc\"\nvisual_guides_color = \"#ddeeff\"\nslider_track_color = \"#123456\"\npage_low_color = \"#474751\"\ncolor_borders_color = \"#abcdef\"\nstatus_normal_color = \"#ccccd8\"\npaginator_sidebar_color = \"#5a5a65\"\nprimary_highlight_color = \"#ffffff\"\nmenubar_tab_label_color = \"#e6e6f2\"\ntoggle_enabled_color = \"#68d8a5\"\ntoggle_disabled_color = \"#878794\"\nscrollinglist_bg_color = \"#515161\"\nbreadcrumb_bg_color = \"#515161\"\n";
assert_eq!(parse_color_from_key(content, "low_color", [0, 0, 0]), [17, 34, 51]);
assert_eq!(parse_color_from_key(content, "high_color", [0, 0, 0]), [68, 85, 102]);
assert_eq!(parse_color_from_key(content, "disabled_color", [0, 0, 0]), [119, 136, 153]);
@@ -2420,6 +2451,7 @@ mod tests {
assert_eq!(parse_color_from_key(content, "toggle_enabled_color", [0, 0, 0]), [104, 216, 165]);
assert_eq!(parse_color_from_key(content, "toggle_disabled_color", [0, 0, 0]), [135, 135, 148]);
assert_eq!(parse_color_from_key(content, "scrollinglist_bg_color", [0, 0, 0]), [81, 81, 97]);
+ assert_eq!(parse_color_from_key(content, "breadcrumb_bg_color", [0, 0, 0]), [81, 81, 97]);
assert_eq!(parse_color_from_key(content, "non_existent", [1, 2, 3]), [1, 2, 3]);
}