Add generic time constraint to macro conditions

Almost every macro condition can benefit from having the option to
specify a time constraint.
Instead of adding it to each condition separately add it to all
conditions with the option of excluding it when registering a new
condition type.
This commit is contained in:
WarmUpTill
2021-05-28 22:55:29 +02:00
committed by WarmUpTill
parent d9997d374d
commit 326cc0c46f
21 changed files with 274 additions and 203 deletions

View File

@@ -53,3 +53,53 @@ private:
double _unitMultiplier;
};
enum class DurationCondition {
NONE,
MORE,
EQUAL,
LESS,
};
class DurationConstraint {
public:
void Save(obs_data_t *obj, const char *condName = "time_constraint",
const char *secondsName = "seconds",
const char *unitName = "displayUnit");
void Load(obs_data_t *obj, const char *condName = "time_constraint",
const char *secondsName = "seconds",
const char *unitName = "displayUnit");
void SetCondition(DurationCondition cond) { _type = cond; }
void SetDuration(const Duration &dur) { _dur = dur; }
void SetValue(double value) { _dur.seconds = value; }
void SetUnit(DurationUnit u) { _dur.displayUnit = u; }
DurationCondition GetCondition() { return _type; }
Duration GetDuration() { return _dur; }
bool DurationReached();
void Reset();
private:
DurationCondition _type = DurationCondition::NONE;
Duration _dur;
bool _timeReached = false;
};
class DurationConstraintEdit : public QWidget {
Q_OBJECT
public:
DurationConstraintEdit(QWidget *parent = nullptr);
void SetValue(DurationConstraint &value);
void SetUnit(DurationUnit u);
void SetDuration(const Duration &d);
private slots:
void _ConditionChanged(int value);
signals:
void DurationChanged(double value);
void UnitChanged(DurationUnit u);
void ConditionChanged(DurationCondition value);
private:
DurationSelection *_duration;
QComboBox *_condition;
};

View File

