mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-22 18:04:59 -05:00
795 lines
23 KiB
C++
795 lines
23 KiB
C++
#include "macro-condition-date.hpp"
|
|
#include "layout-helpers.hpp"
|
|
#include "macro-helpers.hpp"
|
|
|
|
#include <QCalendarWidget>
|
|
|
|
namespace advss {
|
|
|
|
const std::string MacroConditionDate::id = "date";
|
|
constexpr const char dateFormat[] = "yyyy MM dd hh mm ss";
|
|
|
|
bool MacroConditionDate::_registered = MacroConditionFactory::Register(
|
|
MacroConditionDate::id,
|
|
{MacroConditionDate::Create, MacroConditionDateEdit::Create,
|
|
"AdvSceneSwitcher.condition.date", false});
|
|
|
|
const static std::map<MacroConditionDate::Condition, std::string>
|
|
dateConditionTypes = {
|
|
{MacroConditionDate::Condition::AT,
|
|
"AdvSceneSwitcher.condition.date.state.at"},
|
|
{MacroConditionDate::Condition::AFTER,
|
|
"AdvSceneSwitcher.condition.date.state.after"},
|
|
{MacroConditionDate::Condition::BEFORE,
|
|
"AdvSceneSwitcher.condition.date.state.before"},
|
|
{MacroConditionDate::Condition::BETWEEN,
|
|
"AdvSceneSwitcher.condition.date.state.between"},
|
|
{MacroConditionDate::Condition::PATTERN,
|
|
"AdvSceneSwitcher.condition.date.state.pattern"},
|
|
};
|
|
|
|
const static std::map<MacroConditionDate::Condition, std::string>
|
|
weekConditionTypes = {
|
|
{MacroConditionDate::Condition::AT,
|
|
"AdvSceneSwitcher.condition.date.state.at"},
|
|
{MacroConditionDate::Condition::AFTER,
|
|
"AdvSceneSwitcher.condition.date.state.after"},
|
|
{MacroConditionDate::Condition::BEFORE,
|
|
"AdvSceneSwitcher.condition.date.state.before"},
|
|
};
|
|
|
|
const static std::map<MacroConditionDate::Day, std::string> dayOfWeekNames = {
|
|
{MacroConditionDate::Day::ANY,
|
|
"AdvSceneSwitcher.condition.date.anyDay"},
|
|
{MacroConditionDate::Day::MONDAY,
|
|
"AdvSceneSwitcher.condition.date.monday"},
|
|
{MacroConditionDate::Day::TUESDAY,
|
|
"AdvSceneSwitcher.condition.date.tuesday"},
|
|
{MacroConditionDate::Day::WEDNESDAY,
|
|
"AdvSceneSwitcher.condition.date.wednesday"},
|
|
{MacroConditionDate::Day::THURSDAY,
|
|
"AdvSceneSwitcher.condition.date.thursday"},
|
|
{MacroConditionDate::Day::FRIDAY,
|
|
"AdvSceneSwitcher.condition.date.friday"},
|
|
{MacroConditionDate::Day::SATURDAY,
|
|
"AdvSceneSwitcher.condition.date.saturday"},
|
|
{MacroConditionDate::Day::SUNDAY,
|
|
"AdvSceneSwitcher.condition.date.sunday"},
|
|
};
|
|
|
|
bool MacroConditionDate::CheckDayOfWeek(int64_t msSinceLastCheck)
|
|
{
|
|
QDateTime cur = QDateTime::currentDateTime();
|
|
SetVariables(cur);
|
|
|
|
if (_dayOfWeek != Day::ANY &&
|
|
cur.date().dayOfWeek() != static_cast<int>(_dayOfWeek)) {
|
|
return false;
|
|
}
|
|
if (_ignoreTime) {
|
|
return true;
|
|
}
|
|
_dateTime.setDate(cur.date());
|
|
|
|
switch (_condition) {
|
|
case MacroConditionDate::Condition::AT:
|
|
return _dateTime <= cur &&
|
|
_dateTime >= cur.addMSecs(-msSinceLastCheck);
|
|
case MacroConditionDate::Condition::AFTER:
|
|
return cur >= _dateTime;
|
|
case MacroConditionDate::Condition::BEFORE:
|
|
return cur <= _dateTime;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool MacroConditionDate::CheckBetween(const QDateTime &now)
|
|
{
|
|
// In the case of ignoring the date component treat the "left" value as
|
|
// the start of the time range and the "right" value as the end
|
|
if (_ignoreDate) {
|
|
if (_dateTime2 >= _dateTime) {
|
|
return now >= _dateTime && now <= _dateTime2;
|
|
}
|
|
// Assume that the end / start value should be shifted by 24h
|
|
// as otherwise the condition would never be true
|
|
return (now >= _dateTime && now <= _dateTime2.addDays(1)) ||
|
|
(now >= _dateTime.addDays(-1) && now <= _dateTime2);
|
|
}
|
|
|
|
if (_dateTime2 >= _dateTime) {
|
|
return now >= _dateTime && now <= _dateTime2;
|
|
}
|
|
return now >= _dateTime2 && now <= _dateTime;
|
|
}
|
|
|
|
bool MacroConditionDate::CheckPattern(QDateTime now,
|
|
int64_t secondsSinceLastCheck)
|
|
{
|
|
auto regex = QRegularExpression(QRegularExpression::anchoredPattern(
|
|
QString::fromStdString(_pattern)));
|
|
if (!regex.isValid()) {
|
|
return false;
|
|
}
|
|
|
|
// Silently ignore cases in which the scene switcher was not able to
|
|
// run for more than 60s
|
|
if (secondsSinceLastCheck > 60) {
|
|
secondsSinceLastCheck = 0;
|
|
}
|
|
|
|
for (int i = 0; i <= secondsSinceLastCheck; ++i) {
|
|
auto match = regex.match(now.toString(dateFormat));
|
|
if (match.hasMatch()) {
|
|
return true;
|
|
}
|
|
now = now.addSecs(-1);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool MacroConditionDate::CheckRegularDate(int64_t msSinceLastCheck)
|
|
{
|
|
bool match = false;
|
|
QDateTime cur = QDateTime::currentDateTime();
|
|
SetVariables(cur);
|
|
|
|
if (_ignoreDate) {
|
|
_dateTime.setDate(cur.date());
|
|
_dateTime2.setDate(cur.date());
|
|
}
|
|
if (_ignoreTime) {
|
|
_dateTime.setTime(cur.time());
|
|
_dateTime2.setTime(cur.time());
|
|
}
|
|
|
|
switch (_condition) {
|
|
case MacroConditionDate::Condition::AT:
|
|
match = _dateTime <= cur &&
|
|
_dateTime >= cur.addMSecs(-msSinceLastCheck);
|
|
break;
|
|
case MacroConditionDate::Condition::AFTER:
|
|
match = cur >= _dateTime;
|
|
break;
|
|
case MacroConditionDate::Condition::BEFORE:
|
|
match = cur <= _dateTime;
|
|
break;
|
|
case MacroConditionDate::Condition::BETWEEN:
|
|
match = CheckBetween(cur);
|
|
break;
|
|
case MacroConditionDate::Condition::PATTERN:
|
|
match = CheckPattern(cur, msSinceLastCheck / 1000);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (match && _repeat) {
|
|
_dateTime = _dateTime.addSecs(_duration.Seconds());
|
|
_dateTime2 = _dateTime2.addSecs(_duration.Seconds());
|
|
}
|
|
|
|
return match;
|
|
}
|
|
|
|
bool MacroConditionDate::CheckCondition()
|
|
{
|
|
auto m = GetMacro();
|
|
if (!m) {
|
|
return false;
|
|
}
|
|
auto msSinceLastCheck = MillisecondsSinceMacroConditionCheck(m);
|
|
if (_dayOfWeekCheck) {
|
|
return CheckDayOfWeek(msSinceLastCheck);
|
|
}
|
|
return CheckRegularDate(msSinceLastCheck);
|
|
}
|
|
|
|
bool MacroConditionDate::Save(obs_data_t *obj) const
|
|
{
|
|
MacroCondition::Save(obj);
|
|
obs_data_set_int(obj, "dayOfWeek", static_cast<int>(_dayOfWeek));
|
|
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
|
|
const auto &dateToSave = _updateOnRepeat ? _dateTime : _origDateTime;
|
|
const auto &dateToSave2 = _updateOnRepeat ? _dateTime2 : _origDateTime2;
|
|
obs_data_set_string(obj, "dateTime",
|
|
dateToSave.toString().toStdString().c_str());
|
|
obs_data_set_string(obj, "dateTime2",
|
|
dateToSave2.toString().toStdString().c_str());
|
|
obs_data_set_bool(obj, "ignoreDate", _ignoreDate);
|
|
obs_data_set_bool(obj, "ignoreTime", _ignoreTime);
|
|
obs_data_set_bool(obj, "repeat", _repeat);
|
|
obs_data_set_bool(obj, "updateOnRepeat", _updateOnRepeat);
|
|
_duration.Save(obj);
|
|
obs_data_set_bool(obj, "dayOfWeekCheck", _dayOfWeekCheck);
|
|
obs_data_set_string(obj, "pattern", _pattern.c_str());
|
|
return true;
|
|
}
|
|
|
|
bool MacroConditionDate::Load(obs_data_t *obj)
|
|
{
|
|
MacroCondition::Load(obj);
|
|
_dayOfWeek = static_cast<Day>(obs_data_get_int(obj, "dayOfWeek"));
|
|
_condition = static_cast<MacroConditionDate::Condition>(
|
|
obs_data_get_int(obj, "condition"));
|
|
_dateTime = QDateTime::fromString(
|
|
QString::fromStdString(obs_data_get_string(obj, "dateTime")));
|
|
_origDateTime = _dateTime;
|
|
_dateTime2 = QDateTime::fromString(
|
|
QString::fromStdString(obs_data_get_string(obj, "dateTime2")));
|
|
_origDateTime2 = _dateTime2;
|
|
_ignoreDate = obs_data_get_bool(obj, "ignoreDate");
|
|
_ignoreTime = obs_data_get_bool(obj, "ignoreTime");
|
|
_repeat = obs_data_get_bool(obj, "repeat");
|
|
_updateOnRepeat = obs_data_get_bool(obj, "updateOnRepeat");
|
|
_duration.Load(obj);
|
|
_dayOfWeekCheck = obs_data_get_bool(obj, "dayOfWeekCheck");
|
|
_pattern = obs_data_get_string(obj, "pattern");
|
|
|
|
// The following code is used to avoid issues with old save files in
|
|
// which the simple date check did not support setting _condition
|
|
if (_dayOfWeekCheck &&
|
|
_condition == MacroConditionDate::Condition::BETWEEN) {
|
|
_condition = MacroConditionDate::Condition::AT;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
std::string MacroConditionDate::GetShortDesc() const
|
|
{
|
|
if (_dayOfWeekCheck) {
|
|
auto it = dayOfWeekNames.find(_dayOfWeek);
|
|
if (it == dayOfWeekNames.end()) {
|
|
return "";
|
|
}
|
|
std::string dayName = obs_module_text(it->second.c_str());
|
|
if (_ignoreTime) {
|
|
return dayName;
|
|
}
|
|
return dayName + " " +
|
|
_dateTime.time().toString().toStdString();
|
|
} else {
|
|
if (_condition == Condition::PATTERN) {
|
|
return "";
|
|
}
|
|
|
|
if (!_ignoreDate && !_ignoreTime) {
|
|
return GetDateTime1().toString().toStdString();
|
|
} else if (_ignoreDate && !_ignoreTime) {
|
|
return GetDateTime1().time().toString().toStdString();
|
|
} else if (!_ignoreDate && _ignoreTime) {
|
|
return GetDateTime1().date().toString().toStdString();
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
|
|
void MacroConditionDate::SetDate1(const QDate &date)
|
|
{
|
|
_dateTime.setDate(date);
|
|
_origDateTime.setDate(date);
|
|
}
|
|
|
|
void MacroConditionDate::SetDate2(const QDate &date)
|
|
{
|
|
_dateTime2.setDate(date);
|
|
_origDateTime2.setDate(date);
|
|
}
|
|
|
|
void MacroConditionDate::SetTime1(const QTime &time)
|
|
{
|
|
_dateTime.setTime(time);
|
|
_origDateTime.setTime(time);
|
|
}
|
|
|
|
void MacroConditionDate::SetTime2(const QTime &time)
|
|
{
|
|
_dateTime2.setTime(time);
|
|
_origDateTime2.setTime(time);
|
|
}
|
|
|
|
QDateTime MacroConditionDate::GetDateTime1() const
|
|
{
|
|
return _repeat && _updateOnRepeat ? _dateTime : _origDateTime;
|
|
}
|
|
|
|
QDateTime MacroConditionDate::GetDateTime2() const
|
|
{
|
|
return _repeat && _updateOnRepeat ? _dateTime2 : _origDateTime2;
|
|
}
|
|
|
|
QDateTime MacroConditionDate::GetNextMatchDateTime() const
|
|
{
|
|
return _dateTime;
|
|
}
|
|
|
|
void MacroConditionDate::SetVariables(const QDateTime &date)
|
|
{
|
|
SetVariableValue(date.toString().toStdString());
|
|
|
|
SetTempVarValue("year", std::to_string(date.date().year()));
|
|
SetTempVarValue("month", std::to_string(date.date().month()));
|
|
SetTempVarValue("day", std::to_string(date.date().day()));
|
|
SetTempVarValue("hour", std::to_string(date.time().hour()));
|
|
SetTempVarValue("minute", std::to_string(date.time().minute()));
|
|
SetTempVarValue("second", std::to_string(date.time().second()));
|
|
SetTempVarValue("dayOfWeek", std::to_string(date.date().dayOfWeek()));
|
|
}
|
|
|
|
void MacroConditionDate::SetupTempVars()
|
|
{
|
|
MacroCondition::SetupTempVars();
|
|
AddTempvar("year",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.year"));
|
|
AddTempvar("month",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.month"));
|
|
AddTempvar("day", obs_module_text("AdvSceneSwitcher.tempVar.date.day"));
|
|
AddTempvar("hour",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.hour"));
|
|
AddTempvar("minute",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.minute"));
|
|
AddTempvar("second",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.second"));
|
|
AddTempvar("dayOfWeek",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.date.dayOfWeek"));
|
|
}
|
|
|
|
static inline void populateDaySelection(QComboBox *list)
|
|
{
|
|
for (auto entry : dayOfWeekNames) {
|
|
list->addItem(obs_module_text(entry.second.c_str()));
|
|
}
|
|
}
|
|
|
|
static inline void populateConditionSelection(QComboBox *list)
|
|
{
|
|
for (auto entry : dateConditionTypes) {
|
|
list->addItem(obs_module_text(entry.second.c_str()));
|
|
}
|
|
}
|
|
|
|
static inline void populateWeekConditionSelection(QComboBox *list)
|
|
{
|
|
for (auto entry : weekConditionTypes) {
|
|
list->addItem(obs_module_text(entry.second.c_str()));
|
|
}
|
|
}
|
|
|
|
MacroConditionDateEdit::MacroConditionDateEdit(
|
|
QWidget *parent, std::shared_ptr<MacroConditionDate> entryData)
|
|
: QWidget(parent),
|
|
_weekCondition(new QComboBox()),
|
|
_dayOfWeek(new QComboBox()),
|
|
_ignoreWeekTime(new QCheckBox()),
|
|
_weekTime(new QTimeEdit()),
|
|
_condition(new QComboBox()),
|
|
_date(new QDateEdit()),
|
|
_time(new QTimeEdit()),
|
|
_separator(new QLabel(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.separator"))),
|
|
_date2(new QDateEdit()),
|
|
_time2(new QTimeEdit()),
|
|
_ignoreDate(new QCheckBox()),
|
|
_ignoreTime(new QCheckBox()),
|
|
_repeat(new QCheckBox()),
|
|
_nextMatchDate(new QLabel()),
|
|
_updateOnRepeat(new QCheckBox()),
|
|
_duration(new DurationSelection()),
|
|
_pattern(new QLineEdit()),
|
|
_currentDate(new QLabel()),
|
|
_advancedSettingsTooggle(new QPushButton(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.showAdvancedSettings"))),
|
|
_simpleLayout(new QHBoxLayout()),
|
|
_advancedLayout(new QHBoxLayout()),
|
|
_repeatLayout(new QVBoxLayout()),
|
|
_repeatUpdateLayout(new QHBoxLayout()),
|
|
_patternLayout(new QHBoxLayout())
|
|
{
|
|
_ignoreWeekTime->setToolTip(
|
|
obs_module_text("AdvSceneSwitcher.condition.date.ignoreTime"));
|
|
_weekTime->setDisplayFormat("hh:mm:ss");
|
|
_date->setDisplayFormat("yyyy.MM.dd ");
|
|
_date->setCalendarPopup(true);
|
|
auto cal = _date->calendarWidget();
|
|
cal->showSelectedDate();
|
|
_time->setDisplayFormat("hh:mm:ss");
|
|
_date2->setDisplayFormat("yyyy.MM.dd ");
|
|
_date2->setCalendarPopup(true);
|
|
cal = _date2->calendarWidget();
|
|
cal->showSelectedDate();
|
|
_time2->setDisplayFormat("hh:mm:ss");
|
|
_ignoreDate->setToolTip(
|
|
obs_module_text("AdvSceneSwitcher.condition.date.ignoreDate"));
|
|
_ignoreTime->setToolTip(
|
|
obs_module_text("AdvSceneSwitcher.condition.date.ignoreTime"));
|
|
|
|
QWidget::connect(_weekCondition, SIGNAL(currentIndexChanged(int)), this,
|
|
SLOT(ConditionChanged(int)));
|
|
QWidget::connect(_dayOfWeek, SIGNAL(currentIndexChanged(int)), this,
|
|
SLOT(DayOfWeekChanged(int)));
|
|
QWidget::connect(_ignoreWeekTime, SIGNAL(stateChanged(int)), this,
|
|
SLOT(IgnoreTimeChanged(int)));
|
|
QWidget::connect(_weekTime, SIGNAL(timeChanged(const QTime &)), this,
|
|
SLOT(TimeChanged(const QTime &)));
|
|
QWidget::connect(_condition, SIGNAL(currentIndexChanged(int)), this,
|
|
SLOT(ConditionChanged(int)));
|
|
QWidget::connect(_date, SIGNAL(dateChanged(const QDate &)), this,
|
|
SLOT(DateChanged(const QDate &)));
|
|
QWidget::connect(_date2, SIGNAL(dateChanged(const QDate &)), this,
|
|
SLOT(Date2Changed(const QDate &)));
|
|
QWidget::connect(_time, SIGNAL(timeChanged(const QTime &)), this,
|
|
SLOT(TimeChanged(const QTime &)));
|
|
QWidget::connect(_time2, SIGNAL(timeChanged(const QTime &)), this,
|
|
SLOT(Time2Changed(const QTime &)));
|
|
QWidget::connect(_ignoreDate, SIGNAL(stateChanged(int)), this,
|
|
SLOT(IgnoreDateChanged(int)));
|
|
QWidget::connect(_ignoreTime, SIGNAL(stateChanged(int)), this,
|
|
SLOT(IgnoreTimeChanged(int)));
|
|
QWidget::connect(_repeat, SIGNAL(stateChanged(int)), this,
|
|
SLOT(RepeatChanged(int)));
|
|
QWidget::connect(_updateOnRepeat, SIGNAL(stateChanged(int)), this,
|
|
SLOT(UpdateOnRepeatChanged(int)));
|
|
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)),
|
|
this, SLOT(DurationChanged(const Duration &)));
|
|
QWidget::connect(_advancedSettingsTooggle, SIGNAL(clicked()), this,
|
|
SLOT(AdvancedSettingsToggleClicked()));
|
|
QWidget::connect(_pattern, SIGNAL(editingFinished()), this,
|
|
SLOT(PatternChanged()));
|
|
|
|
populateDaySelection(_dayOfWeek);
|
|
populateConditionSelection(_condition);
|
|
populateWeekConditionSelection(_weekCondition);
|
|
|
|
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
|
|
{"{{weekCondition}}", _weekCondition},
|
|
{"{{dayOfWeek}}", _dayOfWeek},
|
|
{"{{ignoreWeekTime}}", _ignoreWeekTime},
|
|
{"{{weekTime}}", _weekTime},
|
|
{"{{condition}}", _condition},
|
|
{"{{date}}", _date},
|
|
{"{{time}}", _time},
|
|
{"{{separator}}", _separator},
|
|
{"{{date2}}", _date2},
|
|
{"{{time2}}", _time2},
|
|
{"{{ignoreDate}}", _ignoreDate},
|
|
{"{{ignoreTime}}", _ignoreTime},
|
|
{"{{repeat}}", _repeat},
|
|
{"{{updateOnRepeat}}", _updateOnRepeat},
|
|
{"{{duration}}", _duration},
|
|
{"{{pattern}}", _pattern},
|
|
{"{{currentDate}}", _currentDate},
|
|
};
|
|
PlaceWidgets(
|
|
obs_module_text("AdvSceneSwitcher.condition.date.entry.simple"),
|
|
_simpleLayout, widgetPlaceholders);
|
|
PlaceWidgets(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.entry.advanced"),
|
|
_advancedLayout, widgetPlaceholders);
|
|
PlaceWidgets(
|
|
obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.entry.updateOnRepeat"),
|
|
_repeatUpdateLayout, widgetPlaceholders);
|
|
auto repeatLayout = new QHBoxLayout;
|
|
PlaceWidgets(
|
|
obs_module_text("AdvSceneSwitcher.condition.date.entry.repeat"),
|
|
repeatLayout, widgetPlaceholders);
|
|
PlaceWidgets(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.entry.pattern"),
|
|
_patternLayout, widgetPlaceholders);
|
|
_repeatLayout->addLayout(repeatLayout);
|
|
_repeatLayout->addWidget(_nextMatchDate);
|
|
_repeatLayout->addLayout(_repeatUpdateLayout);
|
|
|
|
auto *mainLayout = new QVBoxLayout;
|
|
mainLayout->addLayout(_simpleLayout);
|
|
mainLayout->addLayout(_advancedLayout);
|
|
mainLayout->addLayout(_patternLayout);
|
|
mainLayout->addLayout(_repeatLayout);
|
|
auto *_advancedToggleLayout = new QHBoxLayout;
|
|
_advancedToggleLayout->addWidget(_advancedSettingsTooggle);
|
|
_advancedToggleLayout->addStretch();
|
|
mainLayout->addLayout(_advancedToggleLayout);
|
|
setLayout(mainLayout);
|
|
|
|
QWidget::connect(&_timer, SIGNAL(timeout()), this,
|
|
SLOT(ShowNextMatch()));
|
|
QWidget::connect(&_timer, SIGNAL(timeout()), this,
|
|
SLOT(UpdateCurrentTime()));
|
|
_timer.start(1000);
|
|
|
|
_entryData = entryData;
|
|
UpdateEntryData();
|
|
_loading = false;
|
|
}
|
|
|
|
void MacroConditionDateEdit::DayOfWeekChanged(int day)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_dayOfWeek = static_cast<MacroConditionDate::Day>(day);
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::ConditionChanged(int cond)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_condition =
|
|
static_cast<MacroConditionDate::Condition>(cond);
|
|
SetWidgetStatus();
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::DateChanged(const QDate &date)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->SetDate1(date);
|
|
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::TimeChanged(const QTime &time)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->SetTime1(time);
|
|
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::Date2Changed(const QDate &date)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->SetDate2(date);
|
|
}
|
|
|
|
void MacroConditionDateEdit::Time2Changed(const QTime &time)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->SetTime2(time);
|
|
}
|
|
|
|
void MacroConditionDateEdit::IgnoreDateChanged(int state)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_ignoreDate = !state;
|
|
SetWidgetStatus();
|
|
}
|
|
|
|
void MacroConditionDateEdit::IgnoreTimeChanged(int state)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_ignoreTime = !state;
|
|
SetWidgetStatus();
|
|
}
|
|
|
|
void MacroConditionDateEdit::RepeatChanged(int state)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_repeat = state;
|
|
_duration->setDisabled(!state);
|
|
SetWidgetStatus();
|
|
}
|
|
|
|
void MacroConditionDateEdit::UpdateOnRepeatChanged(int state)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_updateOnRepeat = state;
|
|
}
|
|
|
|
void MacroConditionDateEdit::DurationChanged(const Duration &dur)
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
|
|
auto lock = LockContext();
|
|
_entryData->_duration = dur;
|
|
}
|
|
|
|
void MacroConditionDateEdit::AdvancedSettingsToggleClicked()
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
{
|
|
auto lock = LockContext();
|
|
_entryData->_dayOfWeekCheck = !_entryData->_dayOfWeekCheck;
|
|
}
|
|
|
|
switch (_entryData->_condition) {
|
|
case MacroConditionDate::Condition::BETWEEN:
|
|
case MacroConditionDate::Condition::PATTERN:
|
|
_condition->setCurrentIndex(0);
|
|
_weekCondition->setCurrentIndex(0);
|
|
break;
|
|
case MacroConditionDate::Condition::AT:
|
|
case MacroConditionDate::Condition::AFTER:
|
|
case MacroConditionDate::Condition::BEFORE:
|
|
_weekCondition->setCurrentIndex(
|
|
static_cast<int>(_entryData->_condition));
|
|
_condition->setCurrentIndex(
|
|
static_cast<int>(_entryData->_condition));
|
|
break;
|
|
}
|
|
|
|
SetWidgetStatus();
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::ShowNextMatch()
|
|
{
|
|
if (!_entryData || _entryData->_dayOfWeekCheck ||
|
|
!_entryData->_repeat) {
|
|
return;
|
|
}
|
|
QString format(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.entry.nextMatchDate"));
|
|
_nextMatchDate->setText(
|
|
format.arg(_entryData->GetNextMatchDateTime().toString()));
|
|
}
|
|
|
|
void MacroConditionDateEdit::PatternChanged()
|
|
{
|
|
if (_loading || !_entryData) {
|
|
return;
|
|
}
|
|
_entryData->_pattern = _pattern->text().toStdString();
|
|
}
|
|
|
|
void MacroConditionDateEdit::UpdateCurrentTime()
|
|
{
|
|
QDateTime dateTime = dateTime.currentDateTime();
|
|
_currentDate->setText(dateTime.toString(dateFormat));
|
|
}
|
|
|
|
void MacroConditionDateEdit::UpdateEntryData()
|
|
{
|
|
if (!_entryData) {
|
|
return;
|
|
}
|
|
_weekCondition->setCurrentIndex(
|
|
static_cast<int>(_entryData->_condition));
|
|
_dayOfWeek->setCurrentIndex(
|
|
static_cast<int>(static_cast<int>(_entryData->_dayOfWeek)));
|
|
_ignoreWeekTime->setChecked(!_entryData->_ignoreTime);
|
|
_weekTime->setTime(_entryData->GetDateTime1().time());
|
|
_condition->setCurrentIndex(static_cast<int>(_entryData->_condition));
|
|
_date->setDate(_entryData->GetDateTime1().date());
|
|
_time->setTime(_entryData->GetDateTime1().time());
|
|
_date2->setDate(_entryData->GetDateTime2().date());
|
|
_time2->setTime(_entryData->GetDateTime2().time());
|
|
_ignoreDate->setChecked(!_entryData->_ignoreDate);
|
|
_ignoreTime->setChecked(!_entryData->_ignoreTime);
|
|
_repeat->setChecked(_entryData->_repeat);
|
|
_updateOnRepeat->setChecked(_entryData->_updateOnRepeat);
|
|
_duration->SetDuration(_entryData->_duration);
|
|
_duration->setDisabled(!_entryData->_repeat);
|
|
_pattern->setText(QString::fromStdString(_entryData->_pattern));
|
|
ShowNextMatch();
|
|
SetWidgetStatus();
|
|
}
|
|
|
|
void MacroConditionDateEdit::SetupSimpleView()
|
|
{
|
|
SetLayoutVisible(_simpleLayout, true);
|
|
SetLayoutVisible(_advancedLayout, false);
|
|
SetLayoutVisible(_patternLayout, false);
|
|
SetLayoutVisible(_repeatLayout, false);
|
|
SetLayoutVisible(_repeatUpdateLayout, false);
|
|
_weekTime->setDisabled(_entryData->_ignoreTime);
|
|
_weekCondition->setDisabled(_entryData->_ignoreTime);
|
|
const QSignalBlocker b(_weekTime);
|
|
_weekTime->setTime(_entryData->GetDateTime1().time());
|
|
_advancedSettingsTooggle->setText(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.showAdvancedSettings"));
|
|
}
|
|
|
|
void MacroConditionDateEdit::SetupAdvancedView()
|
|
{
|
|
SetLayoutVisible(_simpleLayout, false);
|
|
SetLayoutVisible(_advancedLayout, true);
|
|
SetLayoutVisible(_patternLayout, false);
|
|
SetLayoutVisible(_repeatLayout, true);
|
|
SetLayoutVisible(_repeatUpdateLayout, _entryData->_repeat);
|
|
_nextMatchDate->setVisible(_entryData->_repeat);
|
|
_date->setDisabled(_entryData->_ignoreDate);
|
|
_date2->setDisabled(_entryData->_ignoreDate);
|
|
_time->setDisabled(_entryData->_ignoreTime);
|
|
_time2->setDisabled(_entryData->_ignoreTime);
|
|
ShowFirstDateSelection(true);
|
|
ShowSecondDateSelection(_entryData->_condition ==
|
|
MacroConditionDate::Condition::BETWEEN);
|
|
_advancedSettingsTooggle->setText(obs_module_text(
|
|
"AdvSceneSwitcher.condition.date.showSimpleSettings"));
|
|
}
|
|
|
|
void MacroConditionDateEdit::SetupPatternView()
|
|
{
|
|
SetLayoutVisible(_simpleLayout, false);
|
|
SetLayoutVisible(_advancedLayout, true);
|
|
SetLayoutVisible(_patternLayout, true);
|
|
SetLayoutVisible(_repeatLayout, false);
|
|
SetLayoutVisible(_repeatUpdateLayout, false);
|
|
ShowFirstDateSelection(false);
|
|
ShowSecondDateSelection(false);
|
|
}
|
|
|
|
void MacroConditionDateEdit::SetWidgetStatus()
|
|
{
|
|
if (!_entryData) {
|
|
return;
|
|
}
|
|
|
|
if (_entryData->_dayOfWeekCheck) {
|
|
SetupSimpleView();
|
|
} else if (_entryData->_condition ==
|
|
MacroConditionDate::Condition::PATTERN) {
|
|
SetupPatternView();
|
|
} else {
|
|
SetupAdvancedView();
|
|
}
|
|
adjustSize();
|
|
}
|
|
|
|
void MacroConditionDateEdit::ShowFirstDateSelection(bool visible)
|
|
{
|
|
_ignoreDate->setVisible(visible);
|
|
_date->setVisible(visible);
|
|
_ignoreTime->setVisible(visible);
|
|
_time->setVisible(visible);
|
|
}
|
|
|
|
void MacroConditionDateEdit::ShowSecondDateSelection(bool visible)
|
|
{
|
|
_separator->setVisible(visible);
|
|
_date2->setVisible(visible);
|
|
_time2->setVisible(visible);
|
|
}
|
|
|
|
} // namespace advss
|