浏览代码

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
Igor Bochkariov 7 年之前
父节点
当前提交
61839d8c94
共有 6 个文件被更改,包括 46 次插入18 次删除
  1. 20 15
      UI/adv-audio-control.cpp
  2. 1 0
      UI/adv-audio-control.hpp
  3. 12 0
      UI/item-widget-helpers.hpp
  4. 1 0
      UI/volume-control.cpp
  5. 7 1
      UI/window-basic-adv-audio.cpp
  6. 5 2
      UI/window-basic-main.cpp

+ 20 - 15
UI/adv-audio-control.cpp

@@ -13,7 +13,7 @@
 #define NSEC_PER_MSEC 1000000
 #define NSEC_PER_MSEC 1000000
 #endif
 #endif
 
 
-OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
+OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
 	: source(source_)
 	: source(source_)
 {
 {
 	QHBoxLayout *hlayout;
 	QHBoxLayout *hlayout;
@@ -155,20 +155,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
 	QWidget::connect(mixer6, SIGNAL(clicked(bool)),
 	QWidget::connect(mixer6, SIGNAL(clicked(bool)),
 			this, SLOT(mixer6Changed(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()
 OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
@@ -184,6 +171,24 @@ OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
 	mixerContainer->deleteLater();
 	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 */
 /* OBS source callbacks */
 
 

+ 1 - 0
UI/adv-audio-control.hpp

@@ -51,6 +51,7 @@ public:
 	virtual ~OBSAdvAudioCtrl();
 	virtual ~OBSAdvAudioCtrl();
 
 
 	inline obs_source_t *GetSource() const {return source;}
 	inline obs_source_t *GetSource() const {return source;}
+	void ShowAudioControl(QGridLayout *layout);
 
 
 public slots:
 public slots:
 	void SourceFlagsChanged(uint32_t flags);
 	void SourceFlagsChanged(uint32_t flags);

+ 12 - 0
UI/item-widget-helpers.hpp

@@ -28,3 +28,15 @@ class QListWidgetItem;
 QListWidgetItem *TakeListItem(QListWidget *widget, int row);
 QListWidgetItem *TakeListItem(QListWidget *widget, int row);
 void DeleteListItem(QListWidget *widget, QListWidgetItem *item);
 void DeleteListItem(QListWidget *widget, QListWidgetItem *item);
 void ClearListItems(QListWidget *widget);
 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);
+}

+ 1 - 0
UI/volume-control.cpp

@@ -136,6 +136,7 @@ VolControl::VolControl(OBSSource source_, bool showConfig)
 	font.setPointSize(font.pointSize()-1);
 	font.setPointSize(font.pointSize()-1);
 
 
 	QString sourceName = obs_source_get_name(source);
 	QString sourceName = obs_source_get_name(source);
+	setObjectName(sourceName);
 
 
 	nameLabel->setText(sourceName);
 	nameLabel->setText(sourceName);
 	nameLabel->setFont(font);
 	nameLabel->setFont(font);

+ 7 - 1
UI/window-basic-adv-audio.cpp

@@ -6,6 +6,7 @@
 #include <QLabel>
 #include <QLabel>
 #include "window-basic-adv-audio.hpp"
 #include "window-basic-adv-audio.hpp"
 #include "window-basic-main.hpp"
 #include "window-basic-main.hpp"
+#include "item-widget-helpers.hpp"
 #include "adv-audio-control.hpp"
 #include "adv-audio-control.hpp"
 #include "obs-app.hpp"
 #include "obs-app.hpp"
 #include "qt-wrappers.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)
 inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
 {
 {
 	OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, 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)
 void OBSBasicAdvAudio::SourceAdded(OBSSource source)

+ 5 - 2
UI/window-basic-main.cpp

@@ -2514,8 +2514,11 @@ void OBSBasic::ActivateAudioSource(OBSSource source)
 	connect(vol, &VolControl::ConfigClicked,
 	connect(vol, &VolControl::ConfigClicked,
 			this, &OBSBasic::VolControlContextMenu);
 			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)
 void OBSBasic::DeactivateAudioSource(OBSSource source)