git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commitf60caf88574ff6a8dc6d2cd19bbe016147f5c4ac
parent90972078a2
authorLucas Galante <[email protected]>
date2026-07-01 18:08
Support connector_activation_radius style configuration

 src/layout.rs               | 15 +++++++++++++++
 src/widget/display/graph.rs |  8 ++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/layout.rs b/src/layout.rs
index 56ac2a4..8e3bd6e 100644
--- a/src/layout.rs
+++ b/src/layout.rs
@@ -159,6 +159,7 @@ fn flatten_json_to_flat_props(val: &serde_json::Value, prefix: &str, flat_props:
                 "style.surface.graph.node.connector_color" => "graph_connector_color",
                 "style.surface.graph.node.connector_highlight_color" => "graph_connector_highlight_color",
                 "style.surface.graph.node.connector_size" => "graph_connector_size",
+                "style.surface.graph.node.connector_activation_radius" => "graph_connector_activation_radius",
                 
                 other => {
                     if let Some(rest) = other.strip_prefix("layout.") {
@@ -2573,6 +2574,18 @@ pub fn set_graph_connector_size(size: f32) {
     }
 }
 
+pub fn graph_connector_activation_radius() -> f32 {
+    lazy_init_style_registry();
+    get_style_registry().read().unwrap().get_float("graph_connector_activation_radius").unwrap_or(9.0)
+}
+
+pub fn set_graph_connector_activation_radius(radius: f32) {
+    lazy_init_style_registry();
+    if let Ok(mut registry) = get_style_registry().write() {
+        registry.set_float("graph_connector_activation_radius", radius);
+    }
+}
+
 pub fn font_selector_corner_radius() -> f32 {
     lazy_init_style_registry();
     get_style_registry().read().unwrap().get_float("font_selector_corner_radius").unwrap_or(4.0)
@@ -5146,6 +5159,7 @@ mod tests {
         set_graph_wire_size(10.0);
         set_graph_wire_activation_radius(15.0);
         set_graph_connector_size(12.0);
+        set_graph_connector_activation_radius(18.0);
 
         assert_eq!(graph_spacing_x(), 200.0);
         assert_eq!(graph_spacing_y(), 100.0);
@@ -5155,6 +5169,7 @@ mod tests {
         assert_eq!(graph_wire_size(), 10.0);
         assert_eq!(graph_wire_activation_radius(), 15.0);
         assert_eq!(graph_connector_size(), 12.0);
+        assert_eq!(graph_connector_activation_radius(), 18.0);
 
         crate::color::set_graph_cell_color([0.1, 0.2, 0.3]);
         crate::color::set_graph_gap_color([0.4, 0.5, 0.6]);
diff --git a/src/widget/display/graph.rs b/src/widget/display/graph.rs
index b74a95d..d5370f9 100644
--- a/src/widget/display/graph.rs
+++ b/src/widget/display/graph.rs
@@ -400,12 +400,12 @@ impl Element for Graph {
         let was_hovered_port = self.hovered_port;
         self.hovered_port = None;
 
-        let wire_act_r = crate::layout::graph_wire_activation_radius();
+        let conn_act_r = crate::layout::graph_connector_activation_radius();
 
         for i in 0..self.nodes.len() {
             if let Some((nx, ny, nw, nh)) = self.node_rect(i) {
                 let scale_f = nw / 80.0;
-                let hit_radius = (wire_act_r * scale_f).max(2.0);
+                let hit_radius = (conn_act_r * scale_f).max(2.0);
                 let node = &self.nodes[i];
                 
                 for k in 0..node.inputs {
@@ -449,11 +449,11 @@ impl Element for Graph {
         match state {
             ElementState::Pressed => {
                 log::debug!("Graph::mouse_input: Pressed px={}, py={}, connecting_from={:?}", px, py, self.connecting_from);
-                // First, check direct port clicks
                 for i in (0..self.nodes.len()).rev() {
                     if let Some((nx, ny, nw, nh)) = self.node_rect(i) {
                         let scale_f = nw / 80.0;
-                        let port_click_radius = (20.0 * scale_f).max(12.0);
+                        let conn_act_r = crate::layout::graph_connector_activation_radius();
+                        let port_click_radius = (conn_act_r * scale_f).max(2.0);
                         let port_click_radius_sq = port_click_radius * port_click_radius;
 
                         let node = &self.nodes[i];