UX update

This commit is contained in:
Joe 2026-02-01 07:58:06 -06:00
parent 3e6a50ce4b
commit 0e5e809894
5 changed files with 397 additions and 48 deletions

View file

@ -0,0 +1,132 @@
---
name: Merge UI Button Changes
overview: Rename Push/Pull buttons to Rojo/Studio, remove "all" helper buttons, add double-click cascade functionality with hover-reveal buttons for parent nodes.
todos:
- id: rename-buttons
content: Rename Pull->Studio and Push->Rojo in DomLabel.lua SelectionRadio
status: completed
- id: remove-all-buttons
content: Remove PullAll, SkipAll, PushAll buttons from Confirming.lua
status: completed
- id: add-subtree-callback
content: Create onSubtreeSelectionChange callback in Confirming.lua that sets selection for node and all descendants
status: completed
- id: add-double-click
content: Add double-click handler to SelectionOption buttons with caret indicator
status: completed
- id: hover-reveal-buttons
content: Show selection buttons on hover for parent nodes without patchType
status: completed
isProject: false
---
# Merge UI Button Improvements
## Key Files to Modify
- `[plugin/src/App/Components/PatchVisualizer/DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua)` - Selection buttons and hover behavior
- `[plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua)` - Remove "all" buttons, add subtree selection callback
- `[plugin/src/App/Components/PatchVisualizer/init.lua](plugin/src/App/Components/PatchVisualizer/init.lua)` - Pass patchTree to DomLabel
## Changes
### 1. Rename Buttons (DomLabel.lua)
In `SelectionRadio` function, change button text:
- "Pull" -> "Studio" (line 113)
- "Push" -> "Rojo" (line 137)
### 2. Remove "All" Button Helpers (Confirming.lua)
Remove these elements from the `Buttons` frame (lines 156-184):
- `PullAll` button
- `SkipAll` button
- `PushAll` button
Keep the `setAllSelections` function as it will be repurposed for subtree selection.
### 3. Add Double-Click Cascade with Caret (DomLabel.lua)
Modify `SelectionOption` component:
- Add a "▼" caret character after the button text
- Track double-click using `clickCount` in the `Activated` event
- On double-click, call a new `onSubtreeSelectionChange` callback
Add to `SelectionRadio`:
- Pass `onSubtreeSelectionChange` prop to each option
### 4. Add Subtree Selection Callback (Confirming.lua)
Create new callback `onSubtreeSelectionChange(nodeId, selection)`:
```lua
self.onSubtreeSelectionChange = function(nodeId, selection)
if not self.props.patchTree then return end
local node = self.props.patchTree:getNode(nodeId)
if not node then return end
self:setState(function(state)
local newSelections = table.clone(state.selections)
-- Set this node if it has a patchType
if node.patchType then
newSelections[nodeId] = selection
end
-- Set all descendants
self.props.patchTree:forEach(function(childNode)
if childNode.patchType then
newSelections[childNode.id] = selection
end
end, node)
return { selections = newSelections }
end)
end
```
### 5. Show Buttons on Hover for Parents Without Changes (DomLabel.lua)
For nodes where `patchType == nil` but `hasChildren == true`:
Add hover state tracking in `DomLabel`:
```lua
self:setState({ isHovered = false })
```
Add `MouseEnter`/`MouseLeave` events to the main Frame.
Modify `SelectionRadio` visibility logic:
- `visible = (props.patchType ~= nil) or (props.hasChildren and self.state.isHovered)`
The buttons for parent-only nodes will use `onSubtreeSelectionChange` directly (no single-click behavior needed since there's no selection to make for the node itself).
### 6. Pass Required Props Through Component Tree
In `PatchVisualizer/init.lua`, pass to DomLabel:
- `patchTree = patchTree`
- `onSubtreeSelectionChange = self.props.onSubtreeSelectionChange`
In `Confirming.lua`, pass to PatchVisualizer:
- `onSubtreeSelectionChange = self.onSubtreeSelectionChange`
## Component Flow
```mermaid
flowchart TD
A[Confirming.lua] -->|selections, onSelectionChange, onSubtreeSelectionChange| B[PatchVisualizer]
B -->|node props, selection callbacks| C[DomLabel]
C -->|single click| D[onSelectionChange]
C -->|double click| E[onSubtreeSelectionChange]
D --> F[Update single node selection]
E --> G[Update node + all descendants]
```