graphic design tool
git clone https://git.lucas.co/cce-designer.git
fix: context menu rows resolve through the toolkit's PAD-aware row_at
The node, viewport and plate-corner menus divided the cursor's offset from
the plate's top by the row height, which names the row below over the
bottom third of every row (the rows start a pad down). 2026-09-22 audit.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
src/app.rs | 10 ++++------
src/plate_corner.rs | 5 ++---
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/src/app.rs b/src/app.rs
index 7595cf2..1d8fb57 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -3422,9 +3422,8 @@ impl State {
return false;
}
if cce_ui::widget::context_menu::hit_test(self.cursor_x, self.cursor_y) {
- let my = cce_ui::widget::context_menu::y();
- let idx = ((self.cursor_y - my) / 24.0).floor() as usize;
- let picked = self.node_menu_slot.zip(self.node_menu_actions.get(idx).copied());
+ let idx = cce_ui::widget::context_menu::row_at(self.cursor_x, self.cursor_y);
+ let picked = self.node_menu_slot.zip(idx.and_then(|i| self.node_menu_actions.get(i).copied()));
self.close_node_menu();
if let Some((slot, action)) = picked {
self.dispatch_node_menu(slot, action);
@@ -3662,9 +3661,8 @@ impl State {
return false;
}
if cce_ui::widget::context_menu::hit_test(self.cursor_x, self.cursor_y) {
- let my = cce_ui::widget::context_menu::y();
- let idx = ((self.cursor_y - my) / 24.0).floor() as usize;
- let picked = self.viewport_menu_actions.get(idx).copied();
+ let idx = cce_ui::widget::context_menu::row_at(self.cursor_x, self.cursor_y);
+ let picked = idx.and_then(|i| self.viewport_menu_actions.get(i).copied());
self.close_viewport_menu();
if let Some(action) = picked {
match action {
diff --git a/src/plate_corner.rs b/src/plate_corner.rs
index da2d34c..a2e7143 100644
--- a/src/plate_corner.rs
+++ b/src/plate_corner.rs
@@ -309,9 +309,8 @@ impl State {
return false;
}
if cce_ui::widget::context_menu::hit_test(self.cursor_x, self.cursor_y) {
- let my = cce_ui::widget::context_menu::y();
- let row = ((self.cursor_y - my) / 24.0).floor() as usize;
- let picked = self.plate_menu_slot.zip(self.plate_menu_actions.get(row).copied());
+ let row = cce_ui::widget::context_menu::row_at(self.cursor_x, self.cursor_y);
+ let picked = self.plate_menu_slot.zip(row.and_then(|r| self.plate_menu_actions.get(r).copied()));
self.close_plate_menu();
if let Some((idx, action)) = picked {
self.dispatch_plate_menu(idx, action);