diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index 531b00173..2c602b6a1 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -13,7 +13,7 @@ #define NSEC_PER_MSEC 1000000 #endif -OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_) +OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) : source(source_) { QHBoxLayout *hlayout; @@ -155,20 +155,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_) QWidget::connect(mixer6, SIGNAL(clicked(bool)), this, SLOT(mixer6Changed(bool))); - int lastRow = layout->rowCount(); - - idx = 0; - layout->addWidget(nameLabel, lastRow, idx++); - layout->addWidget(volume, lastRow, idx++); - layout->addWidget(forceMonoContainer, lastRow, idx++); - layout->addWidget(panningContainer, lastRow, idx++); - layout->addWidget(syncOffset, lastRow, idx++); -#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO - layout->addWidget(monitoringType, lastRow, idx++); -#endif - layout->addWidget(mixerContainer, lastRow, idx++); - layout->layout()->setAlignment(mixerContainer, - Qt::AlignHCenter | Qt::AlignVCenter); + setObjectName(sourceName); } OBSAdvAudioCtrl::~OBSAdvAudioCtrl() @@ -184,6 +171,24 @@ OBSAdvAudioCtrl::~OBSAdvAudioCtrl() mixerContainer->deleteLater(); } +void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout) +{ + int lastRow = layout->rowCount(); + int idx = 0; + + layout->addWidget(nameLabel, lastRow, idx++); + layout->addWidget(volume, lastRow, idx++); + layout->addWidget(forceMonoContainer, lastRow, idx++); + layout->addWidget(panningContainer, lastRow, idx++); + layout->addWidget(syncOffset, lastRow, idx++); +#if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO + layout->addWidget(monitoringType, lastRow, idx++); +#endif + layout->addWidget(mixerContainer, lastRow, idx++); + layout->layout()->setAlignment(mixerContainer, + Qt::AlignHCenter | Qt::AlignVCenter); +} + /* ------------------------------------------------------------------------- */ /* OBS source callbacks */ diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index 38d760823..1352a4b8f 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -51,6 +51,7 @@ public: virtual ~OBSAdvAudioCtrl(); inline obs_source_t *GetSource() const {return source;} + void ShowAudioControl(QGridLayout *layout); public slots: void SourceFlagsChanged(uint32_t flags); diff --git a/UI/item-widget-helpers.hpp b/UI/item-widget-helpers.hpp index 9a4d43e41..776c2fb7b 100644 --- a/UI/item-widget-helpers.hpp +++ b/UI/item-widget-helpers.hpp @@ -28,3 +28,15 @@ class QListWidgetItem; QListWidgetItem *TakeListItem(QListWidget *widget, int row); void DeleteListItem(QListWidget *widget, QListWidgetItem *item); void ClearListItems(QListWidget *widget); + +template +void InsertQObjectByName(std::vector &controls, QObjectPtr control) +{ + QString name = control->objectName(); + auto finder = [name](QObjectPtr elem) { + return elem->objectName() > name; + }; + auto found_at = std::find_if(controls.begin(), controls.end(), finder); + + controls.insert(found_at, control); +} diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp index 5373ab8a6..32d8185f2 100644 --- a/UI/volume-control.cpp +++ b/UI/volume-control.cpp @@ -136,6 +136,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig) font.setPointSize(font.pointSize()-1); QString sourceName = obs_source_get_name(source); + setObjectName(sourceName); nameLabel->setText(sourceName); nameLabel->setFont(font); diff --git a/UI/window-basic-adv-audio.cpp b/UI/window-basic-adv-audio.cpp index 2894f6bf2..e6b47f7be 100644 --- a/UI/window-basic-adv-audio.cpp +++ b/UI/window-basic-adv-audio.cpp @@ -6,6 +6,7 @@ #include #include "window-basic-adv-audio.hpp" #include "window-basic-main.hpp" +#include "item-widget-helpers.hpp" #include "adv-audio-control.hpp" #include "obs-app.hpp" #include "qt-wrappers.hpp" @@ -133,7 +134,12 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata) inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source) { OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source); - controls.push_back(control); + + InsertQObjectByName(controls, control); + + for (auto control : controls) { + control->ShowAudioControl(mainLayout); + } } void OBSBasicAdvAudio::SourceAdded(OBSSource source) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 034d2c029..95f49361b 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -2514,8 +2514,11 @@ void OBSBasic::ActivateAudioSource(OBSSource source) connect(vol, &VolControl::ConfigClicked, this, &OBSBasic::VolControlContextMenu); - volumes.push_back(vol); - ui->volumeWidgets->layout()->addWidget(vol); + InsertQObjectByName(volumes, vol); + + for (auto volume : volumes) { + ui->volumeWidgets->layout()->addWidget(volume); + } } void OBSBasic::DeactivateAudioSource(OBSSource source)