Skip to content

Commit b7cfd64

Browse files
committed
frontend: Add ability to collapse volume controls
This is an alternative to hiding the volume controls completely when they are hidden.
1 parent 5ed5863 commit b7cfd64

File tree

10 files changed

+219
-296
lines changed

10 files changed

+219
-296
lines changed

frontend/cmake/ui-components.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ target_sources(
7373
components/UIValidation.hpp
7474
components/UrlPushButton.cpp
7575
components/UrlPushButton.hpp
76+
components/VerticalLabel.cpp
77+
components/VerticalLabel.hpp
7678
components/VisibilityItemDelegate.cpp
7779
components/VisibilityItemDelegate.hpp
7880
components/VisibilityItemWidget.cpp

frontend/components/OBSSourceLabel.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@
1919

2020
#include <obs.hpp>
2121

22-
#include <QLabel>
22+
#include <components/VerticalLabel.hpp>
2323

24-
class OBSSourceLabel : public QLabel {
24+
class OBSSourceLabel : public VerticalLabel {
2525
Q_OBJECT;
2626

2727
public:
2828
OBSSignal renamedSignal;
2929
OBSSignal removedSignal;
3030
OBSSignal destroyedSignal;
3131

32-
OBSSourceLabel(const obs_source_t *source, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags())
33-
: QLabel(obs_source_get_name(source), parent, f),
32+
OBSSourceLabel(const obs_source_t *source, QWidget *parent = nullptr)
33+
: VerticalLabel(QString(obs_source_get_name(source)), parent),
3434
renamedSignal(obs_source_get_signal_handler(source), "rename", &OBSSourceLabel::SourceRenamed, this),
3535
removedSignal(obs_source_get_signal_handler(source), "remove", &OBSSourceLabel::SourceRemoved, this),
3636
destroyedSignal(obs_source_get_signal_handler(source), "destroy", &OBSSourceLabel::SourceDestroyed,
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "VerticalLabel.hpp"
2+
#include <QStylePainter>
3+
4+
#include "moc_VerticalLabel.cpp"
5+
6+
VerticalLabel::VerticalLabel(const QString &text, QWidget *parent) : QLabel(text, parent) {}
7+
8+
void VerticalLabel::ShowNormal()
9+
{
10+
vertical = false;
11+
}
12+
13+
void VerticalLabel::ShowVertical()
14+
{
15+
vertical = true;
16+
}
17+
18+
void VerticalLabel::paintEvent(QPaintEvent *event)
19+
{
20+
if (!vertical) {
21+
QLabel::paintEvent(event);
22+
return;
23+
}
24+
25+
QStylePainter painter(this);
26+
painter.translate(0, height());
27+
painter.rotate(270);
28+
painter.drawText(QRect(QPoint(0, 0), QLabel::sizeHint()), alignment(), text());
29+
}
30+
31+
QSize VerticalLabel::minimumSizeHint() const
32+
{
33+
QSize s = QLabel::minimumSizeHint();
34+
return QSize(vertical ? s.height() : s.width(), vertical ? s.width() : s.height());
35+
}
36+
37+
QSize VerticalLabel::sizeHint() const
38+
{
39+
QSize s = QLabel::sizeHint();
40+
return QSize(vertical ? s.height() : s.width(), vertical ? s.width() : s.height());
41+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#pragma once
2+
3+
#include <QLabel>
4+
#include <QPaintEvent>
5+
6+
class VerticalLabel : public QLabel {
7+
Q_OBJECT
8+
9+
private:
10+
bool vertical = false;
11+
12+
public:
13+
VerticalLabel(const QString &text, QWidget *parent = nullptr);
14+
void ShowNormal();
15+
void ShowVertical();
16+
17+
protected:
18+
virtual void paintEvent(QPaintEvent *event) override;
19+
virtual QSize sizeHint() const override;
20+
virtual QSize minimumSizeHint() const override;
21+
};

frontend/data/themes/Yami.obt

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,7 +1341,6 @@ QSlider::handle:disabled {
13411341
height: var(--icon_base);
13421342
background-color: var(--button_bg);
13431343
padding: var(--padding_base_border) var(--padding_base_border);
1344-
margin: 0px;
13451344
border: 1px solid var(--button_border);
13461345
border-radius: var(--border_radius);
13471346
icon-size: var(--icon_base);
@@ -1373,24 +1372,17 @@ VolControl {
13731372

13741373
VolControl QLabel {
13751374
font-size: var(--font_small);
1376-
margin: var(--spacing_small) 0px;
13771375
}
13781376

13791377
VolControl #volLabel {
1380-
padding: var(--padding_base) 0px var(--padding_base);
1381-
text-align: center;
13821378
font-size: var(--font_base);
13831379
color: var(--text_muted);
13841380
}
13851381

13861382
/* Horizontal Mixer */
13871383
#hMixerScrollArea VolControl {
1388-
padding: 0px var(--padding_xlarge) var(--padding_base);
13891384
border-bottom: 1px solid var(--border_color);
1390-
}
1391-
1392-
#hMixerScrollArea VolControl QSlider {
1393-
margin: 0px 0px var(--padding_base);
1385+
padding: var(--padding_container);
13941386
}
13951387

13961388
#hMixerScrollArea VolControl QSlider::groove:horizontal {
@@ -1404,46 +1396,29 @@ VolControl #volLabel {
14041396
}
14051397

14061398
#vMixerScrollArea VolControl {
1407-
padding: var(--padding_container) 0px var(--padding_container);
14081399
border-right: 1px solid var(--border_color);
1400+
padding: var(--padding_container);
14091401
}
14101402

14111403
#vMixerScrollArea VolControl QSlider {
14121404
width: var(--volume_slider_box);
1413-
margin: 0px var(--padding_xlarge);
1414-
}
1415-
1416-
#vMixerScrollArea VolControl #volLabel {
1417-
padding: var(--padding_base) 0px var(--padding_base);
1418-
min-width: var(--volume_slider_label);
1419-
margin-left: var(--padding_xlarge);
1420-
text-align: center;
14211405
}
14221406

