diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 7904f436..ed121908 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -1,28 +1,19 @@ +#include +#include + +#include +#include +#include +#include + #include #include #include #include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - #include "headers/switcher-data-structs.hpp" -#include "headers/utility.hpp" #include "headers/advanced-scene-switcher.hpp" +#include "headers/utility.hpp" SwitcherData *switcher = nullptr; @@ -40,404 +31,66 @@ SceneSwitcher::SceneSwitcher(QWidget *parent) loadUI(); } -void SceneSwitcher::loadUI() +void SceneSwitcher::populateSceneSelection(QComboBox *sel, bool addPrevious) { -#if __APPLE__ - setMinimumHeight(700); -#endif - setTabOrder(); - BPtr scenes = obs_frontend_get_scene_names(); char **temp = scenes; while (*temp) { const char *name = *temp; - ui->scenes->addItem(name); - ui->noMatchSwitchScene->addItem(name); - ui->screenRegionScenes->addItem(name); - ui->pauseScenesScenes->addItem(name); - ui->sceneRoundTripScenes1->addItem(name); - ui->sceneRoundTripScenes2->addItem(name); - ui->autoStopScenes->addItem(name); - ui->transitionsScene1->addItem(name); - ui->transitionsScene2->addItem(name); - ui->defaultTransitionsScene->addItem(name); - ui->executableScenes->addItem(name); - ui->idleScenes->addItem(name); - ui->randomScenes->addItem(name); - ui->fileScenes->addItem(name); - ui->mediaScenes->addItem(name); - ui->timeScenes->addItem(name); + sel->addItem(name); temp++; } - auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */ - { - QComboBox *combo = reinterpret_cast(data); - if (strcmp(obs_source_get_id(source), "ffmpeg_source") == 0) { - const char *name = obs_source_get_name(source); - combo->addItem(name); - } - return true; - }; - - obs_enum_sources(sourceEnum, ui->mediaSources); - - ui->mediaStates->addItem("None"); - ui->mediaStates->addItem("Playing"); - ui->mediaStates->addItem("Opening"); - ui->mediaStates->addItem("Buffering"); - ui->mediaStates->addItem("Paused"); - ui->mediaStates->addItem("Stopped"); - ui->mediaStates->addItem("Ended"); - ui->mediaStates->addItem("Error"); - - ui->mediaTimeRestrictions->addItem("None"); - ui->mediaTimeRestrictions->addItem("Time shorter"); - ui->mediaTimeRestrictions->addItem("Time longer"); - ui->mediaTimeRestrictions->addItem("Time remaining shorter"); - ui->mediaTimeRestrictions->addItem("Time remaining longer"); - - ui->sceneRoundTripScenes2->addItem(PREVIOUS_SCENE_NAME); - ui->idleScenes->addItem(PREVIOUS_SCENE_NAME); - ui->mediaScenes->addItem(PREVIOUS_SCENE_NAME); - ui->timeScenes->addItem(PREVIOUS_SCENE_NAME); + if (addPrevious) + sel->addItem(PREVIOUS_SCENE_NAME); +} +void SceneSwitcher::populateTransitionSelection(QComboBox *sel) +{ obs_frontend_source_list *transitions = new obs_frontend_source_list(); obs_frontend_get_transitions(transitions); for (size_t i = 0; i < transitions->sources.num; i++) { const char *name = obs_source_get_name(transitions->sources.array[i]); - ui->transitions->addItem(name); - ui->screenRegionsTransitions->addItem(name); - ui->sceneRoundTripTransitions->addItem(name); - ui->transitionsTransitions->addItem(name); - ui->defaultTransitionsTransitions->addItem(name); - ui->executableTransitions->addItem(name); - ui->idleTransitions->addItem(name); - ui->randomTransitions->addItem(name); - ui->fileTransitions->addItem(name); - ui->mediaTransitions->addItem(name); - ui->timeTransitions->addItem(name); + sel->addItem(name); } obs_frontend_source_list_free(transitions); +} - if (switcher->switchIfNotMatching == SWITCH) { - ui->noMatchSwitch->setChecked(true); - ui->noMatchSwitchScene->setEnabled(true); - } else if (switcher->switchIfNotMatching == NO_SWITCH) { - ui->noMatchDontSwitch->setChecked(true); - ui->noMatchSwitchScene->setEnabled(false); - } else { - ui->noMatchRandomSwitch->setChecked(true); - ui->noMatchSwitchScene->setEnabled(false); - } - ui->noMatchSwitchScene->setCurrentText( - GetWeakSourceName(switcher->nonMatchingScene).c_str()); - ui->checkInterval->setValue(switcher->interval); - +void SceneSwitcher::populateWindowSelection(QComboBox *sel) +{ std::vector windows; GetWindowList(windows); sort(windows.begin(), windows.end()); for (std::string &window : windows) { - ui->windows->addItem(window.c_str()); - ui->ignoreWindowsWindows->addItem(window.c_str()); - ui->pauseWindowsWindows->addItem(window.c_str()); - ui->ignoreIdleWindowsWindows->addItem(window.c_str()); + sel->addItem(window.c_str()); } +} - QStringList processes; - GetProcessList(processes); - for (QString &process : processes) - ui->executable->addItem(process); +void SceneSwitcher::loadUI() +{ +#if __APPLE__ + setMinimumHeight(700); +#endif + setupGeneralTab(); + setupTitleTab(); + setupExecutableTab(); + setupRegionTab(); + setupPauseTab(); + setupSequenceTab(); + setupTransitionsTab(); + setupIdleTab(); + setupRandomTab(); + setupMediaTab(); + setupFileTab(); + setupTimeTab(); - for (auto &s : switcher->executableSwitches) { - std::string sceneName = GetWeakSourceName(s.mScene); - std::string transitionName = GetWeakSourceName(s.mTransition); - QString text = MakeSwitchNameExecutable(sceneName.c_str(), - s.mExe, - transitionName.c_str(), - s.mInFocus); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->executables); - item->setData(Qt::UserRole, s.mExe); - } - - for (auto &s : switcher->windowSwitches) { - std::string sceneName = GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSwitchName(sceneName.c_str(), - s.window.c_str(), - transitionName.c_str(), - s.fullscreen, s.focus); - - QListWidgetItem *item = new QListWidgetItem(text, ui->switches); - item->setData(Qt::UserRole, s.window.c_str()); - } - - for (auto &s : switcher->screenRegionSwitches) { - std::string sceneName = GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeScreenRegionSwitchName( - sceneName.c_str(), transitionName.c_str(), s.minX, - s.minY, s.maxX, s.maxY); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->screenRegions); - item->setData(Qt::UserRole, s.regionStr.c_str()); - } - - ui->autoStopSceneCheckBox->setChecked(switcher->autoStopEnable); - ui->autoStopScenes->setCurrentText( - GetWeakSourceName(switcher->autoStopScene).c_str()); - - if (ui->autoStopSceneCheckBox->checkState()) { - ui->autoStopScenes->setDisabled(false); - } else { - ui->autoStopScenes->setDisabled(true); - } - - ui->verboseLogging->setChecked(switcher->verbose); - - for (auto &scene : switcher->pauseScenesSwitches) { - std::string sceneName = GetWeakSourceName(scene); - QString text = QString::fromStdString(sceneName); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->pauseScenes); - item->setData(Qt::UserRole, text); - } - - for (auto &window : switcher->pauseWindowsSwitches) { - QString text = QString::fromStdString(window); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->pauseWindows); - item->setData(Qt::UserRole, text); - } - - for (auto &window : switcher->ignoreWindowsSwitches) { - QString text = QString::fromStdString(window); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->ignoreWindows); - item->setData(Qt::UserRole, text); - } - - int smallestDelay = switcher->interval; - for (auto &s : switcher->sceneRoundTripSwitches) { - std::string sceneName1 = GetWeakSourceName(s.scene1); - std::string sceneName2 = (s.usePreviousScene) - ? PREVIOUS_SCENE_NAME - : GetWeakSourceName(s.scene2); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSceneRoundTripSwitchName( - sceneName1.c_str(), sceneName2.c_str(), - transitionName.c_str(), s.delay); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->sceneRoundTrips); - item->setData(Qt::UserRole, text); - - if (s.delay < smallestDelay) - smallestDelay = s.delay; - } - (smallestDelay * 1000 < switcher->interval) - ? ui->intervalWarning->setVisible(true) - : ui->intervalWarning->setVisible(false); - - ui->sceneRoundTripDelayUnits->addItem("seconds"); - ui->sceneRoundTripDelayUnits->addItem("minutes"); - ui->sceneRoundTripDelayUnits->addItem("hours"); - - for (auto &s : switcher->sceneTransitions) { - std::string sceneName1 = GetWeakSourceName(s.scene1); - std::string sceneName2 = GetWeakSourceName(s.scene2); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeSceneTransitionName(sceneName1.c_str(), - sceneName2.c_str(), - transitionName.c_str()); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->sceneTransitions); - item->setData(Qt::UserRole, text); - } - //(transitionDurationLongerThanInterval(switcher->interval)) ? ui->transitionWarning->setVisible(true) : ui->transitionWarning->setVisible(false); - - for (auto &s : switcher->defaultSceneTransitions) { - std::string sceneName = GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeDefaultSceneTransitionName( - sceneName.c_str(), transitionName.c_str()); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->defaultTransitions); - item->setData(Qt::UserRole, text); - } - - ui->transitionOverridecheckBox->setChecked( - switcher->tansitionOverrideOverride); - - for (auto &window : switcher->ignoreIdleWindows) { - QString text = QString::fromStdString(window); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->ignoreIdleWindows); - item->setData(Qt::UserRole, text); - } - - for (auto &s : switcher->randomSwitches) { - std::string sceneName = GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString text = MakeRandomSwitchName( - sceneName.c_str(), transitionName.c_str(), s.delay); - - QListWidgetItem *item = - new QListWidgetItem(text, ui->randomScenesList); - item->setData(Qt::UserRole, text); - } - - ui->fileType->addItem("local"); - ui->fileType->addItem("remote"); - ui->remoteFileWarningLabel->setText( - "Note that the scene switcher will try to access the remote location every " + - QString::number(switcher->interval) + "ms"); - - for (auto &s : switcher->fileSwitches) { - std::string sceneName = GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString listText = MakeFileSwitchName( - sceneName.c_str(), transitionName.c_str(), - s.file.c_str(), s.text.c_str(), s.useRegex, s.useTime); - - QListWidgetItem *item = - new QListWidgetItem(listText, ui->fileScenesList); - item->setData(Qt::UserRole, listText); - } - - for (auto &s : switcher->mediaSwitches) { - std::string sourceName = GetWeakSourceName(s.source); - std::string sceneName = (s.usePreviousScene) - ? PREVIOUS_SCENE_NAME - : GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString listText = MakeMediaSwitchName( - sourceName.c_str(), sceneName.c_str(), - transitionName.c_str(), s.state, s.restriction, s.time); - - QListWidgetItem *item = - new QListWidgetItem(listText, ui->mediaSwitches); - item->setData(Qt::UserRole, listText); - } - - for (auto &s : switcher->timeSwitches) { - std::string sceneName = (s.usePreviousScene) - ? PREVIOUS_SCENE_NAME - : GetWeakSourceName(s.scene); - std::string transitionName = GetWeakSourceName(s.transition); - QString listText = MakeTimeSwitchName( - sceneName.c_str(), transitionName.c_str(), s.time); - - QListWidgetItem *item = - new QListWidgetItem(listText, ui->timeSwitches); - item->setData(Qt::UserRole, listText); - } - - ui->idleCheckBox->setChecked(switcher->idleData.idleEnable); - ui->idleScenes->setCurrentText( - switcher->idleData.usePreviousScene - ? PREVIOUS_SCENE_NAME - : GetWeakSourceName(switcher->idleData.scene).c_str()); - ui->idleTransitions->setCurrentText( - GetWeakSourceName(switcher->idleData.transition).c_str()); - ui->idleSpinBox->setValue(switcher->idleData.time); - - if (ui->idleCheckBox->checkState()) { - ui->idleScenes->setDisabled(false); - ui->idleSpinBox->setDisabled(false); - ui->idleTransitions->setDisabled(false); - } else { - ui->idleScenes->setDisabled(true); - ui->idleSpinBox->setDisabled(true); - ui->idleTransitions->setDisabled(true); - } - - ui->readPathLineEdit->setText( - QString::fromStdString(switcher->fileIO.readPath.c_str())); - ui->readFileCheckBox->setChecked(switcher->fileIO.readEnabled); - ui->writePathLineEdit->setText( - QString::fromStdString(switcher->fileIO.writePath.c_str())); - - if (ui->readFileCheckBox->checkState()) { - ui->browseButton_2->setDisabled(false); - ui->readPathLineEdit->setDisabled(false); - } else { - ui->browseButton_2->setDisabled(true); - ui->readPathLineEdit->setDisabled(true); - } - - if (switcher->th && switcher->th->isRunning()) - SetStarted(); - else - SetStopped(); + setTabOrder(); loading = false; - - // screen region cursor position - QTimer *screenRegionTimer = new QTimer(this); - connect(screenRegionTimer, SIGNAL(timeout()), this, - SLOT(updateScreenRegionCursorPos())); - screenRegionTimer->start(1000); - - for (int p : switcher->functionNamesByPriority) { - std::string s = ""; - switch (p) { - case READ_FILE_FUNC: - s = "File Content"; - break; - case ROUND_TRIP_FUNC: - s = "Scene Sequence"; - break; - case IDLE_FUNC: - s = "Idle Detection"; - break; - case EXE_FUNC: - s = "Executable"; - break; - case SCREEN_REGION_FUNC: - s = "Screen Region"; - break; - case WINDOW_TITLE_FUNC: - s = "Window Title"; - break; - case MEDIA_FUNC: - s = "Media"; - break; - case TIME_FUNC: - s = "Time"; - break; - } - QString text(s.c_str()); - QListWidgetItem *item = - new QListWidgetItem(text, ui->priorityList); - item->setData(Qt::UserRole, text); - } - - for (int i = 0; i < switcher->threadPriorities.size(); ++i) { - ui->threadPriority->addItem( - switcher->threadPriorities[i].name.c_str()); - ui->threadPriority->setItemData( - i, switcher->threadPriorities[i].description.c_str(), - Qt::ToolTipRole); - if (switcher->threadPriority == - switcher->threadPriorities[i].value) { - ui->threadPriority->setCurrentText( - switcher->threadPriorities[i].name.c_str()); - } - } } /******************************************************************************** diff --git a/src/executable-switch.cpp b/src/executable-switch.cpp index 62f3abc3..f50d511e 100644 --- a/src/executable-switch.cpp +++ b/src/executable-switch.cpp @@ -254,3 +254,27 @@ void SwitcherData::loadExecutableSwitches(obs_data_t *obj) } obs_data_array_release(executableArray); } + +void SceneSwitcher::setupExecutableTab() +{ + populateSceneSelection(ui->executableScenes, false); + populateTransitionSelection(ui->executableTransitions); + + QStringList processes; + GetProcessList(processes); + for (QString &process : processes) + ui->executable->addItem(process); + + for (auto &s : switcher->executableSwitches) { + std::string sceneName = GetWeakSourceName(s.mScene); + std::string transitionName = GetWeakSourceName(s.mTransition); + QString text = MakeSwitchNameExecutable(sceneName.c_str(), + s.mExe, + transitionName.c_str(), + s.mInFocus); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->executables); + item->setData(Qt::UserRole, s.mExe); + } +} diff --git a/src/file-switch.cpp b/src/file-switch.cpp index 0e0a4cd5..b5213cbf 100644 --- a/src/file-switch.cpp +++ b/src/file-switch.cpp @@ -435,3 +435,41 @@ void SwitcherData::loadFileSwitches(obs_data_t *obj) switcher->fileIO.writeEnabled = obs_data_get_bool(obj, "writeEnabled"); switcher->fileIO.writePath = obs_data_get_string(obj, "writePath"); } + +void SceneSwitcher::setupFileTab() +{ + populateSceneSelection(ui->fileScenes, false); + populateTransitionSelection(ui->fileTransitions); + + ui->fileType->addItem("local"); + ui->fileType->addItem("remote"); + ui->remoteFileWarningLabel->setText( + "Note that the scene switcher will try to access the remote location every " + + QString::number(switcher->interval) + "ms"); + + for (auto &s : switcher->fileSwitches) { + std::string sceneName = GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString listText = MakeFileSwitchName( + sceneName.c_str(), transitionName.c_str(), + s.file.c_str(), s.text.c_str(), s.useRegex, s.useTime); + + QListWidgetItem *item = + new QListWidgetItem(listText, ui->fileScenesList); + item->setData(Qt::UserRole, listText); + } + + ui->readPathLineEdit->setText( + QString::fromStdString(switcher->fileIO.readPath.c_str())); + ui->readFileCheckBox->setChecked(switcher->fileIO.readEnabled); + ui->writePathLineEdit->setText( + QString::fromStdString(switcher->fileIO.writePath.c_str())); + + if (ui->readFileCheckBox->checkState()) { + ui->browseButton_2->setDisabled(false); + ui->readPathLineEdit->setDisabled(false); + } else { + ui->browseButton_2->setDisabled(true); + ui->readPathLineEdit->setDisabled(true); + } +} diff --git a/src/general.cpp b/src/general.cpp index 6a2a5c91..a6811a8a 100644 --- a/src/general.cpp +++ b/src/general.cpp @@ -477,3 +477,87 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj) switcher->tabOrder.emplace_back( (int)(obs_data_get_int(obj, "sequenceTabPos"))); } + +void SceneSwitcher::setupGeneralTab() +{ + populateSceneSelection(ui->noMatchSwitchScene, false); + populateSceneSelection(ui->autoStopScenes, false); + + if (switcher->switchIfNotMatching == SWITCH) { + ui->noMatchSwitch->setChecked(true); + ui->noMatchSwitchScene->setEnabled(true); + } else if (switcher->switchIfNotMatching == NO_SWITCH) { + ui->noMatchDontSwitch->setChecked(true); + ui->noMatchSwitchScene->setEnabled(false); + } else { + ui->noMatchRandomSwitch->setChecked(true); + ui->noMatchSwitchScene->setEnabled(false); + } + ui->noMatchSwitchScene->setCurrentText( + GetWeakSourceName(switcher->nonMatchingScene).c_str()); + ui->checkInterval->setValue(switcher->interval); + + ui->autoStopSceneCheckBox->setChecked(switcher->autoStopEnable); + ui->autoStopScenes->setCurrentText( + GetWeakSourceName(switcher->autoStopScene).c_str()); + + if (ui->autoStopSceneCheckBox->checkState()) { + ui->autoStopScenes->setDisabled(false); + } else { + ui->autoStopScenes->setDisabled(true); + } + + ui->verboseLogging->setChecked(switcher->verbose); + + for (int p : switcher->functionNamesByPriority) { + std::string s = ""; + switch (p) { + case READ_FILE_FUNC: + s = "File Content"; + break; + case ROUND_TRIP_FUNC: + s = "Scene Sequence"; + break; + case IDLE_FUNC: + s = "Idle Detection"; + break; + case EXE_FUNC: + s = "Executable"; + break; + case SCREEN_REGION_FUNC: + s = "Screen Region"; + break; + case WINDOW_TITLE_FUNC: + s = "Window Title"; + break; + case MEDIA_FUNC: + s = "Media"; + break; + case TIME_FUNC: + s = "Time"; + break; + } + QString text(s.c_str()); + QListWidgetItem *item = + new QListWidgetItem(text, ui->priorityList); + item->setData(Qt::UserRole, text); + } + + for (int i = 0; i < switcher->threadPriorities.size(); ++i) { + ui->threadPriority->addItem( + switcher->threadPriorities[i].name.c_str()); + ui->threadPriority->setItemData( + i, switcher->threadPriorities[i].description.c_str(), + Qt::ToolTipRole); + if (switcher->threadPriority == + switcher->threadPriorities[i].value) { + ui->threadPriority->setCurrentText( + switcher->threadPriorities[i].name.c_str()); + } + } + + if (switcher->th && switcher->th->isRunning()) + SetStarted(); + else + SetStopped(); +} diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index 166f9c09..fe805474 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -50,6 +50,21 @@ public: void UpdateIdleDataScene(const QString &name); void loadUI(); + void populateSceneSelection(QComboBox *sel, bool addPrevious); + void populateTransitionSelection(QComboBox *sel); + void populateWindowSelection(QComboBox *sel); + void setupGeneralTab(); + void setupTitleTab(); + void setupExecutableTab(); + void setupRegionTab(); + void setupPauseTab(); + void setupSequenceTab(); + void setupTransitionsTab(); + void setupIdleTab(); + void setupRandomTab(); + void setupMediaTab(); + void setupFileTab(); + void setupTimeTab(); void setTabOrder(); public slots: diff --git a/src/idle-switch.cpp b/src/idle-switch.cpp index 003ba8db..7e92a5f3 100644 --- a/src/idle-switch.cpp +++ b/src/idle-switch.cpp @@ -43,8 +43,7 @@ void SwitcherData::checkIdleSwitch(bool &match, OBSWeakSource &scene, idleData.alreadySwitched = true; if (verbose) - blog(LOG_INFO, - "Advanced Scene Switcher idle match"); + blog(LOG_INFO, "Advanced Scene Switcher idle match"); } else idleData.alreadySwitched = false; } @@ -262,3 +261,37 @@ void SwitcherData::loadIdleSwitches(obs_data_t *obj) switcher->idleData.usePreviousScene = (idleSceneName == PREVIOUS_SCENE_NAME); } + +void SceneSwitcher::setupIdleTab() +{ + populateSceneSelection(ui->idleScenes, true); + populateTransitionSelection(ui->idleTransitions); + populateWindowSelection(ui->ignoreIdleWindowsWindows); + + for (auto &window : switcher->ignoreIdleWindows) { + QString text = QString::fromStdString(window); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->ignoreIdleWindows); + item->setData(Qt::UserRole, text); + } + + ui->idleCheckBox->setChecked(switcher->idleData.idleEnable); + ui->idleScenes->setCurrentText( + switcher->idleData.usePreviousScene + ? PREVIOUS_SCENE_NAME + : GetWeakSourceName(switcher->idleData.scene).c_str()); + ui->idleTransitions->setCurrentText( + GetWeakSourceName(switcher->idleData.transition).c_str()); + ui->idleSpinBox->setValue(switcher->idleData.time); + + if (ui->idleCheckBox->checkState()) { + ui->idleScenes->setDisabled(false); + ui->idleSpinBox->setDisabled(false); + ui->idleTransitions->setDisabled(false); + } else { + ui->idleScenes->setDisabled(true); + ui->idleSpinBox->setDisabled(true); + ui->idleTransitions->setDisabled(true); + } +} diff --git a/src/media-switch.cpp b/src/media-switch.cpp index 216506c2..28a311f3 100644 --- a/src/media-switch.cpp +++ b/src/media-switch.cpp @@ -251,3 +251,51 @@ void SwitcherData::loadMediaSwitches(obs_data_t *obj) } obs_data_array_release(mediaArray); } + +void SceneSwitcher::setupMediaTab() +{ + populateSceneSelection(ui->mediaScenes, true); + populateTransitionSelection(ui->mediaTransitions); + + auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */ + { + QComboBox *combo = reinterpret_cast(data); + if (strcmp(obs_source_get_id(source), "ffmpeg_source") == 0) { + const char *name = obs_source_get_name(source); + combo->addItem(name); + } + return true; + }; + + obs_enum_sources(sourceEnum, ui->mediaSources); + + ui->mediaStates->addItem("None"); + ui->mediaStates->addItem("Playing"); + ui->mediaStates->addItem("Opening"); + ui->mediaStates->addItem("Buffering"); + ui->mediaStates->addItem("Paused"); + ui->mediaStates->addItem("Stopped"); + ui->mediaStates->addItem("Ended"); + ui->mediaStates->addItem("Error"); + + ui->mediaTimeRestrictions->addItem("None"); + ui->mediaTimeRestrictions->addItem("Time shorter"); + ui->mediaTimeRestrictions->addItem("Time longer"); + ui->mediaTimeRestrictions->addItem("Time remaining shorter"); + ui->mediaTimeRestrictions->addItem("Time remaining longer"); + + for (auto &s : switcher->mediaSwitches) { + std::string sourceName = GetWeakSourceName(s.source); + std::string sceneName = (s.usePreviousScene) + ? PREVIOUS_SCENE_NAME + : GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString listText = MakeMediaSwitchName( + sourceName.c_str(), sceneName.c_str(), + transitionName.c_str(), s.state, s.restriction, s.time); + + QListWidgetItem *item = + new QListWidgetItem(listText, ui->mediaSwitches); + item->setData(Qt::UserRole, listText); + } +} diff --git a/src/pause-switch.cpp b/src/pause-switch.cpp index 267a0e4f..f762423b 100644 --- a/src/pause-switch.cpp +++ b/src/pause-switch.cpp @@ -221,8 +221,7 @@ bool SwitcherData::checkPause() } if (verbose && pause) - blog(LOG_INFO, - "Advanced Scene Switcher pause match"); + blog(LOG_INFO, "Advanced Scene Switcher pause match"); return pause; } @@ -298,3 +297,26 @@ void SwitcherData::loadPauseSwitches(obs_data_t *obj) } obs_data_array_release(pauseWindowsArray); } + +void SceneSwitcher::setupPauseTab() +{ + populateSceneSelection(ui->pauseScenesScenes, false); + populateWindowSelection(ui->pauseWindowsWindows); + + for (auto &scene : switcher->pauseScenesSwitches) { + std::string sceneName = GetWeakSourceName(scene); + QString text = QString::fromStdString(sceneName); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->pauseScenes); + item->setData(Qt::UserRole, text); + } + + for (auto &window : switcher->pauseWindowsSwitches) { + QString text = QString::fromStdString(window); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->pauseWindows); + item->setData(Qt::UserRole, text); + } +} diff --git a/src/random.cpp b/src/random.cpp index 137f394c..558a631e 100644 --- a/src/random.cpp +++ b/src/random.cpp @@ -196,3 +196,20 @@ void SwitcherData::loadRandomSwitches(obs_data_t *obj) } obs_data_array_release(randomArray); } + +void SceneSwitcher::setupRandomTab() +{ + populateSceneSelection(ui->randomScenes, false); + populateTransitionSelection(ui->randomTransitions); + + for (auto &s : switcher->randomSwitches) { + std::string sceneName = GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeRandomSwitchName( + sceneName.c_str(), transitionName.c_str(), s.delay); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->randomScenesList); + item->setData(Qt::UserRole, text); + } +} diff --git a/src/scene-round-trip.cpp b/src/scene-round-trip.cpp index 1ef12a2e..cfa86c9b 100644 --- a/src/scene-round-trip.cpp +++ b/src/scene-round-trip.cpp @@ -393,3 +393,35 @@ void SwitcherData::loadSceneRoundTripSwitches(obs_data_t *obj) } obs_data_array_release(sceneRoundTripArray); } +void SceneSwitcher::setupSequenceTab() +{ + populateSceneSelection(ui->sceneRoundTripScenes1, false); + populateSceneSelection(ui->sceneRoundTripScenes2, true); + populateTransitionSelection(ui->sceneRoundTripTransitions); + + int smallestDelay = switcher->interval; + for (auto &s : switcher->sceneRoundTripSwitches) { + std::string sceneName1 = GetWeakSourceName(s.scene1); + std::string sceneName2 = (s.usePreviousScene) + ? PREVIOUS_SCENE_NAME + : GetWeakSourceName(s.scene2); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeSceneRoundTripSwitchName( + sceneName1.c_str(), sceneName2.c_str(), + transitionName.c_str(), s.delay); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->sceneRoundTrips); + item->setData(Qt::UserRole, text); + + if (s.delay < smallestDelay) + smallestDelay = s.delay; + } + (smallestDelay * 1000 < switcher->interval) + ? ui->intervalWarning->setVisible(true) + : ui->intervalWarning->setVisible(false); + + ui->sceneRoundTripDelayUnits->addItem("seconds"); + ui->sceneRoundTripDelayUnits->addItem("minutes"); + ui->sceneRoundTripDelayUnits->addItem("hours"); +} diff --git a/src/scene-transitions.cpp b/src/scene-transitions.cpp index 6c80408b..52d6439d 100644 --- a/src/scene-transitions.cpp +++ b/src/scene-transitions.cpp @@ -474,3 +474,42 @@ void SwitcherData::loadSceneTransitions(obs_data_t *obj) switcher->tansitionOverrideOverride = obs_data_get_bool(obj, "tansitionOverrideOverride"); } + +void SceneSwitcher::setupTransitionsTab() +{ + populateSceneSelection(ui->transitionsScene1, false); + populateSceneSelection(ui->transitionsScene2, false); + populateSceneSelection(ui->defaultTransitionsScene, false); + populateTransitionSelection(ui->transitionsTransitions); + populateTransitionSelection(ui->defaultTransitionsTransitions); + + for (auto &s : switcher->sceneTransitions) { + std::string sceneName1 = GetWeakSourceName(s.scene1); + std::string sceneName2 = GetWeakSourceName(s.scene2); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeSceneTransitionName(sceneName1.c_str(), + sceneName2.c_str(), + transitionName.c_str()); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->sceneTransitions); + item->setData(Qt::UserRole, text); + } + //(transitionDurationLongerThanInterval(switcher->interval)) + // ? ui->transitionWarning->setVisible(true) + // : ui->transitionWarning->setVisible(false); + + for (auto &s : switcher->defaultSceneTransitions) { + std::string sceneName = GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeDefaultSceneTransitionName( + sceneName.c_str(), transitionName.c_str()); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->defaultTransitions); + item->setData(Qt::UserRole, text); + } + + ui->transitionOverridecheckBox->setChecked( + switcher->tansitionOverrideOverride); +} diff --git a/src/screen-region-switch.cpp b/src/screen-region-switch.cpp index 88e6f70d..ce9a8a73 100644 --- a/src/screen-region-switch.cpp +++ b/src/screen-region-switch.cpp @@ -1,3 +1,5 @@ +#include + #include "headers/advanced-scene-switcher.hpp" void SwitcherData::checkScreenRegionSwitch(bool &match, OBSWeakSource &scene, @@ -258,3 +260,27 @@ void SwitcherData::loadScreenRegionSwitches(obs_data_t *obj) } obs_data_array_release(screenRegionArray); } + +void SceneSwitcher::setupRegionTab() +{ + populateSceneSelection(ui->screenRegionScenes, false); + populateTransitionSelection(ui->screenRegionsTransitions); + + for (auto &s : switcher->screenRegionSwitches) { + std::string sceneName = GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeScreenRegionSwitchName( + sceneName.c_str(), transitionName.c_str(), s.minX, + s.minY, s.maxX, s.maxY); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->screenRegions); + item->setData(Qt::UserRole, s.regionStr.c_str()); + } + + // screen region cursor position + QTimer *screenRegionTimer = new QTimer(this); + connect(screenRegionTimer, SIGNAL(timeout()), this, + SLOT(updateScreenRegionCursorPos())); + screenRegionTimer->start(1000); +} diff --git a/src/time-switch.cpp b/src/time-switch.cpp index 771399c2..25d75825 100644 --- a/src/time-switch.cpp +++ b/src/time-switch.cpp @@ -217,3 +217,22 @@ void SwitcherData::loadTimeSwitches(obs_data_t *obj) } obs_data_array_release(timeArray); } + +void SceneSwitcher::setupTimeTab() +{ + populateSceneSelection(ui->timeScenes, true); + populateTransitionSelection(ui->timeTransitions); + + for (auto &s : switcher->timeSwitches) { + std::string sceneName = (s.usePreviousScene) + ? PREVIOUS_SCENE_NAME + : GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString listText = MakeTimeSwitchName( + sceneName.c_str(), transitionName.c_str(), s.time); + + QListWidgetItem *item = + new QListWidgetItem(listText, ui->timeSwitches); + item->setData(Qt::UserRole, listText); + } +} diff --git a/src/window-title-switch.cpp b/src/window-title-switch.cpp index 1cd7fec3..6dc9faaf 100644 --- a/src/window-title-switch.cpp +++ b/src/window-title-switch.cpp @@ -402,3 +402,31 @@ void SwitcherData::loadWindowTitleSwitches(obs_data_t *obj) } obs_data_array_release(ignoreWindowsArray); } + +void SceneSwitcher::setupTitleTab() +{ + populateSceneSelection(ui->scenes, false); + populateTransitionSelection(ui->transitions); + populateWindowSelection(ui->windows); + populateWindowSelection(ui->ignoreWindowsWindows); + + for (auto &s : switcher->windowSwitches) { + std::string sceneName = GetWeakSourceName(s.scene); + std::string transitionName = GetWeakSourceName(s.transition); + QString text = MakeSwitchName(sceneName.c_str(), + s.window.c_str(), + transitionName.c_str(), + s.fullscreen, s.focus); + + QListWidgetItem *item = new QListWidgetItem(text, ui->switches); + item->setData(Qt::UserRole, s.window.c_str()); + } + + for (auto &window : switcher->ignoreWindowsSwitches) { + QString text = QString::fromStdString(window); + + QListWidgetItem *item = + new QListWidgetItem(text, ui->ignoreWindows); + item->setData(Qt::UserRole, text); + } +}