From 61839d8c94466a3d762837f2e198d982ef5a1eb6 Mon Sep 17 00:00:00 2001 From: Igor Bochkariov Date: Sun, 18 Mar 2018 19:29:13 +0400 Subject: [PATCH] UI: Sort audio controls by source name Audio controls in OBS Mixer and Advanced Audio Properties window are not sorted at all. Every time OBS is restarted they get shuffled (Jim note: This is due to json object hashing). The order of these controls is additionally not consistent between the mixer and the advanced audio properties window. Closes obsproject/obs-studio#1242 --- UI/adv-audio-control.cpp | 35 ++++++++++++++++++++--------------- UI/adv-audio-control.hpp | 1 + UI/item-widget-helpers.hpp | 12 ++++++++++++ UI/volume-control.cpp | 1 + UI/window-basic-adv-audio.cpp | 8 +++++++- UI/window-basic-main.cpp | 7 +++++-- 6 files changed, 46 insertions(+), 18 deletions(-) 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)