14231407
#vMixerScrollArea VolControl QSlider::groove:vertical {
14241408
background: var(--bg_window);
14251409
width: var(--volume_slider);
14261410
}
14271411

1428-
#vMixerScrollArea VolControl #volMeterFrame {
1429-
padding: var(--padding_large) var(--padding_xlarge) var(--padding_large) 0px;
1430-
}
1431-
1432-
#vMixerScrollArea VolControl QLabel {
1433-
padding: 0px var(--padding_large);
1434-
}
1435-
1436-
#vMixerScrollArea VolControl QPushButton {
1437-
margin-left: var(--spacing_base);
1438-
margin-right: var(--padding_xlarge);
1412+
VolumeMeter {
1413+
background: transparent;
14391414
}
14401415

1441-
#vMixerScrollArea VolControl .indicator-mute {
1442-
margin-left: var(--padding_xlarge);
1416+
VolControl QWidget {
1417+
margin: 0px;
14431418
}
14441419

1445-
VolumeMeter {
1446-
background: transparent;
1420+
VolControl .indicator-expand {
1421+
margin: 0px;
14471422
}
14481423

14491424
VolumeMeter {

frontend/widgets/OBSBasic.hpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,10 +1628,6 @@ private slots:
16281628
void ToggleMixerLayout(bool vertical);
16291629

16301630
private slots:
1631-
void HideAudioControl();
1632-
void UnhideAllAudioControls();
1633-
void ToggleHideMixer();
1634-
16351631
void on_vMixerScrollArea_customContextMenuRequested();
16361632
void on_hMixerScrollArea_customContextMenuRequested();
16371633

frontend/widgets/OBSBasic_SceneItems.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,13 @@ void OBSBasic::MixerRenameSource()
161161

162162
void OBSBasic::ActivateAudioSource(OBSSource source)
163163
{
164-
if (SourceMixerHidden(source))
165-
return;
166164
if (!obs_source_active(source))
167165
return;
168166
if (!obs_source_audio_active(source))
169167
return;
170168

171169
bool vertical = config_get_bool(App()->GetUserConfig(), "BasicWindow", "VerticalVolControl");
172-
VolControl *vol = new VolControl(source, true, vertical);
170+
VolControl *vol = new VolControl(source, vertical, SourceMixerHidden(source));
173171

174172
vol->EnableSlider(!SourceVolumeLocked(source));
175173

@@ -653,12 +651,6 @@ void OBSBasic::CreateSourcePopupMenu(int idx, bool preview)
653651
colorSelect = new ColorSelect(colorMenu);
654652
popup.addMenu(AddBackgroundColorMenu(colorMenu, colorWidgetAction, colorSelect, sceneItem));
655653

656-
if (hasAudio) {
657-
QAction *actionHideMixer =
658-
popup.addAction(QTStr("HideMixer"), this, &OBSBasic::ToggleHideMixer);
659-
actionHideMixer->setCheckable(true);
660-
actionHideMixer->setChecked(SourceMixerHidden(source));
661-
}
662654
popup.addSeparator();
663655
}
664656

frontend/widgets/OBSBasic_VolControl.cpp

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -69,56 +69,6 @@ void OBSBasic::RefreshVolumeColors()
6969
}
7070
}
7171

