提交 61839d8c 编写于 作者: I Igor Bochkariov 提交者: jp9000

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
上级 904ad9be
......@@ -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 */
......
......@@ -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);
......
......@@ -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);
}
......@@ -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);
......
......@@ -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)
......
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册