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