Add web bridge module
This commit is contained in:
100
src/web/bridge.rs
Normal file
100
src/web/bridge.rs
Normal file
@@ -0,0 +1,100 @@
|
||||
//! WebView bridge for JS <-> Rust communication
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(tag = "type", content = "data")]
|
||||
pub enum BridgeMessage {
|
||||
// Player commands
|
||||
Play,
|
||||
Pause,
|
||||
Stop,
|
||||
SeekFrame(u64),
|
||||
SeekTime(f64),
|
||||
StepForward,
|
||||
StepBackward,
|
||||
|
||||
// UI state
|
||||
SetVolume(f32),
|
||||
SetMuted(bool),
|
||||
SetSpeed(f32),
|
||||
|
||||
// Overlay toggles
|
||||
ToggleSubtitle,
|
||||
ToggleYolo,
|
||||
ToggleChunks,
|
||||
|
||||
// Zoom/Pan
|
||||
Zoom(f32),
|
||||
Pan(f32, f32),
|
||||
ResetView,
|
||||
|
||||
// File operations
|
||||
OpenFile(String),
|
||||
|
||||
// Queries
|
||||
GetState,
|
||||
GetSubtitle(f64),
|
||||
GetDetections(u64),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
#[serde(tag = "type", content = "data")]
|
||||
pub enum BridgeResponse {
|
||||
State(PlayerStateResponse),
|
||||
Subtitle(Option<String>),
|
||||
Detections(Vec<DetectionResponse>),
|
||||
Error(String),
|
||||
Ok,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct PlayerStateResponse {
|
||||
pub playback: String,
|
||||
pub current_frame: u64,
|
||||
pub total_frames: u64,
|
||||
pub current_time_ms: u64,
|
||||
pub duration_ms: u64,
|
||||
pub fps: f64,
|
||||
pub show_subtitle: bool,
|
||||
pub show_yolo: bool,
|
||||
pub show_chunks: bool,
|
||||
pub zoom: f32,
|
||||
pub muted: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
pub struct DetectionResponse {
|
||||
pub class_name: String,
|
||||
pub confidence: f64,
|
||||
pub x1: f64,
|
||||
pub y1: f64,
|
||||
pub x2: f64,
|
||||
pub y2: f64,
|
||||
}
|
||||
|
||||
pub struct WebBridge;
|
||||
|
||||
impl WebBridge {
|
||||
pub fn new() -> Self {
|
||||
Self
|
||||
}
|
||||
|
||||
pub fn encode_message(msg: &BridgeMessage) -> String {
|
||||
serde_json::to_string(msg).unwrap_or_default()
|
||||
}
|
||||
|
||||
pub fn decode_message(raw: &str) -> Option<BridgeMessage> {
|
||||
serde_json::from_str(raw).ok()
|
||||
}
|
||||
|
||||
pub fn encode_response(resp: &BridgeResponse) -> String {
|
||||
serde_json::to_string(resp).unwrap_or_default()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for WebBridge {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user