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
master
Igor Bochkariov 2018-03-18 19:29:13 +04:00 committed by jp9000
parent 904ad9be1d
commit 61839d8c94
6 changed files with 46 additions and 18 deletions

View File

@ -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 */

View File

@ -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);

View File

@ -28,3 +28,15 @@ class QListWidgetItem;
QListWidgetItem *TakeListItem(QListWidget *widget, int row);
void DeleteListItem(QListWidget *widget, QListWidgetItem *item);
void ClearListItems(QListWidget *widget);
template<typename QObjectPtr>
void InsertQObjectByName(std::vector<QObjectPtr> &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);
}

View File

@ -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);

View File

@ -6,6 +6,7 @@
#include <QLabel>
#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)

View File

@ -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)