mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-09-07 00:56:00 -05:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2af0735a2f | ||
|
|
556943c293 | ||
|
|
e3004184c4 | ||
|
|
7b2c2e91db | ||
|
|
06ea7bf1d9 |
@@ -185,8 +185,12 @@ AdvSceneSwitcher.condition.replay.state.started="Replay buffer started"
|
|||||||
AdvSceneSwitcher.condition.replay.state.saved="Replay buffer saved"
|
AdvSceneSwitcher.condition.replay.state.saved="Replay buffer saved"
|
||||||
AdvSceneSwitcher.condition.replay.entry="{{state}}"
|
AdvSceneSwitcher.condition.replay.entry="{{state}}"
|
||||||
AdvSceneSwitcher.condition.date="Date"
|
AdvSceneSwitcher.condition.date="Date"
|
||||||
AdvSceneSwitcher.condition.date.entry.line1="{{dateTime}} {{ignoreDate}} Ignore date selection {{ignoreTime}} Ignore time selection"
|
AdvSceneSwitcher.condition.date.state.at="At"
|
||||||
AdvSceneSwitcher.condition.date.entry.line2="{{repeat}} Repeat every {{duration}}"
|
AdvSceneSwitcher.condition.date.state.after="After"
|
||||||
|
AdvSceneSwitcher.condition.date.state.before="Before"
|
||||||
|
AdvSceneSwitcher.condition.date.state.between="Between"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.line1="{{condition}} {{dateTime}} {{dateTime2}} {{ignoreDate}} Ignore date component {{ignoreTime}} Ignore time component"
|
||||||
|
AdvSceneSwitcher.condition.date.entry.line2="{{repeat}} Reschedule {{duration}} later when matching"
|
||||||
|
|
||||||
; Macro Actions
|
; Macro Actions
|
||||||
AdvSceneSwitcher.action.switchScene="Switch scene"
|
AdvSceneSwitcher.action.switchScene="Switch scene"
|
||||||
|
|||||||
@@ -424,8 +424,9 @@ void SwitcherData::Stop()
|
|||||||
{
|
{
|
||||||
if (th && th->isRunning()) {
|
if (th && th->isRunning()) {
|
||||||
stop = true;
|
stop = true;
|
||||||
transitionCv.notify_one();
|
|
||||||
cv.notify_one();
|
cv.notify_one();
|
||||||
|
abortMacroWait = true;
|
||||||
|
macroWaitCv.notify_one();
|
||||||
th->wait();
|
th->wait();
|
||||||
delete th;
|
delete th;
|
||||||
th = nullptr;
|
th = nullptr;
|
||||||
|
|||||||
@@ -4,6 +4,14 @@
|
|||||||
|
|
||||||
#include <QCheckBox>
|
#include <QCheckBox>
|
||||||
#include <QDateTimeEdit>
|
#include <QDateTimeEdit>
|
||||||
|
#include <QComboBox>
|
||||||
|
|
||||||
|
enum class DateCondition {
|
||||||
|
AT,
|
||||||
|
AFTER,
|
||||||
|
BEFORE,
|
||||||
|
BETWEEN,
|
||||||
|
};
|
||||||
|
|
||||||
class MacroConditionDate : public MacroCondition {
|
class MacroConditionDate : public MacroCondition {
|
||||||
public:
|
public:
|
||||||
@@ -18,10 +26,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
QDateTime _dateTime;
|
QDateTime _dateTime;
|
||||||
|
QDateTime _dateTime2;
|
||||||
bool _ignoreDate = false;
|
bool _ignoreDate = false;
|
||||||
bool _ignoreTime = false;
|
bool _ignoreTime = false;
|
||||||
bool _repeat = false;
|
bool _repeat = false;
|
||||||
Duration _duration;
|
Duration _duration;
|
||||||
|
DateCondition _condition = DateCondition::AT;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool _registered;
|
static bool _registered;
|
||||||
@@ -45,7 +55,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
void ConditionChanged(int cond);
|
||||||
void DateTimeChanged(const QDateTime &datetime);
|
void DateTimeChanged(const QDateTime &datetime);
|
||||||
|
void DateTime2Changed(const QDateTime &datetime);
|
||||||
void IgnoreDateChanged(int state);
|
void IgnoreDateChanged(int state);
|
||||||
void IgnoreTimeChanged(int state);
|
void IgnoreTimeChanged(int state);
|
||||||
void RepeatChanged(int state);
|
void RepeatChanged(int state);
|
||||||
@@ -55,7 +67,9 @@ signals:
|
|||||||
void HeaderInfoChanged(const QString &);
|
void HeaderInfoChanged(const QString &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
QComboBox *_condition;
|
||||||
QDateTimeEdit *_dateTime;
|
QDateTimeEdit *_dateTime;
|
||||||
|
QDateTimeEdit *_dateTime2;
|
||||||
QCheckBox *_ignoreDate;
|
QCheckBox *_ignoreDate;
|
||||||
QCheckBox *_ignoreTime;
|
QCheckBox *_ignoreTime;
|
||||||
QCheckBox *_repeat;
|
QCheckBox *_repeat;
|
||||||
@@ -63,5 +77,6 @@ protected:
|
|||||||
std::shared_ptr<MacroConditionDate> _entryData;
|
std::shared_ptr<MacroConditionDate> _entryData;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void ShowSecondDateSelection(bool visible);
|
||||||
bool _loading = true;
|
bool _loading = true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ struct SwitcherData {
|
|||||||
std::mutex m;
|
std::mutex m;
|
||||||
bool transitionActive = false;
|
bool transitionActive = false;
|
||||||
bool waitForTransition = false;
|
bool waitForTransition = false;
|
||||||
std::condition_variable transitionCv;
|
|
||||||
bool stop = false;
|
bool stop = false;
|
||||||
bool verbose = false;
|
bool verbose = false;
|
||||||
bool disableHints = false;
|
bool disableHints = false;
|
||||||
@@ -92,6 +91,8 @@ struct SwitcherData {
|
|||||||
std::chrono::high_resolution_clock::time_point lastMatchTime;
|
std::chrono::high_resolution_clock::time_point lastMatchTime;
|
||||||
|
|
||||||
std::deque<Macro> macros;
|
std::deque<Macro> macros;
|
||||||
|
std::condition_variable macroWaitCv;
|
||||||
|
std::atomic_bool abortMacroWait = {false};
|
||||||
bool macroSceneSwitched = false;
|
bool macroSceneSwitched = false;
|
||||||
bool replayBufferSaved = false;
|
bool replayBufferSaved = false;
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ bool compareSourceSettings(const OBSWeakSource &source,
|
|||||||
std::vector<obs_scene_item *> getSceneItemsWithName(OBSScene scene,
|
std::vector<obs_scene_item *> getSceneItemsWithName(OBSScene scene,
|
||||||
std::string &name);
|
std::string &name);
|
||||||
std::string getDataFilePath(const std::string &file);
|
std::string getDataFilePath(const std::string &file);
|
||||||
QString fromatJsonString(std::string);
|
QString formatJsonString(std::string);
|
||||||
QString fromatJsonString(const char *);
|
QString formatJsonString(const char *);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populate layout with labels and widgets based on provided text
|
* Populate layout with labels and widgets based on provided text
|
||||||
|
|||||||
@@ -174,6 +174,8 @@ void AdvSceneSwitcher::RemoveMacroAction(int idx)
|
|||||||
|
|
||||||
std::lock_guard<std::mutex> lock(switcher->m);
|
std::lock_guard<std::mutex> lock(switcher->m);
|
||||||
macro->Actions().erase(macro->Actions().begin() + idx);
|
macro->Actions().erase(macro->Actions().begin() + idx);
|
||||||
|
switcher->abortMacroWait = true;
|
||||||
|
switcher->macroWaitCv.notify_one();
|
||||||
macro->UpdateActionIndices();
|
macro->UpdateActionIndices();
|
||||||
|
|
||||||
// All entry pointers in existing edit widgets after the new entry will
|
// All entry pointers in existing edit widgets after the new entry will
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ void MacroActionFilterEdit::GetSettingsClicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_settings->setPlainText(
|
_settings->setPlainText(
|
||||||
fromatJsonString(getSourceSettings(_entryData->_filter)));
|
formatJsonString(getSourceSettings(_entryData->_filter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionFilterEdit::SettingsChanged()
|
void MacroActionFilterEdit::SettingsChanged()
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ void MacroActionSceneTransformEdit::UpdateEntryData()
|
|||||||
GetWeakSourceName(_entryData->_source).c_str());
|
GetWeakSourceName(_entryData->_source).c_str());
|
||||||
if (_entryData->_source) {
|
if (_entryData->_source) {
|
||||||
_settings->setPlainText(
|
_settings->setPlainText(
|
||||||
fromatJsonString(_entryData->GetSettings()));
|
formatJsonString(_entryData->GetSettings()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ void MacroActionSceneTransformEdit::GetSettingsClicked()
|
|||||||
auto data = obs_data_create();
|
auto data = obs_data_create();
|
||||||
save_transform_state(data, info, crop);
|
save_transform_state(data, info, crop);
|
||||||
auto json = obs_data_get_json(data);
|
auto json = obs_data_get_json(data);
|
||||||
_settings->setPlainText(fromatJsonString(json));
|
_settings->setPlainText(formatJsonString(json));
|
||||||
obs_data_release(data);
|
obs_data_release(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ void MacroActionSourceEdit::GetSettingsClicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_settings->setPlainText(
|
_settings->setPlainText(
|
||||||
fromatJsonString(getSourceSettings(_entryData->_source)));
|
formatJsonString(getSourceSettings(_entryData->_source)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroActionSourceEdit::SettingsChanged()
|
void MacroActionSourceEdit::SettingsChanged()
|
||||||
|
|||||||
@@ -38,10 +38,12 @@ bool MacroActionWait::PerformAction()
|
|||||||
sleep_duration);
|
sleep_duration);
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lock(switcher->m);
|
std::unique_lock<std::mutex> lock(switcher->m);
|
||||||
auto r = switcher->cv.wait_for(
|
switcher->abortMacroWait = false;
|
||||||
|
switcher->macroWaitCv.wait_for(
|
||||||
lock,
|
lock,
|
||||||
std::chrono::milliseconds((long long)(sleep_duration * 1000)));
|
std::chrono::milliseconds((long long)(sleep_duration * 1000)),
|
||||||
return r == std::cv_status::timeout;
|
[] { return switcher->abortMacroWait.load(); });
|
||||||
|
return !switcher->abortMacroWait;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroActionWait::Save(obs_data_t *obj)
|
bool MacroActionWait::Save(obs_data_t *obj)
|
||||||
|
|||||||
@@ -10,21 +10,52 @@ bool MacroConditionDate::_registered = MacroConditionFactory::Register(
|
|||||||
{MacroConditionDate::Create, MacroConditionDateEdit::Create,
|
{MacroConditionDate::Create, MacroConditionDateEdit::Create,
|
||||||
"AdvSceneSwitcher.condition.date", false});
|
"AdvSceneSwitcher.condition.date", false});
|
||||||
|
|
||||||
|
static std::map<DateCondition, std::string> dateConditionTypes = {
|
||||||
|
{DateCondition::AT, "AdvSceneSwitcher.condition.date.state.at"},
|
||||||
|
{DateCondition::AFTER, "AdvSceneSwitcher.condition.date.state.after"},
|
||||||
|
{DateCondition::BEFORE, "AdvSceneSwitcher.condition.date.state.before"},
|
||||||
|
{DateCondition::BETWEEN,
|
||||||
|
"AdvSceneSwitcher.condition.date.state.between"},
|
||||||
|
};
|
||||||
|
|
||||||
bool MacroConditionDate::CheckCondition()
|
bool MacroConditionDate::CheckCondition()
|
||||||
{
|
{
|
||||||
bool match = false;
|
bool match = false;
|
||||||
QDateTime cur = QDateTime::currentDateTime();
|
QDateTime cur = QDateTime::currentDateTime();
|
||||||
if (_ignoreDate) {
|
if (_ignoreDate) {
|
||||||
_dateTime.setDate(cur.date());
|
_dateTime.setDate(cur.date());
|
||||||
|
_dateTime2.setDate(cur.date());
|
||||||
}
|
}
|
||||||
if (_ignoreTime) {
|
if (_ignoreTime) {
|
||||||
_dateTime.setTime(cur.time());
|
_dateTime.setTime(cur.time());
|
||||||
|
_dateTime2.setTime(cur.time());
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (_condition) {
|
||||||
|
case DateCondition::AT:
|
||||||
|
match = _dateTime >= cur &&
|
||||||
|
_dateTime <= cur.addMSecs(switcher->interval);
|
||||||
|
break;
|
||||||
|
case DateCondition::AFTER:
|
||||||
|
match = cur >= _dateTime;
|
||||||
|
break;
|
||||||
|
case DateCondition::BEFORE:
|
||||||
|
match = cur <= _dateTime;
|
||||||
|
break;
|
||||||
|
case DateCondition::BETWEEN:
|
||||||
|
if (_dateTime2 > _dateTime) {
|
||||||
|
match = cur >= _dateTime && cur <= _dateTime2;
|
||||||
|
} else {
|
||||||
|
match = cur >= _dateTime2 && cur <= _dateTime;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
match = _dateTime >= cur &&
|
|
||||||
_dateTime <= cur.addMSecs(switcher->interval);
|
|
||||||
if (match && _repeat) {
|
if (match && _repeat) {
|
||||||
_dateTime = _dateTime.addSecs(_duration.seconds);
|
_dateTime = _dateTime.addSecs(_duration.seconds);
|
||||||
|
_dateTime2 = _dateTime2.addSecs(_duration.seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
return match;
|
return match;
|
||||||
@@ -33,8 +64,11 @@ bool MacroConditionDate::CheckCondition()
|
|||||||
bool MacroConditionDate::Save(obs_data_t *obj)
|
bool MacroConditionDate::Save(obs_data_t *obj)
|
||||||
{
|
{
|
||||||
MacroCondition::Save(obj);
|
MacroCondition::Save(obj);
|
||||||
|
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
|
||||||
obs_data_set_string(obj, "dateTime",
|
obs_data_set_string(obj, "dateTime",
|
||||||
_dateTime.toString().toStdString().c_str());
|
_dateTime.toString().toStdString().c_str());
|
||||||
|
obs_data_set_string(obj, "dateTime2",
|
||||||
|
_dateTime2.toString().toStdString().c_str());
|
||||||
obs_data_set_bool(obj, "ignoreDate", _ignoreDate);
|
obs_data_set_bool(obj, "ignoreDate", _ignoreDate);
|
||||||
obs_data_set_bool(obj, "ignoreTime", _ignoreTime);
|
obs_data_set_bool(obj, "ignoreTime", _ignoreTime);
|
||||||
obs_data_set_bool(obj, "repeat", _repeat);
|
obs_data_set_bool(obj, "repeat", _repeat);
|
||||||
@@ -46,8 +80,12 @@ bool MacroConditionDate::Save(obs_data_t *obj)
|
|||||||
bool MacroConditionDate::Load(obs_data_t *obj)
|
bool MacroConditionDate::Load(obs_data_t *obj)
|
||||||
{
|
{
|
||||||
MacroCondition::Load(obj);
|
MacroCondition::Load(obj);
|
||||||
|
_condition =
|
||||||
|
static_cast<DateCondition>(obs_data_get_int(obj, "condition"));
|
||||||
_dateTime = QDateTime::fromString(
|
_dateTime = QDateTime::fromString(
|
||||||
QString::fromStdString(obs_data_get_string(obj, "dateTime")));
|
QString::fromStdString(obs_data_get_string(obj, "dateTime")));
|
||||||
|
_dateTime2 = QDateTime::fromString(
|
||||||
|
QString::fromStdString(obs_data_get_string(obj, "dateTime2")));
|
||||||
_ignoreDate = obs_data_get_bool(obj, "ignoreDate");
|
_ignoreDate = obs_data_get_bool(obj, "ignoreDate");
|
||||||
_ignoreTime = obs_data_get_bool(obj, "ignoreTime");
|
_ignoreTime = obs_data_get_bool(obj, "ignoreTime");
|
||||||
_repeat = obs_data_get_bool(obj, "repeat");
|
_repeat = obs_data_get_bool(obj, "repeat");
|
||||||
@@ -60,20 +98,35 @@ std::string MacroConditionDate::GetShortDesc()
|
|||||||
return _dateTime.toString().toStdString();
|
return _dateTime.toString().toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void populateConditionSelection(QComboBox *list)
|
||||||
|
{
|
||||||
|
for (auto entry : dateConditionTypes) {
|
||||||
|
list->addItem(obs_module_text(entry.second.c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MacroConditionDateEdit::MacroConditionDateEdit(
|
MacroConditionDateEdit::MacroConditionDateEdit(
|
||||||
QWidget *parent, std::shared_ptr<MacroConditionDate> entryData)
|
QWidget *parent, std::shared_ptr<MacroConditionDate> entryData)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
{
|
{
|
||||||
|
_condition = new QComboBox();
|
||||||
_dateTime = new QDateTimeEdit();
|
_dateTime = new QDateTimeEdit();
|
||||||
_dateTime->setCalendarPopup(true);
|
_dateTime->setCalendarPopup(true);
|
||||||
_dateTime->setDisplayFormat("yyyy.MM.dd hh:mm:ss");
|
_dateTime->setDisplayFormat("yyyy.MM.dd hh:mm:ss");
|
||||||
|
_dateTime2 = new QDateTimeEdit();
|
||||||
|
_dateTime2->setCalendarPopup(true);
|
||||||
|
_dateTime2->setDisplayFormat("yyyy.MM.dd hh:mm:ss");
|
||||||
_ignoreDate = new QCheckBox();
|
_ignoreDate = new QCheckBox();
|
||||||
_ignoreTime = new QCheckBox();
|
_ignoreTime = new QCheckBox();
|
||||||
_repeat = new QCheckBox();
|
_repeat = new QCheckBox();
|
||||||
_duration = new DurationSelection();
|
_duration = new DurationSelection();
|
||||||
|
|
||||||
|
QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this,
|
||||||
|
SLOT(ConditionChanged(int)));
|
||||||
QWidget::connect(_dateTime, SIGNAL(dateTimeChanged(const QDateTime &)),
|
QWidget::connect(_dateTime, SIGNAL(dateTimeChanged(const QDateTime &)),
|
||||||
this, SLOT(DateTimeChanged(const QDateTime &)));
|
this, SLOT(DateTimeChanged(const QDateTime &)));
|
||||||
|
QWidget::connect(_dateTime2, SIGNAL(dateTimeChanged(const QDateTime &)),
|
||||||
|
this, SLOT(DateTime2Changed(const QDateTime &)));
|
||||||
QWidget::connect(_ignoreDate, SIGNAL(stateChanged(int)), this,
|
QWidget::connect(_ignoreDate, SIGNAL(stateChanged(int)), this,
|
||||||
SLOT(IgnoreDateChanged(int)));
|
SLOT(IgnoreDateChanged(int)));
|
||||||
QWidget::connect(_ignoreTime, SIGNAL(stateChanged(int)), this,
|
QWidget::connect(_ignoreTime, SIGNAL(stateChanged(int)), this,
|
||||||
@@ -85,9 +138,13 @@ MacroConditionDateEdit::MacroConditionDateEdit(
|
|||||||
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
|
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
|
||||||
SLOT(DurationUnitChanged(DurationUnit)));
|
SLOT(DurationUnitChanged(DurationUnit)));
|
||||||
|
|
||||||
|
populateConditionSelection(_condition);
|
||||||
|
|
||||||
auto line1Layout = new QHBoxLayout;
|
auto line1Layout = new QHBoxLayout;
|
||||||
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
||||||
|
{"{{condition}}", _condition},
|
||||||
{"{{dateTime}}", _dateTime},
|
{"{{dateTime}}", _dateTime},
|
||||||
|
{"{{dateTime2}}", _dateTime2},
|
||||||
{"{{ignoreDate}}", _ignoreDate},
|
{"{{ignoreDate}}", _ignoreDate},
|
||||||
{"{{ignoreTime}}", _ignoreTime},
|
{"{{ignoreTime}}", _ignoreTime},
|
||||||
{"{{repeat}}", _repeat},
|
{"{{repeat}}", _repeat},
|
||||||
@@ -111,6 +168,18 @@ MacroConditionDateEdit::MacroConditionDateEdit(
|
|||||||
_loading = false;
|
_loading = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroConditionDateEdit::ConditionChanged(int cond)
|
||||||
|
{
|
||||||
|
if (_loading || !_entryData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(switcher->m);
|
||||||
|
_entryData->_condition = static_cast<DateCondition>(cond);
|
||||||
|
ShowSecondDateSelection(_entryData->_condition ==
|
||||||
|
DateCondition::BETWEEN);
|
||||||
|
}
|
||||||
|
|
||||||
void MacroConditionDateEdit::DateTimeChanged(const QDateTime &datetime)
|
void MacroConditionDateEdit::DateTimeChanged(const QDateTime &datetime)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
if (_loading || !_entryData) {
|
||||||
@@ -124,6 +193,16 @@ void MacroConditionDateEdit::DateTimeChanged(const QDateTime &datetime)
|
|||||||
QString::fromStdString(_entryData->GetShortDesc()));
|
QString::fromStdString(_entryData->GetShortDesc()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroConditionDateEdit::DateTime2Changed(const QDateTime &datetime)
|
||||||
|
{
|
||||||
|
if (_loading || !_entryData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> lock(switcher->m);
|
||||||
|
_entryData->_dateTime2 = datetime;
|
||||||
|
}
|
||||||
|
|
||||||
void MacroConditionDateEdit::IgnoreDateChanged(int state)
|
void MacroConditionDateEdit::IgnoreDateChanged(int state)
|
||||||
{
|
{
|
||||||
if (_loading || !_entryData) {
|
if (_loading || !_entryData) {
|
||||||
@@ -180,10 +259,21 @@ void MacroConditionDateEdit::UpdateEntryData()
|
|||||||
if (!_entryData) {
|
if (!_entryData) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_condition->setCurrentIndex(static_cast<int>(_entryData->_condition));
|
||||||
_dateTime->setDateTime(_entryData->_dateTime);
|
_dateTime->setDateTime(_entryData->_dateTime);
|
||||||
|
_dateTime2->setDateTime(_entryData->_dateTime2);
|
||||||
_ignoreDate->setChecked(_entryData->_ignoreDate);
|
_ignoreDate->setChecked(_entryData->_ignoreDate);
|
||||||
_ignoreTime->setChecked(_entryData->_ignoreTime);
|
_ignoreTime->setChecked(_entryData->_ignoreTime);
|
||||||
_repeat->setChecked(_entryData->_repeat);
|
_repeat->setChecked(_entryData->_repeat);
|
||||||
_duration->SetDuration(_entryData->_duration);
|
_duration->SetDuration(_entryData->_duration);
|
||||||
_duration->setDisabled(!_entryData->_repeat);
|
_duration->setDisabled(!_entryData->_repeat);
|
||||||
|
ShowSecondDateSelection(_entryData->_condition ==
|
||||||
|
DateCondition::BETWEEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroConditionDateEdit::ShowSecondDateSelection(bool visible)
|
||||||
|
{
|
||||||
|
_dateTime2->setVisible(visible);
|
||||||
|
adjustSize();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ void MacroConditionFilterEdit::GetSettingsClicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_settings->setPlainText(
|
_settings->setPlainText(
|
||||||
fromatJsonString(getSourceSettings(_entryData->_filter)));
|
formatJsonString(getSourceSettings(_entryData->_filter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionFilterEdit::SettingsChanged()
|
void MacroConditionFilterEdit::SettingsChanged()
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ void MacroConditionSourceEdit::GetSettingsClicked()
|
|||||||
}
|
}
|
||||||
|
|
||||||
_settings->setPlainText(
|
_settings->setPlainText(
|
||||||
fromatJsonString(getSourceSettings(_entryData->_source)));
|
formatJsonString(getSourceSettings(_entryData->_source)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroConditionSourceEdit::SettingsChanged()
|
void MacroConditionSourceEdit::SettingsChanged()
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ void AdvSceneSwitcher::on_macroRemove_clicked()
|
|||||||
QString name;
|
QString name;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(switcher->m);
|
std::lock_guard<std::mutex> lock(switcher->m);
|
||||||
|
switcher->abortMacroWait = true;
|
||||||
|
switcher->macroWaitCv.notify_one();
|
||||||
int idx = ui->macros->currentRow();
|
int idx = ui->macros->currentRow();
|
||||||
QString::fromStdString(switcher->macros[idx].Name());
|
QString::fromStdString(switcher->macros[idx].Name());
|
||||||
switcher->macros.erase(switcher->macros.begin() + idx);
|
switcher->macros.erase(switcher->macros.begin() + idx);
|
||||||
|
|||||||
@@ -107,8 +107,8 @@ bool Macro::PerformAction()
|
|||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
for (auto &a : _actions) {
|
for (auto &a : _actions) {
|
||||||
ret = ret && a->PerformAction();
|
|
||||||
a->LogAction();
|
a->LogAction();
|
||||||
|
ret = ret && a->PerformAction();
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,7 +92,11 @@ void SwitcherData::writeSceneInfoToFile()
|
|||||||
|
|
||||||
QFile file(QString::fromStdString(fileIO.writePath));
|
QFile file(QString::fromStdString(fileIO.writePath));
|
||||||
if (file.open(QIODevice::WriteOnly)) {
|
if (file.open(QIODevice::WriteOnly)) {
|
||||||
const char *msg = GetWeakSourceName(currentScene).c_str();
|
// switcher->currentScene cannot be used here as scene might
|
||||||
|
// have changed already
|
||||||
|
obs_source_t *source = obs_frontend_get_current_scene();
|
||||||
|
auto msg = obs_source_get_name(source);
|
||||||
|
obs_source_release(source);
|
||||||
file.write(msg, qstrlen(msg));
|
file.write(msg, qstrlen(msg));
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -283,14 +283,22 @@ bool compareSourceSettings(const OBSWeakSource &source,
|
|||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
std::string currentSettings = getSourceSettings(source);
|
std::string currentSettings = getSourceSettings(source);
|
||||||
|
// User input and source settings might be formatted differently
|
||||||
|
currentSettings = formatJsonString(currentSettings).toStdString();
|
||||||
|
std::string userSettings = formatJsonString(settings).toStdString();
|
||||||
|
|
||||||
|
if (userSettings.empty()) {
|
||||||
|
userSettings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
if (useRegex) {
|
if (useRegex) {
|
||||||
try {
|
try {
|
||||||
std::regex expr(settings);
|
std::regex expr(userSettings);
|
||||||
ret = std::regex_match(currentSettings, expr);
|
ret = std::regex_match(currentSettings, expr);
|
||||||
} catch (const std::regex_error &) {
|
} catch (const std::regex_error &) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = currentSettings == settings;
|
ret = currentSettings == userSettings;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -304,12 +312,12 @@ std::string getDataFilePath(const std::string &file)
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
QString fromatJsonString(std::string s)
|
QString formatJsonString(std::string s)
|
||||||
{
|
{
|
||||||
return fromatJsonString(s.c_str());
|
return formatJsonString(s.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString fromatJsonString(const char *json)
|
QString formatJsonString(const char *json)
|
||||||
{
|
{
|
||||||
QJsonDocument doc = QJsonDocument::fromJson(json);
|
QJsonDocument doc = QJsonDocument::fromJson(json);
|
||||||
return doc.toJson(QJsonDocument::Indented);
|
return doc.toJson(QJsonDocument::Indented);
|
||||||
|
|||||||
Reference in New Issue
Block a user