Add pause / continue and save / load remaining time for time condition

This commit is contained in:
WarmUpTill 2021-10-14 20:43:40 +02:00 committed by WarmUpTill
parent 254eabfa8d
commit 093b0f9ec0
5 changed files with 99 additions and 4 deletions

View File

@ -153,9 +153,11 @@ AdvSceneSwitcher.condition.pluginState="Plugin state"
AdvSceneSwitcher.condition.pluginState.state.sceneSwitched="Automated scene change was triggered in this interval"
AdvSceneSwitcher.condition.pluginState.entry="{{condition}}"
AdvSceneSwitcher.condition.timer="Timer"
AdvSceneSwitcher.condition.timer.pause="Pause"
AdvSceneSwitcher.condition.timer.continue="Continue"
AdvSceneSwitcher.condition.timer.entry.line1="{{duration}} have passed"
AdvSceneSwitcher.condition.timer.entry.line2="Time remaining: {{remaining}} seconds"
AdvSceneSwitcher.condition.timer.entry.line3="{{reset}} {{autoReset}} Automatically reset timer after duration was reached"
AdvSceneSwitcher.condition.timer.entry.line3="{{pauseContinue}} {{reset}} {{autoReset}} Automatically reset timer after duration was reached"
AdvSceneSwitcher.condition.timer.reset="Reset"
AdvSceneSwitcher.condition.macro="Macro"
AdvSceneSwitcher.condition.macro.type.count="Count"

View File

