Skip to content

Commit

Permalink
UI: Add volume controls to properties window
Browse files Browse the repository at this point in the history
This makes it easier for users to edit volume controls of a source,
without first closing the properties window.
  • Loading branch information
cg2121 committed Mar 6, 2023
1 parent b464ba8 commit f1f420a
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 1 deletion.
2 changes: 1 addition & 1 deletion UI/forms/OBSBasicProperties.ui
Expand Up @@ -44,7 +44,7 @@
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<layout class="QHBoxLayout" name="previewLayout">
<property name="spacing">
<number>0</number>
</property>
Expand Down
2 changes: 2 additions & 0 deletions UI/volume-control.hpp
Expand Up @@ -280,6 +280,8 @@ class MuteCheckBox;
class VolControl : public QWidget {
Q_OBJECT

friend class OBSBasicProperties;

private:
OBSSource source;
QLabel *nameLabel;
Expand Down
55 changes: 55 additions & 0 deletions UI/window-basic-properties.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qt-wrappers.hpp"
#include "display-helpers.hpp"
#include "properties-view.hpp"
#include "volume-control.hpp"

#include <QCloseEvent>
#include <QScreen>
Expand Down Expand Up @@ -51,6 +52,12 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_)
OBSBasicProperties::SourceRemoved, this),
renamedSignal(obs_source_get_signal_handler(source), "rename",
OBSBasicProperties::SourceRenamed, this),
audioActivated(obs_source_get_signal_handler(source),
"audio_activate", OBSBasicProperties::AudioActivated,
this),
audioDeactivated(obs_source_get_signal_handler(source),
"audio_deactivate",
OBSBasicProperties::AudioDeactivated, this),
oldSettings(obs_data_create())
{
int cx = (int)config_get_int(App()->GlobalConfig(), "PropertiesWindow",
Expand Down Expand Up @@ -114,6 +121,7 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_)
bool drawable_type = type == OBS_SOURCE_TYPE_INPUT ||
type == OBS_SOURCE_TYPE_SCENE;
bool drawable_preview = (caps & OBS_SOURCE_VIDEO) != 0;
bool verticalMixer = true;

if (drawable_preview && drawable_type) {
ui->preview->show();
Expand Down Expand Up @@ -166,7 +174,30 @@ OBSBasicProperties::OBSBasicProperties(QWidget *parent, OBSSource source_)

} else {
ui->preview->hide();
verticalMixer = false;
}

if ((caps & OBS_SOURCE_AUDIO) == OBS_SOURCE_AUDIO) {
vol = new VolControl(source, false, verticalMixer);
vol->nameLabel->hide();

if (!verticalMixer) {
QVBoxLayout *mainLayout =
qobject_cast<QVBoxLayout *>(vol->layout());

if (mainLayout)
mainLayout->addStretch();
} else {
ui->previewLayout->addSpacing(9);
}

ui->previewLayout->addWidget(vol);
}

if (obs_source_audio_active(source))
ShowVolumeControls();
else
HideVolumeControls();
}

OBSBasicProperties::~OBSBasicProperties()
Expand Down Expand Up @@ -301,6 +332,30 @@ void OBSBasicProperties::UpdateProperties(void *data, calldata_t *)
"ReloadProperties");
}

void OBSBasicProperties::AudioActivated(void *data, calldata_t *)
{
QMetaObject::invokeMethod(static_cast<OBSBasicProperties *>(data),
"ShowVolumeControls");
}

void OBSBasicProperties::AudioDeactivated(void *data, calldata_t *)
{
QMetaObject::invokeMethod(static_cast<OBSBasicProperties *>(data),
"HideVolumeControls");
}

void OBSBasicProperties::ShowVolumeControls()
{
if (vol)
vol->show();
}

void OBSBasicProperties::HideVolumeControls()
{
if (vol)
vol->hide();
}

static bool ConfirmReset(QWidget *parent)
{
QMessageBox::StandardButton button;
Expand Down
8 changes: 8 additions & 0 deletions UI/window-basic-properties.hpp
Expand Up @@ -26,6 +26,7 @@

class OBSPropertiesView;
class OBSBasic;
class VolControl;

#include "ui_OBSBasicProperties.h"

Expand All @@ -42,10 +43,13 @@ class OBSBasicProperties : public QDialog {
OBSSignal removedSignal;
OBSSignal renamedSignal;
OBSSignal updatePropertiesSignal;
OBSSignal audioActivated;
OBSSignal audioDeactivated;
OBSData oldSettings;
OBSPropertiesView *view;
QDialogButtonBox *buttonBox;
QSplitter *windowSplitter;
VolControl *vol = nullptr;

OBSSourceAutoRelease sourceA;
OBSSourceAutoRelease sourceB;
Expand All @@ -57,6 +61,8 @@ class OBSBasicProperties : public QDialog {
static void UpdateProperties(void *data, calldata_t *params);
static void DrawPreview(void *data, uint32_t cx, uint32_t cy);
static void DrawTransitionPreview(void *data, uint32_t cx, uint32_t cy);
static void AudioActivated(void *data, calldata_t *params);
static void AudioDeactivated(void *data, calldata_t *params);
void UpdateCallback(void *obj, obs_data_t *settings);
bool ConfirmQuit();
int CheckSettings();
Expand All @@ -65,6 +71,8 @@ class OBSBasicProperties : public QDialog {
private slots:
void on_buttonBox_clicked(QAbstractButton *button);
void AddPreviewButton();
void ShowVolumeControls();
void HideVolumeControls();

public:
OBSBasicProperties(QWidget *parent, OBSSource source_);
Expand Down

0 comments on commit f1f420a

Please sign in to comment.