浏览代码

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

+ 1 - 0
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);

+ 12 - 0
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<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);
 
 	QString sourceName = obs_source_get_name(source);
+	setObjectName(sourceName);
 
 	nameLabel->setText(sourceName);
 	nameLabel->setFont(font);

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

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

+ 5 - 2
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)