NAP
calendar.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "calendaritem.h"
9 
10 // External Includes
11 #include <nap/resource.h>
12 #include <nap/resourceptr.h>
13 #include <nap/core.h>
14 #include <nap/logger.h>
15 #include <nap/signalslot.h>
16 #include <mathutils.h>
17 
18 namespace nap
19 {
20  class CalendarInstance;
21  using CalendarItemList = std::vector<nap::ResourcePtr<CalendarItem>>;
22  constexpr const char* calendarDirectory = "calendar";
23 
30  class NAPAPI ICalendar : public Resource
31  {
32  RTTI_ENABLE(Resource)
33 
34  public:
35  // Constructor
36  ICalendar(nap::Core& core);
37 
41  virtual CalendarInstance& getInstance() = 0;
42 
46  virtual const CalendarInstance& getInstance() const = 0;
47 
48  protected:
50  };
51 
52 
54  // Calendar
56 
69  class NAPAPI Calendar : public ICalendar
70  {
71  RTTI_ENABLE(ICalendar)
72  public:
73  // Constructor
74  Calendar(nap::Core& core);
75 
76  // Destructor
77  virtual ~Calendar();
78 
83  virtual bool init(utility::ErrorState& errorState) override;
84 
88  CalendarInstance& getInstance() override { assert(mInstance != nullptr); return *mInstance; }
89 
93  const CalendarInstance& getInstance() const override { assert(mInstance != nullptr); return *mInstance; }
94 
96  bool mAllowFailure = true;
97 
98  private:
99  std::unique_ptr<CalendarInstance> mInstance = nullptr;
100  };
101 
102 
104  // Calendar runtime instance
106 
107  using OwnedCalendarItemList = std::vector<std::unique_ptr<CalendarItem>>;
108 
114  class NAPAPI CalendarInstance final
115  {
116  friend class Calendar;
117  RTTI_ENABLE()
118  public:
119  // Default constructor
120  CalendarInstance(nap::Core& core);
121 
122  // Calendar can't be copied
123  CalendarInstance(const CalendarInstance& rhs) = delete;
124  CalendarInstance& operator=(const CalendarInstance& rhs) = delete;
125 
135  bool init(const std::string& name, bool allowFailure, CalendarItemList defaultItems, utility::ErrorState& error);
136 
140  const std::string& getName() const { assert(!mName.empty()); return mName; }
141 
145  std::string getPath() const { assert(!mPath.empty()); return mPath; }
146 
150  const OwnedCalendarItemList& getItems() const { return mItems; }
151 
163  template<typename T>
164  void getItems(std::vector<T*>& outItems) const;
165 
173  void addItem(std::unique_ptr<CalendarItem> item);
174 
192  template<typename T, typename... Args>
193  T* addItem(Args&&... args);
194 
201  bool removeItem(const std::string& id);
202 
208  CalendarItem* findByID(const std::string& id);
209 
220  template<typename T>
221  T* findByID(const std::string& id) { return rtti_cast<T>(this->findByID(id)); }
222 
228  CalendarItem* findByTitle(const std::string& title);
229 
240  template<typename T>
241  T* findByTitle(const std::string& title) { return rtti_cast<T>(this->findByTitle(title)); }
242 
247  bool save(utility::ErrorState& error);
248 
251 
253  std::string mName;
254  std::string mPath;
256 
257  private:
262  bool load(utility::ErrorState& error);
263  };
264 
265 
267  // Template Definitions
269 
270  template<typename T, typename... Args>
272  {
273  // Construct using given (forwarded) arguments
274  assert(RTTI_OF(T).is_derived_from(RTTI_OF(nap::CalendarItem)));
275  std::unique_ptr<T> item = std::make_unique<T>(std::forward<Args>(args)...);
276 
277  // Initialize, on failure return and don't add as valid item
278  item->mID = math::generateUUID();
279  utility::ErrorState error;
280  if (!item->init(error))
281  {
282  nap::Logger::error(error.toString());
283  return nullptr;
284  }
285 
286  T* item_ptr = item.get();
287  mItems.emplace_back(std::move(item));
288  return item_ptr;
289  }
290 
291  template<typename T>
292  void nap::CalendarInstance::getItems(std::vector<T*>& outItems) const
293  {
294  outItems.clear();
295  for (const auto& item : mItems)
296  {
297  T* c_item = rtti_cast<T>(item.get());
298  if (c_item != nullptr)
299  {
300  outItems.emplace_back(c_item);
301  }
302  }
303  }
304 }
nap::Calendar
Definition: calendar.h:69
nap::CalendarInstance::mPath
std::string mPath
Path to calendar file on disk.
Definition: calendar.h:254
nap::ICalendar::mCore
nap::Core & mCore
NAP core.
Definition: calendar.h:49
nap::CalendarInstance::getItems
const OwnedCalendarItemList & getItems() const
Definition: calendar.h:150
nap::CalendarInstance::getPath
std::string getPath() const
Definition: calendar.h:145
nap::OwnedCalendarItemList
std::vector< std::unique_ptr< CalendarItem > > OwnedCalendarItemList
Definition: calendar.h:107
nap::math::generateUUID
std::string NAPAPI generateUUID()
nap::Calendar::mItems
CalendarItemList mItems
Property: 'Items' default set of calendar items.
Definition: calendar.h:95
nap::CalendarInstance::addItem
void addItem(std::unique_ptr< CalendarItem > item)
nap::utility::ErrorState
Definition: errorstate.h:19
nap::CalendarInstance::findByID
T * findByID(const std::string &id)
Definition: calendar.h:221
nap::CalendarInstance
Definition: calendar.h:114
nap::Calendar::getInstance
CalendarInstance & getInstance() override
Definition: calendar.h:88
nap::ICalendar
Definition: calendar.h:30
nap::Signal
Definition: signalslot.h:28
nap::CalendarInstance::mCore
nap::Core & mCore
NAP core.
Definition: calendar.h:255
nap::CalendarInstance::itemRemoved
Signal< const CalendarItem & > itemRemoved
Called when an item is about to be removed.
Definition: calendar.h:249
nap::Core
Definition: core.h:82
nap::CalendarItem
Definition: calendaritem.h:22
nap::CalendarInstance::mItems
OwnedCalendarItemList mItems
List of unique calendar items.
Definition: calendar.h:252
nap::Calendar::getInstance
const CalendarInstance & getInstance() const override
Definition: calendar.h:93
nap::calendarDirectory
constexpr const char * calendarDirectory
Directory where all calendars are stored.
Definition: calendar.h:22
nap
Definition: templateapp.h:17
nap::Resource
Definition: resource.h:19
nap::CalendarInstance::mName
std::string mName
Calendar name.
Definition: calendar.h:253
nap::CalendarItemList
std::vector< nap::ResourcePtr< CalendarItem > > CalendarItemList
Definition: calendar.h:21
nap::CalendarInstance::findByTitle
T * findByTitle(const std::string &title)
Definition: calendar.h:241
nap::CalendarInstance::itemAdded
Signal< const CalendarItem & > itemAdded
Called when an item is added.
Definition: calendar.h:250