mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-04-22 10:07:29 -05:00
Add pause / continue and save / load remaining time for time condition
This commit is contained in:
parent
254eabfa8d
commit
093b0f9ec0
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 = {};
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ public:
|
|||
|
||||
bool DurationReached();
|
||||
double TimeRemaining();
|
||||
void SetTimeRemaining(double);
|
||||
void Reset();
|
||||
std::string ToString();
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user