载入中...
搜索中...
未找到
ActionTimelineEditor.cpp
浏览该文件的文档.
29const action::ActionTrack* findTrack(const action::ActionTimeline& timeline, const LogicalId& id) {
36 std::stable_sort(track.notifies.begin(), track.notifies.end(), [](const auto& left, const auto& right) {
39 std::stable_sort(track.states.begin(), track.states.end(), [](const auto& left, const auto& right) {
40 return left.start == right.start ? left.id.format() < right.id.format() : left.start < right.start;
46 timeline.animationSections.begin(), timeline.animationSections.end(), [](const auto& left, const auto& right) {
47 return left.start == right.start ? left.id.format() < right.id.format() : left.start < right.start;
60 if (std::any_of(track.states.begin(), track.states.end(), [&](const auto& state) { return state.id == id; }))
83 } else if (auto fromName = LogicalId::fromParts("action", targetId.empty() ? "untitled" : targetId)) {
92PropertyDescriptor property(const char* path, const char* label, PropertyType type, EditorValue defaultValue,
113ActionTimelineTarget::ActionTimelineTarget(std::string targetId, action::ActionTimeline timeline)
133 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.target-mismatch"), "Action timeline operation targets another document");
135 return eve::editing::failed<void>(EditorStatus::Unsupported, RuleId("editor.action.timeline.operation-unsupported"), "Action timeline target only accepts canonical replace operations");
138 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.payload-invalid"), "Action timeline replacement requires a JSON string");
141 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.json-invalid"), commonMessage(value.status(), "Action timeline JSON is invalid"));
144 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.asset-invalid"), commonMessage(decoded.status(), "Action timeline asset is invalid"));
156Result<void> ActionTimelineTarget::commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) {
159 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.action.timeline.candidate-mismatch"), "Action timeline candidate belongs to another target");
179 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.asset-invalid"), commonMessage(valid.status(), "Action timeline asset is invalid"));
185Result<DomainOperation> ActionTimelineTarget::replacement(const action::ActionTimeline& candidate,
190 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.encode-failed"), "Could not encode the action timeline edit");
194 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.encode-failed"), "Could not serialize the action timeline edit");
202 operation.affectedObjects.push_back({operation.target, timeline_.actionId.format(), revision_});
207eve::Result<eve::Revision> ActionTimelineTarget::currentRevision(const SelectionSnapshot& selection) const {
210 eve::DiagnosticCode::InvalidArgument, "Action timeline selection mismatch", "editor.action.selection"));
218 auto animation = property("timeline.animationUri", "editor.action.animation-uri", PropertyType::AssetRef, "");
228PropertyReadResult ActionTimelineTarget::read(const SelectionSnapshot& selection, const PropertyPath& path) const {
230 if (path == PropertyPath("timeline.actionId")) return {PropertyReadState::Value, timeline_.actionId.format(), {}};
234 timeline_.animationSections.empty() ? timeline_.animationUri : timeline_.animationSections.front().animationUri;
245 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.property-invalid"), "Action timeline property assignment is invalid");
251 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.action-id"), "Action id must be a namespace:name logical id");
256 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.duration"), "Timeline duration must be a number of seconds");
259 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.duration"), commonMessage(duration.status(), "Timeline duration is invalid"));
264 return eve::editing::failed<DomainOperation>(EditorStatus::Rejected, RuleId("editor.action.timeline.animation-uri"), "Animation URI must be a string");
266 if (!candidate.animationSections.empty()) candidate.animationSections.front().animationUri = *uri;
278 return eve::editing::failed<DomainOperation>(EditorStatus::Unsupported, RuleId("editor.action.timeline.property-unsupported"), "Unknown action timeline property");
292 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.json-invalid"), commonMessage(value.status(), "Action timeline JSON is invalid"));
295 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.asset-invalid"), commonMessage(decoded.status(), "Action timeline asset is invalid"));
300 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.action.timeline.asset-invalid"), commonMessage(decoded.status(), "Action timeline asset is invalid"));
311ActionTimelineEditor::ActionTimelineEditor(std::string targetId, action::ActionTimeline timeline)
312 : ActionTimelineEditor(std::move(targetId), std::move(timeline), std::make_shared<ActionTimelineClipboard>()) {}
314ActionTimelineEditor::ActionTimelineEditor(std::string targetId, action::ActionTimeline timeline,
322 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId(std::move(rule)), std::move(message));
378 return rejected("editor.action.timeline.encode-failed", "Could not encode the action timeline edit");
382 return rejected("editor.action.timeline.encode-failed", "Could not serialize the action timeline edit");
396 return eve::editing::failed<void>(begun.code(), RuleId("editor.action.timeline.begin-failed"), "Could not begin action edit");
405 operation.affectedObjects.push_back({operation.target, target_.timeline().actionId.format(), target_.revision()});
416 return eve::editing::failed<void>(committed.code(), RuleId("editor.action.timeline.commit-failed"), "Action edit was rejected");
439 if (label.empty()) return rejected("editor.action.timeline.track-label", "Action track label must not be empty");
463 return rejected("editor.action.timeline.section-split-not-found", "Physical section split was not found");
475 return rejected("editor.action.timeline.section-split-not-found", "Physical section split was not found");
477 candidate.splitTimestamps.erase(candidate.splitTimestamps.begin() + static_cast<std::ptrdiff_t>(index));
488Result<void> ActionTimelineEditor::moveAnimationSection(const LogicalId& sectionId, Duration delta) {
490 auto found = std::find_if(candidate.animationSections.begin(), candidate.animationSections.end(),
493 return rejected("editor.action.timeline.animation-section-not-found", "Animation section was not found");
496 if (!start || !end) return rejected("editor.action.timeline.time-overflow", "Animation section time overflowed");
503Result<void> ActionTimelineEditor::resizeAnimationSection(const LogicalId& sectionId, Duration start,
506 std::find_if(target_.timeline().animationSections.begin(), target_.timeline().animationSections.end(),
513Result<void> ActionTimelineEditor::editAnimationSection(const LogicalId& sectionId, Duration start, Duration end,
516 auto found = std::find_if(candidate.animationSections.begin(), candidate.animationSections.end(),
519 return rejected("editor.action.timeline.animation-section-not-found", "Animation section was not found");
528Result<void> ActionTimelineEditor::editAnimationSectionSource(const LogicalId& sectionId, Duration sourceStart,
532 auto found = std::find_if(candidate.animationSections.begin(), candidate.animationSections.end(),
535 return rejected("editor.action.timeline.animation-section-not-found", "Animation section was not found");
542Result<void> ActionTimelineEditor::editAnimationSectionFull(action::ActionAnimationSection section) {
544 auto found = std::find_if(candidate.animationSections.begin(), candidate.animationSections.end(),
547 return rejected("editor.action.timeline.animation-section-not-found", "Animation section was not found");
556 std::erase_if(candidate.animationSections, [&](const auto& section) { return section.id == sectionId; });
558 return rejected("editor.action.timeline.animation-section-not-found", "Animation section was not found");
562Result<void> ActionTimelineEditor::addNotify(const LogicalId& trackId, action::ActionNotify notify) {
565 if (!track) return rejected("editor.action.timeline.track-not-found", "Action track was not found");
572Result<void> ActionTimelineEditor::addState(const LogicalId& trackId, action::ActionNotifyState state) {
575 if (!track) return rejected("editor.action.timeline.track-not-found", "Action track was not found");
587 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
596 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
609Result<void> ActionTimelineEditor::resizeState(const LogicalId& itemId, Duration start, Duration end) {
611 return rejected("editor.action.timeline.state-range", "Notify-state range is outside the timeline");
617 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
626Result<void> ActionTimelineEditor::updateItem(const LogicalId& itemId, LogicalId type, Value::Object payload) {
627 if (!type.isValid()) return rejected("editor.action.timeline.type-invalid", "Timeline item type is invalid");
632 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
639 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
680 return rejected("editor.action.timeline.parameter-type", "Timeline item is not a parameter curve");
698Result<void> ActionTimelineEditor::removeParameterKey(const LogicalId& itemId, std::size_t index) {
704 return rejected("editor.action.timeline.parameter-type", "Timeline item is not a parameter curve");
722Result<void> ActionTimelineEditor::editItem(const LogicalId& itemId, Duration start, Duration end, LogicalId type,
724 if (!type.isValid()) return rejected("editor.action.timeline.type-invalid", "Timeline item type is invalid");
726 return rejected("editor.action.timeline.item-range", "Timeline item range is outside the timeline");
731 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
733 return rejected("editor.action.timeline.notify-range", "Instant notify start and end must match");
756 const auto section = std::find_if(candidate.animationSections.begin(), candidate.animationSections.end(),
768 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
776 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
790 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
798 if (track.locked) return rejected("editor.action.timeline.track-locked", "Action track is locked");
801 return commit(std::move(candidate), enabled ? "Enable action notify state" : "Disable action notify state",
844 bool found = std::any_of(target_.timeline().animationSections.begin(), target_.timeline().animationSections.end(),
852 if (!found) return rejected("editor.action.timeline.item-not-found", "Timeline item was not found");
872 clipboard_->items_.push_back({ActionTimelineClipboard::Item::Kind::AnimationSection, {}, section, {}, {}});
885LogicalId ActionTimelineEditor::copiedId(const LogicalId& source, const action::ActionTimeline& candidate) {
887 const std::string name = std::string(source.name()) + ".copy." + std::to_string(++copySequence_);
893Result<std::size_t> ActionTimelineEditor::paste(Duration offset) { return pasteItems(offset, nullptr); }
899Result<std::size_t> ActionTimelineEditor::pasteItems(Duration offset, const LogicalId* destinationTrack) {
931 EditorStatus::Rejected, RuleId("editor.action.timeline.track-locked"), "Clipboard track is locked");
960 auto committed = commit(std::move(candidate), "Paste action timeline items", "action.timeline.item.paste");
962 return eve::editing::failed<std::size_t>(committed.code(), RuleId("editor.action.timeline.paste-failed"),
998 if (selection_.empty()) return rejected("editor.action.timeline.selection-empty", "No timeline items are selected");
1009 return rejected("editor.action.timeline.track-locked", "Selection contains an item on a locked track");
1010 std::erase_if(track.notifies, [&](const auto& item) { return selection_.contains(item.id.format()); });
1011 std::erase_if(track.states, [&](const auto& item) { return selection_.contains(item.id.format()); });
1028Result<Duration> ActionTimelineEditor::frameStepTarget(std::int64_t frames, double frameRate) const {
1033 const long double seconds = static_cast<long double>(previewTime_.nanoseconds()) / 1'000'000'000.0L +
1035 const long double maximum = static_cast<long double>(target_.timeline().duration.nanoseconds()) /
1071 return eve::editing::failed<std::size_t>(plan.code(), RuleId("editor.action.timeline.preview-plan"),
1086 return Result<ActionTimelinePreviewPlan>::success(std::move(plan), Status::success(EditorStatus::NoOp));
1095 EditorStatus::Rejected, RuleId("editor.action.timeline.preview-overflow"), "Preview time overflowed");
1114 if (!playing_ || plan.timelineRevision != target_.revision() || plan.previous != previewTime_ ||
1132ActionTimelineDocumentWorkspace::ActionTimelineDocumentWorkspace(DocumentService& documents) : documents_(&documents) {}
1134Result<action::ActionTimeline> ActionTimelineDocumentWorkspace::decode(const EditorValue& content) {
1144ActionTimelineDocumentWorkspace::Tab* ActionTimelineDocumentWorkspace::find(const DocumentId& document) {
1150const ActionTimelineDocumentWorkspace::Tab* ActionTimelineDocumentWorkspace::find(const DocumentId& document) const {
1197 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.action.document.not-open"),
1207 auto edited = documents_->edit(tab.document, tab.editor->target().snapshotValue(), snapshot.value().revision.edit);
1227Result<DocumentSnapshot> ActionTimelineDocumentWorkspace::reconcile(const DocumentId& document) {
1256 return eve::editing::failed<void>(EditorStatus::NotFound, RuleId("editor.action.document.not-open"),
1260 const bool dirty = found->editor->target().revision() != found->savedEditorRevision || snapshot.value().dirty();
1262 return eve::editing::failed<void>(EditorStatus::Conflict, RuleId("editor.action.document.unsaved"),
1269 activeDocument_ = tabs_.empty() ? DocumentId{} : tabs_[std::min(index, tabs_.size() - 1)].document;
Typed continuous parameter-curve action block.
UI-neutral transactional action timeline editor and preview model.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Result< Duration > tryAdd(Duration other) const
Add two durations with overflow validation.
Definition Time.cpp:30
static Result< Duration > fromSeconds(double seconds)
Convert finite seconds to the nearest nanosecond.
Definition Time.cpp:16
static constexpr Duration fromNanoseconds(std::int64_t nanoseconds) noexcept
Construct an exact duration from nanoseconds.
Definition Time.h:55
double seconds() const noexcept
Return this duration as seconds for legacy/presentation APIs.
Definition Time.cpp:28
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static std::optional< LogicalId > fromParts(std::string_view namespaceName, std::string_view name)
Builds a logical ID from separate namespace and name components.
Definition Identity.cpp:48
const std::string & format() const noexcept
Returns the canonical namespace:name representation.
Definition Identity.h:436
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
const std::string & value() const noexcept
Returns the exact legacy or canonical compatibility spelling.
Definition Identity.h:362
static Result< Value > fromJson(std::string_view json)
Parse one strict JSON value into an owning Value.
Definition Value.cpp:57
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
Definition EditableTarget.h:82
Optional capability exposing a deterministic, persistence-safe editing snapshot.
Definition EditableTarget.h:247
static CapabilityId editingCapabilityId()
Stable capability identity shared by every editable domain target.
Definition EditableTarget.h:252
UI-independent property access for an immutable selection snapshot.
Definition EditingProperty.h:139
Dotted property path (layout.size) compared and persisted as text.
Definition EditingIds.h:78
Deterministic owning value tree shared by authoring hosts.
Definition EditingValue.h:19
Owning clipboard shared explicitly by one or more action timeline editors.
Definition ActionTimelineEditor.h:50
bool empty() const noexcept
Whether neither item nor track content is available.
Definition ActionTimelineEditor.cpp:309
Result< DocumentSnapshot > reconcile(const DocumentId &document)
Reconcile a tab with external persistence, rejecting dirty conflicts without data loss.
Definition ActionTimelineEditor.cpp:1227
Result< std::vector< ActionTimelineTabSnapshot > > tabs() const
Ordered immutable tab projections for rendering a document bar.
Definition ActionTimelineEditor.cpp:1274
Result< void > activate(const DocumentId &document)
Activate an already-open tab.
Definition ActionTimelineEditor.cpp:1195
ActionTimelineEditor * activeEditor() noexcept
Borrow the active editor.
Definition ActionTimelineEditor.cpp:1288
Result< void > close(const DocumentId &document, ActionTimelineCloseMode mode)
Close a tab, rejecting unsaved work unless explicit discard is requested.
Definition ActionTimelineEditor.cpp:1251
Result< DocumentSnapshot > save(const DocumentId &document)
Save one exact canonical editor revision through DocumentService CAS persistence.
Definition ActionTimelineEditor.cpp:1212
Result< DocumentId > open(DocumentKey key, std::string title, std::string resourceUri, action::ActionTimeline initialTimeline)
Open or activate one Montage asset document.
Definition ActionTimelineEditor.cpp:1156
Timeline editing controller shared by developer and in-game editors.
Definition ActionTimelineEditor.h:162
Result< void > editAnimationSection(const LogicalId §ionId, Duration start, Duration end, Duration blendIn, std::string animationUri)
Atomically edit section timing, blend and animation resource URI.
Definition ActionTimelineEditor.cpp:513
Result< std::size_t > boxSelect(Duration start, Duration end)
Replace selection with items intersecting a time interval.
Definition ActionTimelineEditor.cpp:826
Result< void > selectItem(const LogicalId &itemId, bool additive=false)
Select one existing item, optionally preserving the current selection.
Definition ActionTimelineEditor.cpp:843
Result< void > setSectionSplit(std::size_t index, Duration time)
Move one indexed physical-section split while preserving strict ordering.
Definition ActionTimelineEditor.cpp:461
std::vector< LogicalId > selectedItemIds() const
Return selected item IDs in lexical order as owning values.
Definition ActionTimelineEditor.cpp:858
Result< void > addParameterKey(const LogicalId &itemId, action::ActionParameterKey key)
Insert one normalized key into a parameter curve as an undoable edit.
Definition ActionTimelineEditor.cpp:648
Result< void > resizeState(const LogicalId &itemId, Duration start, Duration end)
Resize one notify-state interval to exact validated boundaries.
Definition ActionTimelineEditor.cpp:609
Result< void > setTrackLocked(const LogicalId &trackId, bool locked)
Lock/unlock one track through an undoable operation.
Definition ActionTimelineEditor.cpp:817
Result< void > addAnimationSection(action::ActionAnimationSection section)
Add one objective animation section to the montage lane.
Definition ActionTimelineEditor.cpp:481
Result< void > removeParameterKey(const LogicalId &itemId, std::size_t index)
Remove one non-endpoint parameter key as an undoable edit.
Definition ActionTimelineEditor.cpp:698
Result< void > editAnimationSectionFull(action::ActionAnimationSection section)
Replace every editable animation-section field in one undo step.
Definition ActionTimelineEditor.cpp:542
Result< void > moveItem(const LogicalId &itemId, Duration delta)
Move one notify or state by an exact deterministic delta.
Definition ActionTimelineEditor.cpp:582
Result< void > removeAnimationSection(const LogicalId §ionId)
Remove one animation section from the montage lane.
Definition ActionTimelineEditor.cpp:553
Result< void > removeSectionSplit(std::size_t index)
Remove one indexed physical-section split.
Definition ActionTimelineEditor.cpp:473
Result< void > removeItem(const LogicalId &itemId)
Remove one notify or state.
Definition ActionTimelineEditor.cpp:754
Result< void > moveAnimationSection(const LogicalId §ionId, Duration delta)
Move an animation section while preserving its duration.
Definition ActionTimelineEditor.cpp:488
Result< void > setItemEnabled(const LogicalId &itemId, bool enabled)
Enable or disable one notify/state through an undoable transaction.
Definition ActionTimelineEditor.cpp:785
Result< void > configureWorkspace(EditorWorkspace &workspace) const
Atomically install the standard asset/preview/timeline/inspector panel composition.
Definition ActionTimelineEditor.cpp:340
Result< void > addState(const LogicalId &trackId, action::ActionNotifyState state)
Add a notify state interval to an unlocked track.
Definition ActionTimelineEditor.cpp:572
Result< void > addNotify(const LogicalId &trackId, action::ActionNotify notify)
Add an instantaneous notify to an unlocked track.
Definition ActionTimelineEditor.cpp:562
Result< void > removeTrack(const LogicalId &trackId)
Remove one semantic track and all of its items in one undoable transaction.
Definition ActionTimelineEditor.cpp:426
Result< void > editAnimationSectionSource(const LogicalId §ionId, Duration sourceStart, Duration sourceEnd, action::ActionBlendCurve blendCurve)
Atomically edit clip-local trim and incoming blend curve.
Definition ActionTimelineEditor.cpp:528
Result< void > addTrack(action::ActionTrack track)
Add an empty semantic track.
Definition ActionTimelineEditor.cpp:420
Result< void > setTrackMuted(const LogicalId &trackId, bool muted)
Mute/unmute one track through an undoable operation.
Definition ActionTimelineEditor.cpp:808
Result< void > editParameterKey(const LogicalId &itemId, std::size_t index, action::ActionParameterKey key)
Replace one indexed parameter key as an undoable edit.
Definition ActionTimelineEditor.cpp:673
ActionTimelineEditor(std::string targetId, action::ActionTimeline timeline)
Construct a self-contained editor for one canonical timeline.
Definition ActionTimelineEditor.cpp:311
Result< void > editItem(const LogicalId &itemId, Duration start, Duration end, LogicalId type, Value::Object payload)
Atomically replace one item's timing, type and owning payload.
Definition ActionTimelineEditor.cpp:722
Result< void > resizeAnimationSection(const LogicalId §ionId, Duration start, Duration end, Duration blendIn)
Resize an animation section and its incoming blend window.
Definition ActionTimelineEditor.cpp:503
Result< void > addSectionSplit(Duration time)
Insert one physical-section split strictly inside the montage duration.
Definition ActionTimelineEditor.cpp:447
Result< void > updateItem(const LogicalId &itemId, LogicalId type, Value::Object payload)
Replace one item's type and owning payload through one undoable transaction.
Definition ActionTimelineEditor.cpp:626
Result< std::size_t > copySelection()
Copy selected items into an owning editor clipboard.
Definition ActionTimelineEditor.cpp:868
Result< void > renameTrack(const LogicalId &trackId, std::string label)
Rename one track without changing its stable identity.
Definition ActionTimelineEditor.cpp:438
Result< void > reloadDocument(const EditorValue &snapshot)
Atomically replace the document snapshot and clear history, selection and preview transport.
Definition ActionTimelineEditor.cpp:325
Authoritative editor target for one action timeline asset.
Definition ActionTimelineEditor.h:85
static CapabilityId propertyCapabilityId()
Capability identity published by describe() for Inspector property editing.
Definition ActionTimelineEditor.h:96
void * queryCapability(const CapabilityId &capability) override
Query property or snapshot capabilities.
Definition ActionTimelineEditor.cpp:124
TargetDescriptor describe() const override
Describe the timeline document for tools and automation.
Definition ActionTimelineEditor.cpp:116
EditorValue snapshotValue() const override
Capture the canonical timeline as an authoring value tree.
Definition ActionTimelineEditor.cpp:282
PropertyReadResult read(const SelectionSnapshot &selection, const PropertyPath &path) const override
Reads .
Definition ActionTimelineEditor.cpp:228
std::unique_ptr< IDomainOperationTarget > cloneDomainState() const override
Clone complete target state for atomic compensation.
Definition ActionTimelineEditor.cpp:150
TargetId targetId() const override
Stable editor target identity.
Definition ActionTimelineEditor.h:99
Result< DomainOperation > makeReset(const SelectionSnapshot &selection, const PropertyPath &path) const override
Make reset.
Definition ActionTimelineEditor.cpp:274
Result< DomainOperation > makeSet(const SelectionSnapshot &selection, const PropertyPath &path, const EditorValue &value, PropertySetMode mode) const override
Make set.
Definition ActionTimelineEditor.cpp:238
ActionTimelineTarget(std::string targetId)
Construct an empty, valid seed timeline for automation and inspectors.
Definition ActionTimelineEditor.cpp:108
Result< void > loadSnapshot(const EditorValue &snapshot)
Replace content when opening a persisted or automation-supplied timeline.
Definition ActionTimelineEditor.cpp:288
const action::ActionTimeline & timeline() const noexcept
Borrow the authoritative timeline until the next mutation.
Definition ActionTimelineEditor.h:116
eve::Result< eve::Revision > currentRevision(const SelectionSnapshot &selection) const override
Current revision.
Definition ActionTimelineEditor.cpp:207
Result< void > commitDomainState(std::unique_ptr< IDomainOperationTarget > candidate) override
Atomically publish a validated candidate.
Definition ActionTimelineEditor.cpp:156
Result< void > applyDomainOperation(const DomainOperation &operation) override
Apply a validated canonical replace operation.
Definition ActionTimelineEditor.cpp:131
std::uint64_t revision() const override
Monotonic content revision.
Definition ActionTimelineEditor.h:101
PropertySchema schema(const SelectionSnapshot &selection) const override
Schema.
Definition ActionTimelineEditor.cpp:214
Document coordinator with revision-safe requestSave/executeSave sequencing.
Definition EditorDocumentService.h:118
Result< DocumentSnapshot > reconcileExternal(const DocumentId &document)
Reconcile one open document with the latest store value. Clean documents adopt external content; dirt...
Definition EditorDocumentService.cpp:144
Result< DocumentSnapshot > edit(const DocumentId &document, EditorValue content, std::optional< Revision > expectedRevision=std::nullopt)
Replace the working content using an optional expected edit revision.
Definition EditorDocumentService.cpp:65
Result< DocumentSnapshot > snapshot(const DocumentId &document) const
Return one metadata snapshot.
Definition EditorDocumentService.cpp:126
Result< DocumentSnapshot > executeSave(const SaveTicket &ticket)
Execute a captured save ticket without reading newer working content.
Definition EditorDocumentService.cpp:93
Result< EditorValue > content(const DocumentId &document) const
Return the current working content snapshot.
Definition EditorDocumentService.cpp:118
Result< SaveTicket > requestSave(const DocumentId &document)
Capture an exact content/revision pair for a later CAS save.
Definition EditorDocumentService.cpp:78
Result< void > close(const DocumentId &document)
Close and discard in-memory state; persisted content is unchanged.
Definition EditorDocumentService.cpp:218
Result< DocumentSnapshot > open(DocumentKey key, std::string title, std::string resourceUri, EditorValue initialContent={})
Open an asset-backed document, loading existing persisted content when present.
Definition EditorDocumentService.cpp:34
Composition model shared by project-specific developer and runtime editors.
Definition EditorWorkspace.h:43
bool setPanelContext(const std::string &id, const std::string &context)
Attach a semantic input context such as scene, graph, or timeline.
Definition EditorWorkspace.cpp:137
Result< WorkspacePanelDescriptor > registerPanel(WorkspacePanelDescriptor descriptor)
Register a checked owning panel descriptor.
Definition EditorWorkspace.cpp:48
Result< WorkspacePanelDescriptor > activatePanel(const StableId &id)
Activate a visible panel with structured not-found/rejected results.
Definition EditorWorkspace.cpp:169
bool setPanelCapability(const std::string &id, const std::string &capability)
Attach a capability requirement used by the host when filtering panels.
Definition EditorWorkspace.cpp:128
Result< TransactionReceipt > commit() override
Preflight and commit all active operations through the authority.
Definition EditorTransactionService.cpp:74
Result< TransactionId > begin(TransactionSpec specification) override
Begin a transaction with a stable id and base revision.
Definition EditorTransactionService.cpp:60
void clear()
Clear pending work and local undo/redo history without mutating the authority target.
Definition EditorTransactionService.h:81
bool active() const noexcept override
True while begin/append has an uncommitted transaction.
Definition EditorTransactionService.h:75
Result< void > discard() override
Discard the active, not-yet-committed operation list.
Definition EditorTransactionService.cpp:76
Result< void > append(DomainOperation operation) override
Append an operation to the active transaction without applying it.
Definition EditorTransactionService.cpp:68
ActionBlendCurve
Built-in deterministic cross-fade curve evaluated without asset callbacks.
Definition ActionTimeline.h:30
Result< void > noOp(std::vector< Diagnostic > diagnostics={})
Construct a successful void result for an operation that made no change.
Definition EditingResult.h:58
Definition ActionPreviewController.cpp:6
eve::editing::Value EditorValue
Compatibility alias for the UI-independent authoring value tree.
Definition EditorValue.h:8
EditorValue toEditorValue(const eve::Value &value)
Compatibility spelling for conversion into the authoring value tree.
Definition EditorProperty.h:29
eve::editing::PropertyDescriptor PropertyDescriptor
Definition EditorProperty.h:17
eve::editing::TransactionSpec TransactionSpec
Definition EditorProtocol.h:17
eve::editing::DomainOperation DomainOperation
Definition EditorProtocol.h:12
ActionTimelineCloseMode
Dirty-document policy applied when closing one Montage tab.
Definition ActionTimelineEditor.h:338
@ ProtectDirty
@ Timeline
@ InvalidArgument
Definition Container.h:602
Objective animation segment placed on the montage presentation lane.
Definition ActionTimeline.h:58
Typed interval with explicit enter/exit boundaries.
Definition ActionTimeline.h:111
Instantaneous typed event placed on an action track.
Definition ActionTimeline.h:99
static Result< ActionParameterCurveBinding > fromPayload(const Value::Object &payload)
Decode and validate target, operation and normalized ordered keys.
Definition ActionParameterCurve.cpp:65
One normalized, owning parameter-curve key.
Definition ActionParameterCurve.h:24
Canonical action timeline asset shared by runtime and editor.
Definition ActionTimeline.h:178
Result< Value > toValue() const
Encode the canonical schema as an owning deterministic Value.
Definition ActionTimeline.cpp:376
static Result< ActionTimeline > fromValue(const Value &value)
Decode and validate one canonical schema value transactionally.
Definition ActionTimeline.cpp:425
Result< void > validate() const
Validate ids, ranges, uniqueness and deterministic ordering.
Definition ActionTimeline.cpp:219
std::vector< ActionAnimationSection > animationSections
Definition ActionTimeline.h:184
std::string animationUri
Compatibility-only single-clip projection; v2 runtime uses animationSections.
Definition ActionTimeline.h:183
std::vector< Duration > splitTimestamps
Sorted objective split timestamps forming N+1 physical sections.
Definition ActionTimeline.h:187
Ordered semantic lane in one action timeline.
Definition ActionTimeline.h:124
std::vector< PropertyDescriptor > properties
Definition EditingProperty.h:120
PropertyDescriptorLookup find(const PropertyPath &path) const
Finds find.
Definition EditingProperty.cpp:9
std::vector< SelectionItem > items
Definition EditingSelection.h:22
Stable discovery metadata exposed by every editable target.
Definition EditableTarget.h:39
Prepared deterministic preview advance that can be validated before presentation side effects.
Definition ActionTimelineEditor.h:34
Duration previous
Definition ActionTimelineEditor.h:36
bool includeStart
Definition ActionTimelineEditor.h:38
unsigned long long timelineRevision
Definition ActionTimelineEditor.h:35
bool reachesEnd
Definition ActionTimelineEditor.h:39
std::vector< action::ActionTimelineEvent > events
Definition ActionTimelineEditor.h:40
Stable document identity; paths are deliberately excluded.
Definition EditorDocumentService.h:33