Просмотр исходного кода

LibCore: Add CTimer::restart() and make set_interval() take effect soon.

Andreas Kling 6 лет назад
Родитель
Сommit
d73ed74d1c
2 измененных файлов с 23 добавлено и 1 удалено
  1. 14 0
      LibCore/CTimer.cpp
  2. 9 1
      LibCore/CTimer.h

+ 14 - 0
LibCore/CTimer.cpp

@@ -30,6 +30,13 @@ void CTimer::start(int interval)
     m_active = true;
 }
 
+void CTimer::restart(int interval)
+{
+    if (m_active)
+        stop();
+    start(interval);
+}
+
 void CTimer::stop()
 {
     if (!m_active)
@@ -42,6 +49,13 @@ void CTimer::timer_event(CTimerEvent&)
 {
     if (m_single_shot)
         stop();
+    else {
+        if (m_interval_dirty) {
+            stop();
+            start(m_interval);
+        }
+    }
+
     if (on_timeout)
         on_timeout();
 }

+ 9 - 1
LibCore/CTimer.h

@@ -11,11 +11,18 @@ public:
 
     void start();
     void start(int interval);
+    void restart(int interval);
     void stop();
 
     bool is_active() const { return m_active; }
     int interval() const { return m_interval; }
-    void set_interval(int interval) { m_interval = interval; }
+    void set_interval(int interval)
+    {
+        if (m_interval == interval)
+            return;
+        m_interval = interval;
+        m_interval_dirty = true;
+    }
 
     bool is_single_shot() const { return m_single_shot; }
     void set_single_shot(bool single_shot) { m_single_shot = single_shot; }
@@ -29,5 +36,6 @@ private:
 
     bool m_active { false };
     bool m_single_shot { false };
+    bool m_interval_dirty { false };
     int m_interval { 0 };
 };