Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ set(mmapper_SRCS
group/mmapper2group.h
logger/autologger.cpp
logger/autologger.h
mainwindow/AudioVolumeSlider.cpp
mainwindow/AudioVolumeSlider.h
mainwindow/MapZoomSlider.cpp
mainwindow/MapZoomSlider.h
mainwindow/UpdateDialog.cpp
Expand Down
2 changes: 1 addition & 1 deletion src/group/mmapper2group.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ Mmapper2Group::Mmapper2Group(QObject *const parent)
, m_groupManagerApi{std::make_unique<GroupManagerApi>(*this)}
{}

Mmapper2Group::~Mmapper2Group() {}
Mmapper2Group::~Mmapper2Group() = default;

SharedGroupChar Mmapper2Group::getSelf()
{
Expand Down
98 changes: 98 additions & 0 deletions src/mainwindow/AudioVolumeSlider.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (C) 2026 The MMapper Authors

#include "AudioVolumeSlider.h"

#include "../configuration/configuration.h"
#include "../global/SignalBlocker.h"

#include <QWheelEvent>

AudioVolumeSlider::AudioVolumeSlider(QWidget *const parent)
: QSlider(Qt::Orientation::Horizontal, parent)
{
init();
}

AudioVolumeSlider::AudioVolumeSlider(AudioType type, QWidget *const parent)
: QSlider(Qt::Orientation::Horizontal, parent)
, m_type(type)
{
init();
}

AudioVolumeSlider::~AudioVolumeSlider() = default;

void AudioVolumeSlider::init()
{
setRange(0, 100);
connect(this, &QSlider::valueChanged, this, [this](int value) { updateToConfig(value); });

setConfig().audio.registerChangeCallback(m_lifetime, [this]() { updateFromConfig(); });

if constexpr (NO_AUDIO) {
setEnabled(false);
}
setAudioType(m_type);
}

void AudioVolumeSlider::setAudioType(AudioType type)
{
if (m_type == type && toolTip().length() > 0) {
return;
}

m_type = type;
updateFromConfig();

switch (m_type) {
case AudioType::Music:
setToolTip(tr("Music Volume"));
break;
case AudioType::Sound:
setToolTip(tr("Sound Volume"));
break;
}
}

void AudioVolumeSlider::updateFromConfig()
{
int actualVolume = 0;
switch (m_type) {
case AudioType::Music:
actualVolume = getConfig().audio.getMusicVolume();
break;
case AudioType::Sound:
actualVolume = getConfig().audio.getSoundVolume();
break;
}

if (value() != actualVolume) {
const SignalBlocker block{*this};
setValue(actualVolume);
}
}

void AudioVolumeSlider::updateToConfig(int value)
{
auto &audioSettings = setConfig().audio;
switch (m_type) {
case AudioType::Music:
if (audioSettings.getMusicVolume() != value) {
audioSettings.setMusicVolume(value);
audioSettings.setUnlocked();
}
break;
case AudioType::Sound:
if (audioSettings.getSoundVolume() != value) {
audioSettings.setSoundVolume(value);
audioSettings.setUnlocked();
}
break;
}
}

void AudioVolumeSlider::wheelEvent(QWheelEvent *event)
{
event->ignore();
}
42 changes: 42 additions & 0 deletions src/mainwindow/AudioVolumeSlider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#pragma once
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (C) 2026 The MMapper Authors

#include "../global/RuleOf5.h"
#include "../global/Signal2.h"
#include "../global/macros.h"

#include <QSlider>

class NODISCARD_QOBJECT AudioVolumeSlider final : public QSlider
{
Q_OBJECT
Q_PROPERTY(AudioType audioType READ audioType WRITE setAudioType)

public:
enum class NODISCARD AudioType : uint8_t { Music, Sound };
Q_ENUM(AudioType)

private:
Signal2Lifetime m_lifetime;
AudioType m_type = AudioType::Music;

public:
explicit AudioVolumeSlider(QWidget *parent = nullptr);
explicit AudioVolumeSlider(AudioType type, QWidget *parent = nullptr);
~AudioVolumeSlider() final;
DELETE_CTORS_AND_ASSIGN_OPS(AudioVolumeSlider);

public:
NODISCARD AudioType audioType() const { return m_type; }
void setAudioType(AudioType type);

void updateFromConfig();

protected:
void wheelEvent(QWheelEvent *event) override;

private:
void init();
void updateToConfig(int value);
};
7 changes: 7 additions & 0 deletions src/mainwindow/MapZoomSlider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include "../display/mapwindow.h"
#include "../global/SignalBlocker.h"

#include <QWheelEvent>

MapZoomSlider::~MapZoomSlider() = default;

int MapZoomSlider::calcPos(const float zoom) noexcept
Expand Down Expand Up @@ -49,3 +51,8 @@ void MapZoomSlider::setFromActual()
setValue(clamp(rounded));
}
}

