UI: Cleanup advanced audio window

This converts the advanced audio window to use
a ui form, so it is easier to modify in the future.

This also fixes sizing issues with the control widgets,
as before the audio tracks would be clipped, because the
widgets in the window were too wide.
master
Clayton Groeneveld 2022-05-31 20:06:31 -05:00 committed by Matt Gajownik
parent 7d2fae69de
commit 295386781f
6 changed files with 394 additions and 147 deletions

View File

@ -112,6 +112,7 @@ target_sources(
forms/AutoConfigVideoPage.ui
forms/ColorSelect.ui
forms/OBSAbout.ui
forms/OBSAdvAudio.ui
forms/OBSBasic.ui
forms/OBSBasicFilters.ui
forms/OBSBasicInteraction.ui

View File

@ -27,8 +27,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
uint32_t flags = obs_source_get_flags(source);
uint32_t mixers = obs_source_get_audio_mixers(source);
activeContainer = new QWidget();
forceMonoContainer = new QWidget();
mixerContainer = new QWidget();
balanceContainer = new QWidget();
labelL = new QLabel();
@ -70,12 +68,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
OBSSourceBalanceChanged, this);
renameSignal.Connect(handler, "rename", OBSSourceRenamed, this);
hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0);
activeContainer->setLayout(hlayout);
hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0);
forceMonoContainer->setLayout(hlayout);
hlayout = new QHBoxLayout();
hlayout->setContentsMargins(0, 0, 0, 0);
mixerContainer->setLayout(hlayout);
@ -85,7 +77,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
balanceContainer->setFixedWidth(150);
labelL->setText("L");
labelR->setText("R");
OBSBasic *main = reinterpret_cast<OBSBasic *>(App()->GetMainWindow());
@ -104,9 +95,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
: QTStr("Basic.Stats.Status.Inactive"));
if (isActive)
setThemeID(active, "error");
activeContainer->layout()->addWidget(active);
activeContainer->layout()->setAlignment(active, Qt::AlignVCenter);
activeContainer->setFixedWidth(120);
active->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
volume->setMinimum(MIN_DB - 0.1);
volume->setMaximum(MAX_DB);
@ -114,7 +103,6 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
volume->setDecimals(1);
volume->setSuffix(" dB");
volume->setValue(obs_mul_to_db(vol));
volume->setFixedWidth(100);
volume->setAccessibleName(
QTStr("Basic.AdvAudio.VolumeSource").arg(sourceName));
@ -127,10 +115,11 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
percent->setMaximum(2000);
percent->setSuffix("%");
percent->setValue((int)(obs_source_get_volume(source) * 100.0f));
percent->setFixedWidth(100);
percent->setAccessibleName(
QTStr("Basic.AdvAudio.VolumeSource").arg(sourceName));
stackedWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
stackedWidget->setFixedWidth(100);
stackedWidget->addWidget(volume);
stackedWidget->addWidget(percent);
@ -139,14 +128,11 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
SetVolumeWidget(volType);
forceMono->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
forceMono->setChecked((flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0);
forceMono->setAccessibleName(
QTStr("Basic.AdvAudio.MonoSource").arg(sourceName));
forceMonoContainer->layout()->addWidget(forceMono);
forceMonoContainer->layout()->setAlignment(forceMono, Qt::AlignVCenter);
forceMonoContainer->setFixedWidth(50);
balance->setOrientation(Qt::Horizontal);
balance->setMinimum(0);
balance->setMaximum(100);
@ -191,6 +177,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
monitoringType->setAccessibleName(
QTStr("Basic.AdvAudio.MonitoringSource")
.arg(sourceName));
monitoringType->setSizePolicy(QSizePolicy::Maximum,
QSizePolicy::Fixed);
}
mixer1->setText("1");
@ -218,14 +206,14 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
mixer6->setAccessibleName(
QTStr("Basic.Settings.Output.Adv.Audio.Track6"));
balanceContainer->layout()->addWidget(labelL);
balanceContainer->layout()->addWidget(balance);
balanceContainer->layout()->addWidget(labelR);
speaker_layout sl = obs_source_get_speaker_layout(source);
if (sl == SPEAKERS_STEREO) {
balanceContainer->layout()->addWidget(labelL);
balanceContainer->layout()->addWidget(balance);
balanceContainer->layout()->addWidget(labelR);
balanceContainer->setMaximumWidth(170);
}
if (sl != SPEAKERS_STEREO)
balanceContainer->setEnabled(false);
mixerContainer->layout()->addWidget(mixer1);
mixerContainer->layout()->addWidget(mixer2);
@ -233,6 +221,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_)
mixerContainer->layout()->addWidget(mixer4);
mixerContainer->layout()->addWidget(mixer5);
mixerContainer->layout()->addWidget(mixer6);
mixerContainer->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
QWidget::connect(volume, SIGNAL(valueChanged(double)), this,
SLOT(volumeChanged(double)));
@ -270,9 +259,9 @@ OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
{
iconLabel->deleteLater();
nameLabel->deleteLater();
activeContainer->deleteLater();
active->deleteLater();
stackedWidget->deleteLater();
forceMonoContainer->deleteLater();
forceMono->deleteLater();
balanceContainer->deleteLater();
syncOffset->deleteLater();
if (obs_audio_monitoring_available())
@ -287,9 +276,9 @@ void OBSAdvAudioCtrl::ShowAudioControl(QGridLayout *layout)
layout->addWidget(iconLabel, lastRow, idx++);
layout->addWidget(nameLabel, lastRow, idx++);
layout->addWidget(activeContainer, lastRow, idx++);
layout->addWidget(active, lastRow, idx++);
layout->addWidget(stackedWidget, lastRow, idx++);
layout->addWidget(forceMonoContainer, lastRow, idx++);
layout->addWidget(forceMono, lastRow, idx++);
layout->addWidget(balanceContainer, lastRow, idx++);
layout->addWidget(syncOffset, lastRow, idx++);
if (obs_audio_monitoring_available())

View File

@ -24,8 +24,6 @@ class OBSAdvAudioCtrl : public QObject {
private:
OBSSource source;
QPointer<QWidget> activeContainer;
QPointer<QWidget> forceMonoContainer;
QPointer<QWidget> mixerContainer;
QPointer<QWidget> balanceContainer;

358
UI/forms/OBSAdvAudio.ui Normal file
View File

@ -0,0 +1,358 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>OBSAdvAudio</class>
<widget class="QDialog" name="OBSAdvAudio">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1100</width>
<height>340</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="windowTitle">
<string>Basic.AdvAudio</string>
</property>
<property name="sizeGripEnabled">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="leftMargin">
<number>11</number>
</property>
<property name="topMargin">
<number>11</number>
</property>
<property name="rightMargin">
<number>11</number>
</property>
<property name="bottomMargin">
<number>11</number>
</property>
<property name="verticalSpacing">
<number>11</number>
</property>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>7</number>
</property>
<item>
<widget class="QCheckBox" name="activeOnly">
<property name="text">
<string>Basic.AdvAudio.ActiveOnly</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="closeButton">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeAdjustPolicy">
<enum>QAbstractScrollArea::AdjustToContents</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1346</width>
<height>254</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>4</number>
</property>
<property name="topMargin">
<number>4</number>
</property>
<property name="rightMargin">
<number>4</number>
</property>
<property name="bottomMargin">
<number>4</number>
</property>
<item>
<layout class="QGridLayout" name="mainLayout">
<property name="verticalSpacing">
<number>4</number>
</property>
<item row="0" column="5">
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.Balance</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.Stats.Status</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.Mono</string>
</property>
</widget>
</item>
<item row="0" column="8">
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.AudioTracks</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.Name</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.SyncOffset</string>
</property>
</widget>
</item>
<item row="0" column="7">
<widget class="QLabel" name="label_6">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.Monitoring</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QWidget" name="widget" native="true">
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="label_9">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Basic.AdvAudio.Volume</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="usePercent">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>%</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>closeButton</sender>
<signal>clicked()</signal>
<receiver>OBSAdvAudio</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>1286</x>
<y>474</y>
</hint>
<hint type="destinationlabel">
<x>672</x>
<y>250</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -1,9 +1,3 @@
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QScrollArea>
#include <QPushButton>
#include <QLabel>
#include "window-basic-adv-audio.hpp"
#include "window-basic-main.hpp"
#include "item-widget-helpers.hpp"
@ -11,124 +5,34 @@
#include "obs-app.hpp"
#include "qt-wrappers.hpp"
#include "ui_OBSAdvAudio.h"
Q_DECLARE_METATYPE(OBSSource);
OBSBasicAdvAudio::OBSBasicAdvAudio(QWidget *parent)
: QDialog(parent),
ui(new Ui::OBSAdvAudio),
sourceAddedSignal(obs_get_signal_handler(), "source_activate",
OBSSourceAdded, this),
sourceRemovedSignal(obs_get_signal_handler(), "source_deactivate",
OBSSourceRemoved, this),
showInactive(false)
{
QScrollArea *scrollArea;
QVBoxLayout *vlayout;
QWidget *widget;
QLabel *label;
QLabel *volLabel = new QLabel(QTStr("Basic.AdvAudio.Volume"));
volLabel->setStyleSheet("font-weight: bold;");
volLabel->setContentsMargins(0, 0, 6, 0);
usePercent = new QCheckBox();
usePercent->setStyleSheet("font-weight: bold;");
usePercent->setText("%");
connect(usePercent, SIGNAL(toggled(bool)), this,
SLOT(SetVolumeType(bool)));
ui->setupUi(this);
VolumeType volType = (VolumeType)config_get_int(
GetGlobalConfig(), "BasicWindow", "AdvAudioVolumeType");
if (volType == VolumeType::Percent)
usePercent->setChecked(true);
QHBoxLayout *volLayout = new QHBoxLayout();
volLayout->setContentsMargins(0, 0, 0, 0);
volLayout->addWidget(volLabel);
volLayout->addWidget(usePercent);
volLayout->addStretch();
int idx = 0;
mainLayout = new QGridLayout;
mainLayout->setContentsMargins(0, 0, 0, 0);
label = new QLabel("");
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.Name"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.Stats.Status"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
mainLayout->addLayout(volLayout, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.Mono"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.Balance"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
label = new QLabel(QTStr("Basic.AdvAudio.SyncOffset"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
if (obs_audio_monitoring_available()) {
label = new QLabel(QTStr("Basic.AdvAudio.Monitoring"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
}
label = new QLabel(QTStr("Basic.AdvAudio.AudioTracks"));
label->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(label, 0, idx++);
controlArea = new QWidget;
controlArea->setLayout(mainLayout);
controlArea->setSizePolicy(QSizePolicy::Preferred,
QSizePolicy::Preferred);
vlayout = new QVBoxLayout;
vlayout->addWidget(controlArea);
//vlayout->setAlignment(controlArea, Qt::AlignTop);
widget = new QWidget;
widget->setLayout(vlayout);
widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
scrollArea = new QScrollArea;
scrollArea->setWidget(widget);
scrollArea->setWidgetResizable(true);
QPushButton *closeButton = new QPushButton(QTStr("Close"));
activeOnly = new QCheckBox();
activeOnly->setChecked(!showInactive);
activeOnly->setText(QTStr("Basic.AdvAudio.ActiveOnly"));
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(activeOnly);
buttonLayout->addStretch();
buttonLayout->addWidget(closeButton);
vlayout = new QVBoxLayout;
vlayout->setContentsMargins(11, 11, 11, 11);
vlayout->addWidget(scrollArea);
vlayout->addLayout(buttonLayout);
setLayout(vlayout);
connect(activeOnly, SIGNAL(clicked(bool)), this,
SLOT(ActiveOnlyChanged(bool)));
connect(closeButton, &QPushButton::clicked, [this]() { close(); });
ui->usePercent->setChecked(true);
installEventFilter(CreateShortcutFilter());
/* enum user scene/sources */
obs_enum_sources(EnumSources, this);
resize(1100, 340);
setWindowTitle(QTStr("Basic.AdvAudio"));
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
setSizeGripEnabled(true);
setWindowModality(Qt::NonModal);
setAttribute(Qt::WA_DeleteOnClose, true);
setContextMenuPolicy(Qt::CustomContextMenu);
}
OBSBasicAdvAudio::~OBSBasicAdvAudio()
@ -175,12 +79,12 @@ inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
if (controls[i]->GetSource() == source)
return;
}
OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(ui->mainLayout, source);
InsertQObjectByName(controls, control);
for (auto control : controls) {
control->ShowAudioControl(mainLayout);
control->ShowAudioControl(ui->mainLayout);
}
}
@ -210,11 +114,11 @@ void OBSBasicAdvAudio::SourceRemoved(OBSSource source)
}
}
void OBSBasicAdvAudio::SetVolumeType(bool percent)
void OBSBasicAdvAudio::on_usePercent_toggled(bool checked)
{
VolumeType type;
if (percent)
if (checked)
type = VolumeType::Percent;
else
type = VolumeType::dB;
@ -226,7 +130,7 @@ void OBSBasicAdvAudio::SetVolumeType(bool percent)
(int)type);
}
void OBSBasicAdvAudio::ActiveOnlyChanged(bool checked)
void OBSBasicAdvAudio::on_activeOnly_toggled(bool checked)
{
SetShowInactive(!checked);
}
@ -237,7 +141,7 @@ void OBSBasicAdvAudio::SetShowInactive(bool show)
return;
showInactive = show;
activeOnly->setChecked(!showInactive);
sourceAddedSignal.Disconnect();
sourceRemovedSignal.Disconnect();
@ -275,7 +179,7 @@ void OBSBasicAdvAudio::SetIconsVisible(bool visible)
{
showVisible = visible;
QLayoutItem *item = mainLayout->itemAtPosition(0, 0);
QLayoutItem *item = ui->mainLayout->itemAtPosition(0, 0);
QLabel *headerLabel = qobject_cast<QLabel *>(item->widget());
visible ? headerLabel->show() : headerLabel->hide();

View File

@ -3,11 +3,10 @@
#include <obs.hpp>
#include <QDialog>
#include <vector>
#include <QCheckBox>
#include <QPointer>
#include <memory>
class OBSAdvAudioCtrl;
class QGridLayout;
class Ui_OBSAdvAudio;
// "Basic advanced audio"? ...
@ -15,10 +14,6 @@ class OBSBasicAdvAudio : public QDialog {
Q_OBJECT
private:
QWidget *controlArea;
QGridLayout *mainLayout;
QPointer<QCheckBox> activeOnly;
QPointer<QCheckBox> usePercent;
OBSSignal sourceAddedSignal;
OBSSignal sourceRemovedSignal;
bool showInactive;
@ -33,12 +28,14 @@ private:
static void OBSSourceAdded(void *param, calldata_t *calldata);
static void OBSSourceRemoved(void *param, calldata_t *calldata);
std::unique_ptr<Ui_OBSAdvAudio> ui;
public slots:
void SourceAdded(OBSSource source);
void SourceRemoved(OBSSource source);
void SetVolumeType(bool percent);
void ActiveOnlyChanged(bool checked);
void on_usePercent_toggled(bool checked);
void on_activeOnly_toggled(bool checked);
public:
OBSBasicAdvAudio(QWidget *parent);