use std::collections::HashMap;
use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct SyncGroupId(pub u64);
static NEXT_SYNC_GROUP_ID: AtomicU64 = AtomicU64::new(1);
impl SyncGroupId {
pub fn generate() -> Self {
Self(NEXT_SYNC_GROUP_ID.fetch_add(1, Ordering::SeqCst))
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum SyncMode {
Synced,
Sometimes(Option<SyncGroupId>),
Standalone,
}
impl SyncMode {
pub fn label(&self) -> &'static str {
match self {
SyncMode::Synced => "synced",
SyncMode::Sometimes(None) => "sometimes (alone)",
SyncMode::Sometimes(Some(_))=> "sometimes (group)",
SyncMode::Standalone => "standalone",
}
}
pub fn color(&self) -> [f32; 4] {
match self {
SyncMode::Synced => [0.40, 0.85, 0.45, 1.0], SyncMode::Sometimes(None) => [0.95, 0.85, 0.30, 1.0], SyncMode::Sometimes(Some(_))=> [0.30, 0.65, 0.95, 1.0], SyncMode::Standalone => [0.85, 0.40, 0.40, 1.0], }
}
}
pub mod node_ids {
pub const STYLES: &str = "styles";
pub const Z_LAYERS: &str = "z_layers";
pub const FRAME_TIME: &str = "frame_time_ms";
pub const PANEL_TYPES: &str = "panel_type_registry";
pub const CHROME_CFG: &str = "branch.chrome_cfg";
pub const EDGES: &str = "branch.edges";
pub const DOCK_TREE: &str = "branch.dock_tree";
pub const LAYOUT_TREE: &str = "branch.layout_tree";
pub const OVERLAYS: &str = "branch.overlays";
pub const DISPATCHER: &str = "branch.dispatcher";
pub const CTX_MANAGER: &str = "branch.ctx";
pub const POINTER_STATE: &str = "branch.pointer_state";
pub const MODALS: &str = "branch.modals";
pub const POPUPS: &str = "branch.popups";
pub const DROPDOWNS: &str = "branch.dropdowns";
pub const TOOLBARS: &str = "branch.toolbars";
pub const SIDEBARS: &str = "branch.sidebars";
pub const CONTEXT_MENUS: &str = "branch.context_menus";
pub const CHROME_STATE: &str = "branch.chrome_widget_state";
}
#[derive(Clone, Debug)]
pub struct SyncRegistry {
modes: HashMap<&'static str, SyncMode>,
}
impl SyncRegistry {
pub fn defaults() -> Self {
let mut modes = HashMap::new();
modes.insert(node_ids::STYLES, SyncMode::Synced);
modes.insert(node_ids::Z_LAYERS, SyncMode::Synced);
modes.insert(node_ids::FRAME_TIME, SyncMode::Synced);
modes.insert(node_ids::PANEL_TYPES, SyncMode::Synced);
modes.insert(node_ids::LAYOUT_TREE, SyncMode::Standalone);
modes.insert(node_ids::OVERLAYS, SyncMode::Standalone);
modes.insert(node_ids::DISPATCHER, SyncMode::Standalone);
modes.insert(node_ids::CTX_MANAGER, SyncMode::Standalone);
modes.insert(node_ids::POINTER_STATE, SyncMode::Standalone);
modes.insert(node_ids::CHROME_CFG, SyncMode::Sometimes(None));
modes.insert(node_ids::EDGES, SyncMode::Sometimes(None));
modes.insert(node_ids::DOCK_TREE, SyncMode::Sometimes(None));
modes.insert(node_ids::MODALS, SyncMode::Standalone);
modes.insert(node_ids::POPUPS, SyncMode::Standalone);
modes.insert(node_ids::DROPDOWNS, SyncMode::Standalone);
modes.insert(node_ids::CONTEXT_MENUS, SyncMode::Standalone);
modes.insert(node_ids::TOOLBARS, SyncMode::Sometimes(None));
modes.insert(node_ids::SIDEBARS, SyncMode::Sometimes(None));
modes.insert(node_ids::CHROME_STATE, SyncMode::Sometimes(None));
Self { modes }
}
pub fn get(&self, node_id: &str) -> SyncMode {
self.modes
.get(node_id)
.copied()
.unwrap_or(SyncMode::Standalone)
}
pub fn set(&mut self, node_id: &'static str, mode: SyncMode) {
self.modes.insert(node_id, mode);
}
pub fn iter(&self) -> impl Iterator<Item = (&'static str, SyncMode)> + '_ {
self.modes.iter().map(|(k, v)| (*k, *v))
}
}
impl Default for SyncRegistry {
fn default() -> Self {
Self::defaults()
}
}