mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-04-21 09:37:26 -05:00
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:
parent
8e8cb4bf3e
commit
1510a2c2fa
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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="媒体"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user