All checks were successful
Windows Release / windows-x86_64 (push) Successful in 1h12m54s
Session/person/layer defaults plus person×layer ACL (Allow/Deny/Inherit) for draw, move, delete, hide, and layer management; bump save format to 0.9.0-fork. Co-authored-by: Cursor <cursoragent@cursor.com>
77 lines
2.4 KiB
C++
77 lines
2.4 KiB
C++
/*
|
||
* InfiniPaint (fork)
|
||
* Collab ACL: World → Person → Layer → Person×Layer (Allow/Deny/Inherit)
|
||
*/
|
||
#pragma once
|
||
|
||
#include <cstdint>
|
||
#include <map>
|
||
#include <string>
|
||
#include <cereal/types/map.hpp>
|
||
#include <cereal/types/string.hpp>
|
||
|
||
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 <typename Archive>
|
||
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 <typename Archive>
|
||
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);
|