diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 3a66afc4..57626229 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -97,6 +97,7 @@ AdvSceneSwitcher.actionQueueTab.queueAddButton.tooltip="Add new action queue" AdvSceneSwitcher.actionQueueTab.queueRemoveButton.tooltip="Remove selected action queues" AdvSceneSwitcher.actionQueueTab.name.header="Name" AdvSceneSwitcher.actionQueueTab.size.header="Size" +AdvSceneSwitcher.actionQueueTab.lastEmpty.header="Last empty" AdvSceneSwitcher.actionQueueTab.isRunning.header="Is running" AdvSceneSwitcher.actionQueueTab.runOnStartup.header="Run on startup" AdvSceneSwitcher.actionQueueTab.yes="Yes" diff --git a/lib/queue/action-queue-tab.cpp b/lib/queue/action-queue-tab.cpp index 8282c07d..31559c87 100644 --- a/lib/queue/action-queue-tab.cpp +++ b/lib/queue/action-queue-tab.cpp @@ -5,6 +5,7 @@ #include "plugin-state-helpers.hpp" #include "sync-helpers.hpp" #include "tab-helpers.hpp" +#include "time-helpers.hpp" #include "ui-helpers.hpp" #include @@ -55,6 +56,13 @@ void ActionQueueTable::Add() QString::fromStdString(newQueue->Name())); } +static double getSecondsSinceLastEmpty(ActionQueue *queue) +{ + const auto time = std::chrono::high_resolution_clock::now() - + queue->GetLastEmptyTime(); + return std::chrono::duration_cast(time).count(); +} + static QStringList getCellLabels(ActionQueue *queue, bool addName = true) { assert(queue); @@ -64,6 +72,7 @@ static QStringList getCellLabels(ActionQueue *queue, bool addName = true) result << QString::fromStdString(queue->Name()); } result << QString::number(queue->Size()) + << FormatRelativeTime(getSecondsSinceLastEmpty(queue)) << QString::fromStdString(obs_module_text( queue->IsRunning() ? "AdvSceneSwitcher.actionQueueTab.yes" @@ -199,6 +208,8 @@ ActionQueueTable::ActionQueueTable(QTabWidget *parent) "AdvSceneSwitcher.actionQueueTab.name.header") << obs_module_text( "AdvSceneSwitcher.actionQueueTab.size.header") + << obs_module_text( + "AdvSceneSwitcher.actionQueueTab.lastEmpty.header") << obs_module_text( "AdvSceneSwitcher.actionQueueTab.isRunning.header") << obs_module_text( diff --git a/lib/queue/action-queue.cpp b/lib/queue/action-queue.cpp index 9ee4576b..1a7faafc 100644 --- a/lib/queue/action-queue.cpp +++ b/lib/queue/action-queue.cpp @@ -26,7 +26,10 @@ void SetupActionQueues() done = true; } -ActionQueue::ActionQueue() : Item() {} +ActionQueue::ActionQueue() : Item() +{ + _lastEmpty = std::chrono::high_resolution_clock::now(); +} ActionQueue::~ActionQueue() { @@ -124,6 +127,14 @@ bool ActionQueue::IsEmpty() return _actions.empty(); } +ActionQueue::TimePoint ActionQueue::GetLastEmptyTime() +{ + if (IsEmpty()) { + _lastEmpty = std::chrono::high_resolution_clock::now(); + } + return _lastEmpty; +} + size_t ActionQueue::Size() { std::lock_guard lock(_mutex); @@ -137,6 +148,8 @@ void ActionQueue::RunActions() { // Grab next action to run std::unique_lock lock(_mutex); while (_actions.empty() && !_stop) { + _lastEmpty = + std::chrono::high_resolution_clock::now(); _cv.wait(lock); } diff --git a/lib/queue/action-queue.hpp b/lib/queue/action-queue.hpp index 1ac735d5..7c54ae1c 100644 --- a/lib/queue/action-queue.hpp +++ b/lib/queue/action-queue.hpp @@ -2,11 +2,12 @@ #include "item-selection-helpers.hpp" #include "macro-action.hpp" +#include +#include #include #include #include #include -#include namespace advss { @@ -14,6 +15,8 @@ class ActionQueueSelection; class ActionQueueSettingsDialog; class ActionQueue : public Item { + using TimePoint = std::chrono::high_resolution_clock::time_point; + public: ActionQueue(); ~ActionQueue(); @@ -30,6 +33,7 @@ public: void Clear(); bool IsEmpty(); + TimePoint GetLastEmptyTime(); void Add(const std::shared_ptr &); size_t Size(); @@ -44,6 +48,7 @@ private: std::condition_variable _cv; std::thread _thread; std::deque> _actions; + TimePoint _lastEmpty; friend ActionQueueSelection; friend ActionQueueSettingsDialog;