system settings
git clone https://git.lucas.co/cce-system-interface.git
feat: taller Processes list (220 -> 400) drawn frameless on the well
ScrollRegion gains a draw_frame flag (with_frame): off skips the
border + background plate in push_prims while keeping the scrollbar.
The process list uses it; the services list keeps its frame.
Co-Authored-By: Claude Fable 5 <[email protected]>
src/pages/processes.rs | 6 +++---
src/scroll_region.rs | 49 ++++++++++++++++++++++++++++++-------------------
2 files changed, 33 insertions(+), 22 deletions(-)
diff --git a/src/pages/processes.rs b/src/pages/processes.rs
index 0d51f1f..18b4850 100644
--- a/src/pages/processes.rs
+++ b/src/pages/processes.rs
@@ -44,7 +44,7 @@ impl Default for ProcessesState {
Self {
loaded: false,
processes: Vec::new(),
- cpu_list: ScrollRegion::new(24.0, 2.0),
+ cpu_list: ScrollRegion::new(24.0, 2.0).with_frame(false),
services_loaded: false,
services: Vec::new(),
@@ -93,7 +93,7 @@ pub async fn fetch_processes_state() -> ProcessesState {
ProcessesState {
loaded: true,
processes,
- cpu_list: ScrollRegion::new(24.0, 2.0),
+ cpu_list: ScrollRegion::new(24.0, 2.0).with_frame(false),
services_loaded: false,
services: Vec::new(),
services_active_tab: ServiceTab::System,
@@ -121,7 +121,7 @@ pub fn view(state: &mut ProcessesState, cx: f32, cy: f32, cw: f32, ch: f32, root
let list_box_x = rx + 12.0;
let list_box_y = sec.ay();
let list_box_w = sec.cw - 24.0;
- let list_box_h = 220.0;
+ let list_box_h = 400.0;
// Dissolved List (Phase 6v): scroll state + frame prims are app-owned. The
// scrollable viewport starts below the header.
diff --git a/src/scroll_region.rs b/src/scroll_region.rs
index 9ae139d..c1b05fe 100644
--- a/src/scroll_region.rs
+++ b/src/scroll_region.rs
@@ -32,6 +32,9 @@ pub struct ScrollRegion {
/// Local stand-in for the legacy global focus flag (`ScrollBox::focus()` on any press
/// inside the frame): set on a press that hits the region, cleared on one that misses.
pub focused: bool,
+ /// Draw the border + background plate in `push_prims`. Off = frameless: rows
+ /// sit directly on the window plate (the scrollbar still draws).
+ pub draw_frame: bool,
}
impl ScrollRegion {
@@ -52,9 +55,15 @@ impl ScrollRegion {
drag_offset_y: 0.0,
hovered: false,
focused: false,
+ draw_frame: true,
}
}
+ pub fn with_frame(mut self, draw_frame: bool) -> Self {
+ self.draw_frame = draw_frame;
+ self
+ }
+
pub fn set_rect(&mut self, x: f32, y: f32, w: f32, h: f32) {
self.x = x;
self.y = y;
@@ -222,25 +231,27 @@ impl ScrollRegion {
/// The legacy frame, single-drawn: 1px rounded border (focus/hover tinted, from
/// `List::solid_border`), inset rounded bg, then the scrollbar track and thumb ON TOP.
pub fn push_prims(&self, pc: &mut dyn cce_ui::layout::RenderTarget) {
- let radius = cce_ui::layout::list_corner_radius();
- let border_color = if self.focused {
- [0.30, 0.50, 0.32, 1.0]
- } else if self.hovered {
- [0.25, 0.25, 0.35, 1.0]
- } else {
- [0.18, 0.18, 0.24, 1.0]
- };
- let all = (true, true, true, true);
- pc.rect_with_radius_corners(border_color, self.x, self.y, self.w, self.h, radius, all);
- pc.rect_with_radius_corners(
- cce_ui::color::list_bg_color(),
- self.x + 1.0,
- self.y + 1.0,
- self.w - 2.0,
- self.h - 2.0,
- (radius - 1.0).max(0.0),
- all,
- );
+ if self.draw_frame {
+ let radius = cce_ui::layout::list_corner_radius();
+ let border_color = if self.focused {
+ [0.30, 0.50, 0.32, 1.0]
+ } else if self.hovered {
+ [0.25, 0.25, 0.35, 1.0]
+ } else {
+ [0.18, 0.18, 0.24, 1.0]
+ };
+ let all = (true, true, true, true);
+ pc.rect_with_radius_corners(border_color, self.x, self.y, self.w, self.h, radius, all);
+ pc.rect_with_radius_corners(
+ cce_ui::color::list_bg_color(),
+ self.x + 1.0,
+ self.y + 1.0,
+ self.w - 2.0,
+ self.h - 2.0,
+ (radius - 1.0).max(0.0),
+ all,
+ );
+ }
if self.content_h > self.viewport_h {
let (sb_x, track_y, sb_w, track_h, thumb_y, thumb_h) = self.scrollbar_geom();
pc.rect(cce_ui::color::scrollbar_track_color(), sb_x, track_y, sb_w, track_h);