void MapZoomSlider::wheelEvent(QWheelEvent *event)
{
event->ignore();
}
3 changes: 3 additions & 0 deletions src/mainwindow/MapZoomSlider.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class NODISCARD_QOBJECT MapZoomSlider final : public QSlider

void setFromActual();

protected:
void wheelEvent(QWheelEvent *event) override;

private:
static int clamp(int val) { return std::clamp(val, min, max); }
};
11 changes: 11 additions & 0 deletions src/mainwindow/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "../roompanel/RoomManager.h"
#include "../roompanel/RoomWidget.h"
#include "../viewers/TopLevelWindows.h"
#include "AudioVolumeSlider.h"
#include "MapZoomSlider.h"
#include "UpdateDialog.h"
#include "aboutdialog.h"
Expand Down Expand Up @@ -1185,6 +1186,7 @@ void MainWindow::setupMenuBar()
toolbars->addAction(roomToolBar->toggleViewAction());
toolbars->addAction(connectionToolBar->toggleViewAction());
toolbars->addAction(settingsToolBar->toggleViewAction());
toolbars->addAction(audioToolBar->toggleViewAction());
QMenu *sidepanels = viewMenu->addMenu(tr("&Side Panels"));
sidepanels->addAction(m_dockDialogLog->toggleViewAction());
sidepanels->addAction(m_dockDialogClient->toggleViewAction());
Expand Down Expand Up @@ -1428,6 +1430,15 @@ void MainWindow::setupToolBars()
settingsToolBar->setObjectName("PreferencesToolBar");
settingsToolBar->addAction(preferencesAct);
settingsToolBar->hide();

audioToolBar = addToolBar(tr("Audio"));
audioToolBar->setObjectName("AudioToolBar");
audioToolBar->addWidget(
new AudioVolumeSlider(AudioVolumeSlider::AudioType::Music, audioToolBar));
audioToolBar->addSeparator();
audioToolBar->addWidget(
new AudioVolumeSlider(AudioVolumeSlider::AudioType::Sound, audioToolBar));
audioToolBar->hide();
}

void MainWindow::setupStatusBar()
Expand Down
1 change: 1 addition & 0 deletions src/mainwindow/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ class NODISCARD_QOBJECT MainWindow final : public QMainWindow
QToolBar *roomToolBar = nullptr;
QToolBar *connectionToolBar = nullptr;
QToolBar *settingsToolBar = nullptr;
QToolBar *audioToolBar = nullptr;

QMenu *fileMenu = nullptr;
QMenu *editMenu = nullptr;
Expand Down
4 changes: 2 additions & 2 deletions src/media/DescriptionWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class NODISCARD_QOBJECT DescriptionWidget final : public QWidget
private:
MediaLibrary &m_library;

QLabel *m_label;
QTextEdit *m_textEdit;
QLabel *m_label = nullptr;
QTextEdit *m_textEdit = nullptr;

private:
QCache<QString, QImage> m_imageCache;
Expand Down
4 changes: 2 additions & 2 deletions src/media/MediaLibrary.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ class NODISCARD_QOBJECT MediaLibrary final : public QObject
public:
explicit MediaLibrary(QObject *parent = nullptr);

QString findAudio(const QString &subDir, const QString &name) const;
QString findImage(const QString &subDir, const QString &name) const;
NODISCARD QString findAudio(const QString &subDir, const QString &name) const;
NODISCARD QString findImage(const QString &subDir, const QString &name) const;

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

Expand Down
2 changes: 1 addition & 1 deletion src/media/MusicManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ void MusicManager::shutdown()
#endif
}

void MusicManager::playMusic(const QString &musicFile)
void MusicManager::playMusic(MAYBE_UNUSED const QString &musicFile)
{
#ifndef MMAPPER_NO_AUDIO
if (musicFile.isEmpty() || NO_AUDIO) {
Expand Down
4 changes: 3 additions & 1 deletion src/media/MusicManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (C) 2026 The MMapper Authors

#include "../global/RuleOf5.h"
#include "../global/macros.h"

#include <QCache>
Expand Down Expand Up @@ -36,7 +37,7 @@ class NODISCARD_QOBJECT MusicManager final : public QObject
float fadeVolume = 0.0f;
};

MusicChannel m_channels[2];
MusicChannel m_channels[2]; // TODO: use std::array or MMapper::Array
int m_activeChannel = 0;
QCache<QString, qint64> m_cachedPositions;
QCache<QString, QTemporaryFile> m_wasmFiles;
Expand All @@ -52,6 +53,7 @@ class NODISCARD_QOBJECT MusicManager final : public QObject
public:
explicit MusicManager(MediaLibrary &library, QObject *parent = nullptr);
~MusicManager() override;
DELETE_CTORS_AND_ASSIGN_OPS(MusicManager);

void playMusic(const QString &musicFile);
void stopMusic();
Expand Down
2 changes: 1 addition & 1 deletion src/media/SfxManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ void SfxManager::playFromData(const QByteArray &data, const QString &soundName)
#endif
}

