Specify scenes to exclude from Region triggers (#111)

Adds an option to exclude a region triggered scene switch if you're
currently in the specified Scene.
This commit is contained in:
Kevin Nash 2021-02-03 13:49:18 -05:00 committed by GitHub
parent 8e8cb4bf3e
commit 1510a2c2fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 78 additions and 13 deletions

View File

@ -97,7 +97,8 @@ AdvSceneSwitcher.screenRegionTab.title="Bildschrimbereich"
AdvSceneSwitcher.screenRegionTab.currentPosition="Mauszeiger ist bei:"
AdvSceneSwitcher.screenRegionTab.showGuideFrames="Hilfsrahmen einblenden"
AdvSceneSwitcher.screenRegionTab.hideGuideFrames="Hilfsrahmen ausblenden"
AdvSceneSwitcher.screenRegionTab.entry="Wenn der Mauszeiger in {{minX}} {{minY}} x {{maxX}} {{maxY}} ist wechsle zu {{scenes}} mit {{transitions}}"
AdvSceneSwitcher.screenRegionTab.excludeScenes.None="Keine Auswahl"
AdvSceneSwitcher.screenRegionTab.entry="Wenn der Mauszeiger in {{minX}} {{minY}} x {{maxX}} {{maxY}} ist wechsle zu {{scenes}} mit {{transitions}} außer wenn auf {{excludeScenes}}"
AdvSceneSwitcher.screenRegionTab.help="Dieser Tab ermöglicht es basierend auf der Position des Mauszeigers Szenen zu wechseln.\n\nKlicke auf das markierte Plus Symbol, um einen neuen Eintrag hinzuzufügen."
; Media Tab

View File

@ -97,7 +97,8 @@ AdvSceneSwitcher.screenRegionTab.title="Region"
AdvSceneSwitcher.screenRegionTab.currentPosition="Cursor is currently at:"
AdvSceneSwitcher.screenRegionTab.showGuideFrames="Show guide frames"
AdvSceneSwitcher.screenRegionTab.hideGuideFrames="Hide guide frames"
AdvSceneSwitcher.screenRegionTab.entry="If cursor is in {{minX}} {{minY}} x {{maxX}} {{maxY}} switch to {{scenes}} using {{transitions}}"
AdvSceneSwitcher.screenRegionTab.excludeScenes.None="No selection"
AdvSceneSwitcher.screenRegionTab.entry="If cursor is in {{minX}} {{minY}} x {{maxX}} {{maxY}} switch to {{scenes}} using {{transitions}} unless in {{excludeScenes}}"
AdvSceneSwitcher.screenRegionTab.help="This tab will allow you to automatically switch scenes based on the current position of your mouse cursor.\n\nClick on the highlighted plus symbol to continue."
; Media Tab

View File

@ -86,7 +86,7 @@ AdvSceneSwitcher.screenRegionTab.title="屏幕区域"
AdvSceneSwitcher.screenRegionTab.currentPosition="鼠标当前位置:"
AdvSceneSwitcher.screenRegionTab.showGuideFrames="显示区域边界"
AdvSceneSwitcher.screenRegionTab.hideGuideFrames="隐藏区域边界"
AdvSceneSwitcher.screenRegionTab.entry="如果鼠标在 {{minX}} {{minY}} x {{maxX}} {{maxY}} 使用转场特效 {{transitions}} 切换到场景 {{scenes}}"
AdvSceneSwitcher.screenRegionTab.entry="如果鼠标在 {{minX}} {{minY}} x {{maxX}} {{maxY}} 使用转场特效 {{transitions}} 切换到场景 {{scenes}} unless in {{excludeScenes}}"
; Media Tab
AdvSceneSwitcher.mediaTab.title="媒体"

View File

@ -111,15 +111,22 @@ void addSelectionEntry(QComboBox *sel, const char *description,
void AdvSceneSwitcher::populateSceneSelection(QComboBox *sel, bool addPrevious,
bool addSceneGroup,
bool addSelect)
bool addSelect,
std::string selectText)
{
sel->clear();
if (addSelect)
addSelectionEntry(
sel, obs_module_text("AdvSceneSwitcher.selectScene"),
obs_module_text(
"AdvSceneSwitcher.invaildEntriesWillNotBeSaved"));
if (addSelect) {
if (selectText.empty()) {
addSelectionEntry(
sel,
obs_module_text("AdvSceneSwitcher.selectScene"),
obs_module_text(
"AdvSceneSwitcher.invaildEntriesWillNotBeSaved"));
} else {
addSelectionEntry(sel, selectText.c_str());
}
}
BPtr<char *> scenes = obs_frontend_get_scene_names();
char **temp = scenes;

View File

@ -62,7 +62,8 @@ public:
static void populateSceneSelection(QComboBox *sel,
bool addPrevious = false,
bool addSceneGroup = false,
bool addSelect = true);
bool addSelect = true,
std::string selectText = "");
static void populateTransitionSelection(QComboBox *sel,
bool addSelect = true);

View File

@ -7,6 +7,7 @@ constexpr auto default_priority_4 = screen_region_func;
struct ScreenRegionSwitch : SceneSwitcherEntry {
static bool pause;
OBSWeakSource excludeScene = nullptr;
int minX = 0, minY = 0, maxX = 0, maxY = 0;
const char *getType() { return "region"; }
@ -29,12 +30,14 @@ public:
void hideFrame();
private slots:
void ExcludeSceneChanged(const QString &text);
void MinXChanged(int pos);
void MinYChanged(int pos);
void MaxXChanged(int pos);
void MaxYChanged(int pos);
private:
QComboBox *excludeScenes;
QSpinBox *minX;
QSpinBox *minY;
QSpinBox *maxX;

View File

@ -132,6 +132,19 @@ void AdvSceneSwitcher::on_screenRegionDown_clicked()
switcher->screenRegionSwitches[index + 1]);
}
bool shouldIgnoreSceneSwitch(ScreenRegionSwitch &matchingRegion)
{
if (!matchingRegion.excludeScene)
return false;
obs_source_t *currentScene = obs_frontend_get_current_scene();
OBSWeakSource ws = obs_source_get_weak_source(currentScene);
obs_weak_source_release(ws);
obs_source_release(currentScene);
return matchingRegion.excludeScene == ws;
}
void SwitcherData::checkScreenRegionSwitch(bool &match, OBSWeakSource &scene,
OBSWeakSource &transition)
{
@ -149,6 +162,11 @@ void SwitcherData::checkScreenRegionSwitch(bool &match, OBSWeakSource &scene,
cursorPos.first <= s.maxX && cursorPos.second <= s.maxY) {
int regionSize = (s.maxX - s.minX) + (s.maxY - s.minY);
if (regionSize < minRegionSize) {
if (shouldIgnoreSceneSwitch(s)) {
// We technically have a match.
// But just ignore it.
return;
}
match = true;
scene = s.getScene();
transition = s.transition;
@ -233,6 +251,13 @@ void ScreenRegionSwitch::save(obs_data_t *obj)
{
SceneSwitcherEntry::save(obj);
const char *excludeSceneName = "";
obs_source_t *excludeSceneSource =
obs_weak_source_get_source(excludeScene);
excludeSceneName = obs_source_get_name(excludeSceneSource);
obs_source_release(excludeSceneSource);
obs_data_set_string(obj, "excludeScene", excludeSceneName);
obs_data_set_int(obj, "minX", minX);
obs_data_set_int(obj, "minY", minY);
obs_data_set_int(obj, "maxX", maxX);
@ -272,6 +297,9 @@ void ScreenRegionSwitch::load(obs_data_t *obj)
SceneSwitcherEntry::load(obj);
const char *excludeSceneName = obs_data_get_string(obj, "excludeScene");
excludeScene = GetWeakSourceByName(excludeSceneName);
minX = obs_data_get_int(obj, "minX");
minY = obs_data_get_int(obj, "minY");
maxX = obs_data_get_int(obj, "maxX");
@ -281,6 +309,7 @@ void ScreenRegionSwitch::load(obs_data_t *obj)
ScreenRegionWidget::ScreenRegionWidget(QWidget *parent, ScreenRegionSwitch *s)
: SwitchWidget(parent, s, true, true)
{
excludeScenes = new QComboBox();
minX = new QSpinBox();
minY = new QSpinBox();
maxX = new QSpinBox();
@ -301,6 +330,9 @@ ScreenRegionWidget::ScreenRegionWidget(QWidget *parent, ScreenRegionSwitch *s)
maxX->setMaximum(1000000);
maxY->setMaximum(1000000);
QWidget::connect(excludeScenes,
SIGNAL(currentTextChanged(const QString &)), this,
SLOT(ExcludeSceneChanged(const QString &)));
QWidget::connect(minX, SIGNAL(valueChanged(int)), this,
SLOT(MinXChanged(int)));
QWidget::connect(minY, SIGNAL(valueChanged(int)), this,
@ -310,7 +342,14 @@ ScreenRegionWidget::ScreenRegionWidget(QWidget *parent, ScreenRegionSwitch *s)
QWidget::connect(maxY, SIGNAL(valueChanged(int)), this,
SLOT(MaxYChanged(int)));
AdvSceneSwitcher::populateSceneSelection(
excludeScenes, false, false, true,
obs_module_text(
"AdvSceneSwitcher.screenRegionTab.excludeScenes.None"));
if (s) {
excludeScenes->setCurrentText(
GetWeakSourceName(s->excludeScene).c_str());
minX->setValue(s->minX);
minY->setValue(s->minY);
maxX->setValue(s->maxX);
@ -319,9 +358,13 @@ ScreenRegionWidget::ScreenRegionWidget(QWidget *parent, ScreenRegionSwitch *s)
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{minX}}", minX}, {"{{minY}}", minY},
{"{{maxX}}", maxX}, {"{{maxY}}", maxY},
{"{{scenes}}", scenes}, {"{{transitions}}", transitions}};
{"{{minX}}", minX},
{"{{minY}}", minY},
{"{{maxX}}", maxX},
{"{{maxY}}", maxY},
{"{{scenes}}", scenes},
{"{{transitions}}", transitions},
{"{{excludeScenes}}", excludeScenes}};
placeWidgets(obs_module_text("AdvSceneSwitcher.screenRegionTab.entry"),
mainLayout, widgetPlaceholders);
setLayout(mainLayout);
@ -362,6 +405,15 @@ void ScreenRegionWidget::hideFrame()
helperFrame.hide();
}
void ScreenRegionWidget::ExcludeSceneChanged(const QString &text)
{
if (loading || !switchData)
return;
std::lock_guard<std::mutex> lock(switcher->m);
switchData->excludeScene = GetWeakSourceByQString(text);
}
void ScreenRegionWidget::MinXChanged(int pos)
{
if (loading || !switchData)