Initial commit: COPILOT D6 Flutter keyboard controller

Flutter web app replacing legacy WPF CCTV surveillance keyboard controller.
Includes wall overview, section view with monitor grid, camera input,
PTZ control, alarm/lock/sequence BLoCs, and legacy-matching UI styling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
klas
2026-02-12 14:57:38 +01:00
commit 40143734fc
125 changed files with 65073 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
/// Event received from bridge WebSocket
class BridgeEvent {
final String serverId;
final DateTime timestamp;
final String action;
final Map<String, dynamic> params;
BridgeEvent({
required this.serverId,
required this.timestamp,
required this.action,
required this.params,
});
factory BridgeEvent.fromJson(Map<String, dynamic> json, String serverId) {
return BridgeEvent(
serverId: serverId,
timestamp: json['timestamp'] != null
? DateTime.parse(json['timestamp'] as String)
: DateTime.now(),
action: json['action'] as String? ?? '',
params: json['params'] as Map<String, dynamic>? ?? {},
);
}
// Specific event type checks
bool get isViewerConnected => action == 'ViewerConnected';
bool get isViewerCleared => action == 'ViewerCleared';
bool get isViewerSelectionChanged => action == 'ViewerSelectionChanged';
bool get isEventStarted => action == 'EventStarted';
bool get isEventStopped => action == 'EventStopped';
bool get isDigitalInput => action == 'DigitalInput';
bool get isAlarmQueueNotification => action == 'VCAlarmQueueNotification';
bool get isConnectionLost => action == 'ConnectionLost';
// Viewer events
int? get viewer => params['Viewer'] as int?;
int? get channel => params['Channel'] as int?;
int? get playMode => params['PlayMode'] as int?;
// Alarm events
int? get eventId => params['EventID'] as int?;
String? get eventName => params['EventName'] as String?;
int? get typeId => params['TypeID'] as int?;
int? get foreignKey {
final fk = params['ForeignKey'];
if (fk is int) return fk;
if (fk is String) return int.tryParse(fk);
return null;
}
// Digital input
int? get contact => params['Contact'] as int?;
int? get state => params['State'] as int?;
// Alarm queue notification
int? get notification => params['Notification'] as int?;
int? get alarmId => params['AlarmID'] as int?;
@override
String toString() {
return 'BridgeEvent($action from $serverId at $timestamp)';
}
}