@@ -6,8 +6,6 @@
#include <QComboBox>
#include <chrono>
#include "duration-control.hpp"
enum class AudioCondition {
ABOVE,
BELOW,
@@ -33,7 +31,6 @@ public:
OBSWeakSource _audioSource;
int _volume = 0;
AudioCondition _condition = AudioCondition::ABOVE;
Duration _duration;
obs_volmeter_t *_volmeter = nullptr;
private:
@@ -63,13 +60,11 @@ private slots:
void SourceChanged(const QString &text);
void VolumeThresholdChanged(int vol);
void ConditionChanged(int cond);
void DurationChanged(double seconds);
protected:
QComboBox *_audioSources;
QComboBox *_condition;
QSpinBox *_volume;
DurationSelection *_duration;
VolControl *_volMeter = nullptr;
std::shared_ptr<MacroConditionAudio> _entryData;

View File

@@ -15,6 +15,7 @@ struct MacroConditionInfo {
TCreateMethod _createFunc;
TCreateWidgetMethod _createWidgetFunc;
std::string _name;
bool _useDurationConstraint = true;
};
class MacroConditionFactory {
@@ -27,6 +28,7 @@ public:
static auto GetConditionTypes() { return _methods; }
static std::string GetConditionName(const std::string &);
static std::string GetIdByName(const QString &name);
static bool UsesDurationConstraint(const std::string &id);
private:
static std::map<std::string, MacroConditionInfo> _methods;
@@ -46,11 +48,15 @@ public:
private slots:
void LogicSelectionChanged(int idx);
void ConditionSelectionChanged(const QString &text);
void DurationChanged(double seconds);
void DurationConditionChanged(DurationCondition cond);
void DurationUnitChanged(DurationUnit unit);
protected:
QComboBox *_logicSelection;
QComboBox *_conditionSelection;
Section *_section;
DurationConstraintEdit *_dur;
std::shared_ptr<MacroCondition> *_entryData;

View File

@@ -1,8 +1,9 @@
#pragma once
#include "macro.hpp"
#include "duration-control.hpp"
#include <QWidget>
#include <QComboBox>
#include "duration-control.hpp"
class MacroConditionIdle : public MacroCondition {
public:

View File

@@ -2,7 +2,6 @@
#include "macro.hpp"
#include <QWidget>
#include <QComboBox>
#include "duration-control.hpp"
enum class RecordState {
STOP,
@@ -22,7 +21,6 @@ public:
}
RecordState _recordState;
Duration _duration;
private:
static bool _registered;
@@ -47,12 +45,9 @@ public:
private slots:
void StateChanged(int value);
void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
protected:
QComboBox *_recordState;
DurationSelection *_duration;
std::shared_ptr<MacroConditionRecord> _entryData;
private:

View File

@@ -2,7 +2,6 @@
#include "macro.hpp"
#include <QWidget>
#include <QComboBox>
#include "duration-control.hpp"
enum class SceneType {
CURRENT,
@@ -22,7 +21,6 @@ public:
OBSWeakSource _scene;
SceneType _type;
Duration _duration;
private:
static bool _registered;
@@ -48,13 +46,10 @@ public:
private slots:
void SceneChanged(const QString &text);
void TypeChanged(int value);
void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
protected:
QComboBox *_sceneSelection;
QComboBox *_sceneType;
DurationSelection *_duration;
std::shared_ptr<MacroConditionScene> _entryData;
private:

View File

@@ -2,7 +2,6 @@
#include "macro.hpp"
#include <QWidget>
#include <QComboBox>
#include "duration-control.hpp"
enum class StreamState {
STOP,
@@ -21,7 +20,6 @@ public:
}
StreamState _streamState;
Duration _duration;
private:
static bool _registered;
@@ -46,12 +44,9 @@ public:
private slots:
void StateChanged(int value);
void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
protected:
QComboBox *_streamState;
DurationSelection *_duration;
std::shared_ptr<MacroConditionStream> _entryData;
private:

View File

@@ -1,10 +1,10 @@
#pragma once
#include "macro.hpp"
#include "screenshot-helper.hpp"
#include <QWidget>
#include <QComboBox>
#include <chrono>
#include "duration-control.hpp"
#include "screenshot-helper.hpp"
enum class VideoCondition {
MATCH,
@@ -30,7 +30,6 @@ public:
OBSWeakSource _videoSource;
VideoCondition _condition = VideoCondition::MATCH;
Duration _duration;
std::string _file = obs_module_text("AdvSceneSwitcher.enterPath");
private:
@@ -66,12 +65,9 @@ private slots:
void ConditionChanged(int cond);
void FilePathChanged();
void BrowseButtonClicked();
void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
protected:
QComboBox *_videoSelection;
DurationSelection *_duration;
QComboBox *_condition;
QLineEdit *_filePath;
QPushButton *_browseButton;

View File

@@ -1,4 +1,6 @@
#pragma once
#include "duration-control.hpp"
#include <string>
#include <deque>
#include <memory>
@@ -40,13 +42,22 @@ public:
virtual bool Save(obs_data_t *obj) = 0;
virtual bool Load(obs_data_t *obj) = 0;
virtual std::string GetId() = 0;
LogicType GetLogicType() { return _logic; }
void SetLogicType(LogicType logic) { _logic = logic; }
static const std::map<LogicType, LogicTypeInfo> logicTypes;
bool DurationReached() { return _duration.DurationReached(); }
void ResetDuration() { _duration.Reset(); }
DurationConstraint GetDurationConstraint() { return _duration; }
void SetDurationConstraint(const DurationConstraint &dur);
void SetDurationCondition(DurationCondition cond);
void SetDurationUnit(DurationUnit u);
void SetDuration(double seconds);
private:
LogicType _logic;
DurationConstraint _duration;
};
class MacroAction {