diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index e3ecb0bc..2cb55908 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -146,17 +146,22 @@ void AdvSceneSwitcher::populateAudioSelection(QComboBox *sel, bool addSelect) auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */ { - QComboBox *combo = reinterpret_cast(data); + std::vector *list = + reinterpret_cast *>(data); uint32_t flags = obs_source_get_output_flags(source); if ((flags & OBS_SOURCE_AUDIO) != 0) { - const char *name = obs_source_get_name(source); - combo->addItem(name); + list->push_back(obs_source_get_name(source)); } return true; }; - obs_enum_sources(sourceEnum, sel); + std::vector audioSources; + obs_enum_sources(sourceEnum, &audioSources); + sort(audioSources.begin(), audioSources.end()); + for (std::string &source : audioSources) { + sel->addItem(source.c_str()); + } } void AdvSceneSwitcher::populateMediaSelection(QComboBox *sel, bool addSelect) @@ -170,17 +175,22 @@ void AdvSceneSwitcher::populateMediaSelection(QComboBox *sel, bool addSelect) auto sourceEnum = [](void *data, obs_source_t *source) -> bool /* -- */ { - QComboBox *combo = reinterpret_cast(data); + std::vector *list = + reinterpret_cast *>(data); std::string sourceId = obs_source_get_id(source); if (sourceId.compare("ffmpeg_source") == 0 || sourceId.compare("vlc_source") == 0) { - const char *name = obs_source_get_name(source); - combo->addItem(name); + list->push_back(obs_source_get_name(source)); } return true; }; - obs_enum_sources(sourceEnum, sel); + std::vector meidaSources; + obs_enum_sources(sourceEnum, &meidaSources); + sort(meidaSources.begin(), meidaSources.end()); + for (std::string &source : meidaSources) { + sel->addItem(source.c_str()); + } } void AdvSceneSwitcher::populateProcessSelection(QComboBox *sel, bool addSelect) @@ -191,10 +201,34 @@ void AdvSceneSwitcher::populateProcessSelection(QComboBox *sel, bool addSelect) QStringList processes; GetProcessList(processes); + processes.sort(); for (QString &process : processes) sel->addItem(process); } +void AdvSceneSwitcher::listAddClicked(QListWidget *list, + SwitchWidget *newWidget, + QPushButton *addButton, + QMetaObject::Connection *addHighlight) +{ + if (!list || !newWidget) { + blog(LOG_WARNING, + "listAddClicked called without valid list or widget"); + return; + } + + if (addButton && addHighlight) + addButton->disconnect(*addHighlight); + + QListWidgetItem *item; + item = new QListWidgetItem(list); + list->addItem(item); + item->setSizeHint(newWidget->minimumSizeHint()); + list->setItemWidget(item, newWidget); + + list->scrollToItem(item); +} + bool AdvSceneSwitcher::listMoveUp(QListWidget *list) { int index = list->currentRow(); diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index 8f1a262f..51f28d30 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -75,6 +75,9 @@ public: QColor = QColor(0, 0, 0, 0), QString specifier = "QLabel "); + void listAddClicked(QListWidget *list, SwitchWidget *newWidget, + QPushButton *addButton = nullptr, + QMetaObject::Connection *addHighlight = nullptr); bool listMoveUp(QListWidget *list); bool listMoveDown(QListWidget *list); diff --git a/src/switch-audio.cpp b/src/switch-audio.cpp index ae4eebe2..f8a6e3d5 100644 --- a/src/switch-audio.cpp +++ b/src/switch-audio.cpp @@ -6,18 +6,12 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_audioAdd_clicked() { - ui->audioAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->audioSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->audioSwitches); - ui->audioSwitches->addItem(item); - AudioSwitchWidget *sw = - new AudioSwitchWidget(&switcher->audioSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->audioSwitches->setItemWidget(item, sw); + listAddClicked(ui->audioSwitches, + new AudioSwitchWidget(&switcher->audioSwitches.back()), + ui->audioAdd, &addPulse); } void AdvSceneSwitcher::on_audioRemove_clicked() @@ -352,8 +346,6 @@ AudioSwitchWidget::AudioSwitchWidget(AudioSwitch *s) : SwitchWidget(s) audioVolumeThreshold->setValue(s->volumeThreshold); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *switchLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{audioSources}}", audioSources}, diff --git a/src/switch-executable.cpp b/src/switch-executable.cpp index 894fb61c..0c1877d5 100644 --- a/src/switch-executable.cpp +++ b/src/switch-executable.cpp @@ -5,18 +5,13 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_executableAdd_clicked() { - ui->executableAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->executableSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->executables); - ui->executables->addItem(item); - ExecutableSwitchWidget *sw = new ExecutableSwitchWidget( - &switcher->executableSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->executables->setItemWidget(item, sw); + listAddClicked(ui->executables, + new ExecutableSwitchWidget( + &switcher->executableSwitches.back()), + ui->executableAdd, &addPulse); } void AdvSceneSwitcher::on_executableRemove_clicked() @@ -224,8 +219,6 @@ ExecutableSwitchWidget::ExecutableSwitchWidget(ExecutableSwitch *s) requiresFocus->setChecked(s->inFocus); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{processes}}", processes}, diff --git a/src/switch-file.cpp b/src/switch-file.cpp index c26cde38..44477a35 100644 --- a/src/switch-file.cpp +++ b/src/switch-file.cpp @@ -169,10 +169,14 @@ bool compareIgnoringLineEnding(QString &s1, QString &s2) while (!s1stream.atEnd() || !s2stream.atEnd()) { QString s1s = s1stream.readLine(); QString s2s = s2stream.readLine(); - if (QString::compare(s1s, s2s, Qt::CaseSensitive) != 0) { + if (s1s != s2s) { return false; } } + + if (!s1stream.atEnd() && !s2stream.atEnd()) + return false; + return true; } @@ -197,8 +201,8 @@ bool matchFileContent(QString &filedata, FileSwitch &s) bool checkRemoteFileContent(FileSwitch &s) { std::string data = getRemoteData(s.file); - QString text = QString::fromStdString(s.text); - return matchFileContent(text, s); + QString qdata = QString::fromStdString(data); + return matchFileContent(qdata, s); } bool checkLocalFileContent(FileSwitch &s) @@ -226,6 +230,9 @@ void SwitcherData::checkFileContent(bool &match, OBSWeakSource &scene, OBSWeakSource &transition) { for (FileSwitch &s : fileSwitches) { + if (!s.initialized()) + continue; + bool equal = false; if (s.remote) { equal = checkRemoteFileContent(s); @@ -250,13 +257,9 @@ void AdvSceneSwitcher::on_fileAdd_clicked() std::lock_guard lock(switcher->m); switcher->fileSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->fileSwitches); - ui->fileSwitches->addItem(item); - FileSwitchWidget *sw = - new FileSwitchWidget(&switcher->fileSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->fileSwitches->setItemWidget(item, sw); + listAddClicked(ui->fileSwitches, + new FileSwitchWidget(&switcher->fileSwitches.back()), + ui->fileAdd, &addPulse); } void AdvSceneSwitcher::on_fileRemove_clicked() @@ -490,8 +493,6 @@ FileSwitchWidget::FileSwitchWidget(FileSwitch *s) : SwitchWidget(s, false) checkFileContent->setChecked(s->onlyMatchIfChanged); } - setStyleSheet("* { background-color: transparent; }"); - std::unordered_map widgetPlaceholders = { {"{{fileType}}", fileType}, {"{{filePath}}", filePath}, diff --git a/src/switch-generic.cpp b/src/switch-generic.cpp index e81609b1..e2b6aaee 100644 --- a/src/switch-generic.cpp +++ b/src/switch-generic.cpp @@ -30,6 +30,12 @@ SwitchWidget::SwitchWidget(SceneSwitcherEntry *s, bool usePreviousScene) scenes = new QComboBox(); transitions = new QComboBox(); + // Depending on selected OBS theme some widgets might have a different + // background color than the listwidget and might look out of place + setStyleSheet("QLabel { background-color: transparent; }\ + QSlider { background-color: transparent; }\ + QCheckBox { background-color: transparent; }"); + QWidget::connect(scenes, SIGNAL(currentTextChanged(const QString &)), this, SLOT(SceneChanged(const QString &))); QWidget::connect(transitions, diff --git a/src/switch-media.cpp b/src/switch-media.cpp index 72274d82..5c1d7956 100644 --- a/src/switch-media.cpp +++ b/src/switch-media.cpp @@ -8,18 +8,12 @@ constexpr auto media_any_idx = 9; void AdvSceneSwitcher::on_mediaAdd_clicked() { - ui->mediaAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->mediaSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->mediaSwitches); - ui->mediaSwitches->addItem(item); - MediaSwitchWidget *sw = - new MediaSwitchWidget(&switcher->mediaSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->mediaSwitches->setItemWidget(item, sw); + listAddClicked(ui->mediaSwitches, + new MediaSwitchWidget(&switcher->mediaSwitches.back()), + ui->mediaAdd, &addPulse); } void AdvSceneSwitcher::on_mediaRemove_clicked() @@ -483,8 +477,6 @@ MediaSwitchWidget::MediaSwitchWidget(MediaSwitch *s) : SwitchWidget(s) time->setDisabled(true); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{meidaSources}}", meidaSources}, diff --git a/src/switch-random.cpp b/src/switch-random.cpp index 06ea806d..c8367f5b 100644 --- a/src/switch-random.cpp +++ b/src/switch-random.cpp @@ -7,18 +7,12 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_randomAdd_clicked() { - ui->randomAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->randomSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->randomSwitches); - ui->randomSwitches->addItem(item); - RandomSwitchWidget *sw = - new RandomSwitchWidget(&switcher->randomSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->randomSwitches->setItemWidget(item, sw); + listAddClicked(ui->randomSwitches, + new RandomSwitchWidget(&switcher->randomSwitches.back()), + ui->randomAdd, &addPulse); } void AdvSceneSwitcher::on_randomRemove_clicked() @@ -153,8 +147,6 @@ RandomSwitchWidget::RandomSwitchWidget(RandomSwitch *s) : SwitchWidget(s, false) delay->setValue(s->delay); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{scenes}}", scenes}, diff --git a/src/switch-screen-region.cpp b/src/switch-screen-region.cpp index f44ef755..8adc3958 100644 --- a/src/switch-screen-region.cpp +++ b/src/switch-screen-region.cpp @@ -63,18 +63,13 @@ void AdvSceneSwitcher::on_screenRegionSwitches_currentRowChanged(int idx) void AdvSceneSwitcher::on_screenRegionAdd_clicked() { - ui->screenRegionAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->screenRegionSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->screenRegionSwitches); - ui->screenRegionSwitches->addItem(item); - ScreenRegionWidget *sw = - new ScreenRegionWidget(&switcher->screenRegionSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->screenRegionSwitches->setItemWidget(item, sw); + listAddClicked( + ui->screenRegionSwitches, + new ScreenRegionWidget(&switcher->screenRegionSwitches.back()), + ui->screenRegionAdd, &addPulse); } void AdvSceneSwitcher::on_screenRegionRemove_clicked() @@ -290,8 +285,6 @@ ScreenRegionWidget::ScreenRegionWidget(ScreenRegionSwitch *s) maxY->setValue(s->maxY); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{minX}}", minX}, {"{{minY}}", minY}, diff --git a/src/switch-sequence.cpp b/src/switch-sequence.cpp index 328a6660..10a7676d 100644 --- a/src/switch-sequence.cpp +++ b/src/switch-sequence.cpp @@ -9,18 +9,13 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_sceneSequenceAdd_clicked() { - ui->sceneSequenceAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->sceneSequenceSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->sceneSequenceSwitches); - ui->sceneSequenceSwitches->addItem(item); - SequenceWidget *sw = - new SequenceWidget(&switcher->sceneSequenceSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->sceneSequenceSwitches->setItemWidget(item, sw); + listAddClicked( + ui->sceneSequenceSwitches, + new SequenceWidget(&switcher->sceneSequenceSwitches.back()), + ui->sceneSequenceAdd, &addPulse); } void AdvSceneSwitcher::on_sceneSequenceRemove_clicked() @@ -353,8 +348,6 @@ SequenceWidget::SequenceWidget(SceneSequenceSwitch *s) : SwitchWidget(s) GetWeakSourceName(s->startScene).c_str()); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{startScenes}}", startScenes}, diff --git a/src/switch-time.cpp b/src/switch-time.cpp index b513ad2c..9957de29 100644 --- a/src/switch-time.cpp +++ b/src/switch-time.cpp @@ -5,18 +5,12 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_timeAdd_clicked() { - ui->timeAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->timeSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->timeSwitches); - ui->timeSwitches->addItem(item); - TimeSwitchWidget *sw = - new TimeSwitchWidget(&switcher->timeSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->timeSwitches->setItemWidget(item, sw); + listAddClicked(ui->timeSwitches, + new TimeSwitchWidget(&switcher->timeSwitches.back()), + ui->timeAdd, &addPulse); } void AdvSceneSwitcher::on_timeRemove_clicked() @@ -250,8 +244,6 @@ TimeSwitchWidget::TimeSwitchWidget(TimeSwitch *s) : SwitchWidget(s) time->setTime(s->time); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{triggers}}", triggers}, diff --git a/src/switch-transitions.cpp b/src/switch-transitions.cpp index 9c357524..b8f1c7c8 100644 --- a/src/switch-transitions.cpp +++ b/src/switch-transitions.cpp @@ -6,13 +6,9 @@ void AdvSceneSwitcher::on_transitionsAdd_clicked() std::lock_guard lock(switcher->m); switcher->sceneTransitions.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->sceneTransitions); - ui->sceneTransitions->addItem(item); - TransitionSwitchWidget *sw = - new TransitionSwitchWidget(&switcher->sceneTransitions.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->sceneTransitions->setItemWidget(item, sw); + listAddClicked( + ui->sceneTransitions, + new TransitionSwitchWidget(&switcher->sceneTransitions.back())); } void AdvSceneSwitcher::on_transitionsRemove_clicked() @@ -77,13 +73,9 @@ void AdvSceneSwitcher::on_defaultTransitionsAdd_clicked() std::lock_guard lock(switcher->m); switcher->defaultSceneTransitions.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->defaultTransitions); - ui->defaultTransitions->addItem(item); - DefTransitionSwitchWidget *sw = new DefTransitionSwitchWidget( - &switcher->defaultSceneTransitions.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->defaultTransitions->setItemWidget(item, sw); + listAddClicked(ui->defaultTransitions, + new DefTransitionSwitchWidget( + &switcher->defaultSceneTransitions.back())); } void AdvSceneSwitcher::on_defaultTransitionsRemove_clicked() @@ -427,8 +419,6 @@ TransitionSwitchWidget::TransitionSwitchWidget(SceneTransition *s) scenes2->setCurrentText(GetWeakSourceName(s->scene2).c_str()); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{scenes}}", scenes}, @@ -474,8 +464,6 @@ void TransitionSwitchWidget::Scene2Changed(const QString &text) DefTransitionSwitchWidget::DefTransitionSwitchWidget(DefaultSceneTransition *s) : SwitchWidget(s, false) { - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{scenes}}", scenes}, {"{{transitions}}", transitions}}; diff --git a/src/switch-window.cpp b/src/switch-window.cpp index 38cbd716..0df65ec3 100644 --- a/src/switch-window.cpp +++ b/src/switch-window.cpp @@ -5,18 +5,12 @@ static QMetaObject::Connection addPulse; void AdvSceneSwitcher::on_windowAdd_clicked() { - ui->windowAdd->disconnect(addPulse); - std::lock_guard lock(switcher->m); switcher->windowSwitches.emplace_back(); - QListWidgetItem *item; - item = new QListWidgetItem(ui->windowSwitches); - ui->windowSwitches->addItem(item); - WindowSwitchWidget *sw = - new WindowSwitchWidget(&switcher->windowSwitches.back()); - item->setSizeHint(sw->minimumSizeHint()); - ui->windowSwitches->setItemWidget(item, sw); + listAddClicked(ui->windowSwitches, + new WindowSwitchWidget(&switcher->windowSwitches.back()), + ui->windowAdd, &addPulse); } void AdvSceneSwitcher::on_windowRemove_clicked() @@ -407,8 +401,6 @@ WindowSwitchWidget::WindowSwitchWidget(WindowSwitch *s) : SwitchWidget(s, false) focused->setChecked(s->focus); } - setStyleSheet("* { background-color: transparent; }"); - QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{windows}}", windows},