MT Showcase SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
UIComponent.hpp
1 #pragma once
2 
3 #include "Component.hpp"
4 
5 namespace Showcase
6 {
7 
8  class ContentNode;
9  class ScheduleComponent;
10 
12  class SHOWCASE_API UIComponentInstance : public ComponentInstance
13  {
14  public:
17  UIComponentInstance(std::shared_ptr<Component> component);
18 
24  virtual void setContent(const QByteArray& slotName, std::shared_ptr<ContentNode> content);
25 
31  virtual void removeContent(const QByteArray& slotName, std::shared_ptr<ContentNode> content);
32 
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);
45 
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);
58 
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);
71 
72  protected:
73  virtual void removeInstance() override {}
74 
75  };
76  typedef std::shared_ptr<UIComponentInstance> UIComponentInstancePtr;
77 
78  //------------------------------------------------------------------------
79 
80  class UIComponent;
81  typedef std::unordered_map<Slot, std::vector<std::shared_ptr<UIComponent>>, Slot::Hasher> SlotAssignments;
82 
84  class SHOWCASE_API UIComponent : public Component
85  {
86  public:
89  UIComponent(CachedGraphPtr uiGraph=nullptr);
90  virtual ~UIComponent();
91 
95  std::vector<std::shared_ptr<UIComponent>> assignments(const QByteArray& slot) const;
96 
100  const Slots& componentSlots() const;
101 
105  const std::unordered_set<QByteArray>& roles() const;
106 
109  QByteArray subtype() const;
110 
116  UIComponentInstancePtr createInstance(const QByteArray& role);
117 
121  void assignToSlot(const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
122 
127  void componentAddedToSlot(const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
132  void componentRemovedFromSlot(const QByteArray& slotName, std::shared_ptr<UIComponent> comp);
133 
138  bool slotsFulfilled(const std::unique_lock<std::mutex>& lock=std::unique_lock<std::mutex>()) const;
139 
144  void setOnSlotsFulfilled(std::function<void(void)>&& f);
148  void setOnSlotsUnfulfilled(std::function<void(void)>&& f);
149 
152  void removeFromSlots(const NodeId& id);
153 
157  void initializeContentSlot(const Slot& slot, const Property& property);
158 
161  void removeContentSlot(const Slot& slot);
162 
166  bool enabled() const;
169  void setEnabled(bool enabled);
170 
171  protected:
173  bool acceptContentProperty(const PropertyKey& key) const;
174 
175  virtual void placeholderStatusChanged(const NodeId &id) override;
176  virtual void initPlaceholder(ComponentPlaceholderPtr placeholder) override;
177  void assignSlotsToInstance(UIComponentInstancePtr instance);
178 
180  virtual void propertyReceived(const Property &property) override;
181  virtual void propertyLost(const Property& property) override;
182 
183 
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);
189 
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);
198 
199  virtual ComponentInstancePtr instanceImpl() override;
200 
201 
202  private:
203  enum class ContentEventType
204  {
205  NodeFound,
206  NodeLost,
207  PropertyFound,
208  PropertyLost
209  };
210 
211  struct ContentEvent
212  {
213  std::shared_ptr<ContentNode> node;
214  std::shared_ptr<ContentNode> parent;
215  Property prop;
216  ContentEventType type;
217  };
218 
219  void contentComplete(const QByteArray & slotName);
220  void contentIncomplete(const QByteArray & slotName);
221 
222  void checkSlotsFulfilled();
223 
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);
229 
230  void handlePendingEvents();
231  void queueEvent(ContentEvent event);
232 
233  void scheduleComponentAdded(const QByteArray & slotName,
234  std::shared_ptr<ScheduleComponent> comp);
235 
236  mutable std::mutex m_slotMutex;
237  SlotAssignments m_slots;
238 
239  std::mutex m_contentSlotMutex;
241  typedef std::unordered_map<Slot, std::shared_ptr<ContentNode>, Slot::Hasher> ContentSlots;
242  ContentSlots m_contentSlots;
243 
244  bool m_slotsFulfilledCalled = false;
245  bool m_slotsUnfulfilledCalled = false;
246 
247  std::function<void(void)> m_onSlotsFulfilled;
248  std::function<void(void)> m_onSlotsUnfulfilled;
249 
250  std::atomic<bool> m_settingContent;
251  std::mutex m_contentEventMutex;
252  std::queue<ContentEvent> m_pendingEvents;
253 
254  std::atomic<bool> m_enabled;
255 
256  friend class ContentNode;
257  };
258  typedef std::shared_ptr<UIComponent> UIComponentPtr;
259  typedef std::weak_ptr<UIComponent> UIComponentWeakPtr;
260 
261 }