From f9d60010254deeebc64a88d9e8c680ecdb310b1e Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 15 Mar 2023 13:45:00 +0100 Subject: [PATCH] Enable use of variables for hotkey action duration selection --- data/locale/de-DE.ini | 2 +- data/locale/en-US.ini | 2 +- data/locale/es-ES.ini | 2 +- data/locale/tr-TR.ini | 2 +- data/locale/zh-CN.ini | 2 +- src/macro-core/macro-action-hotkey.cpp | 69 ++++++++++++++------------ src/macro-core/macro-action-hotkey.hpp | 7 +-- 7 files changed, 45 insertions(+), 41 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 46562e0f..f18b4d2c 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -506,7 +506,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Linke Meta-Taste" AdvSceneSwitcher.action.hotkey.rightMeta="Rechte Meta-Taste" AdvSceneSwitcher.action.hotkey.onlyOBS="Tastendruck nur an OBS senden" AdvSceneSwitcher.action.hotkey.disabled="Globale Tastendrücke können nicht simuliert werden - die Funktionalität beschränkt sich auf das Senden von Tastendrücken an OBS!" -AdvSceneSwitcher.action.hotkey.entry="Drücke {{keys}} für {{duration}} Millisekunden" +AdvSceneSwitcher.action.hotkey.entry="Drücke {{keys}} für {{duration}}" AdvSceneSwitcher.action.sceneOrder="Reihenfolge der Szenenelemente" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Nach oben verschieben" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Nach unten verschieben" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index adcb66ee..05d92152 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -527,7 +527,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Left Meta" AdvSceneSwitcher.action.hotkey.rightMeta="Right Meta" AdvSceneSwitcher.action.hotkey.onlyOBS="Send keypress only to OBS" AdvSceneSwitcher.action.hotkey.disabled="Cannot simulate global key presses - functionality limited to sending key press to OBS!" -AdvSceneSwitcher.action.hotkey.entry="Press {{keys}} for {{duration}} milliseconds" +AdvSceneSwitcher.action.hotkey.entry="Press {{keys}} for {{duration}}" AdvSceneSwitcher.action.sceneOrder="Scene item order" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Move up" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Move down" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index b2dd4d33..220fe614 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -422,7 +422,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Meta izquierda" AdvSceneSwitcher.action.hotkey.rightMeta="Meta derecho" AdvSceneSwitcher.action.hotkey.onlyOBS="Enviar pulsación de tecla solo a OBS" AdvSceneSwitcher.action.hotkey.disabled="No se puede simular la pulsación de teclas: ¡funcionalidad desactivada!" -AdvSceneSwitcher.action.hotkey.entry="Presione {{keys}} durante {{duration}} milisegundos" +AdvSceneSwitcher.action.hotkey.entry="Presione {{keys}} durante {{duration}}" AdvSceneSwitcher.action.sceneOrder="Orden de elementos de escena" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Mover hacia arriba" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Mover hacia abajo" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 275923de..365095c6 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -350,7 +350,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="Sol Meta" AdvSceneSwitcher.action.hotkey.rightMeta="Sağ Meta" AdvSceneSwitcher.action.hotkey.onlyOBS="Tuşa basımı yalnızca OBS'ye gönder" AdvSceneSwitcher.action.hotkey.disabled="Tuşa basma simülasyonu yapılamıyor - işlevsellik devre dışı!" -AdvSceneSwitcher.action.hotkey.entry="Bas {{keys}} uygun {{duration}} millisaniye" +AdvSceneSwitcher.action.hotkey.entry="Bas {{keys}} uygun {{duration}}" AdvSceneSwitcher.action.sceneOrder="Sahne öğesi sırası" AdvSceneSwitcher.action.sceneOrder.type.moveUp="Yukarı taşı" AdvSceneSwitcher.action.sceneOrder.type.moveDown="Aşağı indir" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 26272fc1..b5f604d2 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -467,7 +467,7 @@ AdvSceneSwitcher.action.hotkey.leftMeta="左 Meta" AdvSceneSwitcher.action.hotkey.rightMeta="右 Meta" AdvSceneSwitcher.action.hotkey.onlyOBS="仅向OBS发送按键" AdvSceneSwitcher.action.hotkey.disabled="无法模拟按键-功能已禁用!" -AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}} 毫秒" +AdvSceneSwitcher.action.hotkey.entry="按下 {{keys}} for {{duration}}" AdvSceneSwitcher.action.sceneOrder="场景项目顺序" AdvSceneSwitcher.action.sceneOrder.type.moveUp="上移" AdvSceneSwitcher.action.sceneOrder.type.moveDown="下移" diff --git a/src/macro-core/macro-action-hotkey.cpp b/src/macro-core/macro-action-hotkey.cpp index ea4008f7..ce3cd92c 100644 --- a/src/macro-core/macro-action-hotkey.cpp +++ b/src/macro-core/macro-action-hotkey.cpp @@ -224,7 +224,7 @@ bool MacroActionHotkey::PerformAction() } if (!keys.empty()) { - int dur = _duration; + int dur = _duration.Milliseconds(); if (_onlySendToObs || !canSimulateKeyPresses) { std::thread t([keys, dur]() { InjectKeys(keys, dur); }); t.detach(); @@ -254,8 +254,9 @@ bool MacroActionHotkey::Save(obs_data_t *obj) const obs_data_set_bool(obj, "right_alt", _rightAlt); obs_data_set_bool(obj, "left_meta", _leftMeta); obs_data_set_bool(obj, "right_meta", _rightMeta); - obs_data_set_int(obj, "duration", _duration); + _duration.Save(obj); obs_data_set_bool(obj, "onlyOBS", _onlySendToObs); + obs_data_set_int(obj, "version", 1); return true; } @@ -271,7 +272,11 @@ bool MacroActionHotkey::Load(obs_data_t *obj) _rightAlt = obs_data_get_bool(obj, "right_alt"); _leftMeta = obs_data_get_bool(obj, "left_meta"); _rightMeta = obs_data_get_bool(obj, "right_meta"); - _duration = obs_data_get_int(obj, "duration"); + if (!obs_data_has_user_value(obj, "version")) { + _duration = obs_data_get_int(obj, "duration") / 1000.0; + } else { + _duration.Load(obj); + } _onlySendToObs = obs_data_get_bool(obj, "onlyOBS"); return true; } @@ -388,32 +393,30 @@ static inline void populateKeySelection(QComboBox *list) MacroActionHotkeyEdit::MacroActionHotkeyEdit( QWidget *parent, std::shared_ptr entryData) - : QWidget(parent) + : QWidget(parent), + _keys(new QComboBox()), + _leftShift(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.leftShift"))), + _rightShift(new QCheckBox(obs_module_text( + "AdvSceneSwitcher.action.hotkey.rightShift"))), + _leftCtrl(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.leftCtrl"))), + _rightCtrl(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.rightCtrl"))), + _leftAlt(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.leftAlt"))), + _rightAlt(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.rightAlt"))), + _leftMeta(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.leftMeta"))), + _rightMeta(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.rightMeta"))), + _duration(new DurationSelection(this, false)), + _onlySendToOBS(new QCheckBox( + obs_module_text("AdvSceneSwitcher.action.hotkey.onlyOBS"))), + _noKeyPressSimulationWarning(new QLabel( + obs_module_text("AdvSceneSwitcher.action.hotkey.disabled"))) { - _keys = new QComboBox(); - _leftShift = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.leftShift")); - _rightShift = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.rightShift")); - _leftCtrl = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.leftCtrl")); - _rightCtrl = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.rightCtrl")); - _leftAlt = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.leftAlt")); - _rightAlt = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.rightAlt")); - _leftMeta = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.leftMeta")); - _rightMeta = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.rightMeta")); - _duration = new QSpinBox(); - _duration->setMaximum(5000); - _onlySendToOBS = new QCheckBox( - obs_module_text("AdvSceneSwitcher.action.hotkey.onlyOBS")); - _noKeyPressSimulationWarning = new QLabel( - obs_module_text("AdvSceneSwitcher.action.hotkey.disabled")); - populateKeySelection(_keys); QWidget::connect(_keys, SIGNAL(currentIndexChanged(int)), this, @@ -434,8 +437,8 @@ MacroActionHotkeyEdit::MacroActionHotkeyEdit( SLOT(LMetaChanged(int))); QWidget::connect(_rightMeta, SIGNAL(stateChanged(int)), this, SLOT(RMetaChanged(int))); - QWidget::connect(_duration, SIGNAL(valueChanged(int)), this, - SLOT(DurationChanged(int))); + QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), + this, SLOT(DurationChanged(const Duration &))); QWidget::connect(_onlySendToOBS, SIGNAL(stateChanged(int)), this, SLOT(OnlySendToOBSChanged(int))); @@ -493,7 +496,7 @@ void MacroActionHotkeyEdit::UpdateEntryData() _rightAlt->setChecked(_entryData->_rightAlt); _leftMeta->setChecked(_entryData->_leftMeta); _rightMeta->setChecked(_entryData->_rightMeta); - _duration->setValue(_entryData->_duration); + _duration->SetDuration(_entryData->_duration); _onlySendToOBS->setChecked(_entryData->_onlySendToObs || !canSimulateKeyPresses); SetWarningVisibility(); @@ -579,14 +582,14 @@ void MacroActionHotkeyEdit::RMetaChanged(int state) _entryData->_rightMeta = state; } -void MacroActionHotkeyEdit::DurationChanged(int ms) +void MacroActionHotkeyEdit::DurationChanged(const Duration &dur) { if (_loading || !_entryData) { return; } std::lock_guard lock(switcher->m); - _entryData->_duration = ms; + _entryData->_duration = dur; } void MacroActionHotkeyEdit::OnlySendToOBSChanged(int state) diff --git a/src/macro-core/macro-action-hotkey.hpp b/src/macro-core/macro-action-hotkey.hpp index 0a4cb53b..07186f90 100644 --- a/src/macro-core/macro-action-hotkey.hpp +++ b/src/macro-core/macro-action-hotkey.hpp @@ -1,6 +1,7 @@ #pragma once #include "macro-action-edit.hpp" #include "hotkey.hpp" +#include "duration-control.hpp" #include #include @@ -30,7 +31,7 @@ public: bool _rightAlt = false; bool _leftMeta = false; bool _rightMeta = false; - int _duration = 300; // in ms + Duration _duration = 0.3; #ifdef __APPLE__ bool _onlySendToObs = true; #else @@ -68,7 +69,7 @@ private slots: void RAltChanged(int state); void LMetaChanged(int state); void RMetaChanged(int state); - void DurationChanged(int ms); + void DurationChanged(const Duration &); void OnlySendToOBSChanged(int state); protected: @@ -81,7 +82,7 @@ protected: QCheckBox *_rightAlt; QCheckBox *_leftMeta; QCheckBox *_rightMeta; - QSpinBox *_duration; + DurationSelection *_duration; QCheckBox *_onlySendToOBS; QLabel *_noKeyPressSimulationWarning;