From 295386781faf7bd4e2f2e6249ed605be88ef88f3 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Tue, 31 May 2022 20:06:31 -0500 Subject: [PATCH] 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. --- UI/CMakeLists.txt | 1 + UI/adv-audio-control.cpp | 45 ++--- UI/adv-audio-control.hpp | 2 - UI/forms/OBSAdvAudio.ui | 358 ++++++++++++++++++++++++++++++++++ UI/window-basic-adv-audio.cpp | 120 ++---------- UI/window-basic-adv-audio.hpp | 15 +- 6 files changed, 394 insertions(+), 147 deletions(-) create mode 100644 UI/forms/OBSAdvAudio.ui diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index 33a8b9627..64ad16f7f 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -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 diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index cb5b776a0..d36e652f1 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -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(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()) diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index e8ac5a663..c1239f720 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -24,8 +24,6 @@ class OBSAdvAudioCtrl : public QObject { private: OBSSource source; - QPointer activeContainer; - QPointer forceMonoContainer; QPointer mixerContainer; QPointer balanceContainer; diff --git a/UI/forms/OBSAdvAudio.ui b/UI/forms/OBSAdvAudio.ui new file mode 100644 index 000000000..e07710851 --- /dev/null +++ b/UI/forms/OBSAdvAudio.ui @@ -0,0 +1,358 @@ + + + OBSAdvAudio + + + + 0 + 0 + 1100 + 340 + + + + + 0 + 0 + + + + Qt::CustomContextMenu + + + Basic.AdvAudio + + + true + + + + 11 + + + 11 + + + 11 + + + 11 + + + 11 + + + + + 7 + + + + + Basic.AdvAudio.ActiveOnly + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Close + + + + + + + + + + 0 + 0 + + + + QAbstractScrollArea::AdjustToContents + + + true + + + + + 0 + 0 + 1346 + 254 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 4 + + + 4 + + + 4 + + + 4 + + + + + 4 + + + + + + 75 + true + + + + Basic.AdvAudio.Balance + + + + + + + + 0 + 0 + + + + + 75 + true + + + + Basic.Stats.Status + + + + + + + + 75 + true + + + + Basic.AdvAudio.Mono + + + + + + + + 75 + true + + + + Basic.AdvAudio.AudioTracks + + + + + + + + 75 + true + + + + Basic.AdvAudio.Name + + + + + + + + 75 + true + + + + Basic.AdvAudio.SyncOffset + + + + + + + + 75 + true + + + + Basic.AdvAudio.Monitoring + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 2 + + + + + + 75 + true + + + + Basic.AdvAudio.Volume + + + + + + + + 75 + true + + + + % + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 0 + 0 + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + closeButton + clicked() + OBSAdvAudio + close() + + + 1286 + 474 + + + 672 + 250 + + + + + diff --git a/UI/window-basic-adv-audio.cpp b/UI/window-basic-adv-audio.cpp index 4c6c58623..6a8aa0ce2 100644 --- a/UI/window-basic-adv-audio.cpp +++ b/UI/window-basic-adv-audio.cpp @@ -1,9 +1,3 @@ -#include -#include -#include -#include -#include -#include #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(item->widget()); visible ? headerLabel->show() : headerLabel->hide(); diff --git a/UI/window-basic-adv-audio.hpp b/UI/window-basic-adv-audio.hpp index 5d8508cf2..611448ca9 100644 --- a/UI/window-basic-adv-audio.hpp +++ b/UI/window-basic-adv-audio.hpp @@ -3,11 +3,10 @@ #include #include #include -#include -#include +#include 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 activeOnly; - QPointer 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; + 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);