Skip to content

Commit 5d245c3

Browse files
committed
add audio toolbar and AudioVolumeSlider widget
1 parent 91be79e commit 5d245c3

21 files changed

Lines changed: 235 additions & 50 deletions

src/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,8 @@ set(mmapper_SRCS
242242
group/mmapper2group.h
243243
logger/autologger.cpp
244244
logger/autologger.h
245+
mainwindow/AudioVolumeSlider.cpp
246+
mainwindow/AudioVolumeSlider.h
245247
mainwindow/MapZoomSlider.cpp
246248
mainwindow/MapZoomSlider.h
247249
mainwindow/UpdateDialog.cpp

src/group/mmapper2group.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Mmapper2Group::Mmapper2Group(QObject *const parent)
3030
, m_groupManagerApi{std::make_unique<GroupManagerApi>(*this)}
3131
{}
3232

33-
Mmapper2Group::~Mmapper2Group() {}
33+
Mmapper2Group::~Mmapper2Group() = default;
3434

3535
SharedGroupChar Mmapper2Group::getSelf()
3636
{
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
// Copyright (C) 2026 The MMapper Authors
3+
4+
#include "AudioVolumeSlider.h"
5+
6+
#include "../configuration/configuration.h"
7+
#include "../global/SignalBlocker.h"
8+
9+
#include <QWheelEvent>
10+
11+
AudioVolumeSlider::AudioVolumeSlider(QWidget *const parent)
12+
: QSlider(Qt::Orientation::Horizontal, parent)
13+
{
14+
init();
15+
}
16+
17+
AudioVolumeSlider::AudioVolumeSlider(AudioType type, QWidget *const parent)
18+
: QSlider(Qt::Orientation::Horizontal, parent)
19+
, m_type(type)
20+
{
21+
init();
22+
}
23+
24+
AudioVolumeSlider::~AudioVolumeSlider() = default;
25+
26+
void AudioVolumeSlider::init()
27+
{
28+
setRange(0, 100);
29+
connect(this, &QSlider::valueChanged, this, [this](int value) { updateToConfig(value); });
30+
31+
setConfig().audio.registerChangeCallback(m_lifetime, [this]() { updateFromConfig(); });
32+
33+
if constexpr (NO_AUDIO) {
34+
setEnabled(false);
35+
}
36+
setAudioType(m_type);
37+
}
38+
39+
void AudioVolumeSlider::setAudioType(AudioType type)
40+
{
41+
if (m_type == type && toolTip().length() > 0) {
42+
return;
43+
}
44+
45+
m_type = type;
46+
updateFromConfig();
47+
48+
switch (m_type) {
49+
case AudioType::Music:
50+
setToolTip(tr("Music Volume"));
51+
break;
52+
case AudioType::Sound:
53+
setToolTip(tr("Sound Volume"));
54+
break;
55+
}
56+
}
57+
58+
void AudioVolumeSlider::updateFromConfig()
59+
{
60+
int actualVolume = 0;
61+
switch (m_type) {
62+
case AudioType::Music:
63+
actualVolume = getConfig().audio.getMusicVolume();
64+
break;
65+
case AudioType::Sound:
66+
actualVolume = getConfig().audio.getSoundVolume();
67+
break;
68+
}
69+
70+
if (value() != actualVolume) {
71+
const SignalBlocker block{*this};
72+
setValue(actualVolume);
73+
}
74+
}
75+
76+
void AudioVolumeSlider::updateToConfig(int value)
77+
{
78+
auto &audioSettings = setConfig().audio;
79+
switch (m_type) {
80+
case AudioType::Music:
81+
if (audioSettings.getMusicVolume() != value) {
82+
audioSettings.setMusicVolume(value);
83+
audioSettings.setUnlocked();
84+
}
85+
break;
86+
case AudioType::Sound:
87+
if (audioSettings.getSoundVolume() != value) {
88+
audioSettings.setSoundVolume(value);
89+
audioSettings.setUnlocked();
90+
}
91+
break;
92+
}
93+
}
94+
95+
void AudioVolumeSlider::wheelEvent(QWheelEvent *event)
96+
{
97+
event->ignore();
98+
}

src/mainwindow/AudioVolumeSlider.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#pragma once
2+
// SPDX-License-Identifier: GPL-2.0-or-later
3+
// Copyright (C) 2026 The MMapper Authors
4+
5+
#include "../global/RuleOf5.h"
6+
#include "../global/Signal2.h"
7+
#include "../global/macros.h"
8+
9+
#include <QSlider>
10+
11+
class NODISCARD_QOBJECT AudioVolumeSlider final : public QSlider
12+
{
13+
Q_OBJECT
14+
Q_PROPERTY(AudioType audioType READ audioType WRITE setAudioType)
15+
16+
public:
17+
enum class NODISCARD AudioType : uint8_t { Music, Sound };
18+
Q_ENUM(AudioType)
19+
20+
private:
21+
Signal2Lifetime m_lifetime;
22+
AudioType m_type = AudioType::Music;
23+
24+
public:
25+
explicit AudioVolumeSlider(QWidget *parent = nullptr);
26+
explicit AudioVolumeSlider(AudioType type, QWidget *parent = nullptr);
27+
~AudioVolumeSlider() final;
28+
DELETE_CTORS_AND_ASSIGN_OPS(AudioVolumeSlider);
29+
30+
public:
31+
NODISCARD AudioType audioType() const { return m_type; }
32+
void setAudioType(AudioType type);
33+
34+
void updateFromConfig();
35+
36+
protected:
37+
void wheelEvent(QWheelEvent *event) override;
38+
39+
private:
40+
void init();
41+
void updateToConfig(int value);
42+
};

src/mainwindow/MapZoomSlider.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "../display/mapwindow.h"
77
#include "../global/SignalBlocker.h"
88

9+
#include <QWheelEvent>
10+
911
MapZoomSlider::~MapZoomSlider() = default;
1012

1113
int MapZoomSlider::calcPos(const float zoom) noexcept
@@ -49,3 +51,8 @@ void MapZoomSlider::setFromActual()
4951
setValue(clamp(rounded));
5052
}
5153
}
54+
55+
void MapZoomSlider::wheelEvent(QWheelEvent *event)
56+
{
57+
event->ignore();
58+
}