void SfxManager::startEffect(const QUrl &url, const QString &tmpToDelete)
void SfxManager::startEffect(MAYBE_UNUSED const QUrl &url, MAYBE_UNUSED const QString &tmpToDelete)
{
#ifndef MMAPPER_NO_AUDIO
auto *effect = new QMediaPlayer(this);
Expand Down
4 changes: 3 additions & 1 deletion src/media/SfxManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (C) 2026 The MMapper Authors

#include "../global/RuleOf5.h"
#include "../global/macros.h"

#include <QObject>
Expand All @@ -22,13 +23,14 @@ class NODISCARD_QOBJECT SfxManager final : public QObject

private:
#ifndef MMAPPER_NO_AUDIO
QAudioOutput *m_output;
QAudioOutput *m_output = nullptr;
#endif
MediaLibrary &m_library;

public:
explicit SfxManager(MediaLibrary &library, QObject *parent = nullptr);
~SfxManager() override;
DELETE_CTORS_AND_ASSIGN_OPS(SfxManager);

void shutdown();
void playSound(const QString &soundName);
Expand Down
2 changes: 1 addition & 1 deletion src/preferences/AdvancedGraphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
#include <QVector>
#include <QWidget>

SliderSpinboxButton::~SliderSpinboxButton() {}
SliderSpinboxButton::~SliderSpinboxButton() = default;

template<int D>
class NODISCARD FpSlider final : public QSlider
Expand Down
29 changes: 3 additions & 26 deletions src/preferences/audiopage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include "../configuration/configuration.h"
#include "../global/SignalBlocker.h"
#include "../mainwindow/AudioVolumeSlider.h"
#include "ui_audiopage.h"

#ifndef MMAPPER_NO_AUDIO
Expand All @@ -21,14 +22,6 @@ AudioPage::AudioPage(QWidget *const parent)
slot_updateDevices();
slot_loadConfig();

connect(ui->musicVolumeSlider,
&QSlider::valueChanged,
this,
&AudioPage::slot_musicVolumeChanged);
connect(ui->soundsVolumeSlider,
&QSlider::valueChanged,
this,
&AudioPage::slot_soundsVolumeChanged);
connect(ui->outputDeviceComboBox,
&QComboBox::currentIndexChanged,
this,
Expand All @@ -41,8 +34,6 @@ AudioPage::AudioPage(QWidget *const parent)

if constexpr (NO_AUDIO) {
ui->outputDeviceComboBox->setEnabled(false);
ui->musicVolumeSlider->setEnabled(false);
ui->soundsVolumeSlider->setEnabled(false);
}
}

Expand All @@ -58,8 +49,8 @@ void AudioPage::slot_loadConfig()
SignalBlocker outputBlocker(*ui->outputDeviceComboBox);

const auto &settings = getConfig().audio;
ui->musicVolumeSlider->setValue(settings.getMusicVolume());
ui->soundsVolumeSlider->setValue(settings.getSoundVolume());
ui->musicVolumeSlider->updateFromConfig();
ui->soundsVolumeSlider->updateFromConfig();

int index = ui->outputDeviceComboBox->findData(settings.getOutputDeviceId());
if (index != -1) {
Expand All @@ -69,20 +60,6 @@ void AudioPage::slot_loadConfig()
}
}

void AudioPage::slot_musicVolumeChanged(int value)
{
auto &settings = setConfig().audio;
settings.setMusicVolume(value);
settings.setUnlocked();
}

void AudioPage::slot_soundsVolumeChanged(int value)
{
auto &settings = setConfig().audio;
settings.setSoundVolume(value);
settings.setUnlocked();
}

void AudioPage::slot_outputDeviceChanged(int index)
{
if (index < 0) {
Expand Down
2 changes: 0 additions & 2 deletions src/preferences/audiopage.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ class NODISCARD_QOBJECT AudioPage final : public QWidget

public slots:
void slot_loadConfig();
void slot_musicVolumeChanged(int);
void slot_soundsVolumeChanged(int);
void slot_outputDeviceChanged(int);
void slot_updateDevices();
};
Loading
Loading