add Mom/Tog to ToggleWidget, Big Title, Layout panel scaffold
- ToggleWidget: add Momentary/Toggle mode selector (mirrors TransportWidget minus OSC); HW routing respects trigger_mode; fix invisible button on init by removing explicit empty stylesheet; saves/loads trigger_mode per preset - Big Title: full-width 28px bold QLineEdit above fader row, saves per-preset as big_title; green underline on focus; single bottom border, no separator - Layout panel: floating 220px window to the left of main window, toggled by new Layout button next to Messages; shows Sections checkboxes (Preset Browser, Big Title, Fader Row, Toggle Row, Transport Row); tracks window move/resize; checkboxes not yet wired to functionality Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+50
-8
@@ -4,7 +4,7 @@ from PyQt6.QtWidgets import (
|
||||
QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
|
||||
QLabel, QSpinBox, QLineEdit, QFrame, QSizePolicy
|
||||
)
|
||||
from PyQt6.QtCore import Qt, QEvent
|
||||
from PyQt6.QtCore import Qt, QEvent, QTimer
|
||||
|
||||
from palette import PALETTE_HEX, PALETTE_VIVID
|
||||
from styles import TITLE_STYLE
|
||||
@@ -19,6 +19,7 @@ class ToggleWidget(QWidget):
|
||||
self.setFixedWidth(115)
|
||||
self.current_color = PALETTE_HEX.get("Gray", "#263238")
|
||||
self.toggle_state = False
|
||||
self.trigger_mode = "toggle"
|
||||
self.uid = str(uuid.uuid4())
|
||||
self.zone = None
|
||||
self.center_index = None
|
||||
@@ -108,6 +109,26 @@ class ToggleWidget(QWidget):
|
||||
_hbox_ch.addWidget(self.ch_spin)
|
||||
_grp2_layout.addWidget(self.ch_spin_row)
|
||||
|
||||
# Momentary / Toggle mode selector
|
||||
trigger_row = QHBoxLayout()
|
||||
trigger_row.setContentsMargins(0, 0, 0, 0)
|
||||
trigger_row.setSpacing(2)
|
||||
self.momentary_btn = QPushButton("Mom.")
|
||||
self.momentary_btn.setFixedHeight(18)
|
||||
self.momentary_btn.setCheckable(True)
|
||||
self.momentary_btn.setChecked(False)
|
||||
self.momentary_btn.setStyleSheet("border: none;")
|
||||
self.toggle_mode_btn = QPushButton("Tog.")
|
||||
self.toggle_mode_btn.setFixedHeight(18)
|
||||
self.toggle_mode_btn.setCheckable(True)
|
||||
self.toggle_mode_btn.setChecked(True)
|
||||
self.toggle_mode_btn.setStyleSheet("font-weight: bold; color: #00e676;")
|
||||
self.momentary_btn.clicked.connect(lambda: self.set_trigger_mode("momentary"))
|
||||
self.toggle_mode_btn.clicked.connect(lambda: self.set_trigger_mode("toggle"))
|
||||
trigger_row.addWidget(self.momentary_btn)
|
||||
trigger_row.addWidget(self.toggle_mode_btn)
|
||||
_grp2_layout.addLayout(trigger_row)
|
||||
|
||||
self.cc_output_lbl = QLabel(f"CC{default_cc} [--]")
|
||||
self.cc_output_lbl.setAlignment(Qt.AlignmentFlag.AlignHCenter)
|
||||
self.cc_output_lbl.setStyleSheet("background-color: #000000; color: #00e676; font-size: 10px; padding: 1px; border: none;")
|
||||
@@ -122,7 +143,6 @@ class ToggleWidget(QWidget):
|
||||
|
||||
self.btn = QPushButton("", btn_container)
|
||||
self.btn.setFixedSize(60, 60)
|
||||
self.btn.setStyleSheet("")
|
||||
self.btn.clicked.connect(self.on_click)
|
||||
|
||||
self.led_dot = QLabel(btn_container)
|
||||
@@ -289,15 +309,35 @@ class ToggleWidget(QWidget):
|
||||
self.apply_color(hex_color)
|
||||
self._update_btn_style()
|
||||
|
||||
def set_trigger_mode(self, mode):
|
||||
self.trigger_mode = mode
|
||||
if mode == "momentary":
|
||||
self.momentary_btn.setChecked(True)
|
||||
self.toggle_mode_btn.setChecked(False)
|
||||
self.momentary_btn.setStyleSheet("font-weight: bold; color: #00e676;")
|
||||
self.toggle_mode_btn.setStyleSheet("")
|
||||
else:
|
||||
self.toggle_mode_btn.setChecked(True)
|
||||
self.momentary_btn.setChecked(False)
|
||||
self.toggle_mode_btn.setStyleSheet("font-weight: bold; color: #00e676;")
|
||||
self.momentary_btn.setStyleSheet("")
|
||||
|
||||
def on_click(self):
|
||||
self.toggle_state = not self.toggle_state
|
||||
cc_num = self.cc_spin.value()
|
||||
out_ch = self.ch_spin.value()
|
||||
value = 127 if self.toggle_state else 0
|
||||
print(f"[toggle] CC{cc_num} CH{out_ch} ({value})")
|
||||
send_cc(cc_num, value, channel=out_ch)
|
||||
self.cc_output_lbl.setText(self._cc_output_label(value))
|
||||
self._update_btn_style()
|
||||
if self.trigger_mode == "momentary":
|
||||
print(f"[toggle momentary] CC{cc_num} CH{out_ch} (127)")
|
||||
send_cc(cc_num, 127, channel=out_ch)
|
||||
self.cc_output_lbl.setText(self._cc_output_label(127))
|
||||
self.led_dot.setStyleSheet("background-color: #00e676; border-radius: 3px;")
|
||||
QTimer.singleShot(150, lambda: self.led_dot.setStyleSheet("background-color: #3c3c3c; border-radius: 3px;"))
|
||||
else:
|
||||
self.toggle_state = not self.toggle_state
|
||||
value = 127 if self.toggle_state else 0
|
||||
print(f"[toggle] CC{cc_num} CH{out_ch} ({value})")
|
||||
send_cc(cc_num, value, channel=out_ch)
|
||||
self.cc_output_lbl.setText(self._cc_output_label(value))
|
||||
self._update_btn_style()
|
||||
|
||||
def _update_btn_style(self):
|
||||
if self.toggle_state:
|
||||
@@ -318,6 +358,7 @@ class ToggleWidget(QWidget):
|
||||
"zone_index": self.zone_index,
|
||||
"hw_cc": self.hw_cc,
|
||||
"hw_channel": self.hw_channel,
|
||||
"trigger_mode": self.trigger_mode,
|
||||
}
|
||||
|
||||
def set_state(self, state):
|
||||
@@ -341,6 +382,7 @@ class ToggleWidget(QWidget):
|
||||
self.zone_btn.set_state(self.zone == "left", self.zone == "right")
|
||||
self.hw_cc = state.get("hw_cc", None)
|
||||
self.hw_channel = state.get("hw_channel", None)
|
||||
self.set_trigger_mode(state.get("trigger_mode", "toggle"))
|
||||
if self.hw_cc is not None:
|
||||
self.learn_btn.setText(f"HW: CC{self.hw_cc}")
|
||||
self.cc_input_lbl.setText(self._cc_input_label())
|
||||
|
||||
Reference in New Issue
Block a user