Initial tablet POC: project restructure + WebSocket/HTTP server + JS client

- Restructured project into /app, /server, /client with run.py entry point
- WSServer (QWebSocketServer) with log_signal, start/stop, client tracking
- HTTP server serves /client on port 8080
- Vanilla JS client: faders, toggles, transport, drag-to-arrange, lock/save layout
- Start Tablet button + floating Tablet log window in app UI
- Preset broadcast on load/switch, DAW state relay, hardware sync via widget_update
- Widget colors synced from app palette, toggle state fixed (sends 0/127 correctly)
- Layout saved per preset UUID back to presets.json

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul Lipscomb
2026-06-29 23:44:30 -04:00
parent 22e4fa770e
commit 4db7165797
23 changed files with 851 additions and 1 deletions
+31
View File
@@ -0,0 +1,31 @@
from PyQt6.QtWidgets import QWidget, QHBoxLayout, QPushButton
from PyQt6.QtCore import Qt
from palette import PALETTE
class ColorSwatchPopup(QWidget):
def __init__(self, callback, parent=None):
super().__init__(parent, Qt.WindowType.Popup)
self.callback = callback
layout = QHBoxLayout(self)
layout.setContentsMargins(4, 4, 4, 4)
layout.setSpacing(4)
for name, hex_color in PALETTE:
btn = QPushButton()
btn.setFixedSize(22, 22)
btn.setStyleSheet(f"""
QPushButton {{
background-color: {hex_color};
border-radius: 3px;
border: 1px solid rgba(255,255,255,0.2);
}}
QPushButton:hover {{
border: 2px solid #00ff88;
}}
""")
btn.clicked.connect(lambda checked, n=name, c=hex_color: self.pick(n, c))
layout.addWidget(btn)
self.setStyleSheet("background-color: #2d2d2d; border-radius: 4px;")
def pick(self, name, hex_color):
self.callback(name, hex_color)
self.close()