Compare commits

..

3 Commits

Author SHA1 Message Date
WarmUpTill
189fa5c314 toolbar 2026-01-20 20:10:21 +01:00
WarmUpTill
393d70be33 widget wrapper 2026-01-19 19:08:33 +01:00
WarmUpTill
422c1a39cb layout stuff 2026-01-18 12:30:07 +01:00
33 changed files with 209 additions and 593 deletions

View File

@@ -429,7 +429,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="Verstecken"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="Umschalten" AdvSceneSwitcher.action.sceneVisibility.type.toggle="Umschalten"
AdvSceneSwitcher.action.sceneVisibility.type.source="Quelle" AdvSceneSwitcher.action.sceneVisibility.type.source="Quelle"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Beliebig" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Beliebig"
AdvSceneSwitcher.action.sceneVisibility.layout="Auf{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="Auf{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="Filter" AdvSceneSwitcher.action.filter="Filter"
AdvSceneSwitcher.action.filter.type.enable="Aktivieren" AdvSceneSwitcher.action.filter.type.enable="Aktivieren"
AdvSceneSwitcher.action.filter.type.disable="Deaktivieren" AdvSceneSwitcher.action.filter.type.disable="Deaktivieren"

View File

@@ -157,15 +157,11 @@ AdvSceneSwitcher.mqttConnectionTab.removeMultipleConnectionsPopup.text="Are you
# Macro Tab # Macro Tab
AdvSceneSwitcher.macroTab.title="Macro" AdvSceneSwitcher.macroTab.title="Macro"
AdvSceneSwitcher.macroTab.macros="Macros"
AdvSceneSwitcher.macroTab.priorityWarning="Note: It is recommended to configure macros to be the highest priority functionality.\nThis setting can be changed on the General tab." AdvSceneSwitcher.macroTab.priorityWarning="Note: It is recommended to configure macros to be the highest priority functionality.\nThis setting can be changed on the General tab."
AdvSceneSwitcher.macroTab.help="Macros allow you to execute a string of actions depending on multiple conditions.\n\nClick on the highlighted plus symbol to add a new Macro." AdvSceneSwitcher.macroTab.help="Macros allow you to execute a string of actions depending on multiple conditions.\n\nClick on the highlighted plus symbol to add a new Macro."
AdvSceneSwitcher.macroTab.macroLastExecutedTooltip="Was last executed %1 seconds ago."
AdvSceneSwitcher.macroTab.macroNotYetExecutedTooltip="Was not yet executed."
AdvSceneSwitcher.macroTab.editConditionHelp="This section allows you to define macro conditions.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new condition." AdvSceneSwitcher.macroTab.editConditionHelp="This section allows you to define macro conditions.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new condition."
AdvSceneSwitcher.macroTab.editActionHelp="This section allows you to define macro actions.\nThe actions in this section will be performed when the conditions are met.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new action." AdvSceneSwitcher.macroTab.editActionHelp="This section allows you to define macro actions.\nThe actions in this section will be performed when the conditions are met.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new action."
AdvSceneSwitcher.macroTab.editElseActionHelp="This section allows you to define macro actions.\nThe actions in this section will be performed when the conditions are *not* met.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new action." AdvSceneSwitcher.macroTab.editElseActionHelp="This section allows you to define macro actions.\nThe actions in this section will be performed when the conditions are *not* met.\n\nSelect an existing or add a new macro on the left.\nThen click the plus button below to add a new action."
AdvSceneSwitcher.macroTab.edit="Edit macro"
AdvSceneSwitcher.macroTab.edit.logic="Logic type:" AdvSceneSwitcher.macroTab.edit.logic="Logic type:"
AdvSceneSwitcher.macroTab.edit.condition="Condition type:" AdvSceneSwitcher.macroTab.edit.condition="Condition type:"
AdvSceneSwitcher.macroTab.edit.action="Action type:" AdvSceneSwitcher.macroTab.edit.action="Action type:"
@@ -918,9 +914,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="Hide"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="Toggle" AdvSceneSwitcher.action.sceneVisibility.type.toggle="Toggle"
AdvSceneSwitcher.action.sceneVisibility.type.source="Source" AdvSceneSwitcher.action.sceneVisibility.type.source="Source"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Any" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Any"
AdvSceneSwitcher.action.sceneVisibility.layout="On{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="On{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.sceneVisibility.layout.transition="{{updateTransition}}Set transition to{{transitions}}"
AdvSceneSwitcher.action.sceneVisibility.layout.duration="{{updateDuration}}Set transition duration to{{duration}}seconds"
AdvSceneSwitcher.action.filter="Filter" AdvSceneSwitcher.action.filter="Filter"
AdvSceneSwitcher.action.filter.type.enable="Enable" AdvSceneSwitcher.action.filter.type.enable="Enable"
AdvSceneSwitcher.action.filter.type.disable="Disable" AdvSceneSwitcher.action.filter.type.disable="Disable"
@@ -1196,8 +1190,6 @@ AdvSceneSwitcher.action.variable.type.swapValues="Swap variable values"
AdvSceneSwitcher.action.variable.type.trim="Trim whitespace" AdvSceneSwitcher.action.variable.type.trim="Trim whitespace"
AdvSceneSwitcher.action.variable.type.changeCase="Change case" AdvSceneSwitcher.action.variable.type.changeCase="Change case"
AdvSceneSwitcher.action.variable.type.randomNumber="Generate random number" AdvSceneSwitcher.action.variable.type.randomNumber="Generate random number"
AdvSceneSwitcher.action.variable.type.randomListValue="Select random value"
AdvSceneSwitcher.action.variable.type.allowRepeat="Allow repeat values"
AdvSceneSwitcher.action.variable.case.type.lowerCase="lowercase" AdvSceneSwitcher.action.variable.case.type.lowerCase="lowercase"
AdvSceneSwitcher.action.variable.case.type.upperCase="UPPERCASE" AdvSceneSwitcher.action.variable.case.type.upperCase="UPPERCASE"
AdvSceneSwitcher.action.variable.case.type.capitalized="Capitalized" AdvSceneSwitcher.action.variable.case.type.capitalized="Capitalized"

View File

@@ -350,7 +350,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.show="Mostrar"
AdvSceneSwitcher.action.sceneVisibility.type.hide="Ocultar" AdvSceneSwitcher.action.sceneVisibility.type.hide="Ocultar"
AdvSceneSwitcher.action.sceneVisibility.type.source="Fuente" AdvSceneSwitcher.action.sceneVisibility.type.source="Fuente"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Cualquiera" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Cualquiera"
AdvSceneSwitcher.action.sceneVisibility.layout="En{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="En{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="Filtro" AdvSceneSwitcher.action.filter="Filtro"
AdvSceneSwitcher.action.filter.type.enable="Habilitar" AdvSceneSwitcher.action.filter.type.enable="Habilitar"
AdvSceneSwitcher.action.filter.type.disable="Deshabilitar" AdvSceneSwitcher.action.filter.type.disable="Deshabilitar"

View File

@@ -510,7 +510,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="Masquer"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="Basculer" AdvSceneSwitcher.action.sceneVisibility.type.toggle="Basculer"
AdvSceneSwitcher.action.sceneVisibility.type.source="Source" AdvSceneSwitcher.action.sceneVisibility.type.source="Source"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="N'importe" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="N'importe"
AdvSceneSwitcher.action.sceneVisibility.layout="Sur{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="Sur{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="Filtre" AdvSceneSwitcher.action.filter="Filtre"
AdvSceneSwitcher.action.filter.type.enable="Activer" AdvSceneSwitcher.action.filter.type.enable="Activer"
AdvSceneSwitcher.action.filter.type.disable="Désactiver" AdvSceneSwitcher.action.filter.type.disable="Désactiver"

View File

@@ -870,6 +870,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="非表示"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="切り替え" AdvSceneSwitcher.action.sceneVisibility.type.toggle="切り替え"
; AdvSceneSwitcher.action.sceneVisibility.type.source="Source" ; AdvSceneSwitcher.action.sceneVisibility.type.source="Source"
; AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Any" ; AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Any"
; AdvSceneSwitcher.action.sceneVisibility.entry="On{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="フィルタ" AdvSceneSwitcher.action.filter="フィルタ"
AdvSceneSwitcher.action.filter.type.enable="有効にする" AdvSceneSwitcher.action.filter.type.enable="有効にする"
AdvSceneSwitcher.action.filter.type.disable="無効化" AdvSceneSwitcher.action.filter.type.disable="無効化"

View File

@@ -781,7 +781,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="Ocultar"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="Alternar" AdvSceneSwitcher.action.sceneVisibility.type.toggle="Alternar"
AdvSceneSwitcher.action.sceneVisibility.type.source="Fonte" AdvSceneSwitcher.action.sceneVisibility.type.source="Fonte"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Qualquer" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Qualquer"
AdvSceneSwitcher.action.sceneVisibility.layout="Em{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="Em{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="Filtro" AdvSceneSwitcher.action.filter="Filtro"
AdvSceneSwitcher.action.filter.type.enable="Habilitar" AdvSceneSwitcher.action.filter.type.enable="Habilitar"
AdvSceneSwitcher.action.filter.type.disable="Desabilitar" AdvSceneSwitcher.action.filter.type.disable="Desabilitar"

View File

@@ -281,7 +281,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.show="Göster"
AdvSceneSwitcher.action.sceneVisibility.type.hide="Gizle" AdvSceneSwitcher.action.sceneVisibility.type.hide="Gizle"
AdvSceneSwitcher.action.sceneVisibility.type.source="Kayıt" AdvSceneSwitcher.action.sceneVisibility.type.source="Kayıt"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Herhangi" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="Herhangi"
AdvSceneSwitcher.action.sceneVisibility.layout="Açık{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="Açık{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="Filtrele" AdvSceneSwitcher.action.filter="Filtrele"
AdvSceneSwitcher.action.filter.type.enable="Etkin" AdvSceneSwitcher.action.filter.type.enable="Etkin"
AdvSceneSwitcher.action.filter.type.disable="Etkisiz" AdvSceneSwitcher.action.filter.type.disable="Etkisiz"

View File

@@ -840,7 +840,7 @@ AdvSceneSwitcher.action.sceneVisibility.type.hide="隐藏"
AdvSceneSwitcher.action.sceneVisibility.type.toggle="切换可见性" AdvSceneSwitcher.action.sceneVisibility.type.toggle="切换可见性"
AdvSceneSwitcher.action.sceneVisibility.type.source="源" AdvSceneSwitcher.action.sceneVisibility.type.source="源"
AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="任何" AdvSceneSwitcher.action.sceneVisibility.type.sourceGroup="任何"
AdvSceneSwitcher.action.sceneVisibility.layout="{{scenes}}{{actions}}{{sources}}" AdvSceneSwitcher.action.sceneVisibility.entry="{{scenes}}{{actions}}{{sources}}"
AdvSceneSwitcher.action.filter="滤镜" AdvSceneSwitcher.action.filter="滤镜"
AdvSceneSwitcher.action.filter.type.enable="开启" AdvSceneSwitcher.action.filter.type.enable="开启"
AdvSceneSwitcher.action.filter.type.disable="关闭" AdvSceneSwitcher.action.filter.type.disable="关闭"

View File

@@ -68,10 +68,22 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>962</width> <width>962</width>
<height>1160</height> <height>1142</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_19"> <layout class="QVBoxLayout" name="verticalLayout_19">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item> <item>
<widget class="QGroupBox" name="statusBox"> <widget class="QGroupBox" name="statusBox">
<property name="title"> <property name="title">
@@ -590,11 +602,8 @@
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<widget class="QGroupBox" name="groupBox_5"> <widget class="QWidget" name="wrapper">
<property name="title"> <layout class="QVBoxLayout" name="verticalLayout_10">
<string>AdvSceneSwitcher.macroTab.macros</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_36">
<item> <item>
<widget class="QLabel" name="macroPriorityWarning"> <widget class="QLabel" name="macroPriorityWarning">
<property name="text"> <property name="text">
@@ -677,66 +686,34 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="macroControlLayout"> <widget class="QToolBar" name="macrosToolbar">
<item> <property name="sizePolicy">
<widget class="QToolButton" name="macroAdd"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<property name="toolTip"> <horstretch>0</horstretch>
<string>AdvSceneSwitcher.macroTab.tooltip.macroAddButton</string> <verstretch>0</verstretch>
</property> </sizepolicy>
<property name="themeID" stdset="0"> </property>
<string notr="true">addIconSmall</string> <property name="iconSize">
</property> <size>
<property name="class" stdset="0"> <width>16</width>
<string notr="true">icon-plus</string> <height>16</height>
</property> </size>
</widget> </property>
</item> <property name="floatable">
<item> <bool>false</bool>
<widget class="QToolButton" name="macroRemove"> </property>
<property name="toolTip"> <addaction name="macroAdd"/>
<string>AdvSceneSwitcher.macroTab.tooltip.macroRemoveButton</string> <addaction name="macroRemove"/>
</property> <addaction name="separator"/>
<property name="themeID" stdset="0"> <addaction name="macroUp"/>
<string notr="true">removeIconSmall</string> <addaction name="macroDown"/>
</property> </widget>
<property name="class" stdset="0">
<string notr="true">icon-trash</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="macroUp">
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroUpButton</string>
</property>
<property name="themeID" stdset="0">
<string notr="true">upArrowIconSmall</string>
</property>
<property name="class" stdset="0">
<string notr="true">icon-up</string>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="macroDown">
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroDownButton</string>
</property>
<property name="themeID" stdset="0">
<string notr="true">downArrowIconSmall</string>
</property>
<property name="class" stdset="0">
<string notr="true">icon-down</string>
</property>
</widget>
</item>
</layout>
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QGroupBox" name="macroEditGroup"> <widget class="QGroupBox" name="macroEditGroup">
<property name="title"> <property name="title">
<string>AdvSceneSwitcher.macroTab.edit</string> <string>AdvSceneSwitcher.macroTab.title</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_38"> <layout class="QVBoxLayout" name="verticalLayout_38">
<item> <item>
@@ -4045,6 +4022,78 @@
</widget> </widget>
</item> </item>
</layout> </layout>
<action name="macroAdd">
<property name="icon">
<iconset>
<normaloff>:/res/images/plus.svg</normaloff>:/res/images/plus.svg</iconset>
</property>
<property name="text">
<string>Add</string>
</property>
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroAddButton</string>
</property>
<property name="class" stdset="0">
<string notr="true">icon-plus</string>
</property>
<property name="themeID" stdset="0">
<string notr="true">addIconSmall</string>
</property>
</action>
<action name="macroRemove">
<property name="icon">
<iconset>
<normaloff>:/res/images/minus.svg</normaloff>:/res/images/minus.svg</iconset>
</property>
<property name="text">
<string>Remove</string>
</property>
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroRemoveButton</string>
</property>
<property name="shortcut">
<string>Del</string>
</property>
<property name="shortcutContext">
<enum>Qt::WidgetWithChildrenShortcut</enum>
</property>
<property name="iconVisibleInMenu">
<bool>false</bool>
</property>
<property name="class" stdset="0">
<string notr="true">icon-trash</string>
</property>
</action>
<action name="macroUp">
<property name="icon">
<iconset>
<normaloff>:/res/images/up.svg</normaloff>:/res/images/up.svg</iconset>
</property>
<property name="text">
<string>MoveUp</string>
</property>
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroUpButton</string>
</property>
<property name="class" stdset="0">
<string notr="true">icon-up</string>
</property>
</action>
<action name="macroDown">
<property name="icon">
<iconset>
<normaloff>:/res/images/down.svg</normaloff>:/res/images/down.svg</iconset>
</property>
<property name="text">
<string>MoveDown</string>
</property>
<property name="toolTip">
<string>AdvSceneSwitcher.macroTab.tooltip.macroDownButton</string>
</property>
<property name="class" stdset="0">
<string notr="true">icon-down</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>
@@ -4110,11 +4159,6 @@
<tabstop>priorityUp</tabstop> <tabstop>priorityUp</tabstop>
<tabstop>priorityDown</tabstop> <tabstop>priorityDown</tabstop>
<tabstop>threadPriority</tabstop> <tabstop>threadPriority</tabstop>
<tabstop>macros</tabstop>
<tabstop>macroAdd</tabstop>
<tabstop>macroRemove</tabstop>
<tabstop>macroUp</tabstop>
<tabstop>macroDown</tabstop>
<tabstop>macroName</tabstop> <tabstop>macroName</tabstop>
<tabstop>runMacro</tabstop> <tabstop>runMacro</tabstop>
<tabstop>runMacroInParallel</tabstop> <tabstop>runMacroInParallel</tabstop>

View File

@@ -101,10 +101,10 @@ public:
void HighlightMacroSettingsButton(bool enable = true); void HighlightMacroSettingsButton(bool enable = true);
public slots: public slots:
void on_macroAdd_clicked(); void on_macroAdd_triggered();
void on_macroRemove_clicked(); void on_macroRemove_triggered();
void on_macroUp_clicked() const; void on_macroUp_triggered() const;
void on_macroDown_clicked() const; void on_macroDown_triggered() const;
void on_macroName_editingFinished(); void on_macroName_editingFinished();
void on_runMacroInParallel_stateChanged(int value) const; void on_runMacroInParallel_stateChanged(int value) const;
void on_runMacroOnChange_stateChanged(int value) const; void on_runMacroOnChange_stateChanged(int value) const;

View File

@@ -219,43 +219,6 @@ void MacroActionVariable::GenerateRandomNumber(Variable *var)
} }
} }
void MacroActionVariable::PickRandomValue(Variable *var)
{
static std::random_device rd;
static std::mt19937 gen(rd());
static const uint8_t maxIter = 255;
if (_randomValues.isEmpty()) {
return;
}
if (_randomValues.size() == 1) {
const auto &value = _randomValues.at(0);
var->SetValue(value);
_lastRandomValue = value;
}
std::uniform_int_distribution<int> dis(0, _randomValues.size() - 1);
StringVariable value = _randomValues.at(dis(gen));
uint8_t iter = 0;
for (; !_allowRepeatValues && iter < maxIter &&
_lastRandomValue.has_value() &&
std::string(value) == _lastRandomValue.value();
iter++) {
value = _randomValues.at(dis(gen));
}
if (iter == maxIter) {
blog(LOG_INFO,
"giving up picking non-repeat random value after %d tries",
maxIter);
}
var->SetValue(value);
_lastRandomValue = value;
}
struct AskForInputParams { struct AskForInputParams {
AskForInputParams(const QString &prompt_, const QString &placeholder_) AskForInputParams(const QString &prompt_, const QString &placeholder_)
: prompt(prompt_), : prompt(prompt_),
@@ -495,9 +458,6 @@ bool MacroActionVariable::PerformAction()
case Action::RANDOM_NUMBER: case Action::RANDOM_NUMBER:
GenerateRandomNumber(var.get()); GenerateRandomNumber(var.get());
return true; return true;
case Action::RANDOM_LIST_VALUE:
PickRandomValue(var.get());
return true;
} }
return true; return true;
@@ -538,8 +498,6 @@ bool MacroActionVariable::Save(obs_data_t *obj) const
_randomNumberStart.Save(obj, "randomNumberStart"); _randomNumberStart.Save(obj, "randomNumberStart");
_randomNumberEnd.Save(obj, "randomNumberEnd"); _randomNumberEnd.Save(obj, "randomNumberEnd");
obs_data_set_bool(obj, "generateInteger", _generateInteger); obs_data_set_bool(obj, "generateInteger", _generateInteger);
_randomValues.Save(obj, "randomValues", "value");
obs_data_set_bool(obj, "allowRepeatValues", _allowRepeatValues);
_jsonQuery.Save(obj, "jsonQuery"); _jsonQuery.Save(obj, "jsonQuery");
_jsonIndex.Save(obj, "jsonIndex"); _jsonIndex.Save(obj, "jsonIndex");
@@ -598,8 +556,6 @@ bool MacroActionVariable::Load(obs_data_t *obj)
_randomNumberStart.Load(obj, "randomNumberStart"); _randomNumberStart.Load(obj, "randomNumberStart");
_randomNumberEnd.Load(obj, "randomNumberEnd"); _randomNumberEnd.Load(obj, "randomNumberEnd");
_generateInteger = obs_data_get_bool(obj, "generateInteger"); _generateInteger = obs_data_get_bool(obj, "generateInteger");
_randomValues.Load(obj, "randomValues", "value");
_allowRepeatValues = obs_data_get_bool(obj, "allowRepeatValues");
_jsonQuery.Load(obj, "jsonQuery"); _jsonQuery.Load(obj, "jsonQuery");
_jsonIndex.Load(obj, "jsonIndex"); _jsonIndex.Load(obj, "jsonIndex");
@@ -768,8 +724,6 @@ static inline void populateActionSelection(QComboBox *list)
"AdvSceneSwitcher.action.variable.type.roundToInt"}, "AdvSceneSwitcher.action.variable.type.roundToInt"},
{MacroActionVariable::Action::RANDOM_NUMBER, {MacroActionVariable::Action::RANDOM_NUMBER,
"AdvSceneSwitcher.action.variable.type.randomNumber"}, "AdvSceneSwitcher.action.variable.type.randomNumber"},
{MacroActionVariable::Action::RANDOM_LIST_VALUE,
"AdvSceneSwitcher.action.variable.type.randomListValue"},
{true, ""}, // Separator {true, ""}, // Separator
{MacroActionVariable::Action::USER_INPUT, {MacroActionVariable::Action::USER_INPUT,
@@ -882,13 +836,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
obs_module_text( obs_module_text(
"AdvSceneSwitcher.action.variable.generateInteger"), "AdvSceneSwitcher.action.variable.generateInteger"),
this)), this)),
_randomNumberLayout(new QVBoxLayout()), _randomLayout(new QVBoxLayout()),
_randomValues(new StringListEdit(this)),
_allowRepeatValues(new QCheckBox(
obs_module_text(
"AdvSceneSwitcher.action.variable.type.allowRepeat"),
this)),
_randomValueLayout(new QVBoxLayout()),
_jsonQuery(new VariableLineEdit(this)), _jsonQuery(new VariableLineEdit(this)),
_jsonQueryHelp(new HelpIcon( _jsonQueryHelp(new HelpIcon(
obs_module_text( obs_module_text(
@@ -924,7 +872,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
_randomNumberStart->setMaximum(9999999999); _randomNumberStart->setMaximum(9999999999);
_randomNumberEnd->setMinimum(-9999999999); _randomNumberEnd->setMinimum(-9999999999);
_randomNumberEnd->setMaximum(9999999999); _randomNumberEnd->setMaximum(9999999999);
_randomValues->SetMaxStringSize(99999999);
_jsonIndex->setMaximum(999); _jsonIndex->setMaximum(999);
QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)), QWidget::connect(_variables, SIGNAL(SelectionChanged(const QString &)),
@@ -1013,11 +960,6 @@ MacroActionVariableEdit::MacroActionVariableEdit(
SLOT(RandomNumberEndChanged(const NumberVariable<double> &))); SLOT(RandomNumberEndChanged(const NumberVariable<double> &)));
QWidget::connect(_generateInteger, SIGNAL(stateChanged(int)), this, QWidget::connect(_generateInteger, SIGNAL(stateChanged(int)), this,
SLOT(GenerateIntegerChanged(int))); SLOT(GenerateIntegerChanged(int)));
QWidget::connect(_randomValues,
SIGNAL(StringListChanged(const StringList &)), this,
SLOT(RandomValueListChanged(const StringList &)));
QWidget::connect(_allowRepeatValues, SIGNAL(stateChanged(int)), this,
SLOT(AllowRepeatValuesChanged(int)));
QWidget::connect(_jsonQuery, SIGNAL(editingFinished()), this, QWidget::connect(_jsonQuery, SIGNAL(editingFinished()), this,
SLOT(JsonQueryChanged())); SLOT(JsonQueryChanged()));
QWidget::connect( QWidget::connect(
@@ -1084,11 +1026,8 @@ MacroActionVariableEdit::MacroActionVariableEdit(
obs_module_text( obs_module_text(
"AdvSceneSwitcher.action.variable.layout.randomNumber"), "AdvSceneSwitcher.action.variable.layout.randomNumber"),
randomLayout, widgetPlaceholders); randomLayout, widgetPlaceholders);
_randomNumberLayout->addLayout(randomLayout); _randomLayout->addLayout(randomLayout);
_randomNumberLayout->addWidget(_generateInteger); _randomLayout->addWidget(_generateInteger);
_randomValueLayout->addWidget(_randomValues);
_randomValueLayout->addWidget(_allowRepeatValues);
auto regexConfigLayout = new QHBoxLayout; auto regexConfigLayout = new QHBoxLayout;
regexConfigLayout->addWidget(_subStringRegex); regexConfigLayout->addWidget(_subStringRegex);
@@ -1107,8 +1046,7 @@ MacroActionVariableEdit::MacroActionVariableEdit(
layout->addWidget(_mathExpressionResult); layout->addWidget(_mathExpressionResult);
layout->addLayout(_promptLayout); layout->addLayout(_promptLayout);
layout->addLayout(_placeholderLayout); layout->addLayout(_placeholderLayout);
layout->addLayout(_randomNumberLayout); layout->addLayout(_randomLayout);
layout->addLayout(_randomValueLayout);
setLayout(layout); setLayout(layout);
_entryData = entryData; _entryData = entryData;
@@ -1167,8 +1105,6 @@ void MacroActionVariableEdit::UpdateEntryData()
_randomNumberStart->SetValue(_entryData->_randomNumberStart); _randomNumberStart->SetValue(_entryData->_randomNumberStart);
_randomNumberEnd->SetValue(_entryData->_randomNumberEnd); _randomNumberEnd->SetValue(_entryData->_randomNumberEnd);
_generateInteger->setChecked(_entryData->_generateInteger); _generateInteger->setChecked(_entryData->_generateInteger);
_allowRepeatValues->setChecked(_entryData->_allowRepeatValues);
_randomValues->SetStringList(_entryData->_randomValues);
_jsonQuery->setText(_entryData->_jsonQuery); _jsonQuery->setText(_entryData->_jsonQuery);
_jsonIndex->SetValue(_entryData->_jsonIndex); _jsonIndex->SetValue(_entryData->_jsonIndex);
@@ -1511,18 +1447,6 @@ void MacroActionVariableEdit::GenerateIntegerChanged(int value)
_entryData->_generateInteger = value; _entryData->_generateInteger = value;
} }
void MacroActionVariableEdit::RandomValueListChanged(const StringList &values)
{
GUARD_LOADING_AND_LOCK();
_entryData->_randomValues = values;
}
void MacroActionVariableEdit::AllowRepeatValuesChanged(int value)
{
GUARD_LOADING_AND_LOCK();
_entryData->_allowRepeatValues = value;
}
void MacroActionVariableEdit::JsonQueryChanged() void MacroActionVariableEdit::JsonQueryChanged()
{ {
GUARD_LOADING_AND_LOCK(); GUARD_LOADING_AND_LOCK();
@@ -1717,13 +1641,9 @@ void MacroActionVariableEdit::SetWidgetVisibility()
MacroActionVariable::Action::PAD); MacroActionVariable::Action::PAD);
_caseType->setVisible(_entryData->_action == _caseType->setVisible(_entryData->_action ==
MacroActionVariable::Action::CHANGE_CASE); MacroActionVariable::Action::CHANGE_CASE);
SetLayoutVisible(_randomNumberLayout, SetLayoutVisible(_randomLayout,
_entryData->_action == _entryData->_action ==
MacroActionVariable::Action::RANDOM_NUMBER); MacroActionVariable::Action::RANDOM_NUMBER);
SetLayoutVisible(
_randomValueLayout,
_entryData->_action ==
MacroActionVariable::Action::RANDOM_LIST_VALUE);
_jsonQuery->setVisible(_entryData->_action == _jsonQuery->setVisible(_entryData->_action ==
MacroActionVariable::Action::QUERY_JSON); MacroActionVariable::Action::QUERY_JSON);
_jsonQueryHelp->setVisible(_entryData->_action == _jsonQueryHelp->setVisible(_entryData->_action ==

View File

@@ -6,7 +6,6 @@
#include "resizing-text-edit.hpp" #include "resizing-text-edit.hpp"
#include "scene-selection.hpp" #include "scene-selection.hpp"
#include "single-char-selection.hpp" #include "single-char-selection.hpp"
#include "string-list.hpp"
#include "variable-line-edit.hpp" #include "variable-line-edit.hpp"
#include "variable-text-edit.hpp" #include "variable-text-edit.hpp"
#include "variable-spinbox.hpp" #include "variable-spinbox.hpp"
@@ -57,7 +56,6 @@ public:
QUERY_JSON, QUERY_JSON,
ARRAY_JSON, ARRAY_JSON,
COPY_VAR, COPY_VAR,
RANDOM_LIST_VALUE,
}; };
Action _action = Action::SET_VALUE; Action _action = Action::SET_VALUE;
@@ -109,10 +107,6 @@ public:
DoubleVariable _randomNumberEnd = 100; DoubleVariable _randomNumberEnd = 100;
bool _generateInteger = true; bool _generateInteger = true;
StringList _randomValues = {"value1", "value2", "value3"};
bool _allowRepeatValues = true;
std::optional<std::string> _lastRandomValue;
StringVariable _jsonQuery = "$.some.nested.value"; StringVariable _jsonQuery = "$.some.nested.value";
IntVariable _jsonIndex = 0; IntVariable _jsonIndex = 0;
@@ -125,7 +119,6 @@ private:
void HandleCaseChange(Variable *); void HandleCaseChange(Variable *);
void SetToSceneItemName(Variable *); void SetToSceneItemName(Variable *);
void GenerateRandomNumber(Variable *); void GenerateRandomNumber(Variable *);
void PickRandomValue(Variable *);
std::weak_ptr<MacroSegment> _macroSegment; std::weak_ptr<MacroSegment> _macroSegment;
int _segmentIdxLoadValue = -1; int _segmentIdxLoadValue = -1;
@@ -182,8 +175,6 @@ private slots:
void RandomNumberStartChanged(const NumberVariable<double> &); void RandomNumberStartChanged(const NumberVariable<double> &);
void RandomNumberEndChanged(const NumberVariable<double> &); void RandomNumberEndChanged(const NumberVariable<double> &);
void GenerateIntegerChanged(int); void GenerateIntegerChanged(int);
void RandomValueListChanged(const StringList &);
void AllowRepeatValuesChanged(int);
void JsonQueryChanged(); void JsonQueryChanged();
void JsonIndexChanged(const NumberVariable<int> &); void JsonIndexChanged(const NumberVariable<int> &);
@@ -233,10 +224,7 @@ private:
VariableDoubleSpinBox *_randomNumberStart; VariableDoubleSpinBox *_randomNumberStart;
VariableDoubleSpinBox *_randomNumberEnd; VariableDoubleSpinBox *_randomNumberEnd;
QCheckBox *_generateInteger; QCheckBox *_generateInteger;
QVBoxLayout *_randomNumberLayout; QVBoxLayout *_randomLayout;
StringListEdit *_randomValues;
QCheckBox *_allowRepeatValues;
QVBoxLayout *_randomValueLayout;
VariableLineEdit *_jsonQuery; VariableLineEdit *_jsonQuery;
QLabel *_jsonQueryHelp; QLabel *_jsonQueryHelp;
VariableSpinBox *_jsonIndex; VariableSpinBox *_jsonIndex;

View File

@@ -25,8 +25,6 @@ namespace advss {
static QObject *addPulse = nullptr; static QObject *addPulse = nullptr;
static QTimer onChangeHighlightTimer; static QTimer onChangeHighlightTimer;
static std::chrono::high_resolution_clock::time_point
lastOnChangeHighlightCheckTime{};
static void disableAddButtonHighlight() static void disableAddButtonHighlight()
{ {
@@ -99,7 +97,7 @@ bool AdvSceneSwitcher::AddNewMacro(std::shared_ptr<Macro> &res,
return true; return true;
} }
void AdvSceneSwitcher::on_macroAdd_clicked() void AdvSceneSwitcher::on_macroAdd_triggered()
{ {
// Hotkey to add new macro will also use this function. // Hotkey to add new macro will also use this function.
// Since we don't want the hotkey to have an effect if the macro tab is // Since we don't want the hotkey to have an effect if the macro tab is
@@ -249,12 +247,12 @@ void AdvSceneSwitcher::RenameMacro(std::shared_ptr<Macro> &macro,
MacroSignalManager::Instance()->Rename(oldName, name); MacroSignalManager::Instance()->Rename(oldName, name);
} }
void AdvSceneSwitcher::on_macroRemove_clicked() void AdvSceneSwitcher::on_macroRemove_triggered()
{ {
RemoveSelectedMacros(); RemoveSelectedMacros();
} }
void AdvSceneSwitcher::on_macroUp_clicked() const void AdvSceneSwitcher::on_macroUp_triggered() const
{ {
auto macro = GetSelectedMacro(); auto macro = GetSelectedMacro();
if (!macro) { if (!macro) {
@@ -263,7 +261,7 @@ void AdvSceneSwitcher::on_macroUp_clicked() const
ui->macros->Up(macro); ui->macros->Up(macro);
} }
void AdvSceneSwitcher::on_macroDown_clicked() const void AdvSceneSwitcher::on_macroDown_triggered() const
{ {
auto macro = GetSelectedMacro(); auto macro = GetSelectedMacro();
if (!macro) { if (!macro) {
@@ -552,14 +550,10 @@ void AdvSceneSwitcher::HighlightOnChange() const
return; return;
} }
if (macro->OnChangePreventedActionsSince( if (macro->OnChangePreventedActionsRecently()) {
lastOnChangeHighlightCheckTime)) {
HighlightWidget(ui->runMacroOnChange, Qt::yellow, HighlightWidget(ui->runMacroOnChange, Qt::yellow,
Qt::transparent, true); Qt::transparent, true);
} }
lastOnChangeHighlightCheckTime =
std::chrono::high_resolution_clock::now();
} }
void AdvSceneSwitcher::on_macroSettings_clicked() void AdvSceneSwitcher::on_macroSettings_clicked()
@@ -638,13 +632,11 @@ void AdvSceneSwitcher::SetupMacroTab()
auto &macros = GetTopLevelMacros(); auto &macros = GetTopLevelMacros();
if (macros.size() == 0 && !switcher->disableHints) { if (macros.size() == 0 && !switcher->disableHints) {
addPulse = HighlightWidget(ui->macroAdd, QColor(Qt::green)); addPulse = HighlightWidget(
ui->macrosToolbar->widgetForAction(ui->macroAdd),
QColor(Qt::green));
} }
auto macroControls = setupToolBar({{ui->macroAdd, ui->macroRemove},
{ui->macroUp, ui->macroDown}});
ui->macroControlLayout->addWidget(macroControls);
ui->macros->Reset(macros, GetGlobalMacroSettings()._highlightExecuted); ui->macros->Reset(macros, GetGlobalMacroSettings()._highlightExecuted);
connect(ui->macros, SIGNAL(MacroSelectionChanged()), this, connect(ui->macros, SIGNAL(MacroSelectionChanged()), this,
SLOT(MacroSelectionChanged())); SLOT(MacroSelectionChanged()));
@@ -658,8 +650,6 @@ void AdvSceneSwitcher::SetupMacroTab()
ui->macroPriorityWarning->setVisible( ui->macroPriorityWarning->setVisible(
switcher->functionNamesByPriority[0] != macro_func); switcher->functionNamesByPriority[0] != macro_func);
lastOnChangeHighlightCheckTime =
std::chrono::high_resolution_clock::now();
onChangeHighlightTimer.setInterval(1500); onChangeHighlightTimer.setInterval(1500);
connect(&onChangeHighlightTimer, SIGNAL(timeout()), this, connect(&onChangeHighlightTimer, SIGNAL(timeout()), this,
SLOT(HighlightOnChange())); SLOT(HighlightOnChange()));
@@ -691,7 +681,7 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos)
menu.addAction( menu.addAction(
obs_module_text("AdvSceneSwitcher.macroTab.contextMenuAdd"), obs_module_text("AdvSceneSwitcher.macroTab.contextMenuAdd"),
this, &AdvSceneSwitcher::on_macroAdd_clicked); this, &AdvSceneSwitcher::on_macroAdd_triggered);
auto copy = menu.addAction( auto copy = menu.addAction(
obs_module_text("AdvSceneSwitcher.macroTab.copy"), this, obs_module_text("AdvSceneSwitcher.macroTab.copy"), this,
@@ -707,7 +697,7 @@ void AdvSceneSwitcher::ShowMacroContextMenu(const QPoint &pos)
auto remove = menu.addAction( auto remove = menu.addAction(
obs_module_text("AdvSceneSwitcher.macroTab.remove"), this, obs_module_text("AdvSceneSwitcher.macroTab.remove"), this,
&AdvSceneSwitcher::on_macroRemove_clicked); &AdvSceneSwitcher::on_macroRemove_triggered);
remove->setDisabled(ui->macros->SelectionEmpty()); remove->setDisabled(ui->macros->SelectionEmpty());
menu.addSeparator(); menu.addSeparator();

View File

@@ -5,17 +5,18 @@
#include "path-helpers.hpp" #include "path-helpers.hpp"
#include "sync-helpers.hpp" #include "sync-helpers.hpp"
#include "ui-helpers.hpp" #include "ui-helpers.hpp"
#include "utility.hpp"
#include <obs.h> #include <obs.h>
#include <string> #include <string>
#include <QLabel> #include <QLabel>
#include <QLineEdit> #include <QLineEdit>
#include <QSpacerItem> #include <QSpacerItem>
#include <QPushButton>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QMouseEvent> #include <QMouseEvent>
#include <QStylePainter> #include <QStylePainter>
#include <QToolTip>
Q_DECLARE_METATYPE(std::shared_ptr<advss::Macro>); Q_DECLARE_METATYPE(std::shared_ptr<advss::Macro>);
@@ -89,35 +90,6 @@ MacroTreeItem::MacroTreeItem(MacroTree *tree, std::shared_ptr<Macro> macroItem,
_timer.start(1500); _timer.start(1500);
} }
bool MacroTreeItem::event(QEvent *event)
{
if (event->type() != QEvent::ToolTip) {
return QFrame::event(event);
}
if (_macro->IsGroup()) {
return true;
}
QString text;
if (!_macro->WasExecutedSince({})) {
text = obs_module_text(
"AdvSceneSwitcher.macroTab.macroNotYetExecutedTooltip");
} else {
const QString formatStr = obs_module_text(
"AdvSceneSwitcher.macroTab.macroLastExecutedTooltip");
const auto secondsSinceLastRun =
std::chrono::duration_cast<std::chrono::seconds>(
std::chrono::high_resolution_clock::now() -
_macro->GetLastExecutionTime());
text = formatStr.arg(secondsSinceLastRun.count());
}
auto helpEvent = static_cast<QHelpEvent *>(event);
QToolTip::showText(helpEvent->globalPos(), text, this);
return true;
}
void MacroTreeItem::EnableHighlight(bool enable) void MacroTreeItem::EnableHighlight(bool enable)
{ {
_highlight = enable; _highlight = enable;
@@ -215,19 +187,10 @@ void MacroTreeItem::HighlightIfExecuted()
return; return;
} }
bool wasHighlighted = false;
if (_lastHighlightCheckTime.time_since_epoch().count() != 0 && if (_lastHighlightCheckTime.time_since_epoch().count() != 0 &&
_macro->WasExecutedSince(_lastHighlightCheckTime)) { _macro->WasExecutedSince(_lastHighlightCheckTime)) {
HighlightWidget(this, Qt::green, QColor(0, 0, 0, 0), true); HighlightWidget(this, Qt::green, QColor(0, 0, 0, 0), true);
wasHighlighted = true;
} }
if (!wasHighlighted &&
_lastHighlightCheckTime.time_since_epoch().count() != 0 &&
_macro->OnChangePreventedActionsSince(_lastHighlightCheckTime)) {
HighlightWidget(this, Qt::yellow, QColor(0, 0, 0, 0), true);
}
_lastHighlightCheckTime = std::chrono::high_resolution_clock::now(); _lastHighlightCheckTime = std::chrono::high_resolution_clock::now();
} }
@@ -304,7 +267,7 @@ void MacroTreeItem::Update(bool force)
_expand->blockSignals(true); _expand->blockSignals(true);
_expand->setChecked(_macro->IsCollapsed()); _expand->setChecked(_macro->IsCollapsed());
_expand->blockSignals(false); _expand->blockSignals(false);
connect(_expand, &QCheckBox::toggled, this, connect(_expand, &QPushButton::toggled, this,
&MacroTreeItem::ExpandClicked); &MacroTreeItem::ExpandClicked);
} else { } else {
_spacer = new QSpacerItem(3, 1); _spacer = new QSpacerItem(3, 1);

View File

@@ -34,9 +34,6 @@ public:
explicit MacroTreeItem(MacroTree *tree, std::shared_ptr<Macro> macro, explicit MacroTreeItem(MacroTree *tree, std::shared_ptr<Macro> macro,
bool highlight); bool highlight);
protected:
bool event(QEvent *) override;
private slots: private slots:
void ExpandClicked(bool checked); void ExpandClicked(bool checked);
void EnableHighlight(bool enable); void EnableHighlight(bool enable);

View File

@@ -242,12 +242,8 @@ bool Macro::CheckConditions(bool ignorePause)
vblog(LOG_INFO, "Macro %s returned %d", _name.c_str(), _matched); vblog(LOG_INFO, "Macro %s returned %d", _name.c_str(), _matched);
_conditionSateChanged = _lastMatched != _matched; _conditionSateChanged = _lastMatched != _matched;
const bool hasActionsToExecute = _matched ? (_actions.size() > 0) if (!_conditionSateChanged && _performActionsOnChange) {
: (_elseActions.size() > 0); _onPreventedActionExecution = true;
if (!_conditionSateChanged && _performActionsOnChange &&
hasActionsToExecute) {
_lastOnChangeActionsPreventedTime =
std::chrono::high_resolution_clock::now();
} }
_lastMatched = _matched; _lastMatched = _matched;
@@ -306,16 +302,6 @@ bool Macro::WasExecutedSince(const TimePoint &time) const
return _lastExecutionTime > time; return _lastExecutionTime > time;
} }
bool Macro::OnChangePreventedActionsSince(const TimePoint &time) const
{
return _lastOnChangeActionsPreventedTime > time;
}
Macro::TimePoint Macro::GetLastExecutionTime() const
{
return _lastExecutionTime;
}
bool Macro::ConditionsShouldBeChecked() const bool Macro::ConditionsShouldBeChecked() const
{ {
if (!_useCustomConditionCheckInterval) { if (!_useCustomConditionCheckInterval) {
@@ -1000,8 +986,18 @@ bool Macro::HasValidSplitterPositions() const
!_elseActionSplitterPosition.empty(); !_elseActionSplitterPosition.empty();
} }
bool Macro::OnChangePreventedActionsRecently()
{
if (_onPreventedActionExecution) {
_onPreventedActionExecution = false;
return _matched ? _actions.size() > 0 : _elseActions.size() > 0;
}
return false;
}
void Macro::ResetUIHelpers() void Macro::ResetUIHelpers()
{ {
_onPreventedActionExecution = false;
for (auto c : _conditions) { for (auto c : _conditions) {
c->GetHighlightAndReset(); c->GetHighlightAndReset();
} }

View File

@@ -137,8 +137,7 @@ public:
const QList<int> &GetElseActionSplitterPosition() const; const QList<int> &GetElseActionSplitterPosition() const;
bool HasValidSplitterPositions() const; bool HasValidSplitterPositions() const;
bool WasExecutedSince(const TimePoint &) const; bool WasExecutedSince(const TimePoint &) const;
bool OnChangePreventedActionsSince(const TimePoint &) const; bool OnChangePreventedActionsRecently();
TimePoint GetLastExecutionTime() const;
void ResetUIHelpers(); void ResetUIHelpers();
// Hotkeys // Hotkeys
@@ -169,7 +168,6 @@ private:
TimePoint _lastCheckTime{}; TimePoint _lastCheckTime{};
TimePoint _lastUnpauseTime{}; TimePoint _lastUnpauseTime{};
TimePoint _lastExecutionTime{}; TimePoint _lastExecutionTime{};
TimePoint _lastOnChangeActionsPreventedTime{};
std::vector<std::thread> _helperThreads; std::vector<std::thread> _helperThreads;
std::deque<std::shared_ptr<MacroCondition>> _conditions; std::deque<std::shared_ptr<MacroCondition>> _conditions;
@@ -206,6 +204,9 @@ private:
MacroInputVariables _inputVariables; MacroInputVariables _inputVariables;
// UI helpers
bool _onPreventedActionExecution = false;
QList<int> _actionConditionSplitterPosition; QList<int> _actionConditionSplitterPosition;
QList<int> _elseActionSplitterPosition; QList<int> _elseActionSplitterPosition;

View File

@@ -1,7 +1,5 @@
#include "auto-update-tooltip-label.hpp" #include "auto-update-tooltip-label.hpp"
#include <QToolTip>
namespace advss { namespace advss {
AutoUpdateHelpIcon::AutoUpdateHelpIcon( AutoUpdateHelpIcon::AutoUpdateHelpIcon(
@@ -18,7 +16,6 @@ AutoUpdateHelpIcon::AutoUpdateHelpIcon(
void AutoUpdateHelpIcon::enterEvent(QEnterEvent *event) void AutoUpdateHelpIcon::enterEvent(QEnterEvent *event)
{ {
UpdateTooltip();
_timer->start(_updateIntervalMs); _timer->start(_updateIntervalMs);
QLabel::enterEvent(event); QLabel::enterEvent(event);
} }
@@ -31,12 +28,7 @@ void AutoUpdateHelpIcon::leaveEvent(QEvent *event)
void AutoUpdateHelpIcon::UpdateTooltip() void AutoUpdateHelpIcon::UpdateTooltip()
{ {
if (!underMouse()) { setToolTip(_callback());
return;
}
const QString text = _callback();
QToolTip::showText(QCursor::pos(), text, this);
} }
} // namespace advss } // namespace advss

View File

@@ -57,6 +57,7 @@ ResourceTable::ResourceTable(QWidget *parent, const QString &help,
auto layout = new QVBoxLayout(); auto layout = new QVBoxLayout();
layout->addLayout(helpAndTableLayout); layout->addLayout(helpAndTableLayout);
layout->addLayout(controlLayout); layout->addLayout(controlLayout);
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout); setLayout(layout);
QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add())); QWidget::connect(_add, SIGNAL(clicked()), this, SLOT(Add()));

View File

@@ -58,9 +58,6 @@ StringListEdit::StringListEdit(
_filterCallback(filter), _filterCallback(filter),
_preprocessCallback(preprocess) _preprocessCallback(preprocess)
{ {
if (_addString.isEmpty()) {
_addString = obs_module_text("AdvSceneSwitcher.windowTitle");
}
} }
void StringListEdit::SetStringList(const StringList &list) void StringListEdit::SetStringList(const StringList &list)

View File

@@ -10,8 +10,6 @@ namespace advss {
class StringList : public QList<StringVariable> { class StringList : public QList<StringVariable> {
public: public:
using QList<StringVariable>::QList;
EXPORT bool Save(obs_data_t *obj, const char *name, EXPORT bool Save(obs_data_t *obj, const char *name,
const char *elementName = "string") const; const char *elementName = "string") const;
EXPORT bool Load(obs_data_t *obj, const char *name, EXPORT bool Load(obs_data_t *obj, const char *name,

View File

@@ -166,8 +166,6 @@ target_sources(
utils/scene-item-selection.hpp utils/scene-item-selection.hpp
utils/scene-item-transform-helpers.cpp utils/scene-item-transform-helpers.cpp
utils/scene-item-transform-helpers.hpp utils/scene-item-transform-helpers.hpp
utils/transition-helpers.cpp
utils/transition-helpers.hpp
utils/source-properties-button.cpp utils/source-properties-button.cpp
utils/source-properties-button.hpp utils/source-properties-button.hpp
utils/source-settings-helpers.cpp utils/source-settings-helpers.cpp

View File

@@ -4,7 +4,6 @@
#include "plugin-state-helpers.hpp" #include "plugin-state-helpers.hpp"
#include "scene-switch-helpers.hpp" #include "scene-switch-helpers.hpp"
#include "source-helpers.hpp" #include "source-helpers.hpp"
#include "transition-helpers.hpp"
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
@@ -69,6 +68,14 @@ static int getTransitionOverrideDuration(OBSWeakSource &scene)
return duration; return duration;
} }
static bool isUsingFixedLengthTransition(const OBSWeakSource &transition)
{
obs_source_t *source = obs_weak_source_get_source(transition);
bool ret = obs_transition_fixed(source);
obs_source_release(source);
return ret;
}
static OBSWeakSource getOverrideTransition(OBSWeakSource &scene) static OBSWeakSource getOverrideTransition(OBSWeakSource &scene)
{ {
OBSWeakSource transition; OBSWeakSource transition;
@@ -94,13 +101,13 @@ static int getExpectedTransitionDuration(OBSWeakSource &scene,
auto overrideTransition = getOverrideTransition(scene); auto overrideTransition = getOverrideTransition(scene);
if (overrideTransition) { if (overrideTransition) {
transition = overrideTransition; transition = overrideTransition;
if (!IsFixedLengthTransition(transition)) { if (!isUsingFixedLengthTransition(transition)) {
return getTransitionOverrideDuration(scene); return getTransitionOverrideDuration(scene);
} }
} }
} }
if (IsFixedLengthTransition(transition)) { if (isUsingFixedLengthTransition(transition)) {
return -1; // no API is available to access the fixed duration return -1; // no API is available to access the fixed duration
} }
if (duration != 0) { if (duration != 0) {
@@ -496,7 +503,7 @@ shouldShowDurationInTransitionLayout(MacroActionSwitchScene::SceneType type,
return true; return true;
} }
if (IsFixedLengthTransition(transition.GetTransition())) { if (isUsingFixedLengthTransition(transition.GetTransition())) {
return false; return false;
} }

View File

@@ -1,6 +1,5 @@
#include "macro-action-scene-visibility.hpp" #include "macro-action-scene-visibility.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "transition-helpers.hpp"
namespace advss { namespace advss {
@@ -22,74 +21,9 @@ const static std::map<MacroActionSceneVisibility::Action, std::string>
"AdvSceneSwitcher.action.sceneVisibility.type.toggle"}, "AdvSceneSwitcher.action.sceneVisibility.type.toggle"},
}; };
namespace {
struct TransitionRestoreContext {
obs_sceneitem_t *item;
bool wasVisible;
bool restoreTransition;
OBSSource originalTransition;
bool restoreDuration;
uint32_t originalDuration;
signal_handler_t *sh = nullptr;
~TransitionRestoreContext()
{
if (!sh) {
return;
}
signal_handler_disconnect(
sh, "transition_stop",
&TransitionRestoreContext::ResetSceneItemTransition,
this);
}
static void ResetSceneItemTransition(void *param, calldata_t *)
{
auto *ctx = static_cast<TransitionRestoreContext *>(param);
SetSceneItemTransition(ctx->item, ctx->originalTransition,
!ctx->wasVisible);
obs_sceneitem_set_transition_duration(
ctx->item, !ctx->wasVisible, ctx->originalDuration);
delete ctx;
}
};
} // namespace
static void setSceneItemVisibility(obs_sceneitem_t *item, static void setSceneItemVisibility(obs_sceneitem_t *item,
const bool setTransition,
const OBSWeakSource &transitionWeak,
const bool setDuration,
const Duration &duration,
MacroActionSceneVisibility::Action action) MacroActionSceneVisibility::Action action)
{ {
const OBSSourceAutoRelease transition = OBSGetStrongRef(transitionWeak);
const bool itemIsVisible = obs_sceneitem_visible(item);
const OBSSource currentTransition =
obs_sceneitem_get_transition(item, !itemIsVisible);
const uint32_t currentTransitionDuration =
obs_sceneitem_get_transition_duration(item, !itemIsVisible);
obs_source_t *privateTransitionSource = nullptr;
if (setTransition) {
privateTransitionSource = SetSceneItemTransition(
item, transition, !itemIsVisible);
} else {
privateTransitionSource =
obs_sceneitem_get_transition(item, !itemIsVisible);
}
if (setDuration) {
obs_sceneitem_set_transition_duration(item, !itemIsVisible,
duration.Milliseconds());
}
switch (action) { switch (action) {
case MacroActionSceneVisibility::Action::SHOW: case MacroActionSceneVisibility::Action::SHOW:
obs_sceneitem_set_visible(item, true); obs_sceneitem_set_visible(item, true);
@@ -98,48 +32,16 @@ static void setSceneItemVisibility(obs_sceneitem_t *item,
obs_sceneitem_set_visible(item, false); obs_sceneitem_set_visible(item, false);
break; break;
case MacroActionSceneVisibility::Action::TOGGLE: case MacroActionSceneVisibility::Action::TOGGLE:
obs_sceneitem_set_visible(item, !itemIsVisible); obs_sceneitem_set_visible(item, !obs_sceneitem_visible(item));
break; break;
} }
if (!privateTransitionSource) {
if (setTransition) {
SetSceneItemTransition(item, currentTransition,
!itemIsVisible);
}
if (setDuration) {
obs_sceneitem_set_transition_duration(
item, !itemIsVisible,
currentTransitionDuration);
}
return;
}
auto sh = obs_source_get_signal_handler(privateTransitionSource);
if (!sh) {
return;
}
auto ctx = new TransitionRestoreContext{item,
itemIsVisible,
setTransition,
currentTransition,
setDuration,
currentTransitionDuration,
sh};
signal_handler_connect(
sh, "transition_stop",
&TransitionRestoreContext::ResetSceneItemTransition, ctx);
} }
bool MacroActionSceneVisibility::PerformAction() bool MacroActionSceneVisibility::PerformAction()
{ {
auto items = _source.GetSceneItems(_scene); auto items = _source.GetSceneItems(_scene);
for (const auto &item : items) { for (const auto &item : items) {
setSceneItemVisibility(item, _updateTransition, setSceneItemVisibility(item, _action);
_transition.GetTransition(),
_updateDuration, _duration, _action);
} }
return true; return true;
} }
@@ -164,10 +66,6 @@ bool MacroActionSceneVisibility::Save(obs_data_t *obj) const
MacroAction::Save(obj); MacroAction::Save(obj);
_scene.Save(obj); _scene.Save(obj);
_source.Save(obj); _source.Save(obj);
obs_data_set_bool(obj, "updateTransition", _updateTransition);
_transition.Save(obj);
obs_data_set_bool(obj, "updateDuration", _updateDuration);
_duration.Save(obj);
obs_data_set_int(obj, "action", static_cast<int>(_action)); obs_data_set_int(obj, "action", static_cast<int>(_action));
return true; return true;
} }
@@ -184,10 +82,6 @@ bool MacroActionSceneVisibility::Load(obs_data_t *obj)
MacroAction::Load(obj); MacroAction::Load(obj);
_scene.Load(obj); _scene.Load(obj);
_source.Load(obj); _source.Load(obj);
_updateTransition = obs_data_get_bool(obj, "updateTransition");
_transition.Load(obj);
_updateDuration = obs_data_get_bool(obj, "updateDuration");
_duration.Load(obj);
_action = static_cast<MacroActionSceneVisibility::Action>( _action = static_cast<MacroActionSceneVisibility::Action>(
obs_data_get_int(obj, "action")); obs_data_get_int(obj, "action"));
@@ -247,17 +141,10 @@ MacroActionSceneVisibilityEdit::MacroActionSceneVisibilityEdit(
SceneItemSelection::Type::ALL, SceneItemSelection::Type::ALL,
}, },
SceneItemSelectionWidget::NameClashMode::ALL)), SceneItemSelectionWidget::NameClashMode::ALL)),
_updateTransition(new QCheckBox(this)),
_transitions(new TransitionSelectionWidget(this, false, false)),
_updateDuration(new QCheckBox(this)),
_duration(new DurationSelection(this, false)),
_durationLayout(new QHBoxLayout),
_actions(new QComboBox()) _actions(new QComboBox())
{ {
populateActionSelection(_actions); populateActionSelection(_actions);
_duration->SpinBox()->setSpecialValueText("-");
QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this,
SLOT(ActionChanged(int))); SLOT(ActionChanged(int)));
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)), QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
@@ -267,49 +154,18 @@ MacroActionSceneVisibilityEdit::MacroActionSceneVisibilityEdit(
QWidget::connect(_sources, QWidget::connect(_sources,
SIGNAL(SceneItemChanged(const SceneItemSelection &)), SIGNAL(SceneItemChanged(const SceneItemSelection &)),
this, SLOT(SourceChanged(const SceneItemSelection &))); this, SLOT(SourceChanged(const SceneItemSelection &)));
QWidget::connect(_updateTransition, SIGNAL(stateChanged(int)), this,
SLOT(UpdateTransitionChanged(int)));
QWidget::connect(_transitions,
SIGNAL(TransitionChanged(const TransitionSelection &)),
this,
SLOT(TransitionChanged(const TransitionSelection &)));
QWidget::connect(_updateDuration, SIGNAL(stateChanged(int)), this,
SLOT(UpdateDurationChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)),
this, SLOT(DurationChanged(const Duration &)));
auto sceneItemLayout = new QHBoxLayout; auto layout = new QHBoxLayout;
PlaceWidgets(obs_module_text( PlaceWidgets(obs_module_text(
"AdvSceneSwitcher.action.sceneVisibility.layout"), "AdvSceneSwitcher.action.sceneVisibility.entry"),
sceneItemLayout, layout,
{{"{{scenes}}", _scenes}, {{"{{scenes}}", _scenes},
{"{{sources}}", _sources}, {"{{sources}}", _sources},
{"{{actions}}", _actions}}); {"{{actions}}", _actions}});
auto transitionLayout = new QHBoxLayout;
PlaceWidgets(
obs_module_text(
"AdvSceneSwitcher.action.sceneVisibility.layout.transition"),
transitionLayout,
{{"{{updateTransition}}", _updateTransition},
{"{{transitions}}", _transitions}});
PlaceWidgets(
obs_module_text(
"AdvSceneSwitcher.action.sceneVisibility.layout.duration"),
_durationLayout,
{{"{{updateDuration}}", _updateDuration},
{"{{duration}}", _duration}});
auto layout = new QVBoxLayout;
layout->addLayout(sceneItemLayout);
layout->addLayout(transitionLayout);
layout->addLayout(_durationLayout);
setLayout(layout); setLayout(layout);
_entryData = entryData; _entryData = entryData;
UpdateEntryData(); UpdateEntryData();
SetWidgetVisibility();
_loading = false; _loading = false;
} }
@@ -321,11 +177,7 @@ void MacroActionSceneVisibilityEdit::UpdateEntryData()
_actions->setCurrentIndex(static_cast<int>(_entryData->_action)); _actions->setCurrentIndex(static_cast<int>(_entryData->_action));
_scenes->SetScene(_entryData->_scene); _scenes->SetScene(_entryData->_scene);
_sources->SetSceneItem(_entryData->_source); _sources->SetSceneItem((_entryData->_source));
_updateTransition->setChecked(_entryData->_updateTransition);
_transitions->SetTransition(_entryData->_transition);
_updateDuration->setChecked(_entryData->_updateDuration);
_duration->SetDuration(_entryData->_duration);
} }
void MacroActionSceneVisibilityEdit::SceneChanged(const SceneSelection &s) void MacroActionSceneVisibilityEdit::SceneChanged(const SceneSelection &s)
@@ -345,34 +197,6 @@ void MacroActionSceneVisibilityEdit::SourceChanged(
updateGeometry(); updateGeometry();
} }
void MacroActionSceneVisibilityEdit::UpdateTransitionChanged(int state)
{
GUARD_LOADING_AND_LOCK();
_entryData->_updateTransition = state;
SetWidgetVisibility();
}
void MacroActionSceneVisibilityEdit::TransitionChanged(
const TransitionSelection &t)
{
GUARD_LOADING_AND_LOCK();
_entryData->_transition = t;
SetWidgetVisibility();
}
void MacroActionSceneVisibilityEdit::UpdateDurationChanged(int state)
{
GUARD_LOADING_AND_LOCK();
_entryData->_updateDuration = state;
SetWidgetVisibility();
}
void MacroActionSceneVisibilityEdit::DurationChanged(const Duration &dur)
{
GUARD_LOADING_AND_LOCK();
_entryData->_duration = dur;
}
void MacroActionSceneVisibilityEdit::ActionChanged(int value) void MacroActionSceneVisibilityEdit::ActionChanged(int value)
{ {
GUARD_LOADING_AND_LOCK(); GUARD_LOADING_AND_LOCK();
@@ -380,20 +204,4 @@ void MacroActionSceneVisibilityEdit::ActionChanged(int value)
static_cast<MacroActionSceneVisibility::Action>(value); static_cast<MacroActionSceneVisibility::Action>(value);
} }
void MacroActionSceneVisibilityEdit::SetWidgetVisibility()
{
const bool hideDurationSelection =
_entryData->_updateTransition &&
IsFixedLengthTransition(
_entryData->_transition.GetTransition());
SetLayoutVisible(_durationLayout, !hideDurationSelection);
_transitions->setEnabled(_entryData->_updateTransition);
_duration->setEnabled(_entryData->_updateDuration);
adjustSize();
updateGeometry();
}
} // namespace advss } // namespace advss

View File

@@ -1,9 +1,7 @@
#pragma once #pragma once
#include "duration-control.hpp"
#include "macro-action-edit.hpp" #include "macro-action-edit.hpp"
#include "scene-selection.hpp" #include "scene-selection.hpp"
#include "scene-item-selection.hpp" #include "scene-item-selection.hpp"
#include "transition-selection.hpp"
namespace advss { namespace advss {
@@ -22,10 +20,6 @@ public:
SceneSelection _scene; SceneSelection _scene;
SceneItemSelection _source; SceneItemSelection _source;
bool _updateTransition = false;
TransitionSelection _transition;
bool _updateDuration = false;
Duration _duration;
enum class Action { enum class Action {
SHOW, SHOW,
@@ -59,27 +53,17 @@ public:
private slots: private slots:
void SceneChanged(const SceneSelection &); void SceneChanged(const SceneSelection &);
void SourceChanged(const SceneItemSelection &); void SourceChanged(const SceneItemSelection &);
void UpdateTransitionChanged(int);
void TransitionChanged(const TransitionSelection &);
void UpdateDurationChanged(int);
void DurationChanged(const Duration &seconds);
void ActionChanged(int value); void ActionChanged(int value);
signals: signals:
void HeaderInfoChanged(const QString &); void HeaderInfoChanged(const QString &);
private: protected:
void SetWidgetVisibility();
SceneSelectionWidget *_scenes; SceneSelectionWidget *_scenes;
SceneItemSelectionWidget *_sources; SceneItemSelectionWidget *_sources;
QCheckBox *_updateTransition;
TransitionSelectionWidget *_transitions;
QCheckBox *_updateDuration;
DurationSelection *_duration;
QHBoxLayout *_durationLayout;
QComboBox *_actions; QComboBox *_actions;
std::shared_ptr<MacroActionSceneVisibility> _entryData; std::shared_ptr<MacroActionSceneVisibility> _entryData;
private:
bool _loading = true; bool _loading = true;
}; };

View File

@@ -1,6 +1,5 @@
#include "macro-action-transition.hpp" #include "macro-action-transition.hpp"
#include "layout-helpers.hpp" #include "layout-helpers.hpp"
#include "transition-helpers.hpp"
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
@@ -76,6 +75,26 @@ static void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item,
} }
#endif #endif
static void setSceneItemTransition(const OBSSceneItem &item,
const OBSSourceAutoRelease &transition,
bool show)
{
OBSDataAutoRelease settings = obs_source_get_settings(transition);
if (!transition || !settings) {
// Set transition to "None"
obs_sceneitem_set_transition(item, show, nullptr);
return;
}
// We cannot share the transition source between
// scene items without introducing strange graphical
// artifacts so we have to create new ones here
OBSSourceAutoRelease transitionSource = obs_source_create_private(
obs_source_get_id(transition), obs_source_get_name(transition),
settings);
obs_sceneitem_set_transition(item, show, transitionSource);
}
void MacroActionTransition::SetSourceTransition(bool show) void MacroActionTransition::SetSourceTransition(bool show)
{ {
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(27, 0, 0) #if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(27, 0, 0)
@@ -84,7 +103,7 @@ void MacroActionTransition::SetSourceTransition(bool show)
const auto items = _source.GetSceneItems(_scene); const auto items = _source.GetSceneItems(_scene);
for (const auto &item : items) { for (const auto &item : items) {
if (_setTransitionType) { if (_setTransitionType) {
SetSceneItemTransition(item, transition, show); setSceneItemTransition(item, transition, show);
} }
if (_setDuration) { if (_setDuration) {
obs_sceneitem_set_transition_duration( obs_sceneitem_set_transition_duration(

View File

@@ -55,17 +55,17 @@ void MacroConditionGameCapture::GetCalldataInfo(calldata_t *cd)
if (!calldata_get_string(cd, "title", &title)) { if (!calldata_get_string(cd, "title", &title)) {
blog(LOG_WARNING, "%s failed to get title", __func__); blog(LOG_WARNING, "%s failed to get title", __func__);
} }
_title = title ? title : ""; _title = title;
const char *className = ""; const char *className = "";
if (!calldata_get_string(cd, "class", &className)) { if (!calldata_get_string(cd, "class", &className)) {
blog(LOG_WARNING, "%s failed to get class", __func__); blog(LOG_WARNING, "%s failed to get class", __func__);
} }
_class = className ? className : ""; _class = className;
const char *executable = ""; const char *executable = "";
if (!calldata_get_string(cd, "executable", &executable)) { if (!calldata_get_string(cd, "executable", &executable)) {
blog(LOG_WARNING, "%s failed to get executable", __func__); blog(LOG_WARNING, "%s failed to get executable", __func__);
} }
_executable = executable ? executable : ""; _executable = executable;
} }
void MacroConditionGameCapture::HookedSignalReceived(void *data, calldata_t *cd) void MacroConditionGameCapture::HookedSignalReceived(void *data, calldata_t *cd)

View File

@@ -335,12 +335,6 @@ void SetSourceSetting(obs_source_t *source, const SourceSetting &setting,
case OBS_DATA_OBJECT: { case OBS_DATA_OBJECT: {
OBSDataAutoRelease json = OBSDataAutoRelease json =
obs_data_create_from_json(value.c_str()); obs_data_create_from_json(value.c_str());
if (!json) {
blog(LOG_WARNING,
"not setting invalid data object settings value! (%s)",
value.c_str());
break;
}
obs_data_set_obj(data, id.c_str(), json); obs_data_set_obj(data, id.c_str(), json);
break; break;
} }

View File

@@ -1,32 +0,0 @@
#include "transition-helpers.hpp"
namespace advss {
bool IsFixedLengthTransition(const OBSWeakSource &transition)
{
OBSSourceAutoRelease source = obs_weak_source_get_source(transition);
return obs_transition_fixed(source);
}
obs_source_t *SetSceneItemTransition(const OBSSceneItem &item,
const OBSSourceAutoRelease &transition,
bool show)
{
OBSDataAutoRelease settings = obs_source_get_settings(transition);
if (!transition || !settings) {
// Set transition to "None"
obs_sceneitem_set_transition(item, show, nullptr);
return nullptr;
}
// We cannot share the transition source between
// scene items without introducing strange graphical
// artifacts so we have to create new ones here
OBSSourceAutoRelease transitionSource = obs_source_create_private(
obs_source_get_id(transition), obs_source_get_name(transition),
settings);
obs_sceneitem_set_transition(item, show, transitionSource);
return transitionSource.Get();
}
} // namespace advss

View File

@@ -1,11 +0,0 @@
#pragma once
#include <obs.hpp>
namespace advss {
bool IsFixedLengthTransition(const OBSWeakSource &transition);
obs_source_t *SetSceneItemTransition(const OBSSceneItem &item,
const OBSSourceAutoRelease &transition,
bool show);
} // namespace advss

View File

@@ -70,7 +70,7 @@ struct URLInfo {
std::string path; std::string path;
}; };
static URLInfo getURLInfo(const std::string &input, bool keepParams) static URLInfo getURLInfo(const std::string &input)
{ {
if (input.empty()) { if (input.empty()) {
return {}; return {};
@@ -84,35 +84,21 @@ static URLInfo getURLInfo(const std::string &input, bool keepParams)
const QUrl url(urlInput); const QUrl url(urlInput);
auto host = auto host =
url.scheme().toStdString() + "://" + url.host().toStdString(); url.scheme().toStdString() + "://" + url.host().toStdString();
int port = url.port();
const int port = url.port();
if (port != -1) { if (port != -1) {
host += ":" + std::to_string(port); host += ":" + std::to_string(port);
} }
auto path = url.path().toStdString(); auto path = url.path().toStdString();
if (path.empty()) { if (path.empty()) {
path = "/"; path = "/";
} }
const auto query = url.query().toStdString();
if (!query.empty()) {
if (keepParams) {
path += "?" + query;
} else {
blog(LOG_WARNING,
"ignoring query parameters \"%s\" in URL field. "
"Using parameter field values instead.",
query.c_str());
}
}
return {host, path}; return {host, path};
} }
bool MacroActionHttp::PerformAction() bool MacroActionHttp::PerformAction()
{ {
const auto [host, path] = getURLInfo(_url, !_setParams); const auto [host, path] = getURLInfo(_url);
httplib::Client cli(host); httplib::Client cli(host);
setTimeout(cli, _timeout); setTimeout(cli, _timeout);

View File

@@ -89,24 +89,12 @@ void EventSub::ConnectThread()
void EventSub::WaitAndReconnect() void EventSub::WaitAndReconnect()
{ {
if (_reconnecting) {
return;
}
_reconnecting = true;
auto thread = std::thread([this]() { auto thread = std::thread([this]() {
std::unique_lock<std::mutex> lock(_waitMtx); std::unique_lock<std::mutex> lock(_waitMtx);
blog(LOG_INFO, blog(LOG_INFO,
"Twitch EventSub trying to reconnect to in %d seconds.", "Twitch EventSub trying to reconnect to in %d seconds.",
reconnectDelay); reconnectDelay);
_cv.wait_for(lock, std::chrono::seconds(reconnectDelay)); _cv.wait_for(lock, std::chrono::seconds(reconnectDelay));
_reconnecting = false;
if (_disconnect) {
return;
}
Connect(); Connect();
}); });
thread.detach(); thread.detach();
@@ -114,10 +102,6 @@ void EventSub::WaitAndReconnect()
void EventSub::Connect() void EventSub::Connect()
{ {
if (_reconnecting) {
return;
}
std::lock_guard<std::mutex> lock(_connectMtx); std::lock_guard<std::mutex> lock(_connectMtx);
if (_connected) { if (_connected) {
vblog(LOG_INFO, "Twitch EventSub connect already in progress"); vblog(LOG_INFO, "Twitch EventSub connect already in progress");
@@ -481,8 +465,8 @@ void EventSub::StartServerMigrationClient(const std::string &url)
const auto &data = msg->payload; const auto &data = msg->payload;
if (type == "session_welcome") { if (type == "session_welcome") {
blog(LOG_INFO, vblog(LOG_INFO,
"Twitch EventSub migration successful - switching to new connection"); "Twitch EventSub migration successful - switching to new connection");
OBSDataAutoRelease session = OBSDataAutoRelease session =
obs_data_get_obj(data, "session"); obs_data_get_obj(data, "session");
_migrationSessionID = _migrationSessionID =
@@ -581,7 +565,7 @@ void EventSub::OnClose(connection_hdl hdl)
blog(LOG_INFO, "Twitch EventSub connection closed: %s / %s (%d)", blog(LOG_INFO, "Twitch EventSub connection closed: %s / %s (%d)",
msg.c_str(), reason.c_str(), code); msg.c_str(), reason.c_str(), code);
if (!_migrating) { if (_migrating) {
ClearActiveSubscriptions(); ClearActiveSubscriptions();
} }
_connected = false; _connected = false;

View File

@@ -110,7 +110,6 @@ private:
std::condition_variable _cv; std::condition_variable _cv;
std::atomic_bool _connected{false}; std::atomic_bool _connected{false};
std::atomic_bool _disconnect{false}; std::atomic_bool _disconnect{false};
std::atomic_bool _reconnecting{false};
std::string _url; std::string _url;
std::string _sessionID; std::string _sessionID;