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.
40 lines
1.2 KiB
Protocol Buffer
40 lines
1.2 KiB
Protocol Buffer
syntax = "proto3";
|
|
|
|
package rv.data;
|
|
|
|
option cc_enable_arenas = true;
|
|
option csharp_namespace = "Pro.SerializationInterop.RVProtoData";
|
|
option swift_prefix = "RVData_";
|
|
|
|
import "applicationInfo.proto";
|
|
import "hotKey.proto";
|
|
import "uuid.proto";
|
|
|
|
// KeyMappingsDocument is the global ProPresenter `KeyMappings` file. The
|
|
// reference sample on disk is just an `ApplicationInfo` envelope with an
|
|
// otherwise empty body — ProPresenter seeds the file at startup. Once the
|
|
// user binds hot keys we expect them in `mappings`.
|
|
message KeyMappingsDocument {
|
|
message Mapping {
|
|
// Optional stable identifier for the mapping.
|
|
.rv.data.UUID uuid = 1;
|
|
|
|
// The hot key combo that fires the action.
|
|
.rv.data.HotKey hot_key = 2;
|
|
|
|
// Action target — typically a macro UUID, a control identifier, or any
|
|
// other reference ProPresenter chooses to encode. Kept as bytes so we
|
|
// round-trip cleanly while ProPresenter's internal schema evolves.
|
|
bytes target = 3;
|
|
|
|
// Display name (optional).
|
|
string name = 4;
|
|
}
|
|
|
|
// Application metadata of the writer.
|
|
.rv.data.ApplicationInfo application_info = 1;
|
|
|
|
// Configured key bindings. Empty in the reference sample.
|
|
repeated Mapping mappings = 2;
|
|
}
|