Selaa lähdekoodia

UI: Use grid layout for advanced audio properties

This fixes the issue where the labels wouldn't have enough space for
localization text in certain circumstances, and also fixes some issues
with alignment
jp9000 11 vuotta sitten
vanhempi
sitoutus
dce0afa84f

+ 26 - 25
obs/adv-audio-control.cpp

@@ -1,4 +1,5 @@
 #include <QHBoxLayout>
+#include <QGridLayout>
 #include <QLabel>
 #include <QSpinBox>
 #include <QCheckBox>
@@ -10,14 +11,10 @@
 #define NSEC_PER_MSEC 1000000
 #endif
 
-OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
+OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
 	: source(source_)
 {
-	QWidget *forceMonoContainer;
-	QWidget *mixerContainer;
-	QWidget *panningContainer;
 	QHBoxLayout *hlayout;
-	QLabel  *labelL, *labelR;
 	signal_handler_t *handler = obs_source_get_signal_handler(source);
 	const char *sourceName = obs_source_get_name(source);
 	float vol = obs_source_get_volume(source);
@@ -57,6 +54,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
 	hlayout = new QHBoxLayout();
 	hlayout->setContentsMargins(0, 0, 0, 0);
 	panningContainer->setLayout(hlayout);
+	panningContainer->setMinimumWidth(100);
 
 	labelL->setText("L");
 
@@ -68,18 +66,16 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
 
 	volume->setMinimum(0);
 	volume->setMaximum(2000);
-	volume->setMinimumWidth(130);
-	volume->setMaximumWidth(130);
 	volume->setValue(int(vol * 100.0f));
 
 	forceMono->setChecked((flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0);
 
-	forceMonoContainer->setMinimumWidth(130);
-	forceMonoContainer->setMaximumWidth(130);
 	forceMonoContainer->layout()->addWidget(forceMono);
 	forceMonoContainer->layout()->setAlignment(forceMono,
 			Qt::AlignHCenter | Qt::AlignVCenter);
 
+	QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+
 	panning->setMinimum(0);
 	panning->setMaximum(100);
 	panning->setTickPosition(QSlider::TicksAbove);
@@ -89,8 +85,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
 	int64_t cur_sync = obs_source_get_sync_offset(source);
 	syncOffset->setMinimum(-20000);
 	syncOffset->setMaximum(20000);
-	syncOffset->setMinimumWidth(130);
-	syncOffset->setMaximumWidth(130);
 	syncOffset->setValue(int(cur_sync / NSEC_PER_MSEC));
 
 	mixer1->setText("1");
@@ -102,14 +96,11 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
 	mixer4->setText("4");
 	mixer4->setChecked(mixers & (1<<3));
 
-	panningContainer->setMinimumWidth(140);
-	panningContainer->setMaximumWidth(140);
 	panningContainer->layout()->addWidget(labelL);
 	panningContainer->layout()->addWidget(panning);
 	panningContainer->layout()->addWidget(labelR);
+	panningContainer->setMaximumWidth(170);
 
-	mixerContainer->setMinimumWidth(160);
-	mixerContainer->setMaximumWidth(160);
 	mixerContainer->layout()->addWidget(mixer1);
 	mixerContainer->layout()->addWidget(mixer2);
 	mixerContainer->layout()->addWidget(mixer3);
@@ -132,16 +123,26 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
 	QWidget::connect(mixer4, SIGNAL(clicked(bool)),
 			this, SLOT(mixer4Changed(bool)));
 
-	hlayout = new QHBoxLayout;
-	hlayout->setContentsMargins(0, 0, 0, 0);
-	hlayout->addWidget(nameLabel);
-	hlayout->addWidget(volume);
-	hlayout->addWidget(forceMonoContainer);
-	hlayout->addWidget(panningContainer);
-	hlayout->addWidget(syncOffset);
-	hlayout->addWidget(mixerContainer);
-	setLayout(hlayout);
-	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
+	int lastRow = layout->rowCount();
+
+	layout->addWidget(nameLabel, lastRow, 0);
+	layout->addWidget(volume, lastRow, 1);
+	layout->addWidget(forceMonoContainer, lastRow, 2);
+	layout->addWidget(panningContainer, lastRow, 3);
+	layout->addWidget(syncOffset, lastRow, 4);
+	layout->addWidget(mixerContainer, lastRow, 5);
+	layout->layout()->setAlignment(mixerContainer,
+			Qt::AlignHCenter | Qt::AlignVCenter);
+}
+
+OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
+{
+	nameLabel->deleteLater();
+	volume->deleteLater();
+	forceMonoContainer->deleteLater();
+	panningContainer->deleteLater();
+	syncOffset->deleteLater();
+	mixerContainer->deleteLater();
 }
 
 /* ------------------------------------------------------------------------- */

+ 21 - 11
obs/adv-audio-control.hpp

@@ -2,26 +2,35 @@
 
 #include <obs.hpp>
 #include <QWidget>
+#include <QPointer>
 
+class QGridLayout;
 class QLabel;
 class QSpinBox;
 class QCheckBox;
 class QSlider;
 
-class OBSAdvAudioCtrl : public QWidget {
+class OBSAdvAudioCtrl : public QObject {
 	Q_OBJECT
 
 private:
 	OBSSource              source;
-	QLabel                 *nameLabel              = nullptr;
-	QSpinBox               *volume                 = nullptr;
-	QCheckBox              *forceMono              = nullptr;
-	QSlider                *panning                = nullptr;
-	QSpinBox               *syncOffset             = nullptr;
-	QCheckBox              *mixer1                 = nullptr;
-	QCheckBox              *mixer2                 = nullptr;
-	QCheckBox              *mixer3                 = nullptr;
-	QCheckBox              *mixer4                 = nullptr;
+
+	QPointer<QWidget>      forceMonoContainer;
+	QPointer<QWidget>      mixerContainer;
+	QPointer<QWidget>      panningContainer;
+
+	QPointer<QLabel>       nameLabel;
+	QPointer<QSpinBox>     volume;
+	QPointer<QCheckBox>    forceMono;
+	QPointer<QSlider>      panning;
+	QPointer<QLabel>       labelL;
+	QPointer<QLabel>       labelR;
+	QPointer<QSpinBox>     syncOffset;
+	QPointer<QCheckBox>    mixer1;
+	QPointer<QCheckBox>    mixer2;
+	QPointer<QCheckBox>    mixer3;
+	QPointer<QCheckBox>    mixer4;
 
 	OBSSignal              volChangedSignal;
 	OBSSignal              syncOffsetSignal;
@@ -34,7 +43,8 @@ private:
 	static void OBSSourceMixersChanged(void *param, calldata_t *calldata);
 
 public:
-	OBSAdvAudioCtrl(obs_source_t *source_);
+	OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_);
+	virtual ~OBSAdvAudioCtrl();
 
 	inline obs_source_t *GetSource() const {return source;}
 

+ 11 - 29
obs/window-basic-adv-audio.cpp

@@ -1,5 +1,5 @@
 #include <QVBoxLayout>
-#include <QHBoxLayout>
+#include <QGridLayout>
 #include <QScrollArea>
 #include <QLabel>
 #include "window-basic-adv-audio.hpp"
@@ -18,49 +18,32 @@ OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
 {
 	QScrollArea *scrollArea;
 	QVBoxLayout *vlayout;
-	QHBoxLayout *hlayout;
 	QWidget *widget;
 	QLabel *label;
 
-	hlayout = new QHBoxLayout;
-	hlayout->setContentsMargins(0, 0, 0, 0);
+	mainLayout = new QGridLayout;
+	mainLayout->setContentsMargins(0, 0, 0, 0);
 	label = new QLabel(QTStr("Basic.AdvAudio.Name"));
-	label->setMinimumWidth(170);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
+	mainLayout->addWidget(label, 0, 0);
 	label = new QLabel(QTStr("Basic.AdvAudio.Volume"));
-	label->setMinimumWidth(130);
-	label->setMaximumWidth(130);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
+	mainLayout->addWidget(label, 0, 1);
 	label = new QLabel(QTStr("Basic.AdvAudio.Mono"));
-	label->setMinimumWidth(130);
-	label->setMaximumWidth(130);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
+	mainLayout->addWidget(label, 0, 2);
 	label = new QLabel(QTStr("Basic.AdvAudio.Panning"));
-	label->setMinimumWidth(140);
-	label->setMaximumWidth(140);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
+	mainLayout->addWidget(label, 0, 3);
 	label = new QLabel(QTStr("Basic.AdvAudio.SyncOffset"));
-	label->setMinimumWidth(130);
-	label->setMaximumWidth(130);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
+	mainLayout->addWidget(label, 0, 4);
 	label = new QLabel(QTStr("Basic.AdvAudio.AudioTracks"));
-	label->setMinimumWidth(160);
-	label->setMaximumWidth(160);
 	label->setAlignment(Qt::AlignHCenter);
-	hlayout->addWidget(label);
-	widget = new QWidget;
-	widget->setLayout(hlayout);
+	mainLayout->addWidget(label, 0, 5);
 
-	vlayout = new QVBoxLayout;
-	vlayout->setContentsMargins(0, 0, 0, 10);
-	vlayout->addWidget(widget);
 	controlArea = new QWidget;
-	controlArea->setLayout(vlayout);
+	controlArea->setLayout(mainLayout);
 	controlArea->setSizePolicy(QSizePolicy::Preferred,
 			QSizePolicy::Preferred);
 
@@ -128,8 +111,7 @@ void OBSBasicAdvAudio::OBSSourceRemoved(void *param, calldata_t *calldata)
 
 inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
 {
-	OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(source);
-	controlArea->layout()->addWidget(control);
+	OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
 	controls.push_back(control);
 }
 

+ 2 - 0
obs/window-basic-adv-audio.hpp

@@ -5,6 +5,7 @@
 #include <vector>
 
 class OBSAdvAudioCtrl;
+class QGridLayout;
 
 // "Basic advanced audio"?  ...
 
@@ -13,6 +14,7 @@ class OBSBasicAdvAudio : public QDialog {
 
 private:
 	QWidget *controlArea;
+	QGridLayout *mainLayout;
 	OBSSignal sourceAddedSignal;
 	OBSSignal sourceRemovedSignal;