system settings
git clone https://git.lucas.co/cce-system-interface.git
Refactor cce-system-interface to modularize event handling, config management, watchers, and rendering
src/config_manager.rs | 26 +
src/input_handler.rs | 3669 ++++++++++++++++++++++++++++++++++++++
src/lib.rs | 2 +
src/main.rs | 4753 +------------------------------------------------
src/renderer.rs | 847 +++++++++
src/watchers.rs | 284 +++
6 files changed, 4851 insertions(+), 4730 deletions(-)
diff --git a/src/config_manager.rs b/src/config_manager.rs
new file mode 100644
index 0000000..d35d5ef
--- /dev/null
+++ b/src/config_manager.rs
@@ -0,0 +1,26 @@
+use std::fs;
+use serde_json::Value;
+
+pub const CONFIG_PATH: &str = "/home/lsgalante/.config/cce/config.json";
+
+pub fn read_config_file() -> String {
+ fs::read_to_string(CONFIG_PATH).unwrap_or_default()
+}
+
+pub fn write_config_file(content: &str) -> bool {
+ fs::write(CONFIG_PATH, content).is_ok()
+}
+
+pub fn update_json_value<F>(update_fn: F) -> bool
+where
+ F: FnOnce(&mut Value)
+{
+ let content = read_config_file();
+ let mut val: Value = serde_json::from_str(&content).unwrap_or_else(|_| serde_json::json!({}));
+ update_fn(&mut val);
+ if let Ok(updated_str) = serde_json::to_string_pretty(&val) {
+ write_config_file(&updated_str)
+ } else {
+ false
+ }
+}
diff --git a/src/input_handler.rs b/src/input_handler.rs
new file mode 100644
index 0000000..eec44b1
--- /dev/null
+++ b/src/input_handler.rs
@@ -0,0 +1,3669 @@
+use crate::SystemInterface;
+use cce_system_interface::app::AppAction;
+use cce_system_interface::pages::{self, Page};
+use cce_ui::widget::Element;
+
+impl SystemInterface {
+
+ pub(crate) fn handle_cursor_moved(&mut self, x: f32, y: f32) -> bool {
+ self.cursor_x = x;
+ self.cursor_y = y;
+ let s = 1.0f32;
+ let lx_no_scroll = x / s;
+ let ly_no_scroll = y / s;
+
+ if cce_ui::widget::context_menu::is_visible() {
+ if cce_ui::widget::context_menu::cursor_moved(lx_no_scroll, ly_no_scroll) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ return false;
+ }
+
+ let lx = self.cursor_x / s;
+ let ly = self.cursor_y / s + self.scroll_y;
+ cce_ui::widget::hover_animation::set_cursor_pos(lx, ly_no_scroll);
+ let mut changed = false;
+ if self.menubar.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.switcher.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ changed = true;
+ }
+ for w in &mut self.widgets {
+ let was = w.hovering;
+ w.hovering = self.cursor_x >= w.x && self.cursor_x <= w.x + w.w
+ && self.cursor_y >= w.y && self.cursor_y <= w.y + w.h;
+ if w.hovering != was {
+ w.color = if w.hovering { w.hover_color } else { w.color };
+ changed = true;
+ }
+ }
+
+ if self.app.current_page == Page::Interface {
+ for cp in &mut self.app.interface.color_selectors {
+ if cp.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.interface.tab_margin_spinbox_x.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.menubar_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.tab_margin_spinbox_y.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.button_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.section_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.label_alignment_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.label_offset_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.label_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.plate_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_show_grid_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_snap_enabled_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_uniform_background_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_cell_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_gap_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.graph_gap_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.page_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.grid_min_col_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.spinbox_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.spinbox_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.toggle_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.toggle_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.plate_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.plate_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.page_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.layer_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+
+
+ if self.app.interface.color_selector_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.color_selector_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.color_selector_preview_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.color_selector_preview_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.color_selector_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.menubar_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.breadcrumb_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.section_label_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.nested_section_label_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.textbox_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.textbox_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.slider_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.font_selector_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.font_selector_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.dropdown_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.dropdown_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.button_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.notification_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.window_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.window_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.sans_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.serif_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.mono_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.borders_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.borders_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.status_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.status_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.fuzzel_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.fuzzel_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.terminal_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.terminal_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.borders_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.status_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.fuzzel_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.terminal_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.custom_multicontrol.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ for sb in &mut self.app.interface.windows.spinboxes {
+ if sb.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.interface.windows.cascade_offset_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.edge_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.top_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.grid_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.transition_duration_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.status_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ for menu in &mut self.app.interface.windows.tag_layout_menus {
+ if menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.interface.windows.side_panel_behavior_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.side_panel_position_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.side_panel_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.side_panel_border_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.side_panel_border_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.transparency_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.interface.windows.blur_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.current_page == Page::Input {
+ if self.app.input.rate_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.delay_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.tap_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.scroll_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.scroll_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.pointer_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.pointer_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.trackpad_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.trackpad_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.dwtp_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.trackpoint_accel_speed_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.trackpoint_accel_profile_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.zoom_in_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.zoom_out_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.input.keybinds_control.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.current_page == Page::Audio {
+ if let Some(idx) = self.audio_sink_dragging {
+ if idx < self.app.audio.sink_sliders.len() {
+ if self.app.audio.sink_sliders[idx].drag_update(lx, ly) {
+ changed = true;
+ let val = self.app.audio.sink_sliders[idx].value();
+ if idx < self.app.audio.sink_spinboxes.len() {
+ self.app.audio.sink_spinboxes[idx].value = (val * 100.0).round() as i32;
+ }
+ if idx < self.app.audio.sinks.len() {
+ let id = self.app.audio.sinks[idx].id;
+ self.handle_action(&AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, val)));
+ }
+ }
+ }
+ } else if let Some(idx) = self.audio_source_dragging {
+ if idx < self.app.audio.source_sliders.len() {
+ if self.app.audio.source_sliders[idx].drag_update(lx, ly) {
+ changed = true;
+ let val = self.app.audio.source_sliders[idx].value();
+ if idx < self.app.audio.source_spinboxes.len() {
+ self.app.audio.source_spinboxes[idx].value = (val * 100.0).round() as i32;
+ }
+ if idx < self.app.audio.sources.len() {
+ let id = self.app.audio.sources[idx].id;
+ self.handle_action(&AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, val)));
+ }
+ }
+ }
+ } else {
+ for sb in &mut self.app.audio.sink_spinboxes {
+ if sb.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ for sb in &mut self.app.audio.source_spinboxes {
+ if sb.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ for slider in &mut self.app.audio.sink_sliders {
+ if slider.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ for slider in &mut self.app.audio.source_sliders {
+ if slider.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ }
+ }
+ if self.app.current_page == Page::Display {
+ if self.display_brightness_dragging {
+ if self.app.display.brightness_slider.drag_update(lx, ly) {
+ changed = true;
+ let val = self.app.display.brightness_slider.value();
+ let pct = (val * 100.0).round() as u32;
+ self.app.display.brightness_spinbox.value = pct as i32;
+ self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
+ }
+ } else {
+ if self.app.display.brightness_slider.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.display.brightness_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.display.night_light_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ for out in &mut self.app.display.outputs {
+ if out.name_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if out.resolution_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if let Some(ref mut scale_lbl) = out.scale_label {
+ if scale_lbl.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ }
+ if self.app.display.screensaver_enable_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.display.screensaver_lock_screen_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.display.screensaver_timeout_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.display.screensaver_style_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+
+ if self.app.current_page == Page::Hardware {
+ if self.app.hardware.cpu_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.hardware.cpu_usage_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.hardware.cpu_temp_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ for gpu_lbl in &mut self.app.hardware.gpu_labels {
+ if gpu_lbl.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.hardware.cpu_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.hardware.cpu_gov_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.hardware.gpu_gov_menu.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+
+ if self.app.current_page == Page::Packages {
+ let pkgs = &mut self.app.packages;
+ if pkgs.search_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ match pkgs.active_tab {
+ pages::packages::PackageTab::Installed => {
+ if pkgs.installed_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ let query = if pkgs.search_box.editing {
+ pkgs.search_box.edit_buffer.to_lowercase()
+ } else {
+ pkgs.search_box.text.to_lowercase()
+ };
+ let matching = pkgs.installed.iter()
+ .filter(|p| p.name.to_lowercase().contains(&query) || p.version.to_lowercase().contains(&query))
+ .count();
+ for i in 0..matching.min(pkgs.installed_items.len()) {
+ if pkgs.installed_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ }
+ pages::packages::PackageTab::Updates => {
+ if pkgs.updates_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ let query = if pkgs.search_box.editing {
+ pkgs.search_box.edit_buffer.to_lowercase()
+ } else {
+ pkgs.search_box.text.to_lowercase()
+ };
+ let matching = pkgs.updates.iter()
+ .filter(|p| p.name.to_lowercase().contains(&query))
+ .count();
+ for i in 0..matching.min(pkgs.updates_items.len()) {
+ if pkgs.updates_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ }
+ }
+ }
+
+
+
+ if self.app.current_page == Page::Services {
+ if self.app.services.search_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.list_box.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ let query = if self.app.services.search_box.editing {
+ self.app.services.search_box.edit_buffer.to_lowercase()
+ } else {
+ self.app.services.search_box.text.to_lowercase()
+ };
+ let matching_count = self.app.services.services.iter()
+ .filter(|s| s.is_system == (self.app.services.active_tab == pages::services::ServiceTab::System))
+ .filter(|s| s.name.to_lowercase().contains(&query) || s.description.to_lowercase().contains(&query))
+ .count();
+ for i in 0..matching_count.min(self.app.services.service_items.len()) {
+ if self.app.services.service_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.services.notifications_enable_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.notifications_bell_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.notifications_duration_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.status_label.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.status_separators_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.status_underline_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ if self.app.services.status_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
+ changed = true;
+ }
+ }
+ if self.app.current_page == Page::Accounts {
+ if self.app.accounts.editing_oauth_creds {
+ if self.app.accounts.oauth_client_id_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ if self.app.accounts.oauth_client_secret_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ } else if self.app.accounts.adding_new {
+ if self.app.accounts.email_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ if self.app.accounts.password_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ if self.app.accounts.imap_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ if self.app.accounts.smtp_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
+ }
+ }
+ if changed { self.needs_rebuild = true; }
+ changed
+ }
+
+ pub(crate) fn handle_mouse_input_internal(&mut self, button: cce_ui::widget::MouseButton, state: cce_ui::widget::ElementState) -> bool {
+ let s = 1.0f32;
+ let lx_no_scroll = self.cursor_x / s;
+ let ly_no_scroll = self.cursor_y / s;
+
+ // CSD Close Button Interaction removed
+
+ if cce_ui::widget::context_menu::is_visible() {
+ if cce_ui::widget::context_menu::mouse_input(button, state, lx_no_scroll, ly_no_scroll) {
+ let mut actions = Vec::new();
+ self.propagate_widget_changes(&mut actions);
+ for action in actions {
+ self.handle_action(&action);
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+ let mut handled = false;
+ if state == cce_ui::widget::ElementState::Pressed {
+ if lx_no_scroll < self.sidebar_width {
+ if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ use cce_ui::widget::MenuController;
+ if let Some((idx, _)) = self.menubar.menu_click() {
+ if idx < Page::ALL.len() {
+ cce_ui::widget::focus::clear_focus();
+ let new_page = Page::ALL[idx];
+ self.app.current_page = new_page;
+ self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
+ self.scroll_y = 0.0;
+ pages::interface::write_config_value("last_page", &format!("\"{}\"", new_page.label().to_lowercase()));
+ }
+ }
+ self.needs_rebuild = true;
+ handled = true;
+ }
+ } else {
+ if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ handled = true;
+ }
+ }
+ } else {
+ if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ use cce_ui::widget::MenuController;
+ if let Some((idx, _)) = self.menubar.menu_click() {
+ if idx < Page::ALL.len() {
+ cce_ui::widget::focus::clear_focus();
+ let new_page = Page::ALL[idx];
+ self.app.current_page = new_page;
+ self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
+ self.scroll_y = 0.0;
+ pages::interface::write_config_value("last_page", &format!("\"{}\"", new_page.label().to_lowercase()));
+ }
+ }
+ self.needs_rebuild = true;
+ handled = true;
+ }
+ if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ handled = true;
+ }
+ }
+ if handled {
+ return true;
+ }
+
+ if button != cce_ui::widget::MouseButton::Left && button != cce_ui::widget::MouseButton::Right { return false; }
+ if button == cce_ui::widget::MouseButton::Left && state == cce_ui::widget::ElementState::Released {
+ if self.app.current_page == Page::Audio {
+ let mut ended = false;
+ if let Some(idx) = self.audio_sink_dragging {
+ if idx < self.app.audio.sink_sliders.len() {
+ self.app.audio.sink_sliders[idx].drag_end();
+ }
+ self.audio_sink_dragging = None;
+ ended = true;
+ }
+ if let Some(idx) = self.audio_source_dragging {
+ if idx < self.app.audio.source_sliders.len() {
+ self.app.audio.source_sliders[idx].drag_end();
+ }
+ self.audio_source_dragging = None;
+ ended = true;
+ }
+ if ended {
+ self.needs_rebuild = true;
+ }
+ }
+ if self.app.current_page == Page::Display {
+ if self.display_brightness_dragging {
+ self.app.display.brightness_slider.drag_end();
+ self.display_brightness_dragging = false;
+ self.needs_rebuild = true;
+ }
+ }
+
+ let (px, py) = (self.cursor_x, self.cursor_y);
+ for (btn, action) in &self.page_buttons.clone() {
+ let base = btn.base().unwrap();
+ if px >= base.x && px <= base.x + base.w && py >= base.y && py <= base.y + base.h {
+ self.handle_action(action);
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ }
+ let lx = self.cursor_x / s;
+ let ly = self.cursor_y / s + self.scroll_y;
+ let mut actions = Vec::new();
+
+ if state == cce_ui::widget::ElementState::Pressed {
+ let mut clicked_any_focusable = false;
+ match self.app.current_page {
+ Page::Accounts => {
+ let accs = &mut self.app.accounts;
+ if accs.editing_oauth_creds {
+ if accs.oauth_client_id_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if accs.oauth_client_secret_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ } else if accs.adding_new {
+ if accs.email_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if accs.password_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if accs.imap_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if accs.smtp_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ }
+
+ Page::Interface => {
+ if self.app.interface.custom_multicontrol.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ for cp in &mut self.app.interface.color_selectors {
+ if cp.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ if self.app.interface.tab_margin_spinbox_x.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.menubar_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.tab_margin_spinbox_y.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.button_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.section_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.label_alignment_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.label_offset_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.label_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.plate_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_show_grid_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_snap_enabled_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_uniform_background_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_cell_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_gap_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.graph_gap_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.page_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.grid_min_col_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.spinbox_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.spinbox_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.toggle_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.toggle_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.plate_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.plate_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.page_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.layer_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+
+
+ if self.app.interface.color_selector_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.color_selector_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.color_selector_preview_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.color_selector_preview_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.color_selector_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.menubar_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.breadcrumb_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.nested_section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.textbox_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.textbox_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.slider_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.font_selector_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.font_selector_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.dropdown_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.dropdown_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.button_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.notification_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.window_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.interface.window_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ let tf = &mut self.app.interface;
+ if tf.sans_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.serif_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.mono_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.borders_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.borders_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.status_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.status_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.fuzzel_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.fuzzel_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.terminal_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.terminal_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ for sb in &mut tf.windows.spinboxes {
+ if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ if tf.windows.cascade_offset_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.edge_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.top_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.grid_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.transition_duration_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.status_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ for menu in &mut tf.windows.tag_layout_menus {
+ if menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ if tf.windows.side_panel_behavior_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.side_panel_position_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.side_panel_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.side_panel_border_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.side_panel_border_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.transparency_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if tf.windows.blur_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ Page::Input => {
+ if self.app.input.rate_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.delay_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.scroll_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.pointer_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.trackpad_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.trackpoint_accel_speed_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.trackpoint_accel_profile_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.zoom_in_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.zoom_out_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.input.keybinds_control.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+
+ Page::Audio => {
+ for sb in &mut self.app.audio.sink_spinboxes {
+ if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ for sb in &mut self.app.audio.source_spinboxes {
+ if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ for slider in &mut self.app.audio.sink_sliders {
+ if slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ for slider in &mut self.app.audio.source_sliders {
+ if slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ }
+ Page::Display => {
+ if self.app.display.brightness_slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.display.brightness_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.display.night_light_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ for out in &mut self.app.display.outputs {
+ if out.name_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if out.resolution_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if let Some(ref mut scale_lbl) = out.scale_label {
+ if scale_lbl.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ }
+ if self.app.display.screensaver_timeout_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if self.app.display.screensaver_style_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ Page::Services => {
+ let srv = &mut self.app.services;
+ if srv.search_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if srv.list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if srv.notifications_duration_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if srv.status_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if srv.status_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ Page::Packages => {
+ let pkgs = &mut self.app.packages;
+ if pkgs.search_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ match pkgs.active_tab {
+ pages::packages::PackageTab::Installed => {
+ if pkgs.installed_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ pages::packages::PackageTab::Updates => {
+ if pkgs.updates_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ }
+ }
+ Page::Hardware => {
+ let hw = &mut self.app.hardware;
+ if hw.cpu_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if hw.cpu_gov_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ if hw.gpu_gov_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ Page::Radios => {
+ let net = &mut self.app.network;
+ if net.wifi_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
+ }
+ _ => {}
+ }
+
+ if !clicked_any_focusable {
+ cce_ui::widget::focus::clear_focus();
+ }
+ }
+
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Interface {
+ let tf = &mut self.app.interface.windows;
+ for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetWidth(
+ pages::interface::WidthParam::ALL[i],
+ sb.value as u16,
+ )
+ )
+ ));
+ }
+ }
+ let sb = &mut tf.cascade_offset_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetCascadeOffset(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.edge_gap_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetEdgeGap(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.top_gap_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetTopGap(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.grid_gap_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetGridGap(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.transition_duration_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetTransitionDuration(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.status_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetStatusHeight(sb.value as u16)
+ )
+ ));
+ }
+ }
+ if self.app.current_page == Page::Interface {
+ let tf = &mut self.app.interface.windows;
+ for (idx, menu) in tf.tag_layout_menus.iter_mut().enumerate() {
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetTagLayout(idx + 1, menu.selected)
+ )
+ ));
+ }
+ }
+ let menu = &mut tf.side_panel_behavior_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBehavior(menu.selected)
+ )
+ ));
+ }
+ let menu = &mut tf.side_panel_position_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelPosition(menu.selected)
+ )
+ ));
+ }
+ let sb = &mut tf.side_panel_width_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelWidth(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.side_panel_border_gap_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBorderGap(sb.value as u16)
+ )
+ ));
+ }
+ let sb = &mut tf.side_panel_border_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBorderOpacity(sb.value as u16)
+ )
+ ));
+ }
+ let toggle = &mut tf.transparency_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::ToggleTransparency
+ )
+ ));
+ }
+ let toggle2 = &mut tf.blur_toggle;
+ toggle2.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle2.take_click() {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::ToggleBlur
+ )
+ ));
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Interface {
+ for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
+ let old = cp.color;
+ if !cp.hit_test(lx, ly, &self.ui_context) { cp.unfocus(); }
+ cp.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if cp.take_click() {
+ actions.push(AppAction::Interface(match i {
+ 0 => pages::interface::InterfaceMessage::PickPageLowColor,
+ 1 => pages::interface::InterfaceMessage::PickHighColor,
+ 2 => pages::interface::InterfaceMessage::PickVisualGuides,
+ 3 => pages::interface::InterfaceMessage::PickDisabledColor,
+ 4 => pages::interface::InterfaceMessage::PickSeparatorColor,
+ 5 => pages::interface::InterfaceMessage::PickSliderTrackColor,
+ 6 => pages::interface::InterfaceMessage::PickColorBordersColor,
+ 7 => pages::interface::InterfaceMessage::PickLowColor,
+ 8 => pages::interface::InterfaceMessage::PickNormalColor,
+ 9 => pages::interface::InterfaceMessage::PickPaginatorSidebarColor,
+ 10 => pages::interface::InterfaceMessage::PickPrimaryHighlightColor,
+ 11 => pages::interface::InterfaceMessage::PickMenubarTabLabelColor,
+ 12 => pages::interface::InterfaceMessage::PickToggleEnabledColor,
+ 13 => pages::interface::InterfaceMessage::PickToggleDisabledColor,
+ 14 => pages::interface::InterfaceMessage::PickScrollingListBgColor,
+ 15 => pages::interface::InterfaceMessage::PickBreadcrumbBgColor,
+ 16 => pages::interface::InterfaceMessage::PickPopoverBgColor,
+ 17 => pages::interface::InterfaceMessage::PickNotificationBgColor,
+ 18 => pages::interface::InterfaceMessage::PickWindowColor,
+ 19 => pages::interface::InterfaceMessage::PickPageColor,
+ 20 => pages::interface::InterfaceMessage::PickLayerColor,
+ _ => pages::interface::InterfaceMessage::PickLowColor,
+ }));
+ }
+ if cp.color != old {
+ actions.push(AppAction::Interface(match i {
+ 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
+ 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
+ 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
+ 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
+ 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
+ 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
+ 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
+ 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
+ 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
+ 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
+ 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
+ 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),
+ 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
+ 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
+ 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
+ 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
+ 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
+ _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ }));
+ }
+ }
+ let sb = &mut self.app.interface.menubar_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.notification_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.window_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.window_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.tab_margin_spinbox_x;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.tab_margin_spinbox_y;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.button_padding_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.section_padding_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(sb.value as u16)));
+ }
+ let menu = &mut self.app.interface.label_alignment_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(menu.selected)));
+ }
+ let sb = &mut self.app.interface.label_offset_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(sb.value as i16)));
+ }
+ let sb = &mut self.app.interface.label_margin_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.plate_padding_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(sb.value as u16)));
+ }
+ let toggle = &mut self.app.interface.graph_show_grid_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphShowGrid(toggle.toggled())));
+ }
+ let toggle = &mut self.app.interface.graph_snap_enabled_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphSnapEnabled(toggle.toggled())));
+ }
+ let toggle = &mut self.app.interface.graph_uniform_background_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphUniformBackground(toggle.toggled())));
+ }
+ let sb = &mut self.app.interface.graph_gap_width_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapWidth(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.graph_cell_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.graph_gap_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.page_margin_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.grid_min_col_width_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.spinbox_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.spinbox_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.toggle_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.toggle_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.plate_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.plate_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.page_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(sb.value as f32 / 100.0)));
+ }
+ let sb = &mut self.app.interface.layer_opacity_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(sb.value as f32 / 100.0)));
+ }
+
+
+ let sb = &mut self.app.interface.color_selector_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.color_selector_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.color_selector_preview_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.color_selector_preview_margin_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.textbox_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.textbox_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.slider_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.font_selector_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.font_selector_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.dropdown_height_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.dropdown_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(sb.value as u16)));
+ }
+ let sb = &mut self.app.interface.button_corner_radius_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(sb.value as u16)));
+ }
+ }
+
+ if self.app.current_page == Page::Interface {
+ let mc = &mut self.app.interface.custom_multicontrol;
+ if state == cce_ui::widget::ElementState::Pressed && !mc.hit_test(lx, ly, &self.ui_context) {
+ mc.unfocus();
+ }
+ if mc.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Input {
+ let sb = &mut self.app.input.rate_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ }
+ let sb = &mut self.app.input.delay_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ }
+ let sb = &mut self.app.input.scroll_friction_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
+ }
+ let sb = &mut self.app.input.scroll_speed_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
+ }
+ let sb = &mut self.app.input.pointer_friction_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
+ }
+ let sb = &mut self.app.input.trackpad_friction_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
+ }
+ let sb = &mut self.app.input.trackpoint_accel_speed_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
+ }
+ let sb = &mut self.app.input.cursor_size_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
+ }
+ let kc = &mut self.app.input.keybinds_control;
+ if state == cce_ui::widget::ElementState::Pressed && !kc.hit_test(lx, ly, &self.ui_context) {
+ kc.unfocus();
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Services {
+ let sb = &mut self.app.services.notifications_duration_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(sb.value)));
+ }
+ let sb2 = &mut self.app.services.status_padding_spinbox;
+ if !sb2.hit_test(lx, ly, &self.ui_context) { sb2.unfocus(); }
+ let old2 = sb2.value;
+ if sb2.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb2.value != old2 {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(sb2.value as u16)));
+ }
+ }
+ if self.app.current_page == Page::Input {
+ let toggle = &mut self.app.input.tap_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleTapToClick));
+ }
+ let toggle = &mut self.app.input.scroll_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialScroll));
+ }
+ let toggle = &mut self.app.input.natural_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleNaturalScroll));
+ }
+ let toggle = &mut self.app.input.pointer_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialPointer));
+ }
+ let toggle = &mut self.app.input.trackpad_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialTrackpad));
+ }
+ let toggle = &mut self.app.input.dwtp_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleDwtp));
+ }
+ let menu = &mut self.app.input.trackpoint_accel_profile_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelProfile(menu.selected)));
+ }
+ let menu = &mut self.app.input.cursor_theme_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorTheme(menu.selected)));
+ }
+
+ let tb = &mut self.app.input.zoom_in_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
+ }
+
+ let tb = &mut self.app.input.zoom_out_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
+ }
+ let kc = &mut self.app.input.keybinds_control;
+ if kc.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if kc.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
+ self.needs_rebuild = true;
+ }
+ }
+ if self.app.current_page == Page::Services {
+ let toggle = &mut self.app.services.notifications_enable_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsEnable));
+ }
+ let toggle = &mut self.app.services.notifications_bell_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsBell));
+ }
+ if state == cce_ui::widget::ElementState::Pressed {
+ let lbl1 = &mut self.app.services.status_label;
+ if !lbl1.hit_test(lx, ly, &self.ui_context) { lbl1.unfocus(); }
+ lbl1.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ }
+ let toggle = &mut self.app.services.status_separators_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleSeparators));
+ }
+ let toggle2 = &mut self.app.services.status_underline_toggle;
+ toggle2.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle2.take_click() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleUnderline));
+ }
+ }
+ if self.app.current_page == Page::Display {
+ let toggle = &mut self.app.display.screensaver_enable_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverEnable));
+ }
+
+ let toggle = &mut self.app.display.screensaver_lock_screen_toggle;
+ toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if toggle.take_click() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverLockScreen));
+ }
+
+ let menu = &mut self.app.display.screensaver_style_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(menu.selected)));
+ }
+ }
+ if self.app.current_page == Page::Hardware {
+ let menu = &mut self.app.hardware.cpu_gov_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ if menu.selected == 0 {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPerformance));
+ } else {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPowersave));
+ }
+ }
+
+ let menu = &mut self.app.hardware.gpu_gov_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ if menu.selected == 0 {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuDefault));
+ } else {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuPowersave));
+ }
+ }
+ }
+
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Audio {
+ if button == cce_ui::widget::MouseButton::Left {
+ for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
+ if slider.hit_test(lx, ly, &self.ui_context) {
+ slider.drag_begin(lx, ly);
+ self.audio_sink_dragging = Some(i);
+ self.needs_rebuild = true;
+ }
+ }
+ for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
+ if slider.hit_test(lx, ly, &self.ui_context) {
+ slider.drag_begin(lx, ly);
+ self.audio_source_dragging = Some(i);
+ self.needs_rebuild = true;
+ }
+ }
+ }
+ for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ let id = self.app.audio.sinks[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ let id = self.app.audio.sources[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Display {
+ if button == cce_ui::widget::MouseButton::Left {
+ let slider = &mut self.app.display.brightness_slider;
+ if slider.hit_test(lx, ly, &self.ui_context) {
+ slider.drag_begin(lx, ly);
+ self.display_brightness_dragging = true;
+ self.needs_rebuild = true;
+ }
+ }
+ let sb = &mut self.app.display.brightness_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(sb.value as u32)));
+ }
+ let lbl = &mut self.app.display.night_light_label;
+ if !lbl.hit_test(lx, ly, &self.ui_context) { lbl.unfocus(); }
+ lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
+
+ for out in &mut self.app.display.outputs {
+ let lbl = &mut out.name_label;
+ if !lbl.hit_test(lx, ly, &self.ui_context) { lbl.unfocus(); }
+ lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
+
+ let lbl2 = &mut out.resolution_label;
+ if !lbl2.hit_test(lx, ly, &self.ui_context) { lbl2.unfocus(); }
+ lbl2.mouse_input(button, state, lx, ly, &mut self.ui_context);
+
+ if let Some(ref mut scale_lbl) = out.scale_label {
+ if !scale_lbl.hit_test(lx, ly, &self.ui_context) { scale_lbl.unfocus(); }
+ scale_lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ }
+ }
+
+ let sb = &mut self.app.display.screensaver_timeout_spinbox;
+ if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(sb.value)));
+ }
+ }
+
+ if self.app.current_page == Page::Accounts {
+ if self.app.accounts.editing_oauth_creds {
+ let tb = &mut self.app.accounts.oauth_client_id_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+
+ let tb = &mut self.app.accounts.oauth_client_secret_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ } else if self.app.accounts.adding_new {
+ let tb = &mut self.app.accounts.email_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ let email_val = tb.text.trim().to_lowercase();
+ if email_val.ends_with("@gmail.com") {
+ self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
+ } else if email_val.ends_with("@icloud.com") {
+ self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
+ } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
+ self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
+ }
+ }
+
+ let tb = &mut self.app.accounts.password_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+
+ let tb = &mut self.app.accounts.imap_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+
+ let tb = &mut self.app.accounts.smtp_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ }
+ }
+ if self.app.current_page == Page::Interface {
+ let tb = &mut self.app.interface.sans_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(tb.text.clone())));
+ }
+
+ let tb = &mut self.app.interface.serif_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(tb.text.clone())));
+ }
+
+ let tb = &mut self.app.interface.mono_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(tb.text.clone())));
+ }
+
+ let menu = &mut self.app.interface.borders_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersMenu(menu.selected)));
+ }
+
+ let tb = &mut self.app.interface.borders_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(tb.text.clone())));
+ }
+
+ let menu = &mut self.app.interface.status_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusMenu(menu.selected)));
+ }
+
+ let tb = &mut self.app.interface.status_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(tb.text.clone())));
+ }
+
+ let menu = &mut self.app.interface.fuzzel_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelMenu(menu.selected)));
+ }
+
+ let tb = &mut self.app.interface.fuzzel_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(tb.text.clone())));
+ }
+
+ let menu = &mut self.app.interface.terminal_menu;
+ if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
+ if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalMenu(menu.selected)));
+ }
+
+ let tb = &mut self.app.interface.terminal_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(tb.text.clone())));
+ }
+
+
+
+
+
+ let fs = &mut self.app.interface.color_selector_font_selector;
+ if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+ if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if fs.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorFont(fs.font_family.clone())));
+ }
+
+ let fs = &mut self.app.interface.menubar_font_selector;
+ if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+ if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if fs.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarFont(fs.font_family.clone())));
+ }
+
+ let fs = &mut self.app.interface.breadcrumb_font_selector;
+ if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+ if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if fs.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBreadcrumbFont(fs.font_family.clone())));
+ }
+
+ let fs = &mut self.app.interface.section_label_font_selector;
+ if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+ if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if fs.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionLabelFont(fs.font_family.clone())));
+ }
+
+ let fs = &mut self.app.interface.nested_section_label_font_selector;
+ if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
+ if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if fs.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelFont(fs.font_family.clone())));
+ }
+
+ let sb = &mut self.app.interface.borders_size_box;
+ if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old_val = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if sb.value != old_val {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(sb.value)));
+ }
+
+ let sb = &mut self.app.interface.status_size_box;
+ if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old_val = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if sb.value != old_val {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(sb.value)));
+ }
+
+ let sb = &mut self.app.interface.fuzzel_size_box;
+ if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old_val = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if sb.value != old_val {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelSize(sb.value)));
+ }
+
+ let sb = &mut self.app.interface.terminal_size_box;
+ if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
+ let old_val = sb.value;
+ if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if sb.value != old_val {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalSize(sb.value)));
+ }
+
+
+
+
+ }
+ if self.app.current_page == Page::Services {
+ let tb = &mut self.app.services.search_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ let srv = &mut self.app.services;
+ if srv.list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ let query = if srv.search_box.editing {
+ srv.search_box.edit_buffer.to_lowercase()
+ } else {
+ srv.search_box.text.to_lowercase()
+ };
+ let matching_count = srv.services.iter()
+ .filter(|s| s.is_system == (srv.active_tab == pages::services::ServiceTab::System))
+ .filter(|s| s.name.to_lowercase().contains(&query) || s.description.to_lowercase().contains(&query))
+ .count();
+ for i in 0..matching_count.min(srv.service_items.len()) {
+ if srv.service_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ }
+ }
+ if self.app.current_page == Page::Packages {
+ let pkgs = &mut self.app.packages;
+ let tb = &mut pkgs.search_box;
+ if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) {
+ tb.unfocus();
+ }
+ if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ match pkgs.active_tab {
+ pages::packages::PackageTab::Installed => {
+ if pkgs.installed_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ let query = if pkgs.search_box.editing {
+ pkgs.search_box.edit_buffer.to_lowercase()
+ } else {
+ pkgs.search_box.text.to_lowercase()
+ };
+ let filtered: Vec<&pages::packages::PackageInfo> = pkgs.installed.iter()
+ .filter(|p| p.name.to_lowercase().contains(&query) || p.version.to_lowercase().contains(&query))
+ .collect();
+ let matching = filtered.len();
+ for i in 0..matching.min(pkgs.installed_items.len()) {
+ if pkgs.installed_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if pkgs.installed_items[i].take_click() {
+ let pkg_name = filtered[i].name.clone();
+ actions.push(AppAction::Packages(pages::packages::PackagesMessage::SelectPackage(Some(pkg_name))));
+ }
+ }
+ }
+ pages::packages::PackageTab::Updates => {
+ if pkgs.updates_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ let query = if pkgs.search_box.editing {
+ pkgs.search_box.edit_buffer.to_lowercase()
+ } else {
+ pkgs.search_box.text.to_lowercase()
+ };
+ let filtered: Vec<&pages::packages::UpdateInfo> = pkgs.updates.iter()
+ .filter(|p| p.name.to_lowercase().contains(&query))
+ .collect();
+ let matching = filtered.len();
+ for i in 0..matching.min(pkgs.updates_items.len()) {
+ if pkgs.updates_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ if pkgs.updates_items[i].take_click() {
+ let pkg_name = filtered[i].name.clone();
+ actions.push(AppAction::Packages(pages::packages::PackagesMessage::SelectPackage(Some(pkg_name))));
+ }
+ }
+ }
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Hardware {
+ let hw = &mut self.app.hardware;
+ if hw.cpu_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ }
+ if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Radios {
+ let net = &mut self.app.network;
+ if net.wifi_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ }
+ net.wifi_toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if net.wifi_toggle.take_click() {
+ actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleWifi));
+ }
+ net.bt_toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
+ if net.bt_toggle.take_click() {
+ actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleBluetooth));
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if !actions.is_empty() {
+ self.needs_rebuild = true;
+ return true;
+ }
+ self.needs_rebuild = true;
+ true
+ }
+
+ pub(crate) fn propagate_widget_changes(&mut self, actions: &mut Vec<AppAction>) {
+ match self.app.current_page {
+ Page::Interface => {
+ for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
+ if cp.take_change() {
+ actions.push(AppAction::Interface(match i {
+ 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
+ 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
+ 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
+ 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
+ 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
+ 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
+ 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
+ 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
+ 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
+ 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
+ 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
+ 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),
+ 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
+ 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
+ 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
+ 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
+ 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
+ _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ }));
+ }
+ }
+ if self.app.interface.notification_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(self.app.interface.notification_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.menubar_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(self.app.interface.menubar_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.tab_margin_spinbox_x.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(self.app.interface.tab_margin_spinbox_x.value as u16)));
+ }
+ if self.app.interface.tab_margin_spinbox_y.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(self.app.interface.tab_margin_spinbox_y.value as u16)));
+ }
+ if self.app.interface.button_padding_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(self.app.interface.button_padding_spinbox.value as u16)));
+ }
+ if self.app.interface.section_padding_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(self.app.interface.section_padding_spinbox.value as u16)));
+ }
+ if self.app.interface.label_alignment_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(self.app.interface.label_alignment_menu.selected)));
+ }
+ if self.app.interface.label_offset_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(self.app.interface.label_offset_spinbox.value as i16)));
+ }
+ if self.app.interface.label_margin_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(self.app.interface.label_margin_spinbox.value as u16)));
+ }
+ if self.app.interface.plate_padding_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(self.app.interface.plate_padding_spinbox.value as u16)));
+ }
+ if self.app.interface.graph_show_grid_toggle.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphShowGrid(self.app.interface.graph_show_grid_toggle.toggled())));
+ }
+ if self.app.interface.graph_snap_enabled_toggle.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphSnapEnabled(self.app.interface.graph_snap_enabled_toggle.toggled())));
+ }
+ if self.app.interface.graph_uniform_background_toggle.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphUniformBackground(self.app.interface.graph_uniform_background_toggle.toggled())));
+ }
+ if self.app.interface.graph_cell_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(self.app.interface.graph_cell_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.graph_gap_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(self.app.interface.graph_gap_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.page_margin_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(self.app.interface.page_margin_spinbox.value as u16)));
+ }
+ if self.app.interface.grid_min_col_width_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(self.app.interface.grid_min_col_width_spinbox.value as u16)));
+ }
+ if self.app.interface.spinbox_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(self.app.interface.spinbox_height_spinbox.value as u16)));
+ }
+ if self.app.interface.spinbox_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(self.app.interface.spinbox_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.toggle_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(self.app.interface.toggle_height_spinbox.value as u16)));
+ }
+ if self.app.interface.toggle_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(self.app.interface.toggle_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.plate_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(self.app.interface.plate_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.plate_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(self.app.interface.plate_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.page_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(self.app.interface.page_opacity_spinbox.value as f32 / 100.0)));
+ }
+ if self.app.interface.layer_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(self.app.interface.layer_opacity_spinbox.value as f32 / 100.0)));
+ }
+
+
+ if self.app.interface.color_selector_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(self.app.interface.color_selector_height_spinbox.value as u16)));
+ }
+ if self.app.interface.color_selector_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(self.app.interface.color_selector_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.color_selector_preview_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(self.app.interface.color_selector_preview_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.color_selector_preview_margin_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(self.app.interface.color_selector_preview_margin_spinbox.value as u16)));
+ }
+ if self.app.interface.textbox_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(self.app.interface.textbox_height_spinbox.value as u16)));
+ }
+ if self.app.interface.textbox_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(self.app.interface.textbox_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.slider_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(self.app.interface.slider_height_spinbox.value as u16)));
+ }
+ if self.app.interface.font_selector_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(self.app.interface.font_selector_height_spinbox.value as u16)));
+ }
+ if self.app.interface.font_selector_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(self.app.interface.font_selector_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.dropdown_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(self.app.interface.dropdown_height_spinbox.value as u16)));
+ }
+ if self.app.interface.dropdown_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(self.app.interface.dropdown_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.button_corner_radius_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(self.app.interface.button_corner_radius_spinbox.value as u16)));
+ }
+ if self.app.interface.sans_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(self.app.interface.sans_box.text.clone())));
+ }
+ if self.app.interface.serif_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(self.app.interface.serif_box.text.clone())));
+ }
+ if self.app.interface.mono_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(self.app.interface.mono_box.text.clone())));
+ }
+ if self.app.interface.borders_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersMenu(self.app.interface.borders_menu.selected)));
+ }
+ if self.app.interface.borders_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(self.app.interface.borders_box.text.clone())));
+ }
+ if self.app.interface.status_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusMenu(self.app.interface.status_menu.selected)));
+ }
+ if self.app.interface.status_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(self.app.interface.status_box.text.clone())));
+ }
+ if self.app.interface.fuzzel_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelMenu(self.app.interface.fuzzel_menu.selected)));
+ }
+ if self.app.interface.fuzzel_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(self.app.interface.fuzzel_box.text.clone())));
+ }
+ if self.app.interface.terminal_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalMenu(self.app.interface.terminal_menu.selected)));
+ }
+ if self.app.interface.terminal_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(self.app.interface.terminal_box.text.clone())));
+ }
+ if self.app.interface.color_selector_font_selector.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorFont(self.app.interface.color_selector_font_selector.font_family.clone())));
+ }
+ if self.app.interface.menubar_font_selector.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarFont(self.app.interface.menubar_font_selector.font_family.clone())));
+ }
+ if self.app.interface.section_label_font_selector.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionLabelFont(self.app.interface.section_label_font_selector.font_family.clone())));
+ }
+ if self.app.interface.nested_section_label_font_selector.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelFont(self.app.interface.nested_section_label_font_selector.font_family.clone())));
+ }
+ if self.app.interface.borders_size_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(self.app.interface.borders_size_box.value)));
+ }
+ if self.app.interface.status_size_box.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(self.app.interface.status_size_box.value)));
+ }
+
+ let tf = &mut self.app.interface.windows;
+ for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
+ if sb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetWidth(pages::interface::WidthParam::ALL[i], sb.value as u16))));
+ }
+ }
+ if tf.cascade_offset_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetCascadeOffset(tf.cascade_offset_spinbox.value as u16))));
+ }
+ if tf.edge_gap_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetEdgeGap(tf.edge_gap_spinbox.value as u16))));
+ }
+ if tf.top_gap_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTopGap(tf.top_gap_spinbox.value as u16))));
+ }
+ if tf.grid_gap_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetGridGap(tf.grid_gap_spinbox.value as u16))));
+ }
+ if tf.transition_duration_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTransitionDuration(tf.transition_duration_spinbox.value as u16))));
+ }
+ if tf.status_height_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetStatusHeight(tf.status_height_spinbox.value as u16))));
+ }
+ for (idx, menu) in tf.tag_layout_menus.iter_mut().enumerate() {
+ if menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTagLayout(idx + 1, menu.selected))));
+ }
+ }
+ if tf.side_panel_behavior_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBehavior(tf.side_panel_behavior_menu.selected))));
+ }
+ if tf.side_panel_position_menu.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelPosition(tf.side_panel_position_menu.selected))));
+ }
+ if tf.side_panel_width_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelWidth(tf.side_panel_width_spinbox.value as u16))));
+ }
+ if tf.side_panel_border_gap_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBorderGap(tf.side_panel_border_gap_spinbox.value as u16))));
+ }
+ if tf.side_panel_border_opacity_spinbox.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBorderOpacity(tf.side_panel_border_opacity_spinbox.value as u16))));
+ }
+ }
+ Page::Input => {
+ if self.app.input.rate_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ }
+ if self.app.input.delay_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ }
+ if self.app.input.scroll_friction_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
+ }
+ if self.app.input.scroll_speed_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
+ }
+ if self.app.input.pointer_friction_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
+ }
+ if self.app.input.trackpad_friction_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
+ }
+ if self.app.input.trackpoint_accel_speed_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
+ }
+ if self.app.input.cursor_size_spinbox.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
+ }
+ if self.app.input.tap_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleTapToClick));
+ }
+ if self.app.input.scroll_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialScroll));
+ }
+ if self.app.input.natural_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleNaturalScroll));
+ }
+ if self.app.input.pointer_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialPointer));
+ }
+ if self.app.input.trackpad_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialTrackpad));
+ }
+ if self.app.input.dwtp_toggle.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ToggleDwtp));
+ }
+ if self.app.input.trackpoint_accel_profile_menu.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelProfile(self.app.input.trackpoint_accel_profile_menu.selected)));
+ }
+ if self.app.input.cursor_theme_menu.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorTheme(self.app.input.cursor_theme_menu.selected)));
+ }
+ if self.app.input.zoom_in_box.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
+ }
+ if self.app.input.zoom_out_box.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
+ }
+ if self.app.input.keybinds_control.take_change() {
+ actions.push(AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
+ }
+ }
+ Page::Services => {
+ if self.app.services.notifications_duration_spinbox.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(self.app.services.notifications_duration_spinbox.value)));
+ }
+ if self.app.services.status_padding_spinbox.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(self.app.services.status_padding_spinbox.value as u16)));
+ }
+ if self.app.services.notifications_enable_toggle.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsEnable));
+ }
+ if self.app.services.notifications_bell_toggle.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsBell));
+ }
+ if self.app.services.status_separators_toggle.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleSeparators));
+ }
+ if self.app.services.status_underline_toggle.take_change() {
+ actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleUnderline));
+ }
+ }
+ Page::Display => {
+ if self.app.display.screensaver_enable_toggle.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverEnable));
+ }
+ if self.app.display.screensaver_lock_screen_toggle.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverLockScreen));
+ }
+ if self.app.display.screensaver_style_menu.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(self.app.display.screensaver_style_menu.selected)));
+ }
+ if self.app.display.brightness_spinbox.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(self.app.display.brightness_spinbox.value as u32)));
+ }
+ if self.app.display.brightness_slider.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet((self.app.display.brightness_slider.value() * 100.0).round() as u32)));
+ }
+ if self.app.display.screensaver_timeout_spinbox.take_change() {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(self.app.display.screensaver_timeout_spinbox.value)));
+ }
+ }
+ Page::Hardware => {
+ if self.app.hardware.cpu_gov_menu.take_change() {
+ if self.app.hardware.cpu_gov_menu.selected == 0 {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPerformance));
+ } else {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPowersave));
+ }
+ }
+ if self.app.hardware.gpu_gov_menu.take_change() {
+ if self.app.hardware.gpu_gov_menu.selected == 0 {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuDefault));
+ } else {
+ actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuPowersave));
+ }
+ }
+ }
+ Page::Accounts => {
+ if self.app.accounts.adding_new && self.app.accounts.email_box.take_change() {
+ let email_val = self.app.accounts.email_box.text.trim().to_lowercase();
+ if email_val.ends_with("@gmail.com") {
+ self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
+ } else if email_val.ends_with("@icloud.com") {
+ self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
+ } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
+ self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
+ }
+ }
+ }
+ Page::Audio => {
+ for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
+ if sb.take_change() {
+ let id = self.app.audio.sinks[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
+ if sb.take_change() {
+ let id = self.app.audio.sources[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
+ if slider.take_change() {
+ let id = self.app.audio.sinks[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, slider.value() as f32 / 100.0)));
+ }
+ }
+ for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
+ if slider.take_change() {
+ let id = self.app.audio.sources[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, slider.value() as f32 / 100.0)));
+ }
+ }
+ }
+ Page::Radios => {
+ let net = &mut self.app.network;
+ if net.wifi_toggle.take_change() {
+ actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleWifi));
+ }
+ if net.bt_toggle.take_change() {
+ actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleBluetooth));
+ }
+ }
+ _ => {}
+ }
+ }
+
+ pub(crate) fn handle_mouse_wheel_internal(&mut self, delta: &cce_ui::widget::MouseScrollDelta, px: f32, py: f32) -> bool {
+ if let Ok(mut file) = std::fs::OpenOptions::new().create(true).append(true).open("/tmp/cce-scroll-debug.log") {
+ use std::io::Write;
+ let _ = writeln!(file, "handle_mouse_wheel_internal: px={}, py={}, delta={:?}, sidebar_w={}", px, py, delta, self.sidebar_width);
+ }
+ let s = 1.0f32;
+ if px >= self.sidebar_width * s {
+ let lx = px / s;
+ let ly = py / s + self.scroll_y;
+
+ if self.app.current_page == Page::Input {
+ let input = &self.app.input;
+ if input.is_over_trackpad(lx, ly, &self.ui_context) {
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Audio {
+ let mut actions = Vec::new();
+ for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
+ let old = sb.value;
+ if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb.value != old {
+ let id = self.app.audio.sinks[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ }
+ for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
+ let old = sb.value;
+ if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb.value != old {
+ let id = self.app.audio.sources[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ }
+ for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
+ let old = slider.value();
+ if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ let new_val = slider.value();
+ if new_val != old {
+ let id = self.app.audio.sinks[i].id;
+ if i < self.app.audio.sink_spinboxes.len() {
+ self.app.audio.sink_spinboxes[i].value = (new_val * 100.0).round() as i32;
+ }
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, new_val)));
+ }
+ }
+ }
+ for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
+ let old = slider.value();
+ if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ let new_val = slider.value();
+ if new_val != old {
+ let id = self.app.audio.sources[i].id;
+ if i < self.app.audio.source_spinboxes.len() {
+ self.app.audio.source_spinboxes[i].value = (new_val * 100.0).round() as i32;
+ }
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, new_val)));
+ }
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if !actions.is_empty() {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+ if self.app.current_page == Page::Display {
+ let mut actions = Vec::new();
+ let slider = &mut self.app.display.brightness_slider;
+ let old_val = slider.value();
+ if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ let new_val = slider.value();
+ if new_val != old_val {
+ let pct = (new_val * 100.0).round() as u32;
+ self.app.display.brightness_spinbox.value = pct as i32;
+ actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
+ }
+ }
+ let sb = &mut self.app.display.brightness_spinbox;
+ let old = sb.value;
+ if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(sb.value as u32)));
+ }
+ }
+ let sb2 = &mut self.app.display.screensaver_timeout_spinbox;
+ let old2 = sb2.value;
+ if sb2.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb2.value != old2 {
+ actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(sb2.value)));
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if !actions.is_empty() {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+
+ if self.app.current_page == Page::Interface {
+ let mut actions = Vec::new();
+ let sb = &mut self.app.interface.graph_cell_opacity_spinbox;
+ let old = sb.value;
+ if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(sb.value as f32 / 100.0)));
+ }
+ }
+ let sb2 = &mut self.app.interface.graph_gap_opacity_spinbox;
+ let old2 = sb2.value;
+ if sb2.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb2.value != old2 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(sb2.value as f32 / 100.0)));
+ }
+ }
+ let sb3 = &mut self.app.interface.window_opacity_spinbox;
+ let old3 = sb3.value;
+ if sb3.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb3.value != old3 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(sb3.value as f32 / 100.0)));
+ }
+ }
+ let sb4 = &mut self.app.interface.window_corner_radius_spinbox;
+ let old4 = sb4.value;
+ if sb4.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb4.value != old4 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(sb4.value as u16)));
+ }
+ }
+ let sb5 = &mut self.app.interface.plate_opacity_spinbox;
+ let old5 = sb5.value;
+ if sb5.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb5.value != old5 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(sb5.value as f32 / 100.0)));
+ }
+ }
+ let sb6 = &mut self.app.interface.plate_corner_radius_spinbox;
+ let old6 = sb6.value;
+ if sb6.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb6.value != old6 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(sb6.value as u16)));
+ }
+ }
+ let sb7 = &mut self.app.interface.page_opacity_spinbox;
+ let old7 = sb7.value;
+ if sb7.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb7.value != old7 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(sb7.value as f32 / 100.0)));
+ }
+ }
+ let sb8 = &mut self.app.interface.layer_opacity_spinbox;
+ let old8 = sb8.value;
+ if sb8.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ if sb8.value != old8 {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(sb8.value as f32 / 100.0)));
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if !actions.is_empty() {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+ if self.app.current_page == Page::Services {
+ let srv = &mut self.app.services;
+ if srv.list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Packages {
+ let pkgs = &mut self.app.packages;
+ match pkgs.active_tab {
+ pages::packages::PackageTab::Installed => {
+ if pkgs.installed_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ pages::packages::PackageTab::Updates => {
+ if pkgs.updates_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ }
+ }
+ if self.app.current_page == Page::Hardware {
+ let hw = &mut self.app.hardware;
+ if hw.cpu_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Radios {
+ let net = &mut self.app.network;
+ if net.wifi_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+ let scroll_speed = 24.0;
+ let dy = match delta {
+ cce_ui::widget::MouseScrollDelta::LineDelta(_, y) => -y * scroll_speed,
+ cce_ui::widget::MouseScrollDelta::PixelDelta(pos) => -pos.y as f32,
+ };
+ let old_scroll = self.scroll_y;
+ self.scroll_y = (self.scroll_y + dy).max(0.0).min(self.max_scroll_y);
+ if (self.scroll_y - old_scroll).abs() > 0.01 {
+ self.needs_rebuild = true;
+ return true;
+ }
+ } else {
+ let lx = px / s;
+ let ly = py / s;
+ if self.menubar.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ false
+ }
+
+ pub(crate) fn get_page_root_widget(&mut self) -> Option<*mut (dyn cce_ui::widget::Element + 'static)> {
+ let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
+ let ptr = &mut self.plates[page_idx] as &mut dyn cce_ui::widget::Element as *mut dyn cce_ui::widget::Element;
+ let static_ptr = unsafe {
+ std::mem::transmute::<*mut dyn cce_ui::widget::Element, *mut (dyn cce_ui::widget::Element + 'static)>(ptr)
+ };
+ Some(static_ptr)
+ }
+
+ pub(crate) fn handle_key_input_internal(&mut self, event: &cce_ui::widget::KeyEvent) -> bool {
+ if cce_ui::widget::context_menu::is_visible() {
+ if event.state == cce_ui::widget::ElementState::Pressed
+ && event.logical_key == cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Escape)
+ {
+ cce_ui::widget::context_menu::hide();
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+ if event.state == cce_ui::widget::ElementState::Pressed && !event.repeat {
+ let is_nav_key = match (&event.logical_key, event.ctrl) {
+ (cce_ui::widget::Key::Character(c), true) if c == "j" || c == "J" || c == "k" || c == "K" || c == "u" || c == "U" || c == "i" || c == "I" => true,
+ _ => false,
+ };
+ if is_nav_key {
+ if cce_ui::widget::focus::has_focus() {
+ if cce_ui::widget::focus::navigate_focus(&event.logical_key, event.ctrl) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ } else {
+ if let Some(root_ptr) = self.get_page_root_widget() {
+ unsafe {
+ let root_ref = &mut *root_ptr;
+ cce_ui::widget::focus::set_focused(root_ref);
+ root_ref.focus();
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ if self.app.current_page == Page::Interface {
+ let mc = &mut self.app.interface.custom_multicontrol;
+ if mc.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ let mut changed = false;
+ let mut actions = Vec::new();
+ for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
+ let old = cp.color;
+ if cp.keyboard_input(event, &mut self.ui_context) {
+ if cp.color != old {
+ actions.push(AppAction::Interface(match i {
+ 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
+ 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
+ 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
+ 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
+ 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
+ 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
+ 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
+ 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
+ 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
+ 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
+ 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
+ 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),
+ 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
+ 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
+ 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
+ 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
+ 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
+ _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
+ }));
+ }
+ changed = true;
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if changed {
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.notification_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.window_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.window_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.menubar_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.graph_gap_width_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapWidth(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.tab_margin_spinbox_x;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.tab_margin_spinbox_y;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.button_padding_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.section_padding_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let (menu_changed, old_selected, new_selected) = {
+ let menu = &mut self.app.interface.label_alignment_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if menu_changed {
+ if new_selected != old_selected {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(new_selected)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.label_offset_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(new_val as i16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.label_margin_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.plate_padding_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.page_margin_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.grid_min_col_width_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.spinbox_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.spinbox_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.toggle_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.toggle_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.plate_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.plate_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.page_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.layer_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(new_val as f32 / 100.0)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+
+
+ let sb = &mut self.app.interface.color_selector_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.color_selector_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.color_selector_preview_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.color_selector_preview_margin_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.textbox_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.textbox_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.slider_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.font_selector_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.font_selector_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.dropdown_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.dropdown_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.interface.button_corner_radius_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+
+
+
+ let mut actions = Vec::new();
+ let mut consumed = false;
+
+ let tf = &mut self.app.interface;
+ let tb = &mut tf.sans_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.serif_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.mono_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.borders_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.status_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.fuzzel_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+ let tb = &mut self.app.interface.terminal_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ if tb.take_change() {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(tb.text.clone())));
+ }
+ consumed = true;
+ }
+
+
+
+
+
+ let sb = &mut self.app.interface.borders_size_box;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(sb.value)));
+ consumed = true;
+ }
+
+ let sb = &mut self.app.interface.status_size_box;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(sb.value)));
+ consumed = true;
+ }
+
+ let sb = &mut self.app.interface.fuzzel_size_box;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelSize(sb.value)));
+ consumed = true;
+ }
+
+ let sb = &mut self.app.interface.terminal_size_box;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalSize(sb.value)));
+ consumed = true;
+ }
+
+
+
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if consumed {
+ self.needs_rebuild = true;
+ return true;
+ }
+
+ let mut changed = false;
+ let mut actions = Vec::new();
+ {
+ let tf = &mut self.app.interface.windows;
+ for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetWidth(
+ pages::interface::WidthParam::ALL[i],
+ sb.value as u16,
+ )
+ )
+ ));
+ }
+ changed = true;
+ }
+ }
+ let sb = &mut tf.cascade_offset_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetCascadeOffset(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.edge_gap_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetEdgeGap(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.top_gap_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetTopGap(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.grid_gap_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetGridGap(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.transition_duration_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetTransitionDuration(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.status_height_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetStatusHeight(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let (menu_changed, old_selected, new_selected) = {
+ let menu = &mut tf.side_panel_behavior_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if menu_changed {
+ if new_selected != old_selected {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBehavior(new_selected)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let (menu_changed, old_selected, new_selected) = {
+ let menu = &mut tf.side_panel_position_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if menu_changed {
+ if new_selected != old_selected {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelPosition(new_selected)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.side_panel_width_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelWidth(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.side_panel_border_gap_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBorderGap(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ let sb = &mut tf.side_panel_border_opacity_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ actions.push(AppAction::Interface(
+ pages::interface::InterfaceMessage::Windows(
+ pages::interface::WindowsMessage::SetSidePanelBorderOpacity(sb.value as u16)
+ )
+ ));
+ }
+ changed = true;
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if changed {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Services {
+ let sb = &mut self.app.services.notifications_duration_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(new_val)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.services.status_padding_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(new_val as u16)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Input {
+ if self.app.input.rate_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.delay_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyRepeat));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.scroll_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.scroll_speed_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.pointer_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.trackpad_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.trackpoint_accel_speed_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.cursor_size_spinbox.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.zoom_in_box.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.zoom_out_box.keyboard_input(event, &mut self.ui_context) {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
+ self.needs_rebuild = true;
+ return true;
+ }
+ if self.app.input.keybinds_control.keyboard_input(event, &mut self.ui_context) {
+ if self.app.input.keybinds_control.take_change() {
+ self.handle_action(&AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Accounts {
+ let mut consumed = false;
+ if self.app.accounts.editing_oauth_creds {
+ let tb = &mut self.app.accounts.oauth_client_id_box;
+ if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
+ let tb = &mut self.app.accounts.oauth_client_secret_box;
+ if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
+ } else if self.app.accounts.adding_new {
+ let tb = &mut self.app.accounts.email_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ consumed = true;
+ let email_val = tb.edit_buffer.trim().to_lowercase();
+ if email_val.ends_with("@gmail.com") {
+ self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
+ } else if email_val.ends_with("@icloud.com") {
+ self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
+ } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
+ self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
+ self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
+ self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
+ self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
+ }
+ }
+ let tb = &mut self.app.accounts.password_box;
+ if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
+ let tb = &mut self.app.accounts.imap_box;
+ if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
+ let tb = &mut self.app.accounts.smtp_box;
+ if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
+ }
+
+ if consumed {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Audio {
+ let mut actions = Vec::new();
+ for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ let id = self.app.audio.sinks[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ }
+ for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ if sb.value != old {
+ let id = self.app.audio.sources[i].id;
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
+ }
+ }
+ }
+ for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
+ let old = slider.value();
+ if slider.keyboard_input(event, &mut self.ui_context) {
+ let new_val = slider.value();
+ if new_val != old {
+ let id = self.app.audio.sinks[i].id;
+ if i < self.app.audio.sink_spinboxes.len() {
+ self.app.audio.sink_spinboxes[i].value = (new_val * 100.0).round() as i32;
+ }
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, new_val)));
+ }
+ }
+ }
+ for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
+ let old = slider.value();
+ if slider.keyboard_input(event, &mut self.ui_context) {
+ let new_val = slider.value();
+ if new_val != old {
+ let id = self.app.audio.sources[i].id;
+ if i < self.app.audio.source_spinboxes.len() {
+ self.app.audio.source_spinboxes[i].value = (new_val * 100.0).round() as i32;
+ }
+ actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, new_val)));
+ }
+ }
+ }
+ for a in &actions {
+ self.handle_action(a);
+ }
+ if !actions.is_empty() {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Display {
+ let slider = &mut self.app.display.brightness_slider;
+ let old_slider = slider.value();
+ if slider.keyboard_input(event, &mut self.ui_context) {
+ let new_slider = slider.value();
+ if new_slider != old_slider {
+ let pct = (new_slider * 100.0).round() as u32;
+ self.app.display.brightness_spinbox.value = pct as i32;
+ self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.display.brightness_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(new_val as u32)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let sb = &mut self.app.display.screensaver_timeout_spinbox;
+ let old = sb.value;
+ if sb.keyboard_input(event, &mut self.ui_context) {
+ let new_val = sb.value;
+ if new_val != old {
+ self.handle_action(&AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(new_val)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let (menu_changed, old_selected, new_selected) = {
+ let menu = &mut self.app.display.screensaver_style_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if menu_changed {
+ if new_selected != old_selected {
+ self.handle_action(&AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(new_selected)));
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+
+
+ if self.app.current_page == Page::Services {
+ let srv = &mut self.app.services;
+ if srv.list_box.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ let tb = &mut srv.search_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ tb.take_change();
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Packages {
+ let pkgs = &mut self.app.packages;
+ match pkgs.active_tab {
+ pages::packages::PackageTab::Installed => {
+ if pkgs.installed_list_box.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ pages::packages::PackageTab::Updates => {
+ if pkgs.updates_list_box.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ }
+ let tb = &mut pkgs.search_box;
+ if tb.keyboard_input(event, &mut self.ui_context) {
+ tb.take_change();
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Hardware {
+ let hw = &mut self.app.hardware;
+ if hw.cpu_list_box.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ let (cpu_changed, old_cpu, new_cpu) = {
+ let menu = &mut hw.cpu_gov_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if cpu_changed {
+ if new_cpu != old_cpu {
+ if new_cpu == 0 {
+ self.handle_action(&AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPerformance));
+ } else {
+ self.handle_action(&AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPowersave));
+ }
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ let (gpu_changed, old_gpu, new_gpu) = {
+ let menu = &mut hw.gpu_gov_menu;
+ let old = menu.selected;
+ let changed = menu.keyboard_input(event, &mut self.ui_context);
+ (changed, old, menu.selected)
+ };
+ if gpu_changed {
+ if new_gpu != old_gpu {
+ if new_gpu == 0 {
+ self.handle_action(&AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuDefault));
+ } else {
+ self.handle_action(&AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuPowersave));
+ }
+ }
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ if self.app.current_page == Page::Radios {
+ let net = &mut self.app.network;
+ if net.wifi_list_box.keyboard_input(event, &mut self.ui_context) {
+ self.needs_rebuild = true;
+ return true;
+ }
+ }
+ false
+ }
+
+}
+
diff --git a/src/lib.rs b/src/lib.rs
index 3d0af1e..e0ada05 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,3 +1,5 @@
pub mod app;
pub mod pages;
pub mod widgets;
+pub mod config_manager;
+pub mod watchers;
diff --git a/src/main.rs b/src/main.rs
index 7b797c6..a9e4e7d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,8 +1,10 @@
-use cce_ui::widget::{Finger, hover_animation, TextItem, Element, PageSelector};
+use cce_ui::widget::{Finger, hover_animation, Element, PageSelector};
use glyphon::{Attrs, Buffer, FontSystem, Metrics};
-use cce_system_interface::app::{AppAction, AppState, PageContent};
+use cce_system_interface::app::{AppAction, AppState};
use cce_system_interface::pages::{self, Page};
+mod input_handler;
+mod renderer;
fn make_text_buffer(fs: &mut FontSystem, text: &str, size: f32) -> Buffer {
let scale = cce_ui::scale::scale_factor();
@@ -189,219 +191,8 @@ impl cce_ui::engine::Application for SystemInterface {
let initial_page_idx = INITIAL_PAGE_INDEX.load(std::sync::atomic::Ordering::SeqCst);
let current_page_shared = std::sync::Arc::new(std::sync::atomic::AtomicU8::new(initial_page_idx as u8));
- fn spawn_bg_active<T, F>(
- current_page_shared: std::sync::Arc<std::sync::atomic::AtomicU8>,
- target_page_idx: u8,
- period_secs: u64,
- f: fn() -> F,
- ) -> std::sync::mpsc::Receiver<T>
- where
- T: Send + 'static,
- F: std::future::Future<Output = T> + Send + 'static,
- {
- let (tx, rx) = std::sync::mpsc::channel::<T>();
- tokio::spawn(async move {
- let mut last_fetch: Option<std::time::Instant> = None;
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == target_page_idx {
- let should_fetch = match last_fetch {
- None => true,
- Some(t) => t.elapsed() >= std::time::Duration::from_secs(period_secs),
- };
- if should_fetch {
- let val = f().await;
- if tx.send(val).is_err() { break; }
- last_fetch = Some(std::time::Instant::now());
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
- }
- });
- rx
- }
-
- let rx_audio = spawn_bg_active(current_page_shared.clone(), 1, 3, || pages::audio::fetch_audio_state());
- let rx_display = spawn_bg_active(current_page_shared.clone(), 2, 10, || pages::display::fetch_display_state());
- let rx_network = spawn_bg_active(current_page_shared.clone(), 7, 5, || pages::network::fetch_network_state());
- let rx_layout = {
- let (tx, rx) = std::sync::mpsc::channel::<pages::interface::WindowsState>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let mut last_fetch: Option<std::time::Instant> = None;
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 5 { // Interface is index 5
- let should_fetch = match last_fetch {
- None => true,
- Some(t) => t.elapsed() >= std::time::Duration::from_secs(30),
- };
- if should_fetch {
- let val = tokio::task::spawn_blocking(|| pages::interface::read_windows_config()).await;
- if let Ok(val) = val {
- if tx.send(val).is_err() { break; }
- }
- last_fetch = Some(std::time::Instant::now());
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
- }
- });
- rx
- };
- let rx_wm_events = {
- let (tx, rx) = std::sync::mpsc::channel::<()>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let display = std::env::var("WAYLAND_DISPLAY").unwrap_or_else(|_| "wayland-0".to_string());
- let windows_path = format!("/tmp/cce-windows-{}", display);
- let tags_path = format!("/tmp/cce-tags-{}", display);
- let title_path = format!("/tmp/cce-title-{}", display);
-
- let mut last_mod = std::time::SystemTime::UNIX_EPOCH;
-
- let check_mtime = |path: &str| -> Option<std::time::SystemTime> {
- std::fs::metadata(path).and_then(|m| m.modified()).ok()
- };
-
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 5 { // Interface is index 5
- let mut changed = false;
- for p in &[&windows_path, &tags_path, &title_path] {
- if let Some(mtime) = check_mtime(p) {
- if mtime > last_mod {
- last_mod = mtime;
- changed = true;
- }
- }
- }
- if changed {
- if tx.send(()).is_err() { break; }
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(500)).await;
- }
- });
- rx
- };
- let rx_input = {
- let (tx, rx) = std::sync::mpsc::channel::<pages::input::InputState>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let mut last_fetch: Option<std::time::Instant> = None;
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 4 { // Input is index 4
- let should_fetch = match last_fetch {
- None => true,
- Some(t) => t.elapsed() >= std::time::Duration::from_secs(30),
- };
- if should_fetch {
- let val = tokio::task::spawn_blocking(|| pages::input::read_input_config()).await;
- if let Ok(val) = val {
- if tx.send(val).is_err() { break; }
- }
- last_fetch = Some(std::time::Instant::now());
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
- }
- });
- rx
- };
- let rx_fingers = {
- let (tx, rx) = std::sync::mpsc::channel::<Vec<Finger>>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let socket_path = match std::env::var("WAYLAND_DISPLAY") {
- Ok(display) => format!("/tmp/cce-input-coords-{}.sock", display),
- Err(_) => "/tmp/cce-input-coords.sock".to_string(),
- };
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 4 { // Input is index 4
- if let Ok(stream) = tokio::net::UnixStream::connect(&socket_path).await {
- use tokio::io::AsyncBufReadExt;
- let reader = tokio::io::BufReader::new(stream);
- let mut lines = reader.lines();
- while let Ok(Some(line)) = lines.next_line().await {
- if current_page_shared.load(std::sync::atomic::Ordering::SeqCst) != 4 {
- break;
- }
- if let Ok(fingers) = serde_json::from_str::<Vec<Finger>>(&line) {
- if tx.send(fingers).is_err() {
- return;
- }
- }
- }
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(500)).await;
- }
- });
- rx
- };
- let rx_system = spawn_bg_active(current_page_shared.clone(), 10, 5, || pages::system_info::fetch_system_state());
- let rx_hardware = spawn_bg_active(current_page_shared.clone(), 3, 3, || pages::hardware::fetch_hardware_state());
- let rx_status = spawn_bg_active(current_page_shared.clone(), 8, 10, || pages::services::fetch_status_state());
- let rx_storage = spawn_bg_active(current_page_shared.clone(), 9, 10, || pages::storage::fetch_storage_state());
- let rx_notifications = {
- let (tx, rx) = std::sync::mpsc::channel::<pages::services::NotificationsConfig>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let mut last_fetch: Option<std::time::Instant> = None;
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 8 { // Services is index 8
- let should_fetch = match last_fetch {
- None => true,
- Some(t) => t.elapsed() >= std::time::Duration::from_secs(30),
- };
- if should_fetch {
- let val = tokio::task::spawn_blocking(|| pages::services::read_notifications_config()).await;
- if let Ok(val) = val {
- if tx.send(val).is_err() { break; }
- }
- last_fetch = Some(std::time::Instant::now());
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
- }
- });
- rx
- };
- let rx_typeface = spawn_bg_active(current_page_shared.clone(), 5, 30, || pages::interface::fetch_typeface_state());
- let rx_services = spawn_bg_active(current_page_shared.clone(), 8, 3, || pages::services::fetch_services());
- let rx_accounts = spawn_bg_active(current_page_shared.clone(), 0, 3, || pages::accounts::fetch_accounts());
- let rx_interface = {
- let (tx, rx) = std::sync::mpsc::channel::<pages::interface::InterfaceState>();
- let current_page_shared = current_page_shared.clone();
- tokio::spawn(async move {
- let mut last_fetch: Option<std::time::Instant> = None;
- loop {
- let current_page = current_page_shared.load(std::sync::atomic::Ordering::SeqCst);
- if current_page == 5 { // Interface is index 5
- let should_fetch = match last_fetch {
- None => true,
- Some(t) => t.elapsed() >= std::time::Duration::from_secs(30),
- };
- if should_fetch {
- let val = tokio::task::spawn_blocking(|| pages::interface::read_interface_config()).await;
- if let Ok(val) = val {
- if tx.send(val).is_err() { break; }
- }
- last_fetch = Some(std::time::Instant::now());
- }
- }
- tokio::time::sleep(std::time::Duration::from_millis(250)).await;
- }
- });
- rx
- };
- let (tx_backup, rx_backup) = std::sync::mpsc::channel();
- let rx_packages = spawn_bg_active(current_page_shared.clone(), 6, 30, || pages::packages::fetch_packages_state());
- let (tx_update, rx_update) = std::sync::mpsc::channel();
+ let (watchers, tx_backup, rx_backup, tx_update, rx_update) =
+ cce_system_interface::watchers::spawn_all(current_page_shared.clone());
let (sans_family, serif_family, monospace_family, _, _, _, _, _) = pages::interface::read_preferred_fonts();
@@ -441,25 +232,25 @@ impl cce_ui::engine::Application for SystemInterface {
status_height: 0.0,
cursor_x: 0.0,
cursor_y: 0.0,
- rx_audio,
- rx_display,
- rx_network,
- rx_layout,
- rx_wm_events,
- rx_input,
- rx_fingers,
- rx_hardware,
- rx_system,
- rx_status,
- rx_storage,
- rx_notifications,
- rx_typeface,
- rx_services,
- rx_interface,
- rx_accounts,
+ rx_audio: watchers.rx_audio,
+ rx_display: watchers.rx_display,
+ rx_network: watchers.rx_network,
+ rx_layout: watchers.rx_layout,
+ rx_wm_events: watchers.rx_wm_events,
+ rx_input: watchers.rx_input,
+ rx_fingers: watchers.rx_fingers,
+ rx_hardware: watchers.rx_hardware,
+ rx_system: watchers.rx_system,
+ rx_status: watchers.rx_status,
+ rx_storage: watchers.rx_storage,
+ rx_notifications: watchers.rx_notifications,
+ rx_typeface: watchers.rx_typeface,
+ rx_services: watchers.rx_services,
+ rx_interface: watchers.rx_interface,
+ rx_accounts: watchers.rx_accounts,
tx_backup,
rx_backup,
- rx_packages,
+ rx_packages: watchers.rx_packages,
tx_update,
rx_update,
@@ -648,844 +439,6 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
}
}
- fn rebuild_layout(&mut self, sw: f32, sh: f32) {
- self.switcher.clear_children(&mut self.ui_context);
- for plate in &mut self.plates {
- self.switcher.add_child(plate.as_ptr(), &mut self.ui_context);
- }
-
- let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
-
- // ── Rebuild Element Focus Hierarchy ──
- for plate in &mut self.plates {
- plate.clear_children(&mut self.ui_context);
- }
- let page_root = &mut self.plates[page_idx];
- self.page_sec_containers.clear();
-
- // Clear all widgets' hierarchy links
- self.app.services.search_box.clear_children(&mut self.ui_context); self.app.services.search_box.set_parent(None, &mut self.ui_context);
- self.app.packages.search_box.clear_children(&mut self.ui_context); self.app.packages.search_box.set_parent(None, &mut self.ui_context);
- self.app.packages.installed_list_box.scroll_box.clear_children(&mut self.ui_context); self.app.packages.installed_list_box.scroll_box.set_parent(None, &mut self.ui_context);
- self.app.packages.updates_list_box.scroll_box.clear_children(&mut self.ui_context); self.app.packages.updates_list_box.scroll_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.email_box.clear_children(&mut self.ui_context); self.app.accounts.email_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.password_box.clear_children(&mut self.ui_context); self.app.accounts.password_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.imap_box.clear_children(&mut self.ui_context); self.app.accounts.imap_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.smtp_box.clear_children(&mut self.ui_context); self.app.accounts.smtp_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.oauth_client_id_box.clear_children(&mut self.ui_context); self.app.accounts.oauth_client_id_box.set_parent(None, &mut self.ui_context);
- self.app.accounts.oauth_client_secret_box.clear_children(&mut self.ui_context); self.app.accounts.oauth_client_secret_box.set_parent(None, &mut self.ui_context);
-
- self.app.services.list_box.scroll_box.clear_children(&mut self.ui_context); self.app.services.list_box.scroll_box.set_parent(None, &mut self.ui_context);
-
- self.app.hardware.cpu_list_box.scroll_box.clear_children(&mut self.ui_context); self.app.hardware.cpu_list_box.scroll_box.set_parent(None, &mut self.ui_context);
-
- self.app.network.wifi_list_box.scroll_box.clear_children(&mut self.ui_context); self.app.network.wifi_list_box.scroll_box.set_parent(None, &mut self.ui_context);
-
- for sb in &mut self.app.interface.windows.spinboxes {
- sb.clear_children(&mut self.ui_context);
- sb.set_parent(None, &mut self.ui_context);
- }
- self.app.interface.windows.cascade_offset_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.cascade_offset_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.edge_gap_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.edge_gap_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.top_gap_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.top_gap_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.grid_gap_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.grid_gap_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.transition_duration_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.transition_duration_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.status_height_spinbox.clear_children(&mut self.ui_context); self.app.interface.windows.status_height_spinbox.set_parent(None, &mut self.ui_context);
-
- for cs in &mut self.app.interface.color_selectors {
- cs.clear_children(&mut self.ui_context);
- cs.set_parent(None, &mut self.ui_context);
- }
- self.app.interface.tab_margin_spinbox_x.clear_children(&mut self.ui_context);
- self.app.interface.tab_margin_spinbox_x.set_parent(None, &mut self.ui_context);
- self.app.interface.menubar_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.menubar_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.tab_margin_spinbox_y.clear_children(&mut self.ui_context);
- self.app.interface.tab_margin_spinbox_y.set_parent(None, &mut self.ui_context);
- self.app.interface.button_padding_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.button_padding_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.section_padding_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.section_padding_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.label_alignment_menu.clear_children(&mut self.ui_context);
- self.app.interface.label_alignment_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.label_offset_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.label_offset_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.label_margin_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.label_margin_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.plate_padding_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.plate_padding_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_show_grid_toggle.clear_children(&mut self.ui_context);
- self.app.interface.graph_show_grid_toggle.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_snap_enabled_toggle.clear_children(&mut self.ui_context);
- self.app.interface.graph_snap_enabled_toggle.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_uniform_background_toggle.clear_children(&mut self.ui_context);
- self.app.interface.graph_uniform_background_toggle.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_cell_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.graph_cell_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_gap_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.graph_gap_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.graph_gap_width_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.graph_gap_width_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.page_margin_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.page_margin_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.grid_min_col_width_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.grid_min_col_width_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.spinbox_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.spinbox_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.spinbox_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.spinbox_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.toggle_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.toggle_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.toggle_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.toggle_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
-
- self.app.interface.color_selector_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.color_selector_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.color_selector_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.color_selector_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.plate_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.plate_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.plate_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.plate_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.page_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.page_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.layer_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.layer_opacity_spinbox.set_parent(None, &mut self.ui_context);
-
- self.app.interface.color_selector_preview_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.color_selector_preview_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.color_selector_preview_margin_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.color_selector_preview_margin_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.textbox_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.textbox_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.textbox_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.textbox_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.slider_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.slider_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.color_selector_font_selector.clear_children(&mut self.ui_context);
- self.app.interface.color_selector_font_selector.set_parent(None, &mut self.ui_context);
- self.app.interface.menubar_font_selector.clear_children(&mut self.ui_context);
- self.app.interface.menubar_font_selector.set_parent(None, &mut self.ui_context);
- self.app.interface.breadcrumb_font_selector.clear_children(&mut self.ui_context);
- self.app.interface.breadcrumb_font_selector.set_parent(None, &mut self.ui_context);
- self.app.interface.section_label_font_selector.clear_children(&mut self.ui_context);
- self.app.interface.section_label_font_selector.set_parent(None, &mut self.ui_context);
- self.app.interface.nested_section_label_font_selector.clear_children(&mut self.ui_context);
- self.app.interface.nested_section_label_font_selector.set_parent(None, &mut self.ui_context);
- self.app.interface.font_selector_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.font_selector_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.font_selector_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.font_selector_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.dropdown_height_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.dropdown_height_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.dropdown_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.dropdown_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.button_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.button_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.notification_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.notification_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.window_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.window_opacity_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.window_corner_radius_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.window_corner_radius_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.custom_multicontrol.clear_children(&mut self.ui_context);
- self.app.interface.custom_multicontrol.set_parent(None, &mut self.ui_context);
-
- self.app.interface.sans_box.clear_children(&mut self.ui_context); self.app.interface.sans_box.set_parent(None, &mut self.ui_context);
- self.app.interface.serif_box.clear_children(&mut self.ui_context); self.app.interface.serif_box.set_parent(None, &mut self.ui_context);
- self.app.interface.mono_box.clear_children(&mut self.ui_context); self.app.interface.mono_box.set_parent(None, &mut self.ui_context);
- self.app.interface.borders_menu.clear_children(&mut self.ui_context); self.app.interface.borders_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.borders_box.clear_children(&mut self.ui_context); self.app.interface.borders_box.set_parent(None, &mut self.ui_context);
- self.app.interface.status_menu.clear_children(&mut self.ui_context); self.app.interface.status_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.status_box.clear_children(&mut self.ui_context); self.app.interface.status_box.set_parent(None, &mut self.ui_context);
- self.app.interface.fuzzel_menu.clear_children(&mut self.ui_context); self.app.interface.fuzzel_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.fuzzel_box.clear_children(&mut self.ui_context); self.app.interface.fuzzel_box.set_parent(None, &mut self.ui_context);
- self.app.interface.terminal_menu.clear_children(&mut self.ui_context); self.app.interface.terminal_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.terminal_box.clear_children(&mut self.ui_context); self.app.interface.terminal_box.set_parent(None, &mut self.ui_context);
-
- self.app.services.notifications_enable_toggle.clear_children(&mut self.ui_context); self.app.services.notifications_enable_toggle.set_parent(None, &mut self.ui_context);
- self.app.services.notifications_bell_toggle.clear_children(&mut self.ui_context); self.app.services.notifications_bell_toggle.set_parent(None, &mut self.ui_context);
- self.app.services.notifications_duration_spinbox.clear_children(&mut self.ui_context); self.app.services.notifications_duration_spinbox.set_parent(None, &mut self.ui_context);
-
- self.app.input.rate_spinbox.clear_children(&mut self.ui_context); self.app.input.rate_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.delay_spinbox.clear_children(&mut self.ui_context); self.app.input.delay_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.scroll_toggle.clear_children(&mut self.ui_context); self.app.input.scroll_toggle.set_parent(None, &mut self.ui_context);
- self.app.input.scroll_friction_spinbox.clear_children(&mut self.ui_context); self.app.input.scroll_friction_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.natural_toggle.clear_children(&mut self.ui_context); self.app.input.natural_toggle.set_parent(None, &mut self.ui_context);
- self.app.input.scroll_speed_spinbox.clear_children(&mut self.ui_context); self.app.input.scroll_speed_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.pointer_toggle.clear_children(&mut self.ui_context); self.app.input.pointer_toggle.set_parent(None, &mut self.ui_context);
- self.app.input.pointer_friction_spinbox.clear_children(&mut self.ui_context); self.app.input.pointer_friction_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.trackpad_toggle.clear_children(&mut self.ui_context); self.app.input.trackpad_toggle.set_parent(None, &mut self.ui_context);
- self.app.input.trackpad_friction_spinbox.clear_children(&mut self.ui_context); self.app.input.trackpad_friction_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.dwtp_toggle.clear_children(&mut self.ui_context); self.app.input.dwtp_toggle.set_parent(None, &mut self.ui_context);
- self.app.input.trackpoint_accel_speed_spinbox.clear_children(&mut self.ui_context); self.app.input.trackpoint_accel_speed_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.trackpoint_accel_profile_menu.clear_children(&mut self.ui_context); self.app.input.trackpoint_accel_profile_menu.set_parent(None, &mut self.ui_context);
- self.app.input.cursor_theme_menu.clear_children(&mut self.ui_context); self.app.input.cursor_theme_menu.set_parent(None, &mut self.ui_context);
- self.app.input.cursor_size_spinbox.clear_children(&mut self.ui_context); self.app.input.cursor_size_spinbox.set_parent(None, &mut self.ui_context);
- self.app.input.zoom_in_box.clear_children(&mut self.ui_context); self.app.input.zoom_in_box.set_parent(None, &mut self.ui_context);
- self.app.input.zoom_out_box.clear_children(&mut self.ui_context); self.app.input.zoom_out_box.set_parent(None, &mut self.ui_context);
- self.app.input.keybinds_control.clear_children(&mut self.ui_context); self.app.input.keybinds_control.set_parent(None, &mut self.ui_context);
-
- for sb in &mut self.app.audio.sink_spinboxes {
- sb.clear_children(&mut self.ui_context);
- sb.set_parent(None, &mut self.ui_context);
- }
- for sb in &mut self.app.audio.source_spinboxes {
- sb.clear_children(&mut self.ui_context);
- sb.set_parent(None, &mut self.ui_context);
- }
- for slider in &mut self.app.audio.sink_sliders {
- slider.clear_children(&mut self.ui_context);
- slider.set_parent(None, &mut self.ui_context);
- }
- for slider in &mut self.app.audio.source_sliders {
- slider.clear_children(&mut self.ui_context);
- slider.set_parent(None, &mut self.ui_context);
- }
-
- self.app.display.brightness_spinbox.clear_children(&mut self.ui_context); self.app.display.brightness_spinbox.set_parent(None, &mut self.ui_context);
- self.app.display.brightness_slider.clear_children(&mut self.ui_context); self.app.display.brightness_slider.set_parent(None, &mut self.ui_context);
- self.app.display.night_light_label.clear_children(&mut self.ui_context); self.app.display.night_light_label.set_parent(None, &mut self.ui_context);
- self.app.display.screensaver_enable_toggle.clear_children(&mut self.ui_context); self.app.display.screensaver_enable_toggle.set_parent(None, &mut self.ui_context);
- self.app.display.screensaver_lock_screen_toggle.clear_children(&mut self.ui_context); self.app.display.screensaver_lock_screen_toggle.set_parent(None, &mut self.ui_context);
- self.app.display.screensaver_timeout_spinbox.clear_children(&mut self.ui_context); self.app.display.screensaver_timeout_spinbox.set_parent(None, &mut self.ui_context);
- self.app.display.screensaver_style_menu.clear_children(&mut self.ui_context); self.app.display.screensaver_style_menu.set_parent(None, &mut self.ui_context);
- for out in &mut self.app.display.outputs {
- out.name_label.clear_children(&mut self.ui_context); out.name_label.set_parent(None, &mut self.ui_context);
- out.resolution_label.clear_children(&mut self.ui_context); out.resolution_label.set_parent(None, &mut self.ui_context);
- if let Some(ref mut scale_lbl) = out.scale_label {
- scale_lbl.clear_children(&mut self.ui_context); scale_lbl.set_parent(None, &mut self.ui_context);
- }
- }
- self.app.services.status_separators_toggle.clear_children(&mut self.ui_context); self.app.services.status_separators_toggle.set_parent(None, &mut self.ui_context);
- self.app.services.status_underline_toggle.clear_children(&mut self.ui_context); self.app.services.status_underline_toggle.set_parent(None, &mut self.ui_context);
- self.app.services.status_padding_spinbox.clear_children(&mut self.ui_context); self.app.services.status_padding_spinbox.set_parent(None, &mut self.ui_context);
-
- for menu in &mut self.app.interface.windows.tag_layout_menus {
- menu.clear_children(&mut self.ui_context);
- menu.set_parent(None, &mut self.ui_context);
- }
- self.app.interface.windows.side_panel_behavior_menu.clear_children(&mut self.ui_context);
- self.app.interface.windows.side_panel_behavior_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.side_panel_position_menu.clear_children(&mut self.ui_context);
- self.app.interface.windows.side_panel_position_menu.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.side_panel_width_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.windows.side_panel_width_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.side_panel_border_gap_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.windows.side_panel_border_gap_spinbox.set_parent(None, &mut self.ui_context);
- self.app.interface.windows.side_panel_border_opacity_spinbox.clear_children(&mut self.ui_context);
- self.app.interface.windows.side_panel_border_opacity_spinbox.set_parent(None, &mut self.ui_context);
-
- use cce_ui::widget::focus::link_parent_child;
- match self.app.current_page {
- Page::Accounts => {
- self.page_sec_containers.resize_with(2, cce_ui::widget::Container::new);
- for i in 0..2 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
- if self.app.accounts.editing_oauth_creds {
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.oauth_client_id_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.oauth_client_secret_box, &mut self.ui_context);
- } else if self.app.accounts.adding_new {
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.email_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.password_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.imap_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.accounts.smtp_box, &mut self.ui_context);
- }
- }
-
- Page::Services => {
- self.page_sec_containers.resize_with(3, cce_ui::widget::Container::new);
- for i in 0..3 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.services.search_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.services.list_box.scroll_box, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.services.notifications_enable_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.services.notifications_bell_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.services.notifications_duration_spinbox, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.services.status_separators_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.services.status_underline_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.services.status_padding_spinbox, &mut self.ui_context);
- }
- Page::Hardware => {
- self.page_sec_containers.resize_with(5, cce_ui::widget::Container::new);
- for i in 0..5 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.hardware.cpu_list_box.scroll_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.hardware.cpu_gov_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.hardware.gpu_gov_menu, &mut self.ui_context);
- }
- Page::Radios => {
- self.page_sec_containers.resize_with(2, cce_ui::widget::Container::new);
- for i in 0..2 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.network.wifi_list_box.scroll_box, &mut self.ui_context);
- }
- Page::Interface => {
- self.page_sec_containers.resize_with(10, cce_ui::widget::Container::new);
-
- for i in 0..10 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
-
- // Section 0: Custom Parameters
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.interface.custom_multicontrol, &mut self.ui_context);
-
- // Section 1: Layout (parent of Grid Layout)
- // (Layout widgets)
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.interface.color_selectors[7], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.interface.color_selectors[1], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.interface.color_selectors[2], &mut self.ui_context);
- // (Grid Layout child widgets)
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.interface.grid_min_col_width_spinbox, &mut self.ui_context);
-
-
- // Section 2: Status
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[8], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[3], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.interface.color_selectors[4], &mut self.ui_context);
-
- // Section 3: Controls (parent of: Slider, MenuBar, Toggles, Spinbox, ColorSelector, Textbox, FontSelector)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[6], &mut self.ui_context);
- // (Slider child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[5], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.slider_height_spinbox, &mut self.ui_context);
-
- // (MenuBar child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[9], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[11], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.tab_margin_spinbox_x, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.tab_margin_spinbox_y, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.button_padding_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.menubar_opacity_spinbox, &mut self.ui_context);
- // (Toggles child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[12], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[13], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.toggle_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.toggle_corner_radius_spinbox, &mut self.ui_context);
-
- // (Breadcrumb child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selectors[15], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.breadcrumb_font_selector, &mut self.ui_context);
-
- // (Spinbox child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.spinbox_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.spinbox_corner_radius_spinbox, &mut self.ui_context);
-
- // (ColorSelector child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selector_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selector_preview_corner_radius_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selector_preview_margin_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selector_corner_radius_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.color_selector_font_selector, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.menubar_font_selector, &mut self.ui_context);
-
- // (Textbox child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.textbox_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.textbox_corner_radius_spinbox, &mut self.ui_context);
-
- // (FontSelector child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.font_selector_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.font_selector_corner_radius_spinbox, &mut self.ui_context);
-
- // (Dropdown child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.dropdown_height_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.dropdown_corner_radius_spinbox, &mut self.ui_context);
-
- // (Button child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.button_corner_radius_spinbox, &mut self.ui_context);
-
- // (Labels child widgets)
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.interface.label_margin_spinbox, &mut self.ui_context);
-
- // Section 4: Indicators (parent of Primary Highlight)
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.interface.color_selectors[10], &mut self.ui_context);
-
- // Section 5: Notification
- link_parent_child(&mut self.page_sec_containers[5], &mut self.app.interface.color_selectors[17], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[5], &mut self.app.interface.notification_opacity_spinbox, &mut self.ui_context);
-
- // Section 6: Surfaces
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.color_selectors[18], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.window_opacity_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.window_corner_radius_spinbox, &mut self.ui_context);
- // (Plate child widgets)
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.color_selectors[0], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.plate_padding_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.plate_opacity_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.plate_corner_radius_spinbox, &mut self.ui_context);
- // (Popover child widgets)
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.interface.color_selectors[16], &mut self.ui_context);
-
- // Section 7: Fonts (parent of System Fonts and Program Fonts)
- // (System Fonts)
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.sans_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.serif_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.mono_box, &mut self.ui_context);
-
- // (Program Fonts)
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.borders_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.borders_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.status_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.status_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.fuzzel_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.fuzzel_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.terminal_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[7], &mut self.app.interface.terminal_box, &mut self.ui_context);
-
- // Section 8: Containers (parent of ScrollingList, Sections, Graph)
- // (Sections child widgets)
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.section_padding_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.page_margin_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.section_label_font_selector, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.label_alignment_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.label_offset_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.nested_section_label_font_selector, &mut self.ui_context);
- // (ScrollingList child widgets)
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.color_selectors[14], &mut self.ui_context);
- // (Page child widgets)
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.color_selectors[19], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.page_opacity_spinbox, &mut self.ui_context);
- // (Layer child widgets)
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.color_selectors[20], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.layer_opacity_spinbox, &mut self.ui_context);
- // (Graph child widgets)
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_show_grid_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_snap_enabled_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_uniform_background_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_cell_opacity_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_gap_opacity_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[8], &mut self.app.interface.graph_gap_width_spinbox, &mut self.ui_context);
-
- // Section 9: Windows (parent of Fullscreen, Cascade, Grid, Floating, Movement, Default Layouts, Side Panel, Effects)
- // Fullscreen
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.spinboxes[0], &mut self.ui_context);
-
- // Cascade
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.spinboxes[1], &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.cascade_offset_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.edge_gap_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.top_gap_spinbox, &mut self.ui_context);
-
- // Grid
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.grid_gap_spinbox, &mut self.ui_context);
-
- // Floating
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.spinboxes[3], &mut self.ui_context);
-
- // Movement
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.transition_duration_spinbox, &mut self.ui_context);
-
- // Default Layouts
- for menu in &mut self.app.interface.windows.tag_layout_menus {
- link_parent_child(&mut self.page_sec_containers[9], menu, &mut self.ui_context);
- }
-
- // Side Panel
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.side_panel_behavior_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.side_panel_position_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.side_panel_width_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.side_panel_border_gap_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.side_panel_border_opacity_spinbox, &mut self.ui_context);
-
- // Effects
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.transparency_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[9], &mut self.app.interface.windows.blur_toggle, &mut self.ui_context);
- }
-
-
- Page::Input => {
- self.page_sec_containers.resize_with(7, cce_ui::widget::Container::new);
- link_parent_child(page_root, &mut self.page_sec_containers[0], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[1], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[2], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[3], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[4], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[5], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[6], &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.input.dwtp_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.input.trackpoint_accel_speed_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.input.trackpoint_accel_profile_menu, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.input.rate_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.input.delay_spinbox, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.input.cursor_theme_menu, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut self.app.input.cursor_size_spinbox, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.input.scroll_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.input.scroll_friction_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.input.natural_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.input.scroll_speed_spinbox, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.input.pointer_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.input.pointer_friction_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.input.trackpad_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[4], &mut self.app.input.trackpad_friction_spinbox, &mut self.ui_context);
-
- link_parent_child(&mut self.page_sec_containers[5], &mut self.app.input.zoom_in_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[5], &mut self.app.input.zoom_out_box, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[6], &mut self.app.input.keybinds_control, &mut self.ui_context);
- }
- Page::Audio => {
- self.page_sec_containers.resize_with(2, cce_ui::widget::Container::new);
- link_parent_child(page_root, &mut self.page_sec_containers[0], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[1], &mut self.ui_context);
-
- for sb in &mut self.app.audio.sink_spinboxes {
- link_parent_child(&mut self.page_sec_containers[0], &mut **sb, &mut self.ui_context);
- }
- for sb in &mut self.app.audio.source_spinboxes {
- link_parent_child(&mut self.page_sec_containers[1], &mut **sb, &mut self.ui_context);
- }
- for slider in &mut self.app.audio.sink_sliders {
- link_parent_child(&mut self.page_sec_containers[0], &mut **slider, &mut self.ui_context);
- }
- for slider in &mut self.app.audio.source_sliders {
- link_parent_child(&mut self.page_sec_containers[1], &mut **slider, &mut self.ui_context);
- }
- }
- Page::Display => {
- self.page_sec_containers.resize_with(4, cce_ui::widget::Container::new);
- link_parent_child(page_root, &mut self.page_sec_containers[0], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[1], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[2], &mut self.ui_context);
- link_parent_child(page_root, &mut self.page_sec_containers[3], &mut self.ui_context);
-
- // Section 0: Brightness
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.display.brightness_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.display.brightness_slider, &mut self.ui_context);
-
- // Section 1: Night Light
- link_parent_child(&mut self.page_sec_containers[1], &mut self.app.display.night_light_label, &mut self.ui_context);
-
- // Section 2: Outputs
- for out in &mut self.app.display.outputs {
- link_parent_child(&mut self.page_sec_containers[2], &mut out.name_label, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[2], &mut out.resolution_label, &mut self.ui_context);
- if let Some(ref mut scale_lbl) = out.scale_label {
- link_parent_child(&mut self.page_sec_containers[2], scale_lbl, &mut self.ui_context);
- }
- }
-
- // Section 3: Screensaver Settings
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.display.screensaver_enable_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.display.screensaver_lock_screen_toggle, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.display.screensaver_timeout_spinbox, &mut self.ui_context);
- link_parent_child(&mut self.page_sec_containers[3], &mut self.app.display.screensaver_style_menu, &mut self.ui_context);
- }
- Page::Packages => {
- self.page_sec_containers.resize_with(2, cce_ui::widget::Container::new);
- for i in 0..2 {
- link_parent_child(page_root, &mut self.page_sec_containers[i], &mut self.ui_context);
- }
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.packages.search_box, &mut self.ui_context);
- match self.app.packages.active_tab {
- pages::packages::PackageTab::Installed => {
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.packages.installed_list_box.scroll_box, &mut self.ui_context);
- }
- pages::packages::PackageTab::Updates => {
- link_parent_child(&mut self.page_sec_containers[0], &mut self.app.packages.updates_list_box.scroll_box, &mut self.ui_context);
- }
- }
- }
- _ => {}
- }
-
- self.sidebar_width = self.menubar.sidebar_w();
- self.header_height = 0.0; // No CSD Titlebar
- let s = 1.0f32;
- let mut widgets = Vec::new();
- let mut text_items = Vec::new();
- let mut page_buttons = Vec::new();
-
- cce_ui::widget::hover_animation::reset_frame_registration();
- cce_ui::widget::popovers::clear();
- cce_ui::widget::hover_animation::set_scroll_offset(self.scroll_y);
- cce_ui::widget::hover_animation::set_cursor_pos(self.cursor_x / s, self.cursor_y / s);
-
- let lcx = self.sidebar_width;
- let lcy = self.header_height;
- let lcw = sw / s - self.sidebar_width;
- let lch = sh / s - self.header_height - self.status_height;
-
- let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
- self.menubar.set_selected_page(page_idx);
- self.switcher.set_active_index(Some(page_idx));
-
- // Update root window size, background color, opacity, corner radius, and children
- self.root_window.set_rect(0.0, 0.0, sw / s, sh / s);
- let win_r = self.app.interface.window_color[0] as f32 / 255.0;
- let win_g = self.app.interface.window_color[1] as f32 / 255.0;
- let win_b = self.app.interface.window_color[2] as f32 / 255.0;
- let win_a = self.app.interface.window_opacity;
- self.root_window.background_color = Some(cce_ui::color::to_linear([win_r, win_g, win_b, win_a]));
- self.root_window.radius = self.app.interface.window_corner_radius as f32;
- self.root_window.clear_children(&mut self.ui_context);
- self.root_window.add_child(self.menubar.as_ptr(), &mut self.ui_context);
- self.root_window.add_child(self.switcher.as_ptr(), &mut self.ui_context);
-
- // Position sidebar and switcher below the titlebar
- let mut dummy_pc = PageContent::new();
- cce_ui::layout::render_widget(&mut dummy_pc, &mut self.menubar, 0.0, self.header_height, self.sidebar_width, sh / s - self.header_height, &mut self.ui_context);
- cce_ui::layout::render_widget(&mut dummy_pc, &mut self.switcher, self.sidebar_width, self.header_height, sw / s - self.sidebar_width, sh / s - self.header_height, &mut self.ui_context);
-
- // Render root window recursively
- let mut window_pc = PageContent::new();
- cce_ui::layout::render_widget(&mut window_pc, &mut self.root_window, 0.0, 0.0, sw / s, sh / s, &mut self.ui_context);
-
- // CSD Titlebar removed
-
- for pc_part in &[window_pc] {
- for (c, x, y, w, h, r, corners) in &pc_part.rects {
- widgets.push(AppWidget {
- x: *x * s, y: *y * s, w: *w * s, h: *h * s,
- color: *c, hover_color: *c,
- hovering: false,
- radius: *r * s,
- corners: *corners,
- });
- }
- for (t, size, x, y, tc, font_opt, bounds) in &pc_part.texts {
- text_items.push(TextItem {
- buffer: make_text_buffer_with_font(
- &mut self.font_system,
- t,
- *size * s,
- font_opt.as_deref(),
- &self.sans_serif_family,
- &self.serif_family,
- &self.monospace_family,
- ),
- x: *x * s, y: *y * s,
- color: glyphon::Color::rgb(
- (tc[0] * 255.0) as u8, (tc[1] * 255.0) as u8, (tc[2] * 255.0) as u8,
- ),
- bounds: *bounds,
- });
- }
- }
-
- // Page content in LOGICAL coordinates, then scale to physical
- let pc = self.render_page_content(lcx, lcy, lcw, lch);
-
- let mut popovers = Vec::new();
- Self::collect_popover_rects(&self.plates[page_idx], &mut popovers, &self.ui_context);
-
- let mut max_y = 0.0f32;
- for (_, _, y, _, h, _, _) in &pc.rects {
- max_y = max_y.max(y + h);
- }
- for (_, size, _, y, _, _, _) in &pc.texts {
- max_y = max_y.max(y + size);
- }
- for (btn, _) in &pc.buttons {
- let base = btn.base().unwrap();
- max_y = max_y.max(base.y + base.h);
- }
- self.max_scroll_y = (max_y - lch).max(0.0);
- eprintln!("SCROLL_DEBUG: max_y={}, lch={}, max_scroll_y={}, scroll_y={}", max_y, lch, self.max_scroll_y, self.scroll_y);
- static mut FRAME_COUNT: usize = 0;
- unsafe {
- FRAME_COUNT += 1;
- if FRAME_COUNT > 5 {
- self.scroll_y = self.scroll_y.min(self.max_scroll_y);
- }
- }
-
- let scroll_offset_y = self.scroll_y;
-
- for (c, x, y, w, h, r, corners) in &pc.rects {
- widgets.push(AppWidget {
- x: *x * s, y: (*y - scroll_offset_y) * s, w: *w * s, h: *h * s,
- color: *c, hover_color: *c,
- hovering: false,
- radius: *r * s,
- corners: *corners,
- });
- }
- for (t, size, x, y, tc, font_opt, bounds) in &pc.texts {
- let shifted_bounds = bounds.map(|[bl, bt, br, bb]| {
- [bl, bt - scroll_offset_y, br, bb - scroll_offset_y]
- });
- text_items.push(TextItem {
- buffer: make_text_buffer_with_font(
- &mut self.font_system,
- t,
- *size * s,
- font_opt.as_deref(),
- &self.sans_serif_family,
- &self.serif_family,
- &self.monospace_family,
- ),
- x: *x * s, y: (*y - scroll_offset_y) * s,
- color: glyphon::Color::rgb(
- (tc[0] * 255.0) as u8, (tc[1] * 255.0) as u8, (tc[2] * 255.0) as u8,
- ),
- bounds: shifted_bounds,
- });
- }
- for (btn, action) in &pc.buttons {
- let base = btn.base().unwrap();
- let bg = btn.bg.unwrap_or([0.16, 0.16, 0.24, 1.0]);
- let hover_bg = btn.hover_bg.unwrap_or([0.25, 0.30, 0.26, 1.0]);
- widgets.push(AppWidget {
- x: base.x * s, y: (base.y - scroll_offset_y) * s, w: base.w * s, h: base.h * s,
- color: bg, hover_color: hover_bg,
- hovering: false,
- radius: cce_ui::layout::button_corner_radius() * s,
- corners: (true, true, true, true),
- });
- let label = base.label.as_deref().unwrap_or("");
- let label_size = 12.0;
- let buf = make_text_buffer(&mut self.font_system, label, label_size * s);
- let scale = cce_ui::scale::scale_factor();
- let tw = buf.layout_runs().next().map(|r| r.line_w).unwrap_or(0.0) / scale;
- let lh = label_size * s * 1.4;
- let mut left_align = btn.left_align;
-
- // Auto-detect if inside a ScrollBox to apply left alignment by default
- if !left_align && base.w >= 60.0 {
- if self.app.current_page == Page::Hardware {
- let sb = &self.app.hardware.cpu_list_box;
- let (sb_x, sb_y, sb_w, sb_h) = sb.rect();
- if base.x >= sb_x - 1.0 && base.x + base.w <= sb_x + sb_w + 1.0
- && base.y >= sb_y - 1.0 && base.y + base.h <= sb_y + sb_h + 1.0 {
- left_align = true;
- }
- } else if self.app.current_page == Page::Services {
- let sb = &self.app.services.list_box;
- let (sb_x, sb_y, sb_w, sb_h) = sb.rect();
- if base.x >= sb_x - 1.0 && base.x + base.w <= sb_x + sb_w + 1.0
- && base.y >= sb_y - 1.0 && base.y + base.h <= sb_y + sb_h + 1.0 {
- left_align = true;
- }
- }
- }
-
- let text_x = if left_align {
- base.x * s + 8.0 * s
- } else {
- base.x * s + (base.w * s - tw) / 2.0
- };
-
- let label_color = btn.label_color.unwrap_or([0.83, 0.83, 0.83, 1.0]);
- text_items.push(TextItem {
- buffer: buf,
- x: text_x, y: (base.y - scroll_offset_y) * s + (base.h * s - lh) / 2.0,
- color: glyphon::Color::rgb(
- (label_color[0] * 255.0) as u8,
- (label_color[1] * 255.0) as u8,
- (label_color[2] * 255.0) as u8,
- ),
- bounds: None,
- });
- let mut btn_clone = btn.clone();
- if let Some(base_mut) = btn_clone.base_mut() {
- base_mut.x *= s;
- base_mut.y = (base_mut.y - scroll_offset_y) * s;
- base_mut.w *= s;
- base_mut.h *= s;
- }
- page_buttons.push((btn_clone, action.clone()));
- }
-
- // Render popovers on top of everything (both backgrounds and texts)
- let mut popover_pc = PageContent::new();
- cce_ui::layout::render_popovers(&mut popover_pc, &mut self.ui_context);
-
- for (c, x, y, w, h, r, corners) in &popover_pc.rects {
- widgets.push(AppWidget {
- x: *x * s, y: (*y - scroll_offset_y) * s, w: *w * s, h: *h * s,
- color: *c, hover_color: *c,
- hovering: false,
- radius: *r * s,
- corners: *corners,
- });
- }
- for (t, size, x, y, tc, font_opt, bounds) in &popover_pc.texts {
- let shifted_bounds = bounds.map(|[bl, bt, br, bb]| {
- [bl, bt - scroll_offset_y, br, bb - scroll_offset_y]
- });
- text_items.push(TextItem {
- buffer: make_text_buffer_with_font(
- &mut self.font_system,
- t,
- *size * s,
- font_opt.as_deref(),
- &self.sans_serif_family,
- &self.serif_family,
- &self.monospace_family,
- ),
- x: *x * s, y: (*y - scroll_offset_y) * s,
- color: glyphon::Color::rgb(
- (tc[0] * 255.0) as u8, (tc[1] * 255.0) as u8, (tc[2] * 255.0) as u8,
- ),
- bounds: shifted_bounds,
- });
- }
-
- // Draw global hover highlight if active
- cce_ui::widget::hover_animation::post_render_check();
- if let Some((qx, qy, qw, qh, qc)) = cce_ui::widget::hover_animation::get_quad() {
- widgets.push(AppWidget {
- x: qx * s,
- y: (qy - self.scroll_y) * s,
- w: qw * s,
- h: qh * s,
- color: qc,
- hover_color: qc,
- hovering: false,
- radius: 0.0,
- corners: (true, true, true, true),
- });
- }
-
-
-
-
-
- self.widgets = widgets;
- self.text_items = text_items;
- self.page_buttons = page_buttons;
- self.needs_rebuild = false;
- }
-
- fn render_page_content(&mut self, cx: f32, cy: f32, cw: f32, ch: f32) -> PageContent {
- use pages::*;
- use cce_ui::layout::AdaptiveGrid;
- let margin = cce_ui::layout::page_margin();
- let cx = cx + margin;
- let cy = cy + margin;
- let cw = (cw - 2.0 * margin).max(1.0);
- let ch = (ch - 2.0 * margin).max(1.0);
- let mut layout = AdaptiveGrid::new(260.0, 20.0);
- let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
- let root_focused = cce_ui::widget::focus::is_focused(&self.plates[page_idx]);
- let sec_focused: Vec<bool> = self.page_sec_containers.iter()
- .map(|c| cce_ui::widget::focus::is_focused(c))
- .collect();
- match self.app.current_page {
- Page::Accounts => accounts::view(&mut self.app.accounts, cx, cy, cw, ch, &mut layout, &mut self.ui_context),
- Page::Audio => audio::view(&mut self.app.audio, cx, cy, cw, ch, &sec_focused, &mut layout, &mut self.ui_context),
- Page::Display => display::view(&mut self.app.display, cx, cy, cw, ch, &mut layout, &mut self.ui_context),
- Page::Radios => network::view(&mut self.app.network, cx, cy, cw, ch, root_focused, &mut layout, &mut self.ui_context),
- Page::Hardware => hardware::view(&mut self.app.hardware, cx, cy, cw, ch, root_focused, &mut layout, &mut self.ui_context),
- Page::Input => input::view(&mut self.app.input, cx, cy, cw, ch, &sec_focused, &mut layout, &mut self.ui_context),
- Page::System => system_info::view(&self.app.system_info, cx, cy, cw, ch, &mut layout, &mut self.ui_context),
- Page::Storage => storage::view(&self.app.storage, cx, cy, cw, ch, &mut layout, &mut self.ui_context),
- Page::Services => services::view(&mut self.app.services, cx, cy, cw, ch, &sec_focused, &mut layout, &mut self.ui_context),
- Page::Interface => interface::view(&mut self.app.interface, cx, cy, cw, ch, &sec_focused, &mut layout, &mut self.ui_context),
- Page::Packages => packages::view(&mut self.app.packages, cx, cy, cw, ch, &sec_focused, &mut layout, &mut self.ui_context),
- }
- }
-
fn tick_internal(&mut self, dt: f32) -> bool {
let mut needs_redraw = false;
@@ -1806,3666 +759,6 @@ fn collect_popover_rects(w: &dyn cce_ui::widget::Element, popovers: &mut Vec<(f3
}
}
- fn handle_cursor_moved(&mut self, x: f32, y: f32) -> bool {
- self.cursor_x = x;
- self.cursor_y = y;
- let s = 1.0f32;
- let lx_no_scroll = x / s;
- let ly_no_scroll = y / s;
-
- if cce_ui::widget::context_menu::is_visible() {
- if cce_ui::widget::context_menu::cursor_moved(lx_no_scroll, ly_no_scroll) {
- self.needs_rebuild = true;
- return true;
- }
- return false;
- }
-
- let lx = self.cursor_x / s;
- let ly = self.cursor_y / s + self.scroll_y;
- cce_ui::widget::hover_animation::set_cursor_pos(lx, ly_no_scroll);
- let mut changed = false;
- if self.menubar.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- changed = true;
- }
- if self.switcher.cursor_moved(lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- changed = true;
- }
- for w in &mut self.widgets {
- let was = w.hovering;
- w.hovering = self.cursor_x >= w.x && self.cursor_x <= w.x + w.w
- && self.cursor_y >= w.y && self.cursor_y <= w.y + w.h;
- if w.hovering != was {
- w.color = if w.hovering { w.hover_color } else { w.color };
- changed = true;
- }
- }
-
- if self.app.current_page == Page::Interface {
- for cp in &mut self.app.interface.color_selectors {
- if cp.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.interface.tab_margin_spinbox_x.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.menubar_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.tab_margin_spinbox_y.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.button_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.section_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.label_alignment_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.label_offset_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.label_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.plate_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_show_grid_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_snap_enabled_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_uniform_background_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_cell_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_gap_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.graph_gap_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.page_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.grid_min_col_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.spinbox_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.spinbox_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.toggle_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.toggle_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.plate_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.plate_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.page_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.layer_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
-
-
- if self.app.interface.color_selector_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.color_selector_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.color_selector_preview_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.color_selector_preview_margin_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.color_selector_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.menubar_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.breadcrumb_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.section_label_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.nested_section_label_font_selector.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.textbox_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.textbox_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.slider_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.font_selector_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.font_selector_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.dropdown_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.dropdown_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.button_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.notification_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.window_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.window_corner_radius_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.sans_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.serif_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.mono_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.borders_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.borders_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.status_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.status_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.fuzzel_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.fuzzel_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.terminal_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.terminal_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.borders_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.status_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.fuzzel_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.terminal_size_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.custom_multicontrol.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- for sb in &mut self.app.interface.windows.spinboxes {
- if sb.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.interface.windows.cascade_offset_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.edge_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.top_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.grid_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.transition_duration_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.status_height_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- for menu in &mut self.app.interface.windows.tag_layout_menus {
- if menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.interface.windows.side_panel_behavior_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.side_panel_position_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.side_panel_width_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.side_panel_border_gap_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.side_panel_border_opacity_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.transparency_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.interface.windows.blur_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.current_page == Page::Input {
- if self.app.input.rate_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.delay_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.tap_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.scroll_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.scroll_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.pointer_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.pointer_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.trackpad_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.trackpad_friction_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.dwtp_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.trackpoint_accel_speed_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.trackpoint_accel_profile_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.zoom_in_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.zoom_out_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.input.keybinds_control.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.current_page == Page::Audio {
- if let Some(idx) = self.audio_sink_dragging {
- if idx < self.app.audio.sink_sliders.len() {
- if self.app.audio.sink_sliders[idx].drag_update(lx, ly) {
- changed = true;
- let val = self.app.audio.sink_sliders[idx].value();
- if idx < self.app.audio.sink_spinboxes.len() {
- self.app.audio.sink_spinboxes[idx].value = (val * 100.0).round() as i32;
- }
- if idx < self.app.audio.sinks.len() {
- let id = self.app.audio.sinks[idx].id;
- self.handle_action(&AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, val)));
- }
- }
- }
- } else if let Some(idx) = self.audio_source_dragging {
- if idx < self.app.audio.source_sliders.len() {
- if self.app.audio.source_sliders[idx].drag_update(lx, ly) {
- changed = true;
- let val = self.app.audio.source_sliders[idx].value();
- if idx < self.app.audio.source_spinboxes.len() {
- self.app.audio.source_spinboxes[idx].value = (val * 100.0).round() as i32;
- }
- if idx < self.app.audio.sources.len() {
- let id = self.app.audio.sources[idx].id;
- self.handle_action(&AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, val)));
- }
- }
- }
- } else {
- for sb in &mut self.app.audio.sink_spinboxes {
- if sb.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- for sb in &mut self.app.audio.source_spinboxes {
- if sb.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- for slider in &mut self.app.audio.sink_sliders {
- if slider.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- for slider in &mut self.app.audio.source_sliders {
- if slider.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- }
- }
- if self.app.current_page == Page::Display {
- if self.display_brightness_dragging {
- if self.app.display.brightness_slider.drag_update(lx, ly) {
- changed = true;
- let val = self.app.display.brightness_slider.value();
- let pct = (val * 100.0).round() as u32;
- self.app.display.brightness_spinbox.value = pct as i32;
- self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
- }
- } else {
- if self.app.display.brightness_slider.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.display.brightness_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.display.night_light_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- for out in &mut self.app.display.outputs {
- if out.name_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if out.resolution_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if let Some(ref mut scale_lbl) = out.scale_label {
- if scale_lbl.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- }
- if self.app.display.screensaver_enable_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.display.screensaver_lock_screen_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.display.screensaver_timeout_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.display.screensaver_style_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
-
- if self.app.current_page == Page::Hardware {
- if self.app.hardware.cpu_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.hardware.cpu_usage_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.hardware.cpu_temp_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- for gpu_lbl in &mut self.app.hardware.gpu_labels {
- if gpu_lbl.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.hardware.cpu_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.hardware.cpu_gov_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.hardware.gpu_gov_menu.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
-
- if self.app.current_page == Page::Packages {
- let pkgs = &mut self.app.packages;
- if pkgs.search_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- match pkgs.active_tab {
- pages::packages::PackageTab::Installed => {
- if pkgs.installed_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- let query = if pkgs.search_box.editing {
- pkgs.search_box.edit_buffer.to_lowercase()
- } else {
- pkgs.search_box.text.to_lowercase()
- };
- let matching = pkgs.installed.iter()
- .filter(|p| p.name.to_lowercase().contains(&query) || p.version.to_lowercase().contains(&query))
- .count();
- for i in 0..matching.min(pkgs.installed_items.len()) {
- if pkgs.installed_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- }
- pages::packages::PackageTab::Updates => {
- if pkgs.updates_list_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- let query = if pkgs.search_box.editing {
- pkgs.search_box.edit_buffer.to_lowercase()
- } else {
- pkgs.search_box.text.to_lowercase()
- };
- let matching = pkgs.updates.iter()
- .filter(|p| p.name.to_lowercase().contains(&query))
- .count();
- for i in 0..matching.min(pkgs.updates_items.len()) {
- if pkgs.updates_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- }
- }
- }
-
-
-
- if self.app.current_page == Page::Services {
- if self.app.services.search_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.list_box.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- let query = if self.app.services.search_box.editing {
- self.app.services.search_box.edit_buffer.to_lowercase()
- } else {
- self.app.services.search_box.text.to_lowercase()
- };
- let matching_count = self.app.services.services.iter()
- .filter(|s| s.is_system == (self.app.services.active_tab == pages::services::ServiceTab::System))
- .filter(|s| s.name.to_lowercase().contains(&query) || s.description.to_lowercase().contains(&query))
- .count();
- for i in 0..matching_count.min(self.app.services.service_items.len()) {
- if self.app.services.service_items[i].cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.services.notifications_enable_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.notifications_bell_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.notifications_duration_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.status_label.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.status_separators_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.status_underline_toggle.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- if self.app.services.status_padding_spinbox.cursor_moved(lx, ly, &mut self.ui_context) {
- changed = true;
- }
- }
- if self.app.current_page == Page::Accounts {
- if self.app.accounts.editing_oauth_creds {
- if self.app.accounts.oauth_client_id_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- if self.app.accounts.oauth_client_secret_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- } else if self.app.accounts.adding_new {
- if self.app.accounts.email_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- if self.app.accounts.password_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- if self.app.accounts.imap_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- if self.app.accounts.smtp_box.cursor_moved(lx, ly, &mut self.ui_context) { changed = true; }
- }
- }
- if changed { self.needs_rebuild = true; }
- changed
- }
-
- fn handle_mouse_input_internal(&mut self, button: cce_ui::widget::MouseButton, state: cce_ui::widget::ElementState) -> bool {
- let s = 1.0f32;
- let lx_no_scroll = self.cursor_x / s;
- let ly_no_scroll = self.cursor_y / s;
-
- // CSD Close Button Interaction removed
-
- if cce_ui::widget::context_menu::is_visible() {
- if cce_ui::widget::context_menu::mouse_input(button, state, lx_no_scroll, ly_no_scroll) {
- let mut actions = Vec::new();
- self.propagate_widget_changes(&mut actions);
- for action in actions {
- self.handle_action(&action);
- }
- self.needs_rebuild = true;
- return true;
- }
- }
-
- let mut handled = false;
- if state == cce_ui::widget::ElementState::Pressed {
- if lx_no_scroll < self.sidebar_width {
- if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- use cce_ui::widget::MenuController;
- if let Some((idx, _)) = self.menubar.menu_click() {
- if idx < Page::ALL.len() {
- cce_ui::widget::focus::clear_focus();
- let new_page = Page::ALL[idx];
- self.app.current_page = new_page;
- self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
- self.scroll_y = 0.0;
- pages::interface::write_config_value("last_page", &format!("\"{}\"", new_page.label().to_lowercase()));
- }
- }
- self.needs_rebuild = true;
- handled = true;
- }
- } else {
- if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- self.needs_rebuild = true;
- handled = true;
- }
- }
- } else {
- if self.menubar.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- use cce_ui::widget::MenuController;
- if let Some((idx, _)) = self.menubar.menu_click() {
- if idx < Page::ALL.len() {
- cce_ui::widget::focus::clear_focus();
- let new_page = Page::ALL[idx];
- self.app.current_page = new_page;
- self.current_page_shared.store(idx as u8, std::sync::atomic::Ordering::SeqCst);
- self.scroll_y = 0.0;
- pages::interface::write_config_value("last_page", &format!("\"{}\"", new_page.label().to_lowercase()));
- }
- }
- self.needs_rebuild = true;
- handled = true;
- }
- if self.switcher.mouse_input(button, state, lx_no_scroll, ly_no_scroll, &mut self.ui_context) {
- self.needs_rebuild = true;
- handled = true;
- }
- }
- if handled {
- return true;
- }
-
- if button != cce_ui::widget::MouseButton::Left && button != cce_ui::widget::MouseButton::Right { return false; }
- if button == cce_ui::widget::MouseButton::Left && state == cce_ui::widget::ElementState::Released {
- if self.app.current_page == Page::Audio {
- let mut ended = false;
- if let Some(idx) = self.audio_sink_dragging {
- if idx < self.app.audio.sink_sliders.len() {
- self.app.audio.sink_sliders[idx].drag_end();
- }
- self.audio_sink_dragging = None;
- ended = true;
- }
- if let Some(idx) = self.audio_source_dragging {
- if idx < self.app.audio.source_sliders.len() {
- self.app.audio.source_sliders[idx].drag_end();
- }
- self.audio_source_dragging = None;
- ended = true;
- }
- if ended {
- self.needs_rebuild = true;
- }
- }
- if self.app.current_page == Page::Display {
- if self.display_brightness_dragging {
- self.app.display.brightness_slider.drag_end();
- self.display_brightness_dragging = false;
- self.needs_rebuild = true;
- }
- }
-
- let (px, py) = (self.cursor_x, self.cursor_y);
- for (btn, action) in &self.page_buttons.clone() {
- let base = btn.base().unwrap();
- if px >= base.x && px <= base.x + base.w && py >= base.y && py <= base.y + base.h {
- self.handle_action(action);
- self.needs_rebuild = true;
- return true;
- }
- }
- }
- let lx = self.cursor_x / s;
- let ly = self.cursor_y / s + self.scroll_y;
- let mut actions = Vec::new();
-
- if state == cce_ui::widget::ElementState::Pressed {
- let mut clicked_any_focusable = false;
- match self.app.current_page {
- Page::Accounts => {
- let accs = &mut self.app.accounts;
- if accs.editing_oauth_creds {
- if accs.oauth_client_id_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if accs.oauth_client_secret_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- } else if accs.adding_new {
- if accs.email_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if accs.password_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if accs.imap_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if accs.smtp_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- }
-
- Page::Interface => {
- if self.app.interface.custom_multicontrol.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- for cp in &mut self.app.interface.color_selectors {
- if cp.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- if self.app.interface.tab_margin_spinbox_x.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.menubar_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.tab_margin_spinbox_y.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.button_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.section_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.label_alignment_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.label_offset_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.label_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.plate_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_show_grid_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_snap_enabled_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_uniform_background_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_cell_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_gap_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.graph_gap_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.page_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.grid_min_col_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.spinbox_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.spinbox_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.toggle_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.toggle_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.plate_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.plate_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.page_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.layer_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
-
-
- if self.app.interface.color_selector_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.color_selector_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.color_selector_preview_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.color_selector_preview_margin_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.color_selector_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.menubar_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.breadcrumb_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.nested_section_label_font_selector.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.textbox_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.textbox_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.slider_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.font_selector_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.font_selector_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.dropdown_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.dropdown_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.button_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.notification_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.window_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.interface.window_corner_radius_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- let tf = &mut self.app.interface;
- if tf.sans_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.serif_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.mono_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.borders_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.borders_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.status_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.status_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.fuzzel_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.fuzzel_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.terminal_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.terminal_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- for sb in &mut tf.windows.spinboxes {
- if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- if tf.windows.cascade_offset_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.edge_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.top_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.grid_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.transition_duration_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.status_height_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- for menu in &mut tf.windows.tag_layout_menus {
- if menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- if tf.windows.side_panel_behavior_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.side_panel_position_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.side_panel_width_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.side_panel_border_gap_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.side_panel_border_opacity_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.transparency_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if tf.windows.blur_toggle.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- Page::Input => {
- if self.app.input.rate_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.delay_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.scroll_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.pointer_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.trackpad_friction_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.trackpoint_accel_speed_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.trackpoint_accel_profile_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.zoom_in_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.zoom_out_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.input.keybinds_control.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
-
- Page::Audio => {
- for sb in &mut self.app.audio.sink_spinboxes {
- if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- for sb in &mut self.app.audio.source_spinboxes {
- if sb.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- for slider in &mut self.app.audio.sink_sliders {
- if slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- for slider in &mut self.app.audio.source_sliders {
- if slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- }
- Page::Display => {
- if self.app.display.brightness_slider.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.display.brightness_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.display.night_light_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- for out in &mut self.app.display.outputs {
- if out.name_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if out.resolution_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if let Some(ref mut scale_lbl) = out.scale_label {
- if scale_lbl.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- }
- if self.app.display.screensaver_timeout_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if self.app.display.screensaver_style_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- Page::Services => {
- let srv = &mut self.app.services;
- if srv.search_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if srv.list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if srv.notifications_duration_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if srv.status_label.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if srv.status_padding_spinbox.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- Page::Packages => {
- let pkgs = &mut self.app.packages;
- if pkgs.search_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- match pkgs.active_tab {
- pages::packages::PackageTab::Installed => {
- if pkgs.installed_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- pages::packages::PackageTab::Updates => {
- if pkgs.updates_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- }
- }
- Page::Hardware => {
- let hw = &mut self.app.hardware;
- if hw.cpu_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if hw.cpu_gov_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- if hw.gpu_gov_menu.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- Page::Radios => {
- let net = &mut self.app.network;
- if net.wifi_list_box.hit_test(lx, ly, &self.ui_context) { clicked_any_focusable = true; }
- }
- _ => {}
- }
-
- if !clicked_any_focusable {
- cce_ui::widget::focus::clear_focus();
- }
- }
-
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Interface {
- let tf = &mut self.app.interface.windows;
- for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetWidth(
- pages::interface::WidthParam::ALL[i],
- sb.value as u16,
- )
- )
- ));
- }
- }
- let sb = &mut tf.cascade_offset_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetCascadeOffset(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.edge_gap_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetEdgeGap(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.top_gap_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetTopGap(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.grid_gap_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetGridGap(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.transition_duration_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetTransitionDuration(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.status_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetStatusHeight(sb.value as u16)
- )
- ));
- }
- }
- if self.app.current_page == Page::Interface {
- let tf = &mut self.app.interface.windows;
- for (idx, menu) in tf.tag_layout_menus.iter_mut().enumerate() {
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetTagLayout(idx + 1, menu.selected)
- )
- ));
- }
- }
- let menu = &mut tf.side_panel_behavior_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBehavior(menu.selected)
- )
- ));
- }
- let menu = &mut tf.side_panel_position_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelPosition(menu.selected)
- )
- ));
- }
- let sb = &mut tf.side_panel_width_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelWidth(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.side_panel_border_gap_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBorderGap(sb.value as u16)
- )
- ));
- }
- let sb = &mut tf.side_panel_border_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBorderOpacity(sb.value as u16)
- )
- ));
- }
- let toggle = &mut tf.transparency_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::ToggleTransparency
- )
- ));
- }
- let toggle2 = &mut tf.blur_toggle;
- toggle2.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle2.take_click() {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::ToggleBlur
- )
- ));
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Interface {
- for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
- let old = cp.color;
- if !cp.hit_test(lx, ly, &self.ui_context) { cp.unfocus(); }
- cp.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if cp.take_click() {
- actions.push(AppAction::Interface(match i {
- 0 => pages::interface::InterfaceMessage::PickPageLowColor,
- 1 => pages::interface::InterfaceMessage::PickHighColor,
- 2 => pages::interface::InterfaceMessage::PickVisualGuides,
- 3 => pages::interface::InterfaceMessage::PickDisabledColor,
- 4 => pages::interface::InterfaceMessage::PickSeparatorColor,
- 5 => pages::interface::InterfaceMessage::PickSliderTrackColor,
- 6 => pages::interface::InterfaceMessage::PickColorBordersColor,
- 7 => pages::interface::InterfaceMessage::PickLowColor,
- 8 => pages::interface::InterfaceMessage::PickNormalColor,
- 9 => pages::interface::InterfaceMessage::PickPaginatorSidebarColor,
- 10 => pages::interface::InterfaceMessage::PickPrimaryHighlightColor,
- 11 => pages::interface::InterfaceMessage::PickMenubarTabLabelColor,
- 12 => pages::interface::InterfaceMessage::PickToggleEnabledColor,
- 13 => pages::interface::InterfaceMessage::PickToggleDisabledColor,
- 14 => pages::interface::InterfaceMessage::PickScrollingListBgColor,
- 15 => pages::interface::InterfaceMessage::PickBreadcrumbBgColor,
- 16 => pages::interface::InterfaceMessage::PickPopoverBgColor,
- 17 => pages::interface::InterfaceMessage::PickNotificationBgColor,
- 18 => pages::interface::InterfaceMessage::PickWindowColor,
- 19 => pages::interface::InterfaceMessage::PickPageColor,
- 20 => pages::interface::InterfaceMessage::PickLayerColor,
- _ => pages::interface::InterfaceMessage::PickLowColor,
- }));
- }
- if cp.color != old {
- actions.push(AppAction::Interface(match i {
- 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
- 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
- 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
- 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
- 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
- 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
- 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
- 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
- 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
- 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
- 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
- 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),
- 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
- 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
- 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
- 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
- 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
- _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- }));
- }
- }
- let sb = &mut self.app.interface.menubar_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.notification_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.window_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.window_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.tab_margin_spinbox_x;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(sb.value as u16)));
- }
- let sb = &mut self.app.interface.tab_margin_spinbox_y;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(sb.value as u16)));
- }
- let sb = &mut self.app.interface.button_padding_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(sb.value as u16)));
- }
- let sb = &mut self.app.interface.section_padding_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(sb.value as u16)));
- }
- let menu = &mut self.app.interface.label_alignment_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(menu.selected)));
- }
- let sb = &mut self.app.interface.label_offset_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(sb.value as i16)));
- }
- let sb = &mut self.app.interface.label_margin_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(sb.value as u16)));
- }
- let sb = &mut self.app.interface.plate_padding_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(sb.value as u16)));
- }
- let toggle = &mut self.app.interface.graph_show_grid_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphShowGrid(toggle.toggled())));
- }
- let toggle = &mut self.app.interface.graph_snap_enabled_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphSnapEnabled(toggle.toggled())));
- }
- let toggle = &mut self.app.interface.graph_uniform_background_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphUniformBackground(toggle.toggled())));
- }
- let sb = &mut self.app.interface.graph_gap_width_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapWidth(sb.value as u16)));
- }
- let sb = &mut self.app.interface.graph_cell_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.graph_gap_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.page_margin_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(sb.value as u16)));
- }
- let sb = &mut self.app.interface.grid_min_col_width_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(sb.value as u16)));
- }
- let sb = &mut self.app.interface.spinbox_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.spinbox_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.toggle_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.toggle_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.plate_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.plate_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.page_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(sb.value as f32 / 100.0)));
- }
- let sb = &mut self.app.interface.layer_opacity_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(sb.value as f32 / 100.0)));
- }
-
-
- let sb = &mut self.app.interface.color_selector_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.color_selector_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.color_selector_preview_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.color_selector_preview_margin_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(sb.value as u16)));
- }
- let sb = &mut self.app.interface.textbox_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.textbox_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.slider_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.font_selector_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.font_selector_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.dropdown_height_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(sb.value as u16)));
- }
- let sb = &mut self.app.interface.dropdown_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(sb.value as u16)));
- }
- let sb = &mut self.app.interface.button_corner_radius_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(sb.value as u16)));
- }
- }
-
- if self.app.current_page == Page::Interface {
- let mc = &mut self.app.interface.custom_multicontrol;
- if state == cce_ui::widget::ElementState::Pressed && !mc.hit_test(lx, ly, &self.ui_context) {
- mc.unfocus();
- }
- if mc.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Input {
- let sb = &mut self.app.input.rate_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- }
- let sb = &mut self.app.input.delay_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- }
- let sb = &mut self.app.input.scroll_friction_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
- }
- let sb = &mut self.app.input.scroll_speed_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
- }
- let sb = &mut self.app.input.pointer_friction_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
- }
- let sb = &mut self.app.input.trackpad_friction_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
- }
- let sb = &mut self.app.input.trackpoint_accel_speed_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
- }
- let sb = &mut self.app.input.cursor_size_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
- }
- let kc = &mut self.app.input.keybinds_control;
- if state == cce_ui::widget::ElementState::Pressed && !kc.hit_test(lx, ly, &self.ui_context) {
- kc.unfocus();
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Services {
- let sb = &mut self.app.services.notifications_duration_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(sb.value)));
- }
- let sb2 = &mut self.app.services.status_padding_spinbox;
- if !sb2.hit_test(lx, ly, &self.ui_context) { sb2.unfocus(); }
- let old2 = sb2.value;
- if sb2.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb2.value != old2 {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(sb2.value as u16)));
- }
- }
- if self.app.current_page == Page::Input {
- let toggle = &mut self.app.input.tap_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleTapToClick));
- }
- let toggle = &mut self.app.input.scroll_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialScroll));
- }
- let toggle = &mut self.app.input.natural_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleNaturalScroll));
- }
- let toggle = &mut self.app.input.pointer_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialPointer));
- }
- let toggle = &mut self.app.input.trackpad_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialTrackpad));
- }
- let toggle = &mut self.app.input.dwtp_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleDwtp));
- }
- let menu = &mut self.app.input.trackpoint_accel_profile_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelProfile(menu.selected)));
- }
- let menu = &mut self.app.input.cursor_theme_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorTheme(menu.selected)));
- }
-
- let tb = &mut self.app.input.zoom_in_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
- }
-
- let tb = &mut self.app.input.zoom_out_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
- }
- let kc = &mut self.app.input.keybinds_control;
- if kc.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if kc.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
- self.needs_rebuild = true;
- }
- }
- if self.app.current_page == Page::Services {
- let toggle = &mut self.app.services.notifications_enable_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsEnable));
- }
- let toggle = &mut self.app.services.notifications_bell_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsBell));
- }
- if state == cce_ui::widget::ElementState::Pressed {
- let lbl1 = &mut self.app.services.status_label;
- if !lbl1.hit_test(lx, ly, &self.ui_context) { lbl1.unfocus(); }
- lbl1.mouse_input(button, state, lx, ly, &mut self.ui_context);
- }
- let toggle = &mut self.app.services.status_separators_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleSeparators));
- }
- let toggle2 = &mut self.app.services.status_underline_toggle;
- toggle2.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle2.take_click() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleUnderline));
- }
- }
- if self.app.current_page == Page::Display {
- let toggle = &mut self.app.display.screensaver_enable_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverEnable));
- }
-
- let toggle = &mut self.app.display.screensaver_lock_screen_toggle;
- toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if toggle.take_click() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverLockScreen));
- }
-
- let menu = &mut self.app.display.screensaver_style_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(menu.selected)));
- }
- }
- if self.app.current_page == Page::Hardware {
- let menu = &mut self.app.hardware.cpu_gov_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- if menu.selected == 0 {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPerformance));
- } else {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPowersave));
- }
- }
-
- let menu = &mut self.app.hardware.gpu_gov_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- if menu.selected == 0 {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuDefault));
- } else {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuPowersave));
- }
- }
- }
-
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Audio {
- if button == cce_ui::widget::MouseButton::Left {
- for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
- if slider.hit_test(lx, ly, &self.ui_context) {
- slider.drag_begin(lx, ly);
- self.audio_sink_dragging = Some(i);
- self.needs_rebuild = true;
- }
- }
- for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
- if slider.hit_test(lx, ly, &self.ui_context) {
- slider.drag_begin(lx, ly);
- self.audio_source_dragging = Some(i);
- self.needs_rebuild = true;
- }
- }
- }
- for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- let id = self.app.audio.sinks[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
- }
- }
- for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- let id = self.app.audio.sources[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
- }
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Display {
- if button == cce_ui::widget::MouseButton::Left {
- let slider = &mut self.app.display.brightness_slider;
- if slider.hit_test(lx, ly, &self.ui_context) {
- slider.drag_begin(lx, ly);
- self.display_brightness_dragging = true;
- self.needs_rebuild = true;
- }
- }
- let sb = &mut self.app.display.brightness_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(sb.value as u32)));
- }
- let lbl = &mut self.app.display.night_light_label;
- if !lbl.hit_test(lx, ly, &self.ui_context) { lbl.unfocus(); }
- lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
-
- for out in &mut self.app.display.outputs {
- let lbl = &mut out.name_label;
- if !lbl.hit_test(lx, ly, &self.ui_context) { lbl.unfocus(); }
- lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
-
- let lbl2 = &mut out.resolution_label;
- if !lbl2.hit_test(lx, ly, &self.ui_context) { lbl2.unfocus(); }
- lbl2.mouse_input(button, state, lx, ly, &mut self.ui_context);
-
- if let Some(ref mut scale_lbl) = out.scale_label {
- if !scale_lbl.hit_test(lx, ly, &self.ui_context) { scale_lbl.unfocus(); }
- scale_lbl.mouse_input(button, state, lx, ly, &mut self.ui_context);
- }
- }
-
- let sb = &mut self.app.display.screensaver_timeout_spinbox;
- if !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) && sb.value != old {
- actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(sb.value)));
- }
- }
-
- if self.app.current_page == Page::Accounts {
- if self.app.accounts.editing_oauth_creds {
- let tb = &mut self.app.accounts.oauth_client_id_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
-
- let tb = &mut self.app.accounts.oauth_client_secret_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- } else if self.app.accounts.adding_new {
- let tb = &mut self.app.accounts.email_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- let email_val = tb.text.trim().to_lowercase();
- if email_val.ends_with("@gmail.com") {
- self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
- } else if email_val.ends_with("@icloud.com") {
- self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
- } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
- self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
- }
- }
-
- let tb = &mut self.app.accounts.password_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
-
- let tb = &mut self.app.accounts.imap_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
-
- let tb = &mut self.app.accounts.smtp_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- }
- }
- if self.app.current_page == Page::Interface {
- let tb = &mut self.app.interface.sans_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(tb.text.clone())));
- }
-
- let tb = &mut self.app.interface.serif_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(tb.text.clone())));
- }
-
- let tb = &mut self.app.interface.mono_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(tb.text.clone())));
- }
-
- let menu = &mut self.app.interface.borders_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersMenu(menu.selected)));
- }
-
- let tb = &mut self.app.interface.borders_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(tb.text.clone())));
- }
-
- let menu = &mut self.app.interface.status_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusMenu(menu.selected)));
- }
-
- let tb = &mut self.app.interface.status_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(tb.text.clone())));
- }
-
- let menu = &mut self.app.interface.fuzzel_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelMenu(menu.selected)));
- }
-
- let tb = &mut self.app.interface.fuzzel_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(tb.text.clone())));
- }
-
- let menu = &mut self.app.interface.terminal_menu;
- if state == cce_ui::widget::ElementState::Pressed && !menu.hit_test(lx, ly, &self.ui_context) { menu.unfocus(); }
- if menu.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalMenu(menu.selected)));
- }
-
- let tb = &mut self.app.interface.terminal_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if state == cce_ui::widget::ElementState::Pressed && tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(tb.text.clone())));
- }
-
-
-
-
-
- let fs = &mut self.app.interface.color_selector_font_selector;
- if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
- if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if fs.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorFont(fs.font_family.clone())));
- }
-
- let fs = &mut self.app.interface.menubar_font_selector;
- if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
- if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if fs.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarFont(fs.font_family.clone())));
- }
-
- let fs = &mut self.app.interface.breadcrumb_font_selector;
- if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
- if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if fs.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBreadcrumbFont(fs.font_family.clone())));
- }
-
- let fs = &mut self.app.interface.section_label_font_selector;
- if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
- if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if fs.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionLabelFont(fs.font_family.clone())));
- }
-
- let fs = &mut self.app.interface.nested_section_label_font_selector;
- if state == cce_ui::widget::ElementState::Pressed && !fs.hit_test(lx, ly, &self.ui_context) { fs.unfocus(); }
- if fs.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if fs.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelFont(fs.font_family.clone())));
- }
-
- let sb = &mut self.app.interface.borders_size_box;
- if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old_val = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if sb.value != old_val {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(sb.value)));
- }
-
- let sb = &mut self.app.interface.status_size_box;
- if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old_val = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if sb.value != old_val {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(sb.value)));
- }
-
- let sb = &mut self.app.interface.fuzzel_size_box;
- if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old_val = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if sb.value != old_val {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelSize(sb.value)));
- }
-
- let sb = &mut self.app.interface.terminal_size_box;
- if state == cce_ui::widget::ElementState::Pressed && !sb.hit_test(lx, ly, &self.ui_context) { sb.unfocus(); }
- let old_val = sb.value;
- if sb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if sb.value != old_val {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalSize(sb.value)));
- }
-
-
-
-
- }
- if self.app.current_page == Page::Services {
- let tb = &mut self.app.services.search_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) { tb.unfocus(); }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- let srv = &mut self.app.services;
- if srv.list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- let query = if srv.search_box.editing {
- srv.search_box.edit_buffer.to_lowercase()
- } else {
- srv.search_box.text.to_lowercase()
- };
- let matching_count = srv.services.iter()
- .filter(|s| s.is_system == (srv.active_tab == pages::services::ServiceTab::System))
- .filter(|s| s.name.to_lowercase().contains(&query) || s.description.to_lowercase().contains(&query))
- .count();
- for i in 0..matching_count.min(srv.service_items.len()) {
- if srv.service_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- }
- }
- if self.app.current_page == Page::Packages {
- let pkgs = &mut self.app.packages;
- let tb = &mut pkgs.search_box;
- if state == cce_ui::widget::ElementState::Pressed && !tb.hit_test(lx, ly, &self.ui_context) {
- tb.unfocus();
- }
- if tb.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- match pkgs.active_tab {
- pages::packages::PackageTab::Installed => {
- if pkgs.installed_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- let query = if pkgs.search_box.editing {
- pkgs.search_box.edit_buffer.to_lowercase()
- } else {
- pkgs.search_box.text.to_lowercase()
- };
- let filtered: Vec<&pages::packages::PackageInfo> = pkgs.installed.iter()
- .filter(|p| p.name.to_lowercase().contains(&query) || p.version.to_lowercase().contains(&query))
- .collect();
- let matching = filtered.len();
- for i in 0..matching.min(pkgs.installed_items.len()) {
- if pkgs.installed_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if pkgs.installed_items[i].take_click() {
- let pkg_name = filtered[i].name.clone();
- actions.push(AppAction::Packages(pages::packages::PackagesMessage::SelectPackage(Some(pkg_name))));
- }
- }
- }
- pages::packages::PackageTab::Updates => {
- if pkgs.updates_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- let query = if pkgs.search_box.editing {
- pkgs.search_box.edit_buffer.to_lowercase()
- } else {
- pkgs.search_box.text.to_lowercase()
- };
- let filtered: Vec<&pages::packages::UpdateInfo> = pkgs.updates.iter()
- .filter(|p| p.name.to_lowercase().contains(&query))
- .collect();
- let matching = filtered.len();
- for i in 0..matching.min(pkgs.updates_items.len()) {
- if pkgs.updates_items[i].mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- if pkgs.updates_items[i].take_click() {
- let pkg_name = filtered[i].name.clone();
- actions.push(AppAction::Packages(pages::packages::PackagesMessage::SelectPackage(Some(pkg_name))));
- }
- }
- }
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Hardware {
- let hw = &mut self.app.hardware;
- if hw.cpu_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- }
- if state == cce_ui::widget::ElementState::Pressed && self.app.current_page == Page::Radios {
- let net = &mut self.app.network;
- if net.wifi_list_box.mouse_input(button, state, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- }
- net.wifi_toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if net.wifi_toggle.take_click() {
- actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleWifi));
- }
- net.bt_toggle.mouse_input(button, state, lx, ly, &mut self.ui_context);
- if net.bt_toggle.take_click() {
- actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleBluetooth));
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if !actions.is_empty() {
- self.needs_rebuild = true;
- return true;
- }
- self.needs_rebuild = true;
- true
- }
-
- fn propagate_widget_changes(&mut self, actions: &mut Vec<AppAction>) {
- match self.app.current_page {
- Page::Interface => {
- for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
- if cp.take_change() {
- actions.push(AppAction::Interface(match i {
- 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
- 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
- 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
- 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
- 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
- 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
- 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
- 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
- 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
- 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
- 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
- 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),
- 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
- 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
- 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
- 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
- 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
- _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- }));
- }
- }
- if self.app.interface.notification_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(self.app.interface.notification_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.menubar_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(self.app.interface.menubar_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.tab_margin_spinbox_x.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(self.app.interface.tab_margin_spinbox_x.value as u16)));
- }
- if self.app.interface.tab_margin_spinbox_y.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(self.app.interface.tab_margin_spinbox_y.value as u16)));
- }
- if self.app.interface.button_padding_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(self.app.interface.button_padding_spinbox.value as u16)));
- }
- if self.app.interface.section_padding_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(self.app.interface.section_padding_spinbox.value as u16)));
- }
- if self.app.interface.label_alignment_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(self.app.interface.label_alignment_menu.selected)));
- }
- if self.app.interface.label_offset_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(self.app.interface.label_offset_spinbox.value as i16)));
- }
- if self.app.interface.label_margin_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(self.app.interface.label_margin_spinbox.value as u16)));
- }
- if self.app.interface.plate_padding_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(self.app.interface.plate_padding_spinbox.value as u16)));
- }
- if self.app.interface.graph_show_grid_toggle.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphShowGrid(self.app.interface.graph_show_grid_toggle.toggled())));
- }
- if self.app.interface.graph_snap_enabled_toggle.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphSnapEnabled(self.app.interface.graph_snap_enabled_toggle.toggled())));
- }
- if self.app.interface.graph_uniform_background_toggle.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphUniformBackground(self.app.interface.graph_uniform_background_toggle.toggled())));
- }
- if self.app.interface.graph_cell_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(self.app.interface.graph_cell_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.graph_gap_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(self.app.interface.graph_gap_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.page_margin_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(self.app.interface.page_margin_spinbox.value as u16)));
- }
- if self.app.interface.grid_min_col_width_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(self.app.interface.grid_min_col_width_spinbox.value as u16)));
- }
- if self.app.interface.spinbox_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(self.app.interface.spinbox_height_spinbox.value as u16)));
- }
- if self.app.interface.spinbox_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(self.app.interface.spinbox_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.toggle_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(self.app.interface.toggle_height_spinbox.value as u16)));
- }
- if self.app.interface.toggle_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(self.app.interface.toggle_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.plate_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(self.app.interface.plate_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.plate_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(self.app.interface.plate_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.page_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(self.app.interface.page_opacity_spinbox.value as f32 / 100.0)));
- }
- if self.app.interface.layer_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(self.app.interface.layer_opacity_spinbox.value as f32 / 100.0)));
- }
-
-
- if self.app.interface.color_selector_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(self.app.interface.color_selector_height_spinbox.value as u16)));
- }
- if self.app.interface.color_selector_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(self.app.interface.color_selector_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.color_selector_preview_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(self.app.interface.color_selector_preview_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.color_selector_preview_margin_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(self.app.interface.color_selector_preview_margin_spinbox.value as u16)));
- }
- if self.app.interface.textbox_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(self.app.interface.textbox_height_spinbox.value as u16)));
- }
- if self.app.interface.textbox_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(self.app.interface.textbox_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.slider_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(self.app.interface.slider_height_spinbox.value as u16)));
- }
- if self.app.interface.font_selector_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(self.app.interface.font_selector_height_spinbox.value as u16)));
- }
- if self.app.interface.font_selector_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(self.app.interface.font_selector_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.dropdown_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(self.app.interface.dropdown_height_spinbox.value as u16)));
- }
- if self.app.interface.dropdown_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(self.app.interface.dropdown_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.button_corner_radius_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(self.app.interface.button_corner_radius_spinbox.value as u16)));
- }
- if self.app.interface.sans_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(self.app.interface.sans_box.text.clone())));
- }
- if self.app.interface.serif_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(self.app.interface.serif_box.text.clone())));
- }
- if self.app.interface.mono_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(self.app.interface.mono_box.text.clone())));
- }
- if self.app.interface.borders_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersMenu(self.app.interface.borders_menu.selected)));
- }
- if self.app.interface.borders_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(self.app.interface.borders_box.text.clone())));
- }
- if self.app.interface.status_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusMenu(self.app.interface.status_menu.selected)));
- }
- if self.app.interface.status_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(self.app.interface.status_box.text.clone())));
- }
- if self.app.interface.fuzzel_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelMenu(self.app.interface.fuzzel_menu.selected)));
- }
- if self.app.interface.fuzzel_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(self.app.interface.fuzzel_box.text.clone())));
- }
- if self.app.interface.terminal_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalMenu(self.app.interface.terminal_menu.selected)));
- }
- if self.app.interface.terminal_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(self.app.interface.terminal_box.text.clone())));
- }
- if self.app.interface.color_selector_font_selector.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorFont(self.app.interface.color_selector_font_selector.font_family.clone())));
- }
- if self.app.interface.menubar_font_selector.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarFont(self.app.interface.menubar_font_selector.font_family.clone())));
- }
- if self.app.interface.section_label_font_selector.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSectionLabelFont(self.app.interface.section_label_font_selector.font_family.clone())));
- }
- if self.app.interface.nested_section_label_font_selector.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelFont(self.app.interface.nested_section_label_font_selector.font_family.clone())));
- }
- if self.app.interface.borders_size_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(self.app.interface.borders_size_box.value)));
- }
- if self.app.interface.status_size_box.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(self.app.interface.status_size_box.value)));
- }
-
- let tf = &mut self.app.interface.windows;
- for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
- if sb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetWidth(pages::interface::WidthParam::ALL[i], sb.value as u16))));
- }
- }
- if tf.cascade_offset_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetCascadeOffset(tf.cascade_offset_spinbox.value as u16))));
- }
- if tf.edge_gap_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetEdgeGap(tf.edge_gap_spinbox.value as u16))));
- }
- if tf.top_gap_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTopGap(tf.top_gap_spinbox.value as u16))));
- }
- if tf.grid_gap_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetGridGap(tf.grid_gap_spinbox.value as u16))));
- }
- if tf.transition_duration_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTransitionDuration(tf.transition_duration_spinbox.value as u16))));
- }
- if tf.status_height_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetStatusHeight(tf.status_height_spinbox.value as u16))));
- }
- for (idx, menu) in tf.tag_layout_menus.iter_mut().enumerate() {
- if menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetTagLayout(idx + 1, menu.selected))));
- }
- }
- if tf.side_panel_behavior_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBehavior(tf.side_panel_behavior_menu.selected))));
- }
- if tf.side_panel_position_menu.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelPosition(tf.side_panel_position_menu.selected))));
- }
- if tf.side_panel_width_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelWidth(tf.side_panel_width_spinbox.value as u16))));
- }
- if tf.side_panel_border_gap_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBorderGap(tf.side_panel_border_gap_spinbox.value as u16))));
- }
- if tf.side_panel_border_opacity_spinbox.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::Windows(pages::interface::WindowsMessage::SetSidePanelBorderOpacity(tf.side_panel_border_opacity_spinbox.value as u16))));
- }
- }
- Page::Input => {
- if self.app.input.rate_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- }
- if self.app.input.delay_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- }
- if self.app.input.scroll_friction_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
- }
- if self.app.input.scroll_speed_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
- }
- if self.app.input.pointer_friction_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
- }
- if self.app.input.trackpad_friction_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
- }
- if self.app.input.trackpoint_accel_speed_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
- }
- if self.app.input.cursor_size_spinbox.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
- }
- if self.app.input.tap_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleTapToClick));
- }
- if self.app.input.scroll_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialScroll));
- }
- if self.app.input.natural_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleNaturalScroll));
- }
- if self.app.input.pointer_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialPointer));
- }
- if self.app.input.trackpad_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleInertialTrackpad));
- }
- if self.app.input.dwtp_toggle.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ToggleDwtp));
- }
- if self.app.input.trackpoint_accel_profile_menu.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelProfile(self.app.input.trackpoint_accel_profile_menu.selected)));
- }
- if self.app.input.cursor_theme_menu.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyCursorTheme(self.app.input.cursor_theme_menu.selected)));
- }
- if self.app.input.zoom_in_box.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
- }
- if self.app.input.zoom_out_box.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
- }
- if self.app.input.keybinds_control.take_change() {
- actions.push(AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
- }
- }
- Page::Services => {
- if self.app.services.notifications_duration_spinbox.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(self.app.services.notifications_duration_spinbox.value)));
- }
- if self.app.services.status_padding_spinbox.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(self.app.services.status_padding_spinbox.value as u16)));
- }
- if self.app.services.notifications_enable_toggle.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsEnable));
- }
- if self.app.services.notifications_bell_toggle.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::ToggleNotificationsBell));
- }
- if self.app.services.status_separators_toggle.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleSeparators));
- }
- if self.app.services.status_underline_toggle.take_change() {
- actions.push(AppAction::Services(pages::services::ServicesMessage::StatusToggleUnderline));
- }
- }
- Page::Display => {
- if self.app.display.screensaver_enable_toggle.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverEnable));
- }
- if self.app.display.screensaver_lock_screen_toggle.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::ToggleScreensaverLockScreen));
- }
- if self.app.display.screensaver_style_menu.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(self.app.display.screensaver_style_menu.selected)));
- }
- if self.app.display.brightness_spinbox.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(self.app.display.brightness_spinbox.value as u32)));
- }
- if self.app.display.brightness_slider.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet((self.app.display.brightness_slider.value() * 100.0).round() as u32)));
- }
- if self.app.display.screensaver_timeout_spinbox.take_change() {
- actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(self.app.display.screensaver_timeout_spinbox.value)));
- }
- }
- Page::Hardware => {
- if self.app.hardware.cpu_gov_menu.take_change() {
- if self.app.hardware.cpu_gov_menu.selected == 0 {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPerformance));
- } else {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetCpuPowersave));
- }
- }
- if self.app.hardware.gpu_gov_menu.take_change() {
- if self.app.hardware.gpu_gov_menu.selected == 0 {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuDefault));
- } else {
- actions.push(AppAction::Hardware(pages::hardware::HardwareMessage::SetGpuPowersave));
- }
- }
- }
- Page::Accounts => {
- if self.app.accounts.adding_new && self.app.accounts.email_box.take_change() {
- let email_val = self.app.accounts.email_box.text.trim().to_lowercase();
- if email_val.ends_with("@gmail.com") {
- self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
- } else if email_val.ends_with("@icloud.com") {
- self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
- } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
- self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
- }
- }
- }
- Page::Audio => {
- for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
- if sb.take_change() {
- let id = self.app.audio.sinks[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
- }
- }
- for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
- if sb.take_change() {
- let id = self.app.audio.sources[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
- }
- }
- for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
- if slider.take_change() {
- let id = self.app.audio.sinks[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, slider.value() as f32 / 100.0)));
- }
- }
- for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
- if slider.take_change() {
- let id = self.app.audio.sources[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, slider.value() as f32 / 100.0)));
- }
- }
- }
- Page::Radios => {
- let net = &mut self.app.network;
- if net.wifi_toggle.take_change() {
- actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleWifi));
- }
- if net.bt_toggle.take_change() {
- actions.push(AppAction::Radios(pages::network::NetworkMessage::ToggleBluetooth));
- }
- }
- _ => {}
- }
- }
-
- fn handle_mouse_wheel_internal(&mut self, delta: &cce_ui::widget::MouseScrollDelta, px: f32, py: f32) -> bool {
- if let Ok(mut file) = std::fs::OpenOptions::new().create(true).append(true).open("/tmp/cce-scroll-debug.log") {
- use std::io::Write;
- let _ = writeln!(file, "handle_mouse_wheel_internal: px={}, py={}, delta={:?}, sidebar_w={}", px, py, delta, self.sidebar_width);
- }
- let s = 1.0f32;
- if px >= self.sidebar_width * s {
- let lx = px / s;
- let ly = py / s + self.scroll_y;
-
- if self.app.current_page == Page::Input {
- let input = &self.app.input;
- if input.is_over_trackpad(lx, ly, &self.ui_context) {
- return true;
- }
- }
- if self.app.current_page == Page::Audio {
- let mut actions = Vec::new();
- for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
- let old = sb.value;
- if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb.value != old {
- let id = self.app.audio.sinks[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
- }
- }
- }
- for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
- let old = sb.value;
- if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb.value != old {
- let id = self.app.audio.sources[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
- }
- }
- }
- for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
- let old = slider.value();
- if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- let new_val = slider.value();
- if new_val != old {
- let id = self.app.audio.sinks[i].id;
- if i < self.app.audio.sink_spinboxes.len() {
- self.app.audio.sink_spinboxes[i].value = (new_val * 100.0).round() as i32;
- }
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, new_val)));
- }
- }
- }
- for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
- let old = slider.value();
- if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- let new_val = slider.value();
- if new_val != old {
- let id = self.app.audio.sources[i].id;
- if i < self.app.audio.source_spinboxes.len() {
- self.app.audio.source_spinboxes[i].value = (new_val * 100.0).round() as i32;
- }
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, new_val)));
- }
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if !actions.is_empty() {
- self.needs_rebuild = true;
- return true;
- }
- }
-
- if self.app.current_page == Page::Display {
- let mut actions = Vec::new();
- let slider = &mut self.app.display.brightness_slider;
- let old_val = slider.value();
- if slider.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- let new_val = slider.value();
- if new_val != old_val {
- let pct = (new_val * 100.0).round() as u32;
- self.app.display.brightness_spinbox.value = pct as i32;
- actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
- }
- }
- let sb = &mut self.app.display.brightness_spinbox;
- let old = sb.value;
- if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Display(pages::display::DisplayMessage::BrightnessSet(sb.value as u32)));
- }
- }
- let sb2 = &mut self.app.display.screensaver_timeout_spinbox;
- let old2 = sb2.value;
- if sb2.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb2.value != old2 {
- actions.push(AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(sb2.value)));
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if !actions.is_empty() {
- self.needs_rebuild = true;
- return true;
- }
- }
-
-
- if self.app.current_page == Page::Interface {
- let mut actions = Vec::new();
- let sb = &mut self.app.interface.graph_cell_opacity_spinbox;
- let old = sb.value;
- if sb.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphCellOpacity(sb.value as f32 / 100.0)));
- }
- }
- let sb2 = &mut self.app.interface.graph_gap_opacity_spinbox;
- let old2 = sb2.value;
- if sb2.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb2.value != old2 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapOpacity(sb2.value as f32 / 100.0)));
- }
- }
- let sb3 = &mut self.app.interface.window_opacity_spinbox;
- let old3 = sb3.value;
- if sb3.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb3.value != old3 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(sb3.value as f32 / 100.0)));
- }
- }
- let sb4 = &mut self.app.interface.window_corner_radius_spinbox;
- let old4 = sb4.value;
- if sb4.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb4.value != old4 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(sb4.value as u16)));
- }
- }
- let sb5 = &mut self.app.interface.plate_opacity_spinbox;
- let old5 = sb5.value;
- if sb5.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb5.value != old5 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(sb5.value as f32 / 100.0)));
- }
- }
- let sb6 = &mut self.app.interface.plate_corner_radius_spinbox;
- let old6 = sb6.value;
- if sb6.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb6.value != old6 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(sb6.value as u16)));
- }
- }
- let sb7 = &mut self.app.interface.page_opacity_spinbox;
- let old7 = sb7.value;
- if sb7.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb7.value != old7 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(sb7.value as f32 / 100.0)));
- }
- }
- let sb8 = &mut self.app.interface.layer_opacity_spinbox;
- let old8 = sb8.value;
- if sb8.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- if sb8.value != old8 {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(sb8.value as f32 / 100.0)));
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if !actions.is_empty() {
- self.needs_rebuild = true;
- return true;
- }
- }
-
- if self.app.current_page == Page::Services {
- let srv = &mut self.app.services;
- if srv.list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Packages {
- let pkgs = &mut self.app.packages;
- match pkgs.active_tab {
- pages::packages::PackageTab::Installed => {
- if pkgs.installed_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
- pages::packages::PackageTab::Updates => {
- if pkgs.updates_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
- }
- }
- if self.app.current_page == Page::Hardware {
- let hw = &mut self.app.hardware;
- if hw.cpu_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Radios {
- let net = &mut self.app.network;
- if net.wifi_list_box.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
-
- let scroll_speed = 24.0;
- let dy = match delta {
- cce_ui::widget::MouseScrollDelta::LineDelta(_, y) => -y * scroll_speed,
- cce_ui::widget::MouseScrollDelta::PixelDelta(pos) => -pos.y as f32,
- };
- let old_scroll = self.scroll_y;
- self.scroll_y = (self.scroll_y + dy).max(0.0).min(self.max_scroll_y);
- if (self.scroll_y - old_scroll).abs() > 0.01 {
- self.needs_rebuild = true;
- return true;
- }
- } else {
- let lx = px / s;
- let ly = py / s;
- if self.menubar.mouse_wheel(delta, lx, ly, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- }
- false
- }
-
- fn get_page_root_widget(&mut self) -> Option<*mut (dyn cce_ui::widget::Element + 'static)> {
- let page_idx = Page::ALL.iter().position(|&p| p == self.app.current_page).unwrap_or(0);
- let ptr = &mut self.plates[page_idx] as &mut dyn cce_ui::widget::Element as *mut dyn cce_ui::widget::Element;
- let static_ptr = unsafe {
- std::mem::transmute::<*mut dyn cce_ui::widget::Element, *mut (dyn cce_ui::widget::Element + 'static)>(ptr)
- };
- Some(static_ptr)
- }
-
- fn handle_key_input_internal(&mut self, event: &cce_ui::widget::KeyEvent) -> bool {
- if cce_ui::widget::context_menu::is_visible() {
- if event.state == cce_ui::widget::ElementState::Pressed
- && event.logical_key == cce_ui::widget::Key::Named(cce_ui::widget::NamedKey::Escape)
- {
- cce_ui::widget::context_menu::hide();
- self.needs_rebuild = true;
- return true;
- }
- }
-
- if event.state == cce_ui::widget::ElementState::Pressed && !event.repeat {
- let is_nav_key = match (&event.logical_key, event.ctrl) {
- (cce_ui::widget::Key::Character(c), true) if c == "j" || c == "J" || c == "k" || c == "K" || c == "u" || c == "U" || c == "i" || c == "I" => true,
- _ => false,
- };
- if is_nav_key {
- if cce_ui::widget::focus::has_focus() {
- if cce_ui::widget::focus::navigate_focus(&event.logical_key, event.ctrl) {
- self.needs_rebuild = true;
- return true;
- }
- } else {
- if let Some(root_ptr) = self.get_page_root_widget() {
- unsafe {
- let root_ref = &mut *root_ptr;
- cce_ui::widget::focus::set_focused(root_ref);
- root_ref.focus();
- self.needs_rebuild = true;
- return true;
- }
- }
- }
- }
- }
-
- if self.app.current_page == Page::Interface {
- let mc = &mut self.app.interface.custom_multicontrol;
- if mc.keyboard_input(event, &mut self.ui_context) {
- self.needs_rebuild = true;
- return true;
- }
- let mut changed = false;
- let mut actions = Vec::new();
- for (i, cp) in self.app.interface.color_selectors.iter_mut().enumerate() {
- let old = cp.color;
- if cp.keyboard_input(event, &mut self.ui_context) {
- if cp.color != old {
- actions.push(AppAction::Interface(match i {
- 0 => pages::interface::InterfaceMessage::SetPageLowColor(cp.color),
- 1 => pages::interface::InterfaceMessage::SetHighColor(cp.color),
- 2 => pages::interface::InterfaceMessage::SetVisualGuidesColor(cp.color),
- 3 => pages::interface::InterfaceMessage::SetDisabledColor(cp.color),
- 4 => pages::interface::InterfaceMessage::SetSeparatorColor(cp.color),
- 5 => pages::interface::InterfaceMessage::SetSliderTrackColor(cp.color),
- 6 => pages::interface::InterfaceMessage::SetColorBordersColor(cp.color),
- 7 => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- 8 => pages::interface::InterfaceMessage::SetNormalColor(cp.color),
- 9 => pages::interface::InterfaceMessage::SetPaginatorSidebarColor(cp.color),
- 10 => pages::interface::InterfaceMessage::SetPrimaryHighlightColor(cp.color),
- 11 => pages::interface::InterfaceMessage::SetMenubarTabLabelColor(cp.color),
- 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),
- 16 => pages::interface::InterfaceMessage::SetPopoverBgColor(cp.color),
- 17 => pages::interface::InterfaceMessage::SetNotificationBgColor(cp.color),
- 18 => pages::interface::InterfaceMessage::SetWindowColor(cp.color),
- 19 => pages::interface::InterfaceMessage::SetPageColor(cp.color),
- 20 => pages::interface::InterfaceMessage::SetLayerColor(cp.color),
- _ => pages::interface::InterfaceMessage::SetLowColor(cp.color),
- }));
- }
- changed = true;
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if changed {
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.notification_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNotificationOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.window_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetWindowOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.window_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetWindowCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.menubar_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetMenubarOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.graph_gap_width_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetGraphGapWidth(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.tab_margin_spinbox_x;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginX(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.tab_margin_spinbox_y;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTabMarginY(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.button_padding_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetButtonPadding(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.section_padding_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSectionPadding(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let (menu_changed, old_selected, new_selected) = {
- let menu = &mut self.app.interface.label_alignment_menu;
- let old = menu.selected;
- let changed = menu.keyboard_input(event, &mut self.ui_context);
- (changed, old, menu.selected)
- };
- if menu_changed {
- if new_selected != old_selected {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelAlignment(new_selected)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.label_offset_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetNestedSectionLabelOffset(new_val as i16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.label_margin_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetLabelMargin(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.plate_padding_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlatePadding(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.page_margin_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPageMargin(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.grid_min_col_width_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetGridMinColWidth(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.spinbox_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.spinbox_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSpinboxCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.toggle_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetToggleHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.toggle_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetToggleCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.plate_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlateOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.plate_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPlateCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.page_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetPageOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.layer_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetLayerOpacity(new_val as f32 / 100.0)));
- }
- self.needs_rebuild = true;
- return true;
- }
-
-
- let sb = &mut self.app.interface.color_selector_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.color_selector_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.color_selector_preview_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.color_selector_preview_margin_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetColorSelectorPreviewMargin(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.textbox_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.textbox_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetTextboxCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.slider_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetSliderHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.font_selector_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.font_selector_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetFontSelectorCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.dropdown_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownHeight(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.dropdown_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetDropdownCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.interface.button_corner_radius_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Interface(pages::interface::InterfaceMessage::SetButtonCornerRadius(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
-
-
-
- let mut actions = Vec::new();
- let mut consumed = false;
-
- let tf = &mut self.app.interface;
- let tb = &mut tf.sans_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSans(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.serif_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetSerif(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.mono_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetMono(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.borders_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBorders(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.status_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatus(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.fuzzel_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzel(tb.text.clone())));
- }
- consumed = true;
- }
-
- let tb = &mut self.app.interface.terminal_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- if tb.take_change() {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminal(tb.text.clone())));
- }
- consumed = true;
- }
-
-
-
-
-
- let sb = &mut self.app.interface.borders_size_box;
- if sb.keyboard_input(event, &mut self.ui_context) {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetBordersSize(sb.value)));
- consumed = true;
- }
-
- let sb = &mut self.app.interface.status_size_box;
- if sb.keyboard_input(event, &mut self.ui_context) {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetStatusSize(sb.value)));
- consumed = true;
- }
-
- let sb = &mut self.app.interface.fuzzel_size_box;
- if sb.keyboard_input(event, &mut self.ui_context) {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetFuzzelSize(sb.value)));
- consumed = true;
- }
-
- let sb = &mut self.app.interface.terminal_size_box;
- if sb.keyboard_input(event, &mut self.ui_context) {
- actions.push(AppAction::Interface(pages::interface::InterfaceMessage::SetTerminalSize(sb.value)));
- consumed = true;
- }
-
-
-
- for a in &actions {
- self.handle_action(a);
- }
- if consumed {
- self.needs_rebuild = true;
- return true;
- }
-
- let mut changed = false;
- let mut actions = Vec::new();
- {
- let tf = &mut self.app.interface.windows;
- for (i, sb) in tf.spinboxes.iter_mut().enumerate() {
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetWidth(
- pages::interface::WidthParam::ALL[i],
- sb.value as u16,
- )
- )
- ));
- }
- changed = true;
- }
- }
- let sb = &mut tf.cascade_offset_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetCascadeOffset(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.edge_gap_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetEdgeGap(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.top_gap_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetTopGap(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.grid_gap_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetGridGap(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.transition_duration_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetTransitionDuration(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.status_height_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetStatusHeight(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let (menu_changed, old_selected, new_selected) = {
- let menu = &mut tf.side_panel_behavior_menu;
- let old = menu.selected;
- let changed = menu.keyboard_input(event, &mut self.ui_context);
- (changed, old, menu.selected)
- };
- if menu_changed {
- if new_selected != old_selected {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBehavior(new_selected)
- )
- ));
- }
- changed = true;
- }
- let (menu_changed, old_selected, new_selected) = {
- let menu = &mut tf.side_panel_position_menu;
- let old = menu.selected;
- let changed = menu.keyboard_input(event, &mut self.ui_context);
- (changed, old, menu.selected)
- };
- if menu_changed {
- if new_selected != old_selected {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelPosition(new_selected)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.side_panel_width_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelWidth(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.side_panel_border_gap_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBorderGap(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- let sb = &mut tf.side_panel_border_opacity_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- actions.push(AppAction::Interface(
- pages::interface::InterfaceMessage::Windows(
- pages::interface::WindowsMessage::SetSidePanelBorderOpacity(sb.value as u16)
- )
- ));
- }
- changed = true;
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if changed {
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Services {
- let sb = &mut self.app.services.notifications_duration_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Services(pages::services::ServicesMessage::SetNotificationsDuration(new_val)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.services.status_padding_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Services(pages::services::ServicesMessage::StatusSetPadding(new_val as u16)));
- }
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Input {
- if self.app.input.rate_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.delay_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyRepeat));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.scroll_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyScrollFriction));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.scroll_speed_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyScrollSpeed));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.pointer_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyPointerFriction));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.trackpad_friction_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyTrackpadFriction));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.trackpoint_accel_speed_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyTrackpointAccelSpeed));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.cursor_size_spinbox.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyCursorSize));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.zoom_in_box.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyZoomIn));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.zoom_out_box.keyboard_input(event, &mut self.ui_context) {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ApplyZoomOut));
- self.needs_rebuild = true;
- return true;
- }
- if self.app.input.keybinds_control.keyboard_input(event, &mut self.ui_context) {
- if self.app.input.keybinds_control.take_change() {
- self.handle_action(&AppAction::Input(pages::input::InputMessage::ReloadKeybinds));
- }
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Accounts {
- let mut consumed = false;
- if self.app.accounts.editing_oauth_creds {
- let tb = &mut self.app.accounts.oauth_client_id_box;
- if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
- let tb = &mut self.app.accounts.oauth_client_secret_box;
- if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
- } else if self.app.accounts.adding_new {
- let tb = &mut self.app.accounts.email_box;
- if tb.keyboard_input(event, &mut self.ui_context) {
- consumed = true;
- let email_val = tb.edit_buffer.trim().to_lowercase();
- if email_val.ends_with("@gmail.com") {
- self.app.accounts.imap_box.text = "imap.gmail.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.gmail.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.gmail.com:465".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.gmail.com:465".to_string();
- } else if email_val.ends_with("@icloud.com") {
- self.app.accounts.imap_box.text = "imap.mail.me.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "imap.mail.me.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.mail.me.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.mail.me.com:587".to_string();
- } else if email_val.ends_with("@outlook.com") || email_val.ends_with("@hotmail.com") {
- self.app.accounts.imap_box.text = "outlook.office365.com:993".to_string();
- self.app.accounts.imap_box.edit_buffer = "outlook.office365.com:993".to_string();
- self.app.accounts.smtp_box.text = "smtp.office365.com:587".to_string();
- self.app.accounts.smtp_box.edit_buffer = "smtp.office365.com:587".to_string();
- }
- }
- let tb = &mut self.app.accounts.password_box;
- if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
- let tb = &mut self.app.accounts.imap_box;
- if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
- let tb = &mut self.app.accounts.smtp_box;
- if tb.keyboard_input(event, &mut self.ui_context) { consumed = true; }
- }
-
- if consumed {
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Audio {
- let mut actions = Vec::new();
- for (i, sb) in self.app.audio.sink_spinboxes.iter_mut().enumerate() {
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- let id = self.app.audio.sinks[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, sb.value as f32 / 100.0)));
- }
- }
- }
- for (i, sb) in self.app.audio.source_spinboxes.iter_mut().enumerate() {
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- if sb.value != old {
- let id = self.app.audio.sources[i].id;
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, sb.value as f32 / 100.0)));
- }
- }
- }
- for (i, slider) in self.app.audio.sink_sliders.iter_mut().enumerate() {
- let old = slider.value();
- if slider.keyboard_input(event, &mut self.ui_context) {
- let new_val = slider.value();
- if new_val != old {
- let id = self.app.audio.sinks[i].id;
- if i < self.app.audio.sink_spinboxes.len() {
- self.app.audio.sink_spinboxes[i].value = (new_val * 100.0).round() as i32;
- }
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SinkVolume(id, new_val)));
- }
- }
- }
- for (i, slider) in self.app.audio.source_sliders.iter_mut().enumerate() {
- let old = slider.value();
- if slider.keyboard_input(event, &mut self.ui_context) {
- let new_val = slider.value();
- if new_val != old {
- let id = self.app.audio.sources[i].id;
- if i < self.app.audio.source_spinboxes.len() {
- self.app.audio.source_spinboxes[i].value = (new_val * 100.0).round() as i32;
- }
- actions.push(AppAction::Audio(pages::audio::AudioMessage::SourceVolume(id, new_val)));
- }
- }
- }
- for a in &actions {
- self.handle_action(a);
- }
- if !actions.is_empty() {
- self.needs_rebuild = true;
- return true;
- }
- }
- if self.app.current_page == Page::Display {
- let slider = &mut self.app.display.brightness_slider;
- let old_slider = slider.value();
- if slider.keyboard_input(event, &mut self.ui_context) {
- let new_slider = slider.value();
- if new_slider != old_slider {
- let pct = (new_slider * 100.0).round() as u32;
- self.app.display.brightness_spinbox.value = pct as i32;
- self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(pct)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.display.brightness_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Display(pages::display::DisplayMessage::BrightnessSet(new_val as u32)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let sb = &mut self.app.display.screensaver_timeout_spinbox;
- let old = sb.value;
- if sb.keyboard_input(event, &mut self.ui_context) {
- let new_val = sb.value;
- if new_val != old {
- self.handle_action(&AppAction::Display(pages::display::DisplayMessage::SetScreensaverTimeout(new_val)));
- }
- self.needs_rebuild = true;
- return true;
- }
- let (menu_changed, old_selected, new_selected) = {
- let menu = &mut self.app.display.screensaver_style_menu;
- let old = menu.selected;
- let changed = menu.keyboard_input(event, &mut self.ui_context);
- (changed, old, menu.selected)
- };
- if menu_changed {
- if new_selected != old_selected {
- self.handle_action(&AppAction::Display(pages::display::DisplayMessage::SetScreensaverStyle(new_selected)));
- }
- self.needs_rebuild = true;
- return true;
- }
- }
-
-
- if self
diff truncated