72-
void OBSBasic::HideAudioControl()
73-
{
74-
QAction *action = reinterpret_cast<QAction *>(sender());
75-
VolControl *vol = action->property("volControl").value<VolControl *>();
76-
obs_source_t *source = vol->GetSource();
77-
78-
if (!SourceMixerHidden(source)) {
79-
SetSourceMixerHidden(source, true);
80-
DeactivateAudioSource(source);
81-
}
82-
}
83-
84-
void OBSBasic::UnhideAllAudioControls()
85-
{
86-
auto UnhideAudioMixer = [this](obs_source_t *source) /* -- */
87-
{
88-
if (!obs_source_active(source))
89-
return true;
90-
if (!SourceMixerHidden(source))
91-
return true;
92-
93-
SetSourceMixerHidden(source, false);
94-
ActivateAudioSource(source);
95-
return true;
96-
};
97-
98-
using UnhideAudioMixer_t = decltype(UnhideAudioMixer);
99-
100-
auto PreEnum = [](void *data, obs_source_t *source) -> bool /* -- */
101-
{
102-
return (*reinterpret_cast<UnhideAudioMixer_t *>(data))(source);
103-
};
104-
105-
obs_enum_sources(PreEnum, &UnhideAudioMixer);
106-
}
107-
108-
void OBSBasic::ToggleHideMixer()
109-
{
110-
OBSSceneItem item = GetCurrentSceneItem();
111-
OBSSource source = obs_sceneitem_get_source(item);
112-
113-
if (!SourceMixerHidden(source)) {
114-
SetSourceMixerHidden(source, true);
115-
DeactivateAudioSource(source);
116-
} else {
117-
SetSourceMixerHidden(source, false);
118-
ActivateAudioSource(source);
119-
}
120-
}
121-
12272
void OBSBasic::LockVolumeControl(bool lock)
12373
{
12474
QAction *action = reinterpret_cast<QAction *>(sender());
@@ -141,8 +91,6 @@ void OBSBasic::VolControlContextMenu()
14191
lockAction.setCheckable(true);
14292
lockAction.setChecked(SourceVolumeLocked(vol->GetSource()));
14393

144-
QAction hideAction(QTStr("Hide"), this);
145-
QAction unhideAllAction(QTStr("UnhideAll"), this);
14694
QAction mixerRenameAction(QTStr("Rename"), this);
14795

14896
QAction copyFiltersAction(QTStr("Copy.Filters"), this);
@@ -159,8 +107,6 @@ void OBSBasic::VolControlContextMenu()
159107

160108
/* ------------------- */
161109

162-
connect(&hideAction, &QAction::triggered, this, &OBSBasic::HideAudioControl, Qt::DirectConnection);
163-
connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
164110
connect(&lockAction, &QAction::toggled, this, &OBSBasic::LockVolumeControl, Qt::DirectConnection);
165111
connect(&mixerRenameAction, &QAction::triggered, this, &OBSBasic::MixerRenameSource, Qt::DirectConnection);
166112

@@ -181,7 +127,6 @@ void OBSBasic::VolControlContextMenu()
181127

182128
/* ------------------- */
183129

184-
hideAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
185130
lockAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
186131
mixerRenameAction.setProperty("volControl", QVariant::fromValue<VolControl *>(vol));
187132

@@ -200,8 +145,6 @@ void OBSBasic::VolControlContextMenu()
200145
vol->SetContextMenu(&popup);
201146
popup.addAction(&lockAction);
202147
popup.addSeparator();
203-
popup.addAction(&unhideAllAction);
204-
popup.addAction(&hideAction);
205148
popup.addAction(&mixerRenameAction);
206149
popup.addSeparator();
207150
popup.addAction(&copyFiltersAction);
@@ -231,8 +174,6 @@ void OBSBasic::on_vMixerScrollArea_customContextMenuRequested()
231174

232175
void OBSBasic::StackedMixerAreaContextMenuRequested()
233176
{
234-
QAction unhideAllAction(QTStr("UnhideAll"), this);
235-
236177
QAction advPropAction(QTStr("Basic.MainMenu.Edit.AdvAudio"), this);
237178

238179
QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this);
@@ -242,8 +183,6 @@ void OBSBasic::StackedMixerAreaContextMenuRequested()
242183

243184
/* ------------------- */
244185

245-
connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
246-
247186
connect(&advPropAction, &QAction::triggered, this, &OBSBasic::on_actionAdvAudioProperties_triggered,
248187
Qt::DirectConnection);
249188

@@ -255,7 +194,6 @@ void OBSBasic::StackedMixerAreaContextMenuRequested()
255194
/* ------------------- */
256195

257196
QMenu popup;
258-
popup.addAction(&unhideAllAction);
259197
popup.addSeparator();
260198
popup.addAction(&toggleControlLayoutAction);
261199
popup.addSeparator();
@@ -299,9 +237,6 @@ void OBSBasic::on_actionMixerToolbarAdvAudio_triggered()
299237

300238
void OBSBasic::on_actionMixerToolbarMenu_triggered()
301239
{
302-
QAction unhideAllAction(QTStr("UnhideAll"), this);
303-
connect(&unhideAllAction, &QAction::triggered, this, &OBSBasic::UnhideAllAudioControls, Qt::DirectConnection);
304-
305240
QAction toggleControlLayoutAction(QTStr("VerticalLayout"), this);
306241
toggleControlLayoutAction.setCheckable(true);
307242
toggleControlLayoutAction.setChecked(
@@ -310,7 +245,6 @@ void OBSBasic::on_actionMixerToolbarMenu_triggered()
310245
Qt::DirectConnection);
311246

312247
QMenu popup;
313-
popup.addAction(&unhideAllAction);
314248
popup.addSeparator();
315249
popup.addAction(&toggleControlLayoutAction);
316250
popup.exec(QCursor::pos());

0 commit comments

Comments
 (0)