From a66961eac1feb37e5955dfedb253ae6f7c4fbeb3 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 14 May 2021 22:23:32 +0200 Subject: [PATCH] Add macro condition "idle" --- CMakeLists.txt | 2 + data/locale/en-US.ini | 2 + src/headers/macro-condition-idle.hpp | 51 +++++++++++++++++ src/macro-condition-idle.cpp | 83 ++++++++++++++++++++++++++++ 4 files changed, 138 insertions(+) create mode 100644 src/headers/macro-condition-idle.hpp create mode 100644 src/macro-condition-idle.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 71a1ec6f..f80e9438 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,7 @@ set(advanced-scene-switcher_HEADERS src/headers/macro-condition-edit.hpp src/headers/macro-condition-audio.hpp src/headers/macro-condition-file.hpp + src/headers/macro-condition-idle.hpp src/headers/macro-condition-media.hpp src/headers/macro-condition-plugin-state.hpp src/headers/macro-condition-process.hpp @@ -146,6 +147,7 @@ set(advanced-scene-switcher_SOURCES src/macro-condition-edit.cpp src/macro-condition-audio.cpp src/macro-condition-file.cpp + src/macro-condition-idle.cpp src/macro-condition-media.cpp src/macro-condition-plugin-state.cpp src/macro-condition-process.cpp diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index aaa6ebf3..9524bfaa 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -117,6 +117,8 @@ AdvSceneSwitcher.condition.record.state.stop="Recording stopped" AdvSceneSwitcher.condition.record.entry="{{recordState}} for {{duration}}" AdvSceneSwitcher.condition.process="Process" AdvSceneSwitcher.condition.process.entry="{{processes}} is running {{focused}} and is focused" +AdvSceneSwitcher.condition.idle="Idle" +AdvSceneSwitcher.condition.idle.entry="No keyboard or mouse inputs for {{duration}}" AdvSceneSwitcher.condition.pluginState="Plugin state" AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Automated scene change was triggered in this interval" AdvSceneSwitcher.condition.pluginState.entry="{{condition}}" diff --git a/src/headers/macro-condition-idle.hpp b/src/headers/macro-condition-idle.hpp new file mode 100644 index 00000000..0f1a0e49 --- /dev/null +++ b/src/headers/macro-condition-idle.hpp @@ -0,0 +1,51 @@ +#pragma once +#include "macro.hpp" +#include +#include +#include "duration-control.hpp" + +class MacroConditionIdle : public MacroCondition { +public: + bool CheckCondition(); + bool Save(obs_data_t *obj); + bool Load(obs_data_t *obj); + int GetId() { return id; }; + static std::shared_ptr Create() + { + return std::make_shared(); + } + + Duration _duration; + +private: + static bool _registered; + static const int id; +}; + +class MacroConditionIdleEdit : public QWidget { + Q_OBJECT + +public: + MacroConditionIdleEdit( + QWidget *parent, + std::shared_ptr cond = nullptr); + void UpdateEntryData(); + static QWidget *Create(QWidget *parent, + std::shared_ptr cond) + { + return new MacroConditionIdleEdit( + parent, + std::dynamic_pointer_cast(cond)); + } + +private slots: + void DurationChanged(double seconds); + void DurationUnitChanged(DurationUnit unit); + +protected: + DurationSelection *_duration; + std::shared_ptr _entryData; + +private: + bool _loading = true; +}; diff --git a/src/macro-condition-idle.cpp b/src/macro-condition-idle.cpp new file mode 100644 index 00000000..533d62ea --- /dev/null +++ b/src/macro-condition-idle.cpp @@ -0,0 +1,83 @@ +#include "headers/macro-condition-edit.hpp" +#include "headers/macro-condition-idle.hpp" +#include "headers/utility.hpp" +#include "headers/advanced-scene-switcher.hpp" + +const int MacroConditionIdle::id = 10; + +bool MacroConditionIdle::_registered = MacroConditionFactory::Register( + MacroConditionIdle::id, + {MacroConditionIdle::Create, MacroConditionIdleEdit::Create, + "AdvSceneSwitcher.condition.idle"}); + +bool MacroConditionIdle::CheckCondition() +{ + return secondsSinceLastInput() >= _duration.seconds; +} + +bool MacroConditionIdle::Save(obs_data_t *obj) +{ + MacroCondition::Save(obj); + _duration.Save(obj); + return true; +} + +bool MacroConditionIdle::Load(obs_data_t *obj) +{ + MacroCondition::Load(obj); + _duration.Load(obj); + return true; +} + +MacroConditionIdleEdit::MacroConditionIdleEdit( + QWidget *parent, std::shared_ptr entryData) + : QWidget(parent) +{ + _duration = new DurationSelection(); + + QWidget::connect(_duration, SIGNAL(DurationChanged(double)), this, + SLOT(DurationChanged(double))); + QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this, + SLOT(DurationUnitChanged(DurationUnit))); + + QHBoxLayout *mainLayout = new QHBoxLayout; + std::unordered_map widgetPlaceholders = { + {"{{duration}}", _duration}, + }; + placeWidgets(obs_module_text("AdvSceneSwitcher.condition.idle.entry"), + mainLayout, widgetPlaceholders); + setLayout(mainLayout); + + _entryData = entryData; + UpdateEntryData(); + _loading = false; +} + +void MacroConditionIdleEdit::DurationChanged(double seconds) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_duration.seconds = seconds; +} + +void MacroConditionIdleEdit::DurationUnitChanged(DurationUnit unit) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_duration.displayUnit = unit; +} + +void MacroConditionIdleEdit::UpdateEntryData() +{ + if (!_entryData) { + return; + } + + _duration->SetDuration(_entryData->_duration); +}