/* * InfiniPaint (fork) * Collab ACL: World → Person → Layer → Person×Layer (Allow/Deny/Inherit) */ #pragma once #include #include #include #include #include enum class CollabRight : uint8_t { Draw = 0, Move, Delete, Hide, ManageLayers, COUNT }; enum class CollabTriState : uint8_t { Inherit = 0, Allow = 1, Deny = 2 }; struct CollabPermissionSet { CollabTriState draw = CollabTriState::Inherit; CollabTriState move = CollabTriState::Inherit; CollabTriState erase = CollabTriState::Inherit; CollabTriState hide = CollabTriState::Inherit; CollabTriState manageLayers = CollabTriState::Inherit; CollabTriState get(CollabRight right) const; void set(CollabRight right, CollabTriState state); bool any_concrete() const; static CollabPermissionSet all_allow(); static CollabPermissionSet all_inherit(); static CollabPermissionSet content_deny(); // Draw/Move/Delete Deny, rest Inherit template void serialize(Archive& a) { a(draw, move, erase, hide, manageLayers); } bool operator==(const CollabPermissionSet&) const = default; }; struct CollabSessionDefaults { // Concrete fallback when everything inherits (Inherit treated as Allow). CollabPermissionSet worldDefault = CollabPermissionSet::all_allow(); // Copied onto ClientData when a player joins. CollabPermissionSet newPlayerDefaults = CollabPermissionSet::all_inherit(); // Copied onto new layers' DisplayData.layerDefaults. CollabPermissionSet newLayerDefaults = CollabPermissionSet::all_inherit(); template void serialize(Archive& a) { a(worldDefault, newPlayerDefaults, newLayerDefaults); } bool operator==(const CollabSessionDefaults&) const = default; }; /** Resolve Allow/Deny for peer on a layer. Host callers should short-circuit before this. */ bool collab_resolve_allow( CollabRight right, const CollabPermissionSet* personLayerOverride, // nullable const CollabPermissionSet& layerDefaults, const CollabPermissionSet& personDefaults, const CollabPermissionSet& worldDefault); const char* collab_right_label(CollabRight right); const char* collab_tristate_label(CollabTriState state); CollabTriState collab_cycle_tristate(CollabTriState state);