载入中...
搜索中...
未找到
EditableTarget.h
浏览该文件的文档.
1#pragma once
2#include <string>
3#include <type_traits>
4#include <vector>
7namespace eve::editing {
9struct EditRegion {
10 int minX = 0, minY = 0, maxX = -1, maxY = -1;
12 bool empty() const { return maxX < minX || maxY < minY; }
14 void clear() { *this = {}; }
16 void include(int x, int y) {
17 if (empty()) {
18 minX = maxX = x;
19 minY = maxY = y;
20 return;
21 }
22 if (x < minX) minX = x;
23 if (x > maxX) maxX = x;
24 if (y < minY) minY = y;
25 if (y > maxY) maxY = y;
26 }
28 void include(const EditRegion& o) {
29 if (!o.empty()) {
31 include(o.minX, o.minY);
33 include(o.maxX, o.maxY);
34 }
35 }
36};
37
41 std::string type;
43 bool readOnly = false;
44 std::vector<CapabilityId> capabilities;
45};
46
49public:
51 virtual ~IEditableTarget() = default;
53 virtual TargetId targetId() const = 0;
55 virtual std::uint64_t revision() const = 0;
57 virtual EditRegion dirtyRegion() const = 0;
59 virtual void clearDirtyRegion() = 0;
61 virtual TargetDescriptor describe() const {
62 return {targetId(), {}, revision(), false, {}};
63 }
70 virtual void* queryCapability(const CapabilityId& capability) {
71 (void)capability;
72 return nullptr;
73 }
80 template <class C>
84 if constexpr (requires { C::editingCapabilityId(); }) {
85 if (void* raw = queryCapability(C::editingCapabilityId()))
86 return eve::OptionalRef<C>(std::ref(*static_cast<C*>(raw)));
87 }
89 if constexpr (std::is_polymorphic_v<C>) {
90 if (auto* typed = dynamic_cast<C*>(this)) return eve::OptionalRef<C>(std::ref(*typed));
91 }
92 return {};
93 }
94 template <class C>
98 if constexpr (std::is_polymorphic_v<C>) {
99 if (auto* typed = dynamic_cast<const C*>(this)) return eve::OptionalRef<const C>(std::ref(*typed));
100 }
101 return {};
102 }
103 template <class C>
105 C* query() {
106 auto cap = capability<C>();
107 return cap ? &cap->get() : nullptr;
108 }
109 template <class C>
111 const C* query() const {
112 auto cap = capability<C>();
113 return cap ? &cap->get() : nullptr;
114 }
115};
141#if defined(_MSC_VER)
142// A target that inherits this base together with another editing interface that
143// also derives from IEditableTarget (IDomainOperationTarget, for example) receives
144// the three members below through dominance instead of declaring them itself, and
145// MSVC reports C4250 for each such member. That resolution is well-defined and is
146// the intent: these overrides are the final overriders, so every call through
147// IEditableTarget dispatches here. MSVC documents C4250 as informational, and it is
148// disabled at the single class that creates the pattern because MSVC reports it at
149// each derived class -- which lives in a header that includes this one, after this
150// point, so the suppression below covers them.
151#pragma warning(disable : 4250)
152#endif
154class EditableTargetState : public virtual IEditableTarget {
155public:
157 explicit EditableTargetState(Revision initial = 1) : revision_(initial) {}
158
160 [[nodiscard]] EditRegion dirtyRegion() const override { return dirty_; }
161
163 void clearDirtyRegion() override { dirty_ = {}; }
164
166 [[nodiscard]] std::uint64_t revision() const override { return revision_; }
167
169 [[nodiscard]] Revision revisionValue() const noexcept { return revision_; }
170
171protected:
173 void widenDirty(int x, int y) { dirty_.include(x, y); }
175 void widenDirty(const EditRegion& region) { dirty_.include(region); }
177 void widenDirty() { dirty_.include(0, 0); }
179 void bumpRevision() { ++revision_; }
181 void setRevision(Revision revision) { revision_ = revision; }
183 void setDirtyRegion(const EditRegion& region) { dirty_ = region; }
185 void markDirty(int x, int y) {
187 widenDirty(x, y);
189 bumpRevision();
190 }
192 void markDirty(const EditRegion& region) {
194 widenDirty(region);
196 bumpRevision();
197 }
199 void markDirty() {
201 widenDirty();
203 bumpRevision();
204 }
205
206private:
207 EditRegion dirty_;
208 Revision revision_;
209};
214public:
216 virtual ~IGridTarget() = default;
218 virtual int width() const = 0;
220 virtual int height() const = 0;
222 virtual bool containsCell(int, int) const = 0;
223};
225class IIntFieldTarget : public virtual IGridTarget {
226public:
228 static CapabilityId editingCapabilityId() { return CapabilityId("eve.editing.target.int-field.v1"); }
230 virtual int readInt(int, int) const = 0;
232 [[nodiscard]] virtual FieldWriteStatus writeInt(int, int, int) = 0;
233};
235class IScalarFieldTarget : public virtual IGridTarget {
236public:
238 static CapabilityId editingCapabilityId() { return CapabilityId("eve.editing.target.scalar-field.v1"); }
240 virtual float readScalar(int, int) const = 0;
242 [[nodiscard]] virtual FieldWriteStatus writeScalar(int, int, float) = 0;
244 virtual float sampleScalar(float, float) const = 0;
245};
248public:
250 virtual ~IEditingSnapshotProvider() = default;
252 static CapabilityId editingCapabilityId() { return CapabilityId("eve.editing.target.snapshot.v1"); }
254 [[nodiscard]] virtual Value snapshotValue() const = 0;
255};
256} // namespace eve::editing
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
Vocabulary aliases for nullable and checked borrowed references.
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
Dirty region and revision shared by every editable document target.
void setRevision(Revision revision)
Adopt a revision observed elsewhere, without advancing it.
void bumpRevision()
Advance the revision without touching the dirty region.
void widenDirty(const EditRegion &region)
Widen the dirty region without advancing the revision.
EditRegion dirtyRegion() const override
Return the accumulated dirty region.
void markDirty(int x, int y)
Include one cell in the dirty region and advance the revision.
void clearDirtyRegion() override
Discard the dirty region; the revision does not change.
void markDirty()
Mark an unknown area dirty and advance the revision.
EditableTargetState(Revision initial=1)
Constructs the shared state with an explicit initial revision.
void setDirtyRegion(const EditRegion &region)
Replace the dirty region wholesale, without advancing the revision.
Revision revisionValue() const noexcept
Return the revision as the shared protocol revision type.
void widenDirty(int x, int y)
Widen the dirty region without advancing the revision.
std::uint64_t revision() const override
Return the current revision.
void markDirty(const EditRegion &region)
Include a whole region and advance the revision.
void widenDirty()
Mark an unknown area dirty without advancing the revision.
IEditableTarget public API.
virtual TargetId targetId() const =0
Target id.
eve::OptionalRef< C > capability()
Query a capability through its interface-owned stable identity.
virtual void * queryCapability(const CapabilityId &capability)
Query an optional stable capability.
const C * query() const
Queries query.
eve::OptionalRef< const C > capability() const
Capability.
virtual void clearDirtyRegion()=0
Clears dirty region.
virtual EditRegion dirtyRegion() const =0
Dirty region.
virtual ~IEditableTarget()=default
Releases IEditableTarget resources.
virtual std::uint64_t revision() const =0
Revision.
virtual TargetDescriptor describe() const
Describe the target for tools and automation.
Optional capability exposing a deterministic, persistence-safe editing snapshot.
static CapabilityId editingCapabilityId()
Stable capability identity shared by every editable domain target.
virtual Value snapshotValue() const =0
Capture the target without exposing mutable runtime storage.
virtual ~IEditingSnapshotProvider()=default
Releases IEditingSnapshotProvider resources.
IGridTarget public API.
virtual int width() const =0
Width.
virtual bool containsCell(int, int) const =0
True if cell.
virtual ~IGridTarget()=default
Releases IGridTarget resources.
virtual int height() const =0
Height.
IIntFieldTarget public API.
static CapabilityId editingCapabilityId()
Editing capability id.
virtual int readInt(int, int) const =0
Reads int.
virtual FieldWriteStatus writeInt(int, int, int)=0
Writes int.
IScalarFieldTarget public API.
virtual float readScalar(int, int) const =0
Reads scalar.
virtual FieldWriteStatus writeScalar(int, int, float)=0
Writes scalar.
virtual float sampleScalar(float, float) const =0
Sample scalar.
static CapabilityId editingCapabilityId()
Editing capability id.
Deterministic owning value tree shared by authoring hosts.
std::uint64_t Revision
FieldWriteStatus
FieldWriteStatus public API.
StrongId< CapabilityIdTag > CapabilityId
Definition EditingIds.h:61
std::optional< std::reference_wrapper< T > > OptionalRef
Optional borrowed reference; it does not extend T's lifetime.
Definition BorrowedRef.h:24
EditRegion public API.
bool empty() const
Empty.
void include(int x, int y)
Include.
void include(const EditRegion &o)
Include.
void clear()
Clears clear.
Stable discovery metadata exposed by every editable target.
std::vector< CapabilityId > capabilities