mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-04-24 06:48:24 -05:00
Add option to check for change in visibilty
This commit is contained in:
parent
4ab88ea218
commit
11f769cf09
|
|
@ -325,9 +325,10 @@ AdvSceneSwitcher.condition.transition.type.transitionTarget="Transitioning to"
|
|||
AdvSceneSwitcher.condition.transition.durationSuffix="seconds"
|
||||
AdvSceneSwitcher.condition.transition.entry="{{conditions}}{{transitions}}{{scenes}}{{duration}}{{durationSuffix}}"
|
||||
AdvSceneSwitcher.condition.sceneVisibility="Scene item visibility"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.type.shown="Shown"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.type.hidden="Hidden"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.entry="On{{scenes}}{{sources}}is{{conditions}}"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.type.shown="is visible"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.type.hidden="is hidden"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.type.changed="visibility changed"
|
||||
AdvSceneSwitcher.condition.sceneVisibility.entry="On{{scenes}}{{sources}}{{conditions}}"
|
||||
AdvSceneSwitcher.condition.studioMode="Studio mode"
|
||||
AdvSceneSwitcher.condition.studioMode.state.active="Studio mode is active"
|
||||
AdvSceneSwitcher.condition.studioMode.state.notActive="Studio mode is not active"
|
||||
|
|
|
|||
|
|
@ -14,15 +14,17 @@ bool MacroConditionSceneVisibility::_registered =
|
|||
MacroConditionSceneVisibilityEdit::Create,
|
||||
"AdvSceneSwitcher.condition.sceneVisibility"});
|
||||
|
||||
static std::map<SceneVisibilityCondition, std::string>
|
||||
SceneVisibilityConditionTypes = {
|
||||
{SceneVisibilityCondition::SHOWN,
|
||||
static std::map<MacroConditionSceneVisibility::Condition, std::string>
|
||||
conditionTypes = {
|
||||
{MacroConditionSceneVisibility::Condition::SHOWN,
|
||||
"AdvSceneSwitcher.condition.sceneVisibility.type.shown"},
|
||||
{SceneVisibilityCondition::HIDDEN,
|
||||
{MacroConditionSceneVisibility::Condition::HIDDEN,
|
||||
"AdvSceneSwitcher.condition.sceneVisibility.type.hidden"},
|
||||
{MacroConditionSceneVisibility::Condition::CHANGED,
|
||||
"AdvSceneSwitcher.condition.sceneVisibility.type.changed"},
|
||||
};
|
||||
|
||||
bool areAllSceneItemsShown(std::vector<obs_scene_item *> &items)
|
||||
bool areAllSceneItemsShown(const std::vector<obs_scene_item *> &items)
|
||||
{
|
||||
bool ret = true;
|
||||
for (auto item : items) {
|
||||
|
|
@ -34,7 +36,7 @@ bool areAllSceneItemsShown(std::vector<obs_scene_item *> &items)
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool areAllSceneItemsHidden(std::vector<obs_scene_item *> &items)
|
||||
bool areAllSceneItemsHidden(const std::vector<obs_scene_item *> &items)
|
||||
{
|
||||
bool ret = true;
|
||||
for (auto item : items) {
|
||||
|
|
@ -46,6 +48,29 @@ bool areAllSceneItemsHidden(std::vector<obs_scene_item *> &items)
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool didVisibilityOfAnySceneItemsChange(
|
||||
const std::vector<obs_scene_item *> &items,
|
||||
std::vector<bool> &previousVisibility)
|
||||
{
|
||||
std::vector<bool> currentVisibility;
|
||||
for (const auto &item : items) {
|
||||
currentVisibility.emplace_back(obs_sceneitem_visible(item));
|
||||
}
|
||||
|
||||
bool ret = true;
|
||||
if (previousVisibility.size() != currentVisibility.size()) {
|
||||
ret = false;
|
||||
} else {
|
||||
ret = previousVisibility != currentVisibility;
|
||||
}
|
||||
previousVisibility = currentVisibility;
|
||||
|
||||
for (const auto &item : items) {
|
||||
obs_sceneitem_release(item);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool MacroConditionSceneVisibility::CheckCondition()
|
||||
{
|
||||
auto items = _source.GetSceneItems(_scene);
|
||||
|
|
@ -54,10 +79,13 @@ bool MacroConditionSceneVisibility::CheckCondition()
|
|||
}
|
||||
|
||||
switch (_condition) {
|
||||
case SceneVisibilityCondition::SHOWN:
|
||||
case Condition::SHOWN:
|
||||
return areAllSceneItemsShown(items);
|
||||
case SceneVisibilityCondition::HIDDEN:
|
||||
case Condition::HIDDEN:
|
||||
return areAllSceneItemsHidden(items);
|
||||
case Condition::CHANGED:
|
||||
return didVisibilityOfAnySceneItemsChange(items,
|
||||
_previousVisibilty);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -70,7 +98,6 @@ bool MacroConditionSceneVisibility::Save(obs_data_t *obj) const
|
|||
MacroCondition::Save(obj);
|
||||
_scene.Save(obj);
|
||||
_source.Save(obj);
|
||||
|
||||
obs_data_set_int(obj, "condition", static_cast<int>(_condition));
|
||||
|
||||
return true;
|
||||
|
|
@ -88,8 +115,7 @@ bool MacroConditionSceneVisibility::Load(obs_data_t *obj)
|
|||
MacroCondition::Load(obj);
|
||||
_scene.Load(obj);
|
||||
_source.Load(obj);
|
||||
_condition = static_cast<SceneVisibilityCondition>(
|
||||
obs_data_get_int(obj, "condition"));
|
||||
_condition = static_cast<Condition>(obs_data_get_int(obj, "condition"));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -103,7 +129,7 @@ std::string MacroConditionSceneVisibility::GetShortDesc() const
|
|||
|
||||
static inline void populateConditionSelection(QComboBox *list)
|
||||
{
|
||||
for (auto entry : SceneVisibilityConditionTypes) {
|
||||
for (auto entry : conditionTypes) {
|
||||
list->addItem(obs_module_text(entry.second.c_str()));
|
||||
}
|
||||
}
|
||||
|
|
@ -164,6 +190,7 @@ void MacroConditionSceneVisibilityEdit::SceneChanged(const SceneSelection &s)
|
|||
if (_loading || !_entryData) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(switcher->m);
|
||||
_entryData->_scene = s;
|
||||
emit HeaderInfoChanged(
|
||||
|
|
@ -177,7 +204,16 @@ void MacroConditionSceneVisibilityEdit::ConditionChanged(int index)
|
|||
}
|
||||
|
||||
std::lock_guard<std::mutex> lock(switcher->m);
|
||||
_entryData->_condition = static_cast<SceneVisibilityCondition>(index);
|
||||
_entryData->_condition =
|
||||
static_cast<MacroConditionSceneVisibility::Condition>(index);
|
||||
if (_entryData->_condition ==
|
||||
MacroConditionSceneVisibility::Condition::CHANGED) {
|
||||
_sources->SetShowAllSelectionType(
|
||||
SceneItemSelectionWidget::AllSelectionType::ANY, false);
|
||||
} else {
|
||||
_sources->SetShowAllSelectionType(
|
||||
SceneItemSelectionWidget::AllSelectionType::ALL, false);
|
||||
}
|
||||
}
|
||||
|
||||
void MacroConditionSceneVisibilityEdit::UpdateEntryData()
|
||||
|
|
@ -188,5 +224,13 @@ void MacroConditionSceneVisibilityEdit::UpdateEntryData()
|
|||
|
||||
_conditions->setCurrentIndex(static_cast<int>(_entryData->_condition));
|
||||
_scenes->SetScene(_entryData->_scene);
|
||||
if (_entryData->_condition ==
|
||||
MacroConditionSceneVisibility::Condition::CHANGED) {
|
||||
_sources->SetShowAllSelectionType(
|
||||
SceneItemSelectionWidget::AllSelectionType::ANY, false);
|
||||
} else {
|
||||
_sources->SetShowAllSelectionType(
|
||||
SceneItemSelectionWidget::AllSelectionType::ALL, false);
|
||||
}
|
||||
_sources->SetSceneItem(_entryData->_source);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,11 +5,6 @@
|
|||
|
||||
#include <QComboBox>
|
||||
|
||||
enum class SceneVisibilityCondition {
|
||||
SHOWN,
|
||||
HIDDEN,
|
||||
};
|
||||
|
||||
class MacroConditionSceneVisibility : public MacroCondition {
|
||||
public:
|
||||
MacroConditionSceneVisibility(Macro *m) : MacroCondition(m) {}
|
||||
|
|
@ -23,11 +18,19 @@ public:
|
|||
return std::make_shared<MacroConditionSceneVisibility>(m);
|
||||
}
|
||||
|
||||
enum class Condition {
|
||||
SHOWN,
|
||||
HIDDEN,
|
||||
CHANGED,
|
||||
};
|
||||
|
||||
SceneSelection _scene;
|
||||
SceneItemSelection _source;
|
||||
SceneVisibilityCondition _condition = SceneVisibilityCondition::SHOWN;
|
||||
Condition _condition = Condition::SHOWN;
|
||||
|
||||
private:
|
||||
std::vector<bool> _previousVisibilty;
|
||||
|
||||
static bool _registered;
|
||||
static const std::string id;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -51,7 +51,8 @@ public:
|
|||
void SetSceneItem(const SceneItemSelection &);
|
||||
void SetScene(const SceneSelection &);
|
||||
void SetShowAll(bool);
|
||||
void SetShowAllSelectionType(AllSelectionType t, bool resetSelection = true);
|
||||
void SetShowAllSelectionType(AllSelectionType t,
|
||||
bool resetSelection = true);
|
||||
signals:
|
||||
void SceneItemChanged(const SceneItemSelection &);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user