src/mainwindow/MapZoomSlider.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class NODISCARD_QOBJECT MapZoomSlider final : public QSlider
3131

3232
void setFromActual();
3333

34+
protected:
35+
void wheelEvent(QWheelEvent *event) override;
36+
3437
private:
3538
static int clamp(int val) { return std::clamp(val, min, max); }
3639
};

src/mainwindow/mainwindow.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "../roompanel/RoomManager.h"
3434
#include "../roompanel/RoomWidget.h"
3535
#include "../viewers/TopLevelWindows.h"
36+
#include "AudioVolumeSlider.h"
3637
#include "MapZoomSlider.h"
3738
#include "UpdateDialog.h"
3839
#include "aboutdialog.h"
@@ -1185,6 +1186,7 @@ void MainWindow::setupMenuBar()
11851186
toolbars->addAction(roomToolBar->toggleViewAction());
11861187
toolbars->addAction(connectionToolBar->toggleViewAction());
11871188
toolbars->addAction(settingsToolBar->toggleViewAction());
1189+
toolbars->addAction(audioToolBar->toggleViewAction());
11881190
QMenu *sidepanels = viewMenu->addMenu(tr("&Side Panels"));
11891191
sidepanels->addAction(m_dockDialogLog->toggleViewAction());
11901192
sidepanels->addAction(m_dockDialogClient->toggleViewAction());
@@ -1428,6 +1430,15 @@ void MainWindow::setupToolBars()
14281430
settingsToolBar->setObjectName("PreferencesToolBar");
14291431
settingsToolBar->addAction(preferencesAct);
14301432
settingsToolBar->hide();
1433+
1434+
audioToolBar = addToolBar(tr("Audio"));
1435+
audioToolBar->setObjectName("AudioToolBar");
1436+
audioToolBar->addWidget(
1437+
new AudioVolumeSlider(AudioVolumeSlider::AudioType::Music, audioToolBar));
1438+
audioToolBar->addSeparator();
1439+
audioToolBar->addWidget(
1440+
new AudioVolumeSlider(AudioVolumeSlider::AudioType::Sound, audioToolBar));
1441+
audioToolBar->hide();
14311442
}
14321443

14331444
void MainWindow::setupStatusBar()

src/mainwindow/mainwindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class NODISCARD_QOBJECT MainWindow final : public QMainWindow
135135
QToolBar *roomToolBar = nullptr;
136136
QToolBar *connectionToolBar = nullptr;
137137
QToolBar *settingsToolBar = nullptr;
138+
QToolBar *audioToolBar = nullptr;
138139

139140
QMenu *fileMenu = nullptr;
140141
QMenu *editMenu = nullptr;

src/media/DescriptionWidget.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class NODISCARD_QOBJECT DescriptionWidget final : public QWidget
1919
private:
2020
MediaLibrary &m_library;
2121

22-
QLabel *m_label;
23-
QTextEdit *m_textEdit;
22+
QLabel *m_label = nullptr;
23+
QTextEdit *m_textEdit = nullptr;
2424

2525
private:
2626
QCache<QString, QImage> m_imageCache;

src/media/MediaLibrary.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class NODISCARD_QOBJECT MediaLibrary final : public QObject
3333
public:
3434
explicit MediaLibrary(QObject *parent = nullptr);
3535

36-
QString findAudio(const QString &subDir, const QString &name) const;
37-
QString findImage(const QString &subDir, const QString &name) const;
36+
NODISCARD QString findAudio(const QString &subDir, const QString &name) const;
37+
NODISCARD QString findImage(const QString &subDir, const QString &name) const;
3838

3939
void fetchAsync(const QString &path, std::function<void(const QByteArray &)> callback);
4040

0 commit comments

Comments
 (0)