Multi-iPad dest_id routing, activity ring, context menu hide, live label/visibility sync
Desktop: - Replace Remote checkbox with T: dest_spin (0=Off, 1-9=tablet) on all widgets - dest_id persisted in get_state/set_state, broadcast in tablet snapshot - dest_spin.valueChanged triggers save + broadcast to iPad - _on_widget_visibility_from_tablet updates dest_spin from iPad hide event - _broadcast_preset_update shared helper; ws_server.has_clients guard - label editingFinished triggers live label sync to iPad iOS: - VC-Arrange/VC-Logging/Widgets-Reusable-UI file reorganisation - ArrangeObjects/ArrangeView rename, 7-bucket Arrange-Functions split - myTabletId (UserDefaults) + tabletIdField next to port in toolbar - Preset filter: destId == myTabletId instead of visible bool - BaseWidget activity ring: long press gesture (touch) + final update() flash - Context menu long press (arrange mode): hide widget, save layout, send dest_id:0 - Same-UUID preset check skips Preset Switched alert on visibility/label updates - autoSwitchEnabled, toolbarStatusLabel, presetLabel, statusToken Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ from PyQt6.QtNetwork import QHostAddress
|
||||
class WSServer(QObject):
|
||||
control_received = pyqtSignal(str, int)
|
||||
layout_saved = pyqtSignal(str, object)
|
||||
widget_visibility_received = pyqtSignal(str, int)
|
||||
client_connected = pyqtSignal()
|
||||
log_signal = pyqtSignal(str)
|
||||
raw_in_signal = pyqtSignal(str)
|
||||
@@ -51,11 +52,20 @@ class WSServer(QObject):
|
||||
n = len(data.get("layout", {}))
|
||||
self.log_signal.emit(f"layout saved preset={data['preset_uuid'][:8]}… {n} widgets")
|
||||
self.layout_saved.emit(data["preset_uuid"], data["layout"])
|
||||
elif ev == "widget_visibility":
|
||||
uid = data["uid"]
|
||||
dest_id = int(data.get("dest_id", 0))
|
||||
self.log_signal.emit(f"widget visibility uid={uid[:8]}… dest_id={dest_id}")
|
||||
self.widget_visibility_received.emit(uid, dest_id)
|
||||
else:
|
||||
self.log_signal.emit(f"unknown event: {ev}")
|
||||
except Exception as e:
|
||||
self.log_signal.emit(f"bad message: {e}")
|
||||
|
||||
@property
|
||||
def has_clients(self) -> bool:
|
||||
return len(self._clients) > 0
|
||||
|
||||
def broadcast(self, data: dict):
|
||||
if not self._clients:
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user