Add full IO support for every global ProPresenter library file plus theme folders, and extend the existing Labels/Macros readers with exporters and editable accessors so every supported document is now a round-trippable, mutable object. New library readers/writers (each: FileReader, FileWriter, Library wrapper, element wrapper where applicable, CLI tool, tests, doc/api/*.md): - Groups (ProGroupsDocument) + GroupDefinition - ClearGroups (ClearGroupsDocument) + ClearGroupDefinition - CCLI (CCLIDocument) - Messages (MessageDocument) + Message - Timers (TimersDocument + Clock) + Timer - Stage (Stage.Document) + StageLayout - Workspace (ProPresenterWorkspace) + Screen - Props (PropDocument) + Prop - TestPatterns (TestPatternDocument) - Calendar (new CalendarDocument) + CalendarEvent - KeyMappings (new KeyMappingsDocument) + KeyMapping - CommunicationDevices (JSON file) + CommunicationDevice - Theme bundles (Template.Document folder + Assets/) + ThemeBundle/Slide/Asset Extensions to existing modules: - LabelsFileWriter; Label and LabelLibrary gain setters, addLabel, removeLabel, setColor / setColorHex helpers - MacrosFileWriter; Macro/MacroCollection/MacroLibrary gain UUID, name, color, image_type, image_data, trigger_on_startup setters plus add/remove for macros and collections Two new minimal proto schemas were defined for documents that lacked upstream definitions: - proto/calendar.proto - CalendarDocument with Event entries, raw bytes for the action/macro sub-messages so the schema can evolve - proto/keyMappings.proto - KeyMappingsDocument with ApplicationInfo and a forward-looking Mapping message (sample only carries the info) The Theme file turned out to be a regular Rv\Data\Template\Document, so no new proto was required for theme content; ThemeBundle layers folder + Assets/ handling on top in the same spirit as PresentationBundle. GroupDefinition is intentionally distinct from the existing Group class (which wraps song-level CueGroup) to avoid breaking song APIs. Verified with the full PHPUnit suite: 370 tests, 9200 assertions, all green; LSP diagnostics clean across src/. The unmodified reference samples for Labels, Groups, ClearGroups, TestPatterns, Calendar and KeyMappings round-trip byte-for-byte; the others round-trip with the same byte length (PHP protobuf is not canonically deterministic but re-write-after-write stabilises). doc/INDEX.md, doc/keywords.md and AGENTS.md updated so every new module is discoverable from the top level.
52 lines
1.8 KiB
Protocol Buffer
52 lines
1.8 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package rv.data;
|
|
|
|
option cc_enable_arenas = true;
|
|
option csharp_namespace = "Pro.SerializationInterop.RVProtoData";
|
|
option swift_prefix = "RVData_";
|
|
|
|
import "rvtimestamp.proto";
|
|
import "uuid.proto";
|
|
|
|
// CalendarDocument is the global ProPresenter `Calendar` file. It holds
|
|
// scheduled events that fire macros at given times. The exact semantics of
|
|
// the inner sub-messages 8 and 9 (action and embedded macro reference) are
|
|
// preserved as raw bytes so the document round-trips byte-for-byte; clients
|
|
// that need to inspect them can decode them with `protoc --decode_raw` or
|
|
// reach for the raw protobuf message.
|
|
message CalendarDocument {
|
|
message Event {
|
|
// Stable identity of this calendar event.
|
|
.rv.data.UUID uuid = 1;
|
|
|
|
// Display name (e.g. "Doors Open").
|
|
string name = 2;
|
|
|
|
// When the event starts. Stored as Timestamp seconds (and optional nanos).
|
|
.rv.data.Timestamp start_time = 4;
|
|
|
|
// Opaque flags blob observed in samples. Often a single byte (e.g. 0x01)
|
|
// that ProPresenter uses for recurrence or visibility state.
|
|
bytes flags = 5;
|
|
|
|
// When the event ends. Optional. Same format as `start_time`.
|
|
.rv.data.Timestamp end_time = 6;
|
|
|
|
// Action that runs when the event fires. Encoded as raw protobuf bytes
|
|
// (a `rv.data.Action`-shaped message) so the schema can evolve without
|
|
// breaking existing clients.
|
|
bytes action_data = 8;
|
|
|
|
// Embedded copy of the macro definition the event triggers. Stored as
|
|
// raw protobuf bytes (shape compatible with `MacrosDocument.Macro`).
|
|
bytes macro_data = 9;
|
|
}
|
|
|
|
// Events scheduled in the calendar, in the order ProPresenter wrote them.
|
|
repeated Event events = 1;
|
|
|
|
// Source / mode flag observed in samples (value `1`). Treated as opaque.
|
|
uint32 mode = 2;
|
|
}
|