3 #include "Component.hpp"
9 class ScheduleComponent;
24 virtual void setContent(
const QByteArray& slotName, std::shared_ptr<ContentNode> content);
31 virtual void removeContent(
const QByteArray& slotName, std::shared_ptr<ContentNode> content);
37 virtual void contentNodeFound(std::shared_ptr<ContentNode> node,
38 std::shared_ptr<ContentNode> parent=
nullptr);
43 virtual void contentNodeLost(std::shared_ptr<ContentNode> node,
44 std::shared_ptr<ContentNode> parent=
nullptr);
50 virtual void contentNodeLostProperty(std::shared_ptr<ContentNode> contentNode,
51 const Property& prop);
56 virtual void contentNodeReceivedProperty(std::shared_ptr<ContentNode> contentNode,
57 const Property& prop);
63 virtual void componentAddedToSlot(
const QByteArray& slotName,
64 std::shared_ptr<Component> comp);
69 virtual void componentRemovedFromSlot(
const QByteArray& slotName,
70 std::shared_ptr<Component> comp);
76 typedef std::shared_ptr<UIComponentInstance> UIComponentInstancePtr;
81 typedef std::unordered_map<Slot, std::vector<std::shared_ptr<UIComponent>>, Slot::Hasher> SlotAssignments;
95 std::vector<std::shared_ptr<UIComponent>> assignments(
const QByteArray& slot)
const;
100 const Slots& componentSlots()
const;
105 const std::unordered_set<QByteArray>& roles()
const;
109 QByteArray subtype()
const;
116 UIComponentInstancePtr createInstance(
const QByteArray& role);
121 void assignToSlot(
const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
127 void componentAddedToSlot(
const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
132 void componentRemovedFromSlot(
const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
138 bool slotsFulfilled(
const std::unique_lock<std::mutex>& lock=std::unique_lock<std::mutex>())
const;
144 void setOnSlotsFulfilled(std::function<
void(
void)>&& f);
148 void setOnSlotsUnfulfilled(std::function<
void(
void)>&& f);
152 void removeFromSlots(
const NodeId&
id);
157 void initializeContentSlot(
const Slot& slot,
const Property& property);
161 void removeContentSlot(
const Slot& slot);
166 bool enabled()
const;
169 void setEnabled(
bool enabled);
173 bool acceptContentProperty(
const PropertyKey& key)
const;
175 virtual void placeholderStatusChanged(
const NodeId &
id)
override;
176 virtual void initPlaceholder(ComponentPlaceholderPtr placeholder)
override;
177 void assignSlotsToInstance(UIComponentInstancePtr instance);
180 virtual void propertyReceived(
const Property &property)
override;
181 virtual void propertyLost(
const Property& property)
override;
185 virtual void contentNodeReceivedProperty(std::shared_ptr<ContentNode> node,
const Property& prop,
186 bool eventWasPending =
false);
187 virtual void contentNodeLostProperty(std::shared_ptr<ContentNode> node,
const Property& prop,
188 bool eventWasPending =
false);
192 virtual void contentNodeFound(std::shared_ptr<ContentNode> node,
193 std::shared_ptr<ContentNode> parent=
nullptr,
194 bool eventWasPending =
false);
195 virtual void contentNodeLost(std::shared_ptr<ContentNode> node,
196 std::shared_ptr<ContentNode> parent=
nullptr,
197 bool eventWasPending =
false);
199 virtual ComponentInstancePtr instanceImpl()
override;
203 enum class ContentEventType
213 std::shared_ptr<ContentNode> node;
214 std::shared_ptr<ContentNode> parent;
216 ContentEventType type;
219 void contentComplete(
const QByteArray & slotName);
220 void contentIncomplete(
const QByteArray & slotName);
222 void checkSlotsFulfilled();
224 void setContentToInstance(UIComponentInstancePtr instance,
225 const QByteArray & slotName,
226 std::shared_ptr<ContentNode> node);
227 void addContentNodeChildren(UIComponentInstancePtr instance,
228 std::shared_ptr<ContentNode> node);
230 void handlePendingEvents();
231 void queueEvent(ContentEvent event);
233 void scheduleComponentAdded(
const QByteArray & slotName,
234 std::shared_ptr<ScheduleComponent> comp);
236 mutable std::mutex m_slotMutex;
237 SlotAssignments m_slots;
239 std::mutex m_contentSlotMutex;
241 typedef std::unordered_map<Slot, std::shared_ptr<ContentNode>, Slot::Hasher> ContentSlots;
242 ContentSlots m_contentSlots;
244 bool m_slotsFulfilledCalled =
false;
245 bool m_slotsUnfulfilledCalled =
false;
247 std::function<void(void)> m_onSlotsFulfilled;
248 std::function<void(void)> m_onSlotsUnfulfilled;
250 std::atomic<bool> m_settingContent;
251 std::mutex m_contentEventMutex;
252 std::queue<ContentEvent> m_pendingEvents;
254 std::atomic<bool> m_enabled;
258 typedef std::shared_ptr<UIComponent> UIComponentPtr;
259 typedef std::weak_ptr<UIComponent> UIComponentWeakPtr;