Skip to content

Commit 2498cef

Browse files
committed
Draft source interaction action
1 parent b88209f commit 2498cef

File tree

6 files changed

+1283
-1
lines changed

6 files changed

+1283
-1
lines changed

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,8 @@ target_sources(
301301
src/utils/screenshot-helper.hpp
302302
src/utils/section.cpp
303303
src/utils/section.hpp
304+
src/utils/source-interact.cpp
305+
src/utils/source-interact.hpp
304306
src/utils/slider-spinbox.cpp
305307
src/utils/slider-spinbox.hpp
306308
src/utils/source-selection.cpp

data/locale/en-US.ini

+25
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,12 @@ AdvSceneSwitcher.action.source.type.pressSettingsButton="Press settings button"
561561
AdvSceneSwitcher.action.source.type.refreshSettings.tooltip="Can be used to refresh browser, media, etc. sources"
562562
AdvSceneSwitcher.action.source.type.deinterlaceMode="Set deinterlace mode"
563563
AdvSceneSwitcher.action.source.type.deinterlaceOrder="Set deinterlace field order"
564+
AdvSceneSwitcher.action.source.type.interact="Interact"
565+
AdvSceneSwitcher.action.source.type.interact.selectType="Interaction type:{{type}}"
566+
AdvSceneSwitcher.action.source.type.interact.mouseClick="Send mouse click"
567+
AdvSceneSwitcher.action.source.type.interact.mouseMove="Send mouse move"
568+
AdvSceneSwitcher.action.source.type.interact.mouseWheel="Send mouse wheel"
569+
AdvSceneSwitcher.action.source.type.interact.keyPress="Send key press"
564570
AdvSceneSwitcher.action.source.noSettingsButtons="No buttons found!"
565571
AdvSceneSwitcher.action.source.entry="{{actions}}{{sources}}{{settingsButtons}}{{deinterlaceMode}}{{deinterlaceOrder}}"
566572
AdvSceneSwitcher.action.source.warning="Warning: Enabling and disabling sources globally cannot be controlled by the OBS UI\nYou might be looking for \"Scene item visibility\""
@@ -1197,3 +1203,22 @@ AdvSceneSwitcher.duration.condition.within="Within the last"
11971203
AdvSceneSwitcher.audio.monitor.none="Monitor Off"
11981204
AdvSceneSwitcher.audio.monitor.monitorOnly="Monitor Only (mute output)"
11991205
AdvSceneSwitcher.audio.monitor.both="Monitor and Output"
1206+
1207+
AdvSceneSwitcher.key="Key:"
1208+
AdvSceneSwitcher.key.up="Key up:"
1209+
1210+
AdvSceneSwitcher.modifierKey="Modifier keys:"
1211+
AdvSceneSwitcher.modifierKey.shift="Shift"
1212+
AdvSceneSwitcher.modifierKey.ctrl="Ctrl"
1213+
AdvSceneSwitcher.modifierKey.alt="Alt"
1214+
AdvSceneSwitcher.modifierKey.meta="Meta"
1215+
1216+
AdvSceneSwitcher.mouse.button="Mouse button:"
1217+
AdvSceneSwitcher.mouse.button.left="Left"
1218+
AdvSceneSwitcher.mouse.button.middle="Middle"
1219+
AdvSceneSwitcher.mouse.button.right="Right"
1220+
AdvSceneSwitcher.mouse.position="Mouse position:"
1221+
AdvSceneSwitcher.mouse.up="Mouse up event:"
1222+
AdvSceneSwitcher.mouse.count="Mouse click count:"
1223+
AdvSceneSwitcher.mouse.leave="Mouse leave event:"
1224+
AdvSceneSwitcher.mouse.scrollAmount="Mouse scroll amount:"

src/macro-core/macro-action-source.cpp

+39-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ const static std::map<MacroActionSource::Action, std::string> actionTypes = {
2727
"AdvSceneSwitcher.action.source.type.deinterlaceMode"},
2828
{MacroActionSource::Action::DEINTERLACE_FIELD_ORDER,
2929
"AdvSceneSwitcher.action.source.type.deinterlaceOrder"},
30+
{MacroActionSource::Action::INTERACT,
31+
"AdvSceneSwitcher.action.source.type.interact"},
3032
};
3133

3234
const static std::map<obs_deinterlace_mode, std::string> deinterlaceModes = {
@@ -128,6 +130,8 @@ bool MacroActionSource::PerformAction()
128130
break;
129131
case Action::SETTINGS_BUTTON:
130132
pressSourceButton(_button, s);
133+
case Action::INTERACT:
134+
_interaction.SendToSource(s);
131135
break;
132136
case Action::DEINTERLACE_MODE:
133137
obs_source_set_deinterlace_mode(s, _deinterlaceMode);
@@ -165,6 +169,7 @@ bool MacroActionSource::Save(obs_data_t *obj) const
165169
static_cast<int>(_deinterlaceMode));
166170
obs_data_set_int(obj, "deinterlaceOrder",
167171
static_cast<int>(_deinterlaceOrder));
172+
_interaction.Save(obj);
168173
return true;
169174
}
170175

@@ -179,6 +184,7 @@ bool MacroActionSource::Load(obs_data_t *obj)
179184
obs_data_get_int(obj, "deinterlaceMode"));
180185
_deinterlaceOrder = static_cast<obs_deinterlace_field_order>(
181186
obs_data_get_int(obj, "deinterlaceOrder"));
187+
_interaction.Load(obj);
182188
return true;
183189
}
184190