@ -46,6 +46,13 @@ double Duration::TimeRemaining()
return (seconds * 1000 - runTime.count()) / 1000.;
}
void Duration::SetTimeRemaining(double remaining)
{
long long msPassed = (seconds - remaining) * 1000;
_startTime = std::chrono::high_resolution_clock::now() -
std::chrono::milliseconds(msPassed);
}
void Duration::Reset()
{
_startTime = {};

View File

@ -22,6 +22,7 @@ public:
bool DurationReached();
double TimeRemaining();
void SetTimeRemaining(double);
void Reset();
std::string ToString();

View File

@ -16,8 +16,13 @@ public:
{
return std::make_shared<MacroConditionTimer>();
}
void Pause();
void Continue();
void Reset();
Duration _duration;
bool _paused = false;
double _remaining = 0.;
bool _oneshot = false;
private:
@ -45,13 +50,17 @@ private slots:
void DurationChanged(double seconds);
void DurationUnitChanged(DurationUnit unit);
void AutoResetChanged(int state);
void PauseContinueClicked();
void ResetClicked();
void UpdateTimeRemaining();
protected:
void SetPauseContinueButtonLabel();
DurationSelection *_duration;
QCheckBox *_autoReset;
QPushButton *_reset;
QPushButton *_pauseConinue;
QLabel *_remaining;
std::shared_ptr<MacroConditionTimer> _entryData;

View File

@ -12,6 +12,9 @@ bool MacroConditionTimer::_registered = MacroConditionFactory::Register(
bool MacroConditionTimer::CheckCondition()
{
if (_paused) {
return _remaining == 0.;
}
if (_duration.DurationReached()) {
if (!_oneshot) {
_duration.Reset();
@ -25,6 +28,11 @@ bool MacroConditionTimer::Save(obs_data_t *obj)
{
MacroCondition::Save(obj);
_duration.Save(obj);
if (!_paused) {
_remaining = _duration.TimeRemaining();
}
obs_data_set_double(obj, "remaining", _remaining);
obs_data_set_bool(obj, "paused", _paused);
obs_data_set_bool(obj, "oneshot", _oneshot);
return true;
}
@ -33,20 +41,47 @@ bool MacroConditionTimer::Load(obs_data_t *obj)
{
MacroCondition::Load(obj);
_duration.Load(obj);
_remaining = obs_data_get_double(obj, "remaining");
_paused = obs_data_get_bool(obj, "paused");
if (!obs_data_has_user_value(obj, "oneshot")) {
_oneshot = false;
} else {
_oneshot = obs_data_get_bool(obj, "oneshot");
}
_duration.SetTimeRemaining(_remaining);
return true;
}
void MacroConditionTimer::Pause()
{
if (!_paused) {
_paused = true;
_remaining = _duration.TimeRemaining();
}
}
void MacroConditionTimer::Continue()
{
if (_paused) {
_paused = false;
_duration.SetTimeRemaining(_remaining);
}
}
void MacroConditionTimer::Reset()
{
_remaining = _duration.seconds;
_duration.Reset();
}
MacroConditionTimerEdit::MacroConditionTimerEdit(
QWidget *parent, std::shared_ptr<MacroConditionTimer> entryData)
: QWidget(parent)
{
_duration = new DurationSelection();
_autoReset = new QCheckBox();
_pauseConinue = new QPushButton(
obs_module_text("AdvSceneSwitcher.condition.timer.pause"));
_reset = new QPushButton(
obs_module_text("AdvSceneSwitcher.condition.timer.reset"));
_remaining = new QLabel();
@ -55,6 +90,8 @@ MacroConditionTimerEdit::MacroConditionTimerEdit(
SLOT(DurationChanged(double)));
QWidget::connect(_duration, SIGNAL(UnitChanged(DurationUnit)), this,
SLOT(DurationUnitChanged(DurationUnit)));
QWidget::connect(_pauseConinue, SIGNAL(clicked()), this,
SLOT(PauseContinueClicked()));
QWidget::connect(_reset, SIGNAL(clicked()), this, SLOT(ResetClicked()));
QWidget::connect(_autoReset, SIGNAL(stateChanged(int)), this,
SLOT(AutoResetChanged(int)));
@ -64,6 +101,7 @@ MacroConditionTimerEdit::MacroConditionTimerEdit(
{"{{duration}}", _duration},
{"{{autoReset}}", _autoReset},
{"{{remaining}}", _remaining},
{"{{pauseContinue}}", _pauseConinue},
{"{{reset}}", _reset},
};
placeWidgets(
@ -122,6 +160,23 @@ void MacroConditionTimerEdit::AutoResetChanged(int state)
_entryData->_oneshot = !state;
}
void MacroConditionTimerEdit::PauseContinueClicked()
{
if (_loading || !_entryData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
if (_entryData->_paused) {
timer.start(1000);
_entryData->Continue();
} else {
_entryData->Pause();
timer.stop();
}
SetPauseContinueButtonLabel();
}
void MacroConditionTimerEdit::ResetClicked()
{
if (_loading || !_entryData) {
@ -129,7 +184,7 @@ void MacroConditionTimerEdit::ResetClicked()
}
std::lock_guard<std::mutex> lock(switcher->m);
_entryData->_duration.Reset();
_entryData->Reset();
}
void MacroConditionTimerEdit::UpdateTimeRemaining()
@ -138,8 +193,28 @@ void MacroConditionTimerEdit::UpdateTimeRemaining()
_remaining->setText("-");
return;
}
_remaining->setText(
QString::number(_entryData->_duration.TimeRemaining()));
if (_entryData->_paused) {
_remaining->setText(QString::number(_entryData->_remaining));
} else {
_remaining->setText(
QString::number(_entryData->_duration.TimeRemaining()));
}
}
void MacroConditionTimerEdit::SetPauseContinueButtonLabel()
{
if (!_entryData) {
return;
}
if (_entryData->_paused) {
_pauseConinue->setText(obs_module_text(
"AdvSceneSwitcher.condition.timer.continue"));
} else {
_pauseConinue->setText(obs_module_text(
"AdvSceneSwitcher.condition.timer.pause"));
}
}
void MacroConditionTimerEdit::UpdateEntryData()
@ -150,4 +225,5 @@ void MacroConditionTimerEdit::UpdateEntryData()
_duration->SetDuration(_entryData->_duration);
_autoReset->setChecked(!_entryData->_oneshot);
SetPauseContinueButtonLabel();
}