git.lucas.co / cce-system-interface
system settings
git clone https://git.lucas.co/cce-system-interface.git

commita4c30033400ff16481e9c134fde6e08dbe789b59
parent8b83e6b4fc
authorLucas Galante <[email protected]>
date2026-09-08 21:55
fix: rebuild after a Tab focus step; the page target carries the ring's tint

The view pass runs on rebuild only, so the moved focus ring was not drawn;
raise the flag from Application::focus_stepped. The page's RenderTarget
gains inset_plate_tinted so a focused plate carved through the bridge keeps
its lit rim.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 src/app.rs  | 3 +++
 src/main.rs | 5 +++++
 2 files changed, 8 insertions(+)

diff --git a/src/app.rs b/src/app.rs
index 083f9dd..c9fbc56 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -377,6 +377,9 @@ impl RenderTarget for PageContent {
         self.control_relief_marks.push(self.rects.len());
         self.control_reliefs.push(ControlCarve::Plate { x, y, w, h, radius, depth, color, tint: None });
     }
+    fn inset_plate_tinted(&mut self, color: [f32; 4], x: f32, y: f32, w: f32, h: f32, radius: f32, depth: f32, tint: [f32; 3]) {
+        self.control_reliefs.push(ControlCarve::Plate { x, y, w, h, radius, depth, color, tint: Some(tint) });
+    }
 
     /// The same bridge for the step carves — a DIFFERENT shape, not an inset
     /// plate at another rect: a trough is a seam about the boundary with the
diff --git a/src/main.rs b/src/main.rs
index ec27101..f8843a5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -619,6 +619,11 @@ impl cce_ui::engine::Application for SystemInterface {
         true
     }
 
+    /// The geometry is cached until the next rebuild — a moved focus ring needs one.
+    fn focus_stepped(&mut self) {
+        self.needs_rebuild = true;
+    }
+
     fn handle_key_input(&mut self, event: &cce_ui::widget::KeyEvent, needs_rebuild: &mut bool) -> Option<Self::Message> {
         if self.handle_key_input_internal(event) {
             *needs_rebuild = true;