@@ -249,7 +255,8 @@ MacroActionSourceEdit::MacroActionSourceEdit(
249255
_deinterlaceMode(new QComboBox()),
250256
_deinterlaceOrder(new QComboBox()),
251257
_warning(new QLabel(
252-
obs_module_text("AdvSceneSwitcher.action.source.warning")))
258+
obs_module_text("AdvSceneSwitcher.action.source.warning"))),
259+
_interaction(new SourceInteractionWidget())
253260
{
254261
populateActionSelection(_actions);
255262
auto sources = GetSourceNames();
@@ -273,6 +280,13 @@ MacroActionSourceEdit::MacroActionSourceEdit(
273280
this, SLOT(DeinterlaceModeChanged(int)));
274281
QWidget::connect(_deinterlaceOrder, SIGNAL(currentIndexChanged(int)),
275282
this, SLOT(DeinterlaceOrderChanged(int)));
283+
QWidget::connect(
284+
_interaction,
285+
SIGNAL(SettingsChanged(SourceInteractionInstance *)), this,
286+
SLOT(InteractionSettingsChanged(SourceInteractionInstance *)));
287+
QWidget::connect(_interaction,
288+
SIGNAL(TypeChanged(SourceInteraction::Type)), this,
289+
SLOT(InteractionTypeChanged(SourceInteraction::Type)));
276290

277291
QVBoxLayout *mainLayout = new QVBoxLayout;
278292
QHBoxLayout *entryLayout = new QHBoxLayout;
@@ -294,6 +308,7 @@ MacroActionSourceEdit::MacroActionSourceEdit(
294308
buttonLayout->addWidget(_getSettings);
295309
buttonLayout->addStretch();
296310
mainLayout->addLayout(buttonLayout);
311+
mainLayout->addWidget(_interaction);
297312
setLayout(mainLayout);
298313

299314
_entryData = entryData;
@@ -318,6 +333,7 @@ void MacroActionSourceEdit::UpdateEntryData()
318333
static_cast<int>(_entryData->_deinterlaceMode)));
319334
_deinterlaceOrder->setCurrentIndex(_deinterlaceOrder->findData(
320335
static_cast<int>(_entryData->_deinterlaceOrder)));
336+
_interaction->SetSourceInteractionSelection(_entryData->_interaction);
321337
SetWidgetVisibility();
322338
}
323339

@@ -377,6 +393,16 @@ void MacroActionSourceEdit::SettingsChanged()
377393

378394
auto lock = LockContext();
379395
_entryData->_settings = _settings->toPlainText().toStdString();
396+
}
397+
398+
void MacroActionSourceEdit::InteractionTypeChanged(SourceInteraction::Type value)
399+
{
400+
if (_loading || !_entryData) {
401+
return;
402+
}
403+
404+
auto lock = LockContext();
405+
_entryData->_interaction.SetType(value);
380406

381407
adjustSize();
382408
updateGeometry();
@@ -405,6 +431,16 @@ void MacroActionSourceEdit::DeinterlaceOrderChanged(int idx)
405431
_deinterlaceOrder->itemData(idx).toInt());
406432
}
407433

434+
void MacroActionSourceEdit::InteractionSettingsChanged(
435+
SourceInteractionInstance *value)
436+
{
437+
if (_loading || !_entryData) {
438+
return;
439+
}
440+
auto lock = LockContext();
441+
_entryData->_interaction.SetSettings(value);
442+
}
443+
408444
void MacroActionSourceEdit::SetWidgetVisibility()
409445
{
410446
const bool showSettings = _entryData->_action ==
@@ -424,6 +460,8 @@ void MacroActionSourceEdit::SetWidgetVisibility()
424460
_deinterlaceOrder->setVisible(
425461
_entryData->_action ==
426462
MacroActionSource::Action::DEINTERLACE_FIELD_ORDER);
463+
_interaction->setVisible(_entryData->_action ==
464+
MacroActionSource::Action::INTERACT);
427465
adjustSize();
428466
updateGeometry();
429467
}

src/macro-core/macro-action-source.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "macro-action-edit.hpp"
33
#include "variable-text-edit.hpp"
44
#include "source-selection.hpp"
5+
#include "source-interact.hpp"
56

67
#include <QSpinBox>
78
#include <QLabel>
@@ -39,6 +40,7 @@ class MacroActionSource : public MacroAction {
3940
obs_deinterlace_mode _deinterlaceMode = OBS_DEINTERLACE_MODE_DISABLE;
4041
obs_deinterlace_field_order _deinterlaceOrder =
4142
OBS_DEINTERLACE_FIELD_ORDER_TOP;
43+
SourceInteraction _interaction;
4244

4345
enum class Action {
4446
ENABLE,
@@ -48,6 +50,7 @@ class MacroActionSource : public MacroAction {
4850
SETTINGS_BUTTON,
4951
DEINTERLACE_MODE,
5052
DEINTERLACE_FIELD_ORDER,
53+
INTERACT,
5154
};
5255
Action _action = Action::ENABLE;
5356

@@ -80,6 +83,8 @@ private slots:
8083
void SettingsChanged();
8184
void DeinterlaceModeChanged(int);
8285
void DeinterlaceOrderChanged(int);
86+
void InteractionTypeChanged(SourceInteraction::Type value);
87+
void InteractionSettingsChanged(SourceInteractionInstance *value);
8388
signals:
8489
void HeaderInfoChanged(const QString &);
8590

@@ -92,6 +97,8 @@ private slots:
9297
QComboBox *_deinterlaceMode;
9398
QComboBox *_deinterlaceOrder;
9499
QLabel *_warning;
100+
SourceInteractionWidget *_interaction;
101+
95102
std::shared_ptr<MacroActionSource> _entryData;
96103

97104
private:

0 commit comments

Comments
 (0)