Go to the documentation of this file.
1 #ifndef DNAI_INTERFACES_ILOADINGCLASS_H
2 #define DNAI_INTERFACES_ILOADINGCLASS_H
3 
4 #include <queue>
5 #include <map>
6 #include <functional>
7 
8 namespace dnai {
9 class App;
10  namespace interfaces {
15  {
16  public:
20  enum Status {
21  UNDEFINED = 0,
24  };
25 
30  float statusPercent() const
31  {
32  return m_statusPercent;
33  }
34 
39  Status status() const
40  {
41  return m_status;
42  }
43 
48  void registerBeforeStart(const std::function<void()>& func)
49  {
51  }
56  void registerReady(const std::function<void()>& func)
57  {
58  m_registeredEvents[Status::READY].push(func);
59  }
64  void registerUpdateStatus(const std::function<void(float)>& func)
65  {
66  m_registeredEvents[Status::RUNNING].emplace(std::bind(func, std::bind(&ILoadingClass::statusPercent, this)));
67  }
68 
69  protected:
71  {
72  }
77  virtual std::queue<std::function<void()>> init() = 0;
78 
82  void execAllEvent()
83  {
84  auto events = m_registeredEvents[m_status];
85  while (!events.empty())
86  {
87  events.back()();
88  events.pop();
89  }
90  }
91 
92  public:
93  virtual ~ILoadingClass() = default;
94 
98  void load()
99  {
100  auto funcs = init();
101  const auto count = funcs.size();
102  auto i = 0.f;
103  execAllEvent();
104  m_status = Status::RUNNING;
105  execAllEvent();
106  while (!funcs.empty())
107  {
108  funcs.front()();
109  funcs.pop();
110  ++i;
111  m_statusPercent = i / count;
112  execAllEvent();
113  }
114  m_status = Status::READY;
115  execAllEvent();
116  }
117 
118  private:
121  std::map<Status, std::queue<std::function<void()>>> m_registeredEvents;
122  };
123  }
124 }
125 
126 
127 #endif // ILOADINGCLASS_H
Status m_status
Definition: iloadingclass.h:120
You can use this class in order to display the loading status or call a callback before, after each step or/and after all step.
Definition: iloadingclass.h:14
Status status() const
Return the current status.
Definition: iloadingclass.h:39
Definition: iloadingclass.h:23
float statusPercent() const
Return the current status in percentage.
Definition: iloadingclass.h:30
ILoadingClass()
Definition: iloadingclass.h:70
void registerBeforeStart(const std::function< void()> &func)
Register a callback wich will be called before starting loading.
Definition: iloadingclass.h:48
std::map< Status, std::queue< std::function< void()> > > m_registeredEvents
Definition: iloadingclass.h:121
Definition: guitype.h:14
virtual ~ILoadingClass()=default
void execAllEvent()
Execute all register callback of the current state.
Definition: iloadingclass.h:82
Definition: api.h:13
void registerUpdateStatus(const std::function< void(float)> &func)
Register a callback wich will be called each step of the loading. This function pass loading percenta...
Definition: iloadingclass.h:64
void load()
Call this function in order to load the current object.
Definition: iloadingclass.h:98
void registerReady(const std::function< void()> &func)
Register a callback wich will be called after object was loaded.
Definition: iloadingclass.h:56
Status
Possible status of ILoading class.
Definition: iloadingclass.h:20
float m_statusPercent
Definition: iloadingclass.h:119
Definition: iloadingclass.h:22
virtual std::queue< std::function< void()> > init()=0
You need to implement this function in order to define the loading steps.
Definition: iloadingclass.h:21