Commit Graph

14 Commits

Author SHA1 Message Date
joren
5a52987fbd fix: Add Device button CSS was malformed (same line as another rule) 2026-03-30 00:05:59 +02:00
joren
444fc43c9c fix: toolbar buttons clickable, add node delete
Fixes:
- SVG mousedown handler now ignores clicks outside SVG (toolbar works)
- Right-click node -> Destroy Node to delete virtual devices
- POST /api/destroy-node {node_id} endpoint (uses pw-cli destroy)

Node context menu shows node name and destroy button.
2026-03-30 00:02:53 +02:00
joren
9dc685acda feat: pactl-based module loading, more device types
Backend:
- Switched null-sink and loopback to use pactl (works on all systems)
- Generic POST /api/load-module {module, args} for any pactl module
- Fixed SVG toolbar click issue (z-index layering)

Frontend:
- + Add Device dropdown now includes:
  - Null Sink (virtual audio output)
  - Loopback Device (paired input+output)
  - TCP Network Server (module-native-protocol-tcp)
  - TCP Tunnel Sink
  - TCP Tunnel Source
- Dropdown header and section separators
- Fixed canvas z-index so toolbar is clickable
2026-03-29 23:55:19 +02:00
joren
2879469d13 feat: create virtual devices (+ Add Device dropdown)
Backend:
- POST /api/create-null-sink {name} - loads null-sink module
- POST /api/create-loopback {name} - loads loopback module
- POST /api/unload-module {module_id} - unloads a module
- Fixed double-proxy-destroy crash in GraphEngine
- Graceful failure when module not available (no crash)

Frontend:
- + Add Device button in toolbar with dropdown menu
- Null Sink option (creates virtual audio output)
- Loopback Device option (creates paired input+output)
- Dropdown closes on outside click

Note: null-sink requires libpipewire-module-null-sink to be installed.
Loopback works on all PipeWire installations.
2026-03-29 23:50:01 +02:00
joren
bda57d9680 Merge feature/volume-management into master 2026-03-29 23:35:55 +02:00
joren
37e7834269 fix: click-to-jump on volume slider
Added transparent hitarea rect over the full slider area (14px tall).
Handle is pointer-events:none so clicks pass through to hitarea.
Clicking anywhere on the slider bar now jumps volume there.
2026-03-29 23:34:52 +02:00
joren
0b50400f69 fix: smaller volume handle, click-to-jump already works 2026-03-29 23:33:15 +02:00
joren
044c5e551c fix: volume slider and mute button race conditions
- Mute button click no longer triggers node drag (priority check in onMouseDown)
- Volume slider clamped to 0-100% in both display and API
- Added draggable circle handle on slider end
- Volume drag state tracked globally, not per-element
- Backend: fixed spa_pod_builder API usage (push_object/pop with frame)
- Volume calculated from SVG coordinates properly via svgPoint conversion
2026-03-29 23:29:40 +02:00
joren
65db5daa7c feat: built-in volume management
- Volume slider on every node (green bar, draggable)
- Mute toggle button (M/m) on every node
- Backend: read volume/mute from PipeWire node props
- Backend: POST /api/volume {node_id, volume} to set volume
- Backend: POST /api/mute {node_id, mute} to toggle mute
- Graph JSON includes volume and mute fields per node
- Slider supports drag-to-adjust with mouse
2026-03-29 23:21:39 +02:00
joren
8c6a1f44c1 Merge feature/complete-qpwgraph-features into master 2026-03-29 22:55:57 +02:00
joren
0acfa6ea73 feat: complete qpwgraph feature parity
Core Visual Routing:
- Dashed lines for inactive connections (unpinned shown dimmer)
- Color-coded streams (audio=green, midi=red, video=blue)
- Pin indicator (yellow dot) on pinned connections

Patchbay - Session Management:
- Save & Restore: named profiles stored on server (~/.config/pwweb/patchbay.json)
- Activated Mode: toggle to auto-restore connections when apps appear
- Exclusive Mode: enforce profile-only links, disconnect everything else
- Pin & Unpin: right-click wire -> Pin/Unpin, yellow dot on pinned wires
- Auto-Pin: automatically pin all new manual connections
- Auto-Disconnect: auto-sever pinned connections when patchbay deactivated
- Rule Management: dialog showing all profile rules with type badges

Graph Customization:
- Node Hiding: add regex patterns to hide nodes (e.g. Dummy|Freewheel)
- Node Merging: merge nodes sharing a common prefix into one block
- All rules persisted to server with the patchbay state

Dialogs: Hide Nodes, Merge Nodes, Profiles, Rules
2026-03-29 22:55:28 +02:00
joren
0c56192e6f Merge feature/full-feature-set into master 2026-03-29 22:48:59 +02:00
joren
77e2fdca14 feat: full feature set - filters, context menu, patchbay, position persistence
Backend:
- GET/PUT /api/positions - server-side node position persistence (~/.config/pwweb/)
- GET/PUT /api/patchbay - save/load connection snapshots
- POST /api/patchbay/apply - apply saved connections

Frontend (custom SVG canvas):
- Right-click wire to disconnect (context menu)
- Port type filter toolbar (audio/midi/video/other toggles)
- Save/Load patchbay buttons
- Node positions persisted to localStorage + server
- Node border color by mode (green=output, red=input)
- Type indicator in node header [audio] [midi]
- Selected wire highlight (white, thicker)
- Select wire + Delete to disconnect
- Drag output port to input port to connect
- Pan (drag bg) and zoom (scroll wheel)
- Filtered ports shown as dim dots when hidden
2026-03-29 22:45:10 +02:00
joren
f8c57fbdd3 Initial commit: pwweb - PipeWire WebUI
C++ backend with SSE streaming (reuses qpwgraph PipeWire callbacks).
Svelte frontend with custom SVG canvas for port-level connections.

Features:
- Live PipeWire graph via SSE
- Drag output->input port to connect
- Double-click or select+Delete to disconnect
- Node positions saved to localStorage
- Pan (drag bg) and zoom (scroll)
- Port type coloring (audio=green, midi=red, video=blue)
2026-03-29 22:40:07 +02:00