diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2f6ce2f69..adeda5182 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -552,45 +552,9 @@ QToolBar *MainWindow::createToolBar() if (!status.isEmpty()) setStatus(QString("Failed to toggle repeat: %1").arg(status), true); }); - // Volume slider - volume = new QSlider(this); - volume->setOrientation(Qt::Orientation::Vertical); - volume->setFixedHeight(100); - volume->setMinimum(0); - volume->setMaximum(20); - volume->setValue(spt::ClientHandler::getVolume() * 20); - // Layout for volume slider - auto volumeMenu = new QMenu(this); - volumeMenu->setContentsMargins(2, 6, 2, 6); - auto volumeLayout = new QVBoxLayout(); - volumeLayout->addWidget(volume); - volumeMenu->setLayout(volumeLayout); - // Volume action for slider - volumeButton = new QToolButton(this); - volumeButton->setText("Volume"); - volumeButton->setIcon(volumeIcon()); - volumeButton->setPopupMode(QToolButton::InstantPopup); - volumeButton->setMenu(volumeMenu); + // Volume + volumeButton = new VolumeButton(settings, *spotify, this); toolBar->addWidget(volumeButton); - QSlider::connect(volume, &QAbstractSlider::valueChanged, [this](int value) { - volumeButton->setIcon(volumeIcon()); - }); - if (settings.general.pulseVolume) - { - // If using PulseAudio for volume control, update on every tick - QSlider::connect(volume, &QAbstractSlider::valueChanged, [](int value) { - spt::ClientHandler::setVolume(value * 0.05); - }); - } - else - { - // If using Spotify for volume control, only update on release - QSlider::connect(volume, &QAbstractSlider::sliderReleased, [this]() { - auto status = spotify->setVolume(volume->value() * 5); - if (!status.isEmpty()) - setStatus(QString("Failed to set volume: %1").arg(status), true); - }); - } // Return final tool bar return toolBar; } @@ -923,13 +887,6 @@ QSet MainWindow::allArtists() return artists; } -QIcon MainWindow::volumeIcon() -{ - auto vol = volume->value() * 5; - return Icon::get(QString("audio-volume-%1") - .arg(vol < 33 ? "low" : vol > 66 ? "high" : "medium")); -} - void MainWindow::setFixedWidthTime(bool value) { position->setFont(value ? QFont("monospace") : QFont()); diff --git a/src/mainwindow.hpp b/src/mainwindow.hpp index e58d28259..a24fd2c1b 100644 --- a/src/mainwindow.hpp +++ b/src/mainwindow.hpp @@ -20,6 +20,7 @@ #include "spotify/clienthandler.hpp" #include "spotify/user.hpp" #include "whatsnewdialog.hpp" +#include "volumebutton.hpp" #include #include @@ -104,7 +105,7 @@ class MainWindow : public QMainWindow QLabel *nowPlaying, *position, *nowAlbum; QSlider *progress, *volume; QAction *playPause, *repeat, *shuffle; - QToolButton *volumeButton; + VolumeButton *volumeButton; // Everything else spt::Spotify *spotify; QNetworkAccessManager *network; @@ -139,5 +140,4 @@ class MainWindow : public QMainWindow QStringList currentTracks(); void setPlayingTrackItem(QTreeWidgetItem *item); QSet allArtists(); - QIcon volumeIcon(); }; diff --git a/src/volumebutton.cpp b/src/volumebutton.cpp new file mode 100644 index 000000000..f038a5530 --- /dev/null +++ b/src/volumebutton.cpp @@ -0,0 +1,62 @@ +#include "volumebutton.hpp" + +VolumeButton::VolumeButton(const Settings &settings, spt::Spotify &spotify, QWidget *parent) + : settings(settings), spotify(spotify), volume(new QSlider(this)), QToolButton(parent) +{ + // Volume slider + volume->setOrientation(Qt::Orientation::Vertical); + volume->setFixedHeight(100); + volume->setMinimum(0); + volume->setMaximum(20); + volume->setValue(spt::ClientHandler::getVolume() * 20); + + // Layout for volume slider + auto volumeMenu = new QMenu(this); + volumeMenu->setContentsMargins(2, 6, 2, 6); + auto volumeLayout = new QVBoxLayout(); + volumeLayout->addWidget(volume); + volumeMenu->setLayout(volumeLayout); + + setText("Volume"); + updateIcon(); + setPopupMode(QToolButton::InstantPopup); + setMenu(volumeMenu); + + QAbstractSlider::connect(volume, &QAbstractSlider::valueChanged, [this](int value) { + updateIcon(); + }); + + if (settings.general.pulseVolume) + { + // If using PulseAudio for volume control, update on every tick + QSlider::connect(volume, &QAbstractSlider::valueChanged, [](int value) { + spt::ClientHandler::setVolume(value * 0.05); + }); + } + else + { + // If using Spotify for volume control, only update on release + QSlider::connect(volume, &QAbstractSlider::sliderReleased, [this]() { + auto status = this->spotify.setVolume(volume->value() * 5); + if (!status.isEmpty()) + { + auto window = dynamic_cast(this->parent()); + if (window != nullptr) + window->setStatus(QString("Failed to set volume: %1").arg(status), true); + } + }); + } +} + +void VolumeButton::wheelEvent(QWheelEvent *event) +{ + volume->setValue(volume->value() + (event->angleDelta().y() < 0 ? -1 : 1)); + event->accept(); +} + +void VolumeButton::updateIcon() +{ + auto vol = volume->value() * 5; + setIcon(Icon::get(QString("audio-volume-%1") + .arg(vol < 33 ? "low" : vol > 66 ? "high" : "medium"))); +} diff --git a/src/volumebutton.hpp b/src/volumebutton.hpp new file mode 100644 index 000000000..2346dfca9 --- /dev/null +++ b/src/volumebutton.hpp @@ -0,0 +1,31 @@ +#pragma once + +class VolumeButton; + +#include "icon.hpp" +#include "spotify/clienthandler.hpp" + +#include +#include +#include +#include +#include +#include + +class VolumeButton : public QToolButton +{ + Q_OBJECT + +public: + VolumeButton(const Settings &settings, spt::Spotify &spotify, QWidget *parent); + void updateIcon(); + +protected: + void wheelEvent(QWheelEvent *event) override; + + +private: + QSlider *volume; + const Settings &settings; + spt::Spotify &spotify; +}; \ No newline at end of file