summaryrefslogtreecommitdiffstats
path: root/examples/multimedia/player/playercontrols.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/multimedia/player/playercontrols.cpp')
-rw-r--r--examples/multimedia/player/playercontrols.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/examples/multimedia/player/playercontrols.cpp b/examples/multimedia/player/playercontrols.cpp
new file mode 100644
index 000000000..4933bf8cf
--- /dev/null
+++ b/examples/multimedia/player/playercontrols.cpp
@@ -0,0 +1,176 @@
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+#include "playercontrols.h"
+
+#include <QAudio>
+#include <QBoxLayout>
+#include <QComboBox>
+#include <QSlider>
+#include <QStyle>
+#include <QToolButton>
+
+PlayerControls::PlayerControls(QWidget *parent) : QWidget(parent)
+{
+ m_playButton = new QToolButton(this);
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+
+ connect(m_playButton, &QAbstractButton::clicked, this, &PlayerControls::playClicked);
+
+ m_stopButton = new QToolButton(this);
+ m_stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop));
+ m_stopButton->setEnabled(false);
+
+ connect(m_stopButton, &QAbstractButton::clicked, this, &PlayerControls::stop);
+
+ m_nextButton = new QToolButton(this);
+ m_nextButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward));
+
+ connect(m_nextButton, &QAbstractButton::clicked, this, &PlayerControls::next);
+
+ m_previousButton = new QToolButton(this);
+ m_previousButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward));
+
+ connect(m_previousButton, &QAbstractButton::clicked, this, &PlayerControls::previous);
+
+ m_muteButton = new QToolButton(this);
+ m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume));
+
+ connect(m_muteButton, &QAbstractButton::clicked, this, &PlayerControls::muteClicked);
+
+ m_volumeSlider = new QSlider(Qt::Horizontal, this);
+ m_volumeSlider->setRange(0, 100);
+ QSizePolicy sp = m_volumeSlider->sizePolicy();
+ sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding);
+ m_volumeSlider->setSizePolicy(sp);
+
+ connect(m_volumeSlider, &QSlider::valueChanged, this,
+ &PlayerControls::onVolumeSliderValueChanged);
+
+ m_rateBox = new QComboBox(this);
+ m_rateBox->addItem("0.5x", QVariant(0.5));
+ m_rateBox->addItem("1.0x", QVariant(1.0));
+ m_rateBox->addItem("2.0x", QVariant(2.0));
+ m_rateBox->setCurrentIndex(1);
+
+ connect(m_rateBox, QOverload<int>::of(&QComboBox::activated), this,
+ &PlayerControls::updateRate);
+
+ QBoxLayout *layout = new QHBoxLayout;
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->addWidget(m_stopButton);
+ layout->addWidget(m_previousButton);
+ layout->addWidget(m_playButton);
+ layout->addWidget(m_nextButton);
+ layout->addWidget(m_muteButton);
+ layout->addWidget(m_volumeSlider);
+ layout->addWidget(m_rateBox);
+ setLayout(layout);
+}
+
+QMediaPlayer::PlaybackState PlayerControls::state() const
+{
+ return m_playerState;
+}
+
+void PlayerControls::setState(QMediaPlayer::PlaybackState state)
+{
+ if (state != m_playerState) {
+ m_playerState = state;
+
+ switch (state) {
+ case QMediaPlayer::StoppedState:
+ m_stopButton->setEnabled(false);
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+ break;
+ case QMediaPlayer::PlayingState:
+ m_stopButton->setEnabled(true);
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause));
+ break;
+ case QMediaPlayer::PausedState:
+ m_stopButton->setEnabled(true);
+ m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay));
+ break;
+ }
+ }
+}
+
+float PlayerControls::volume() const
+{
+ qreal linearVolume =
+ QAudio::convertVolume(m_volumeSlider->value() / qreal(100),
+ QAudio::LogarithmicVolumeScale, QAudio::LinearVolumeScale);
+
+ return linearVolume;
+}
+
+void PlayerControls::setVolume(float volume)
+{
+ qreal logarithmicVolume = QAudio::convertVolume(volume, QAudio::LinearVolumeScale,
+ QAudio::LogarithmicVolumeScale);
+
+ m_volumeSlider->setValue(qRound(logarithmicVolume * 100));
+}
+
+bool PlayerControls::isMuted() const
+{
+ return m_playerMuted;
+}
+
+void PlayerControls::setMuted(bool muted)
+{
+ if (muted != m_playerMuted) {
+ m_playerMuted = muted;
+
+ m_muteButton->setIcon(style()->standardIcon(muted ? QStyle::SP_MediaVolumeMuted
+ : QStyle::SP_MediaVolume));
+ }
+}
+
+void PlayerControls::playClicked()
+{
+ switch (m_playerState) {
+ case QMediaPlayer::StoppedState:
+ case QMediaPlayer::PausedState:
+ emit play();
+ break;
+ case QMediaPlayer::PlayingState:
+ emit pause();
+ break;
+ }
+}
+
+void PlayerControls::muteClicked()
+{
+ emit changeMuting(!m_playerMuted);
+}
+
+qreal PlayerControls::playbackRate() const
+{
+ return m_rateBox->itemData(m_rateBox->currentIndex()).toDouble();
+}
+
+void PlayerControls::setPlaybackRate(float rate)
+{
+ for (int i = 0; i < m_rateBox->count(); ++i) {
+ if (qFuzzyCompare(rate, float(m_rateBox->itemData(i).toDouble()))) {
+ m_rateBox->setCurrentIndex(i);
+ return;
+ }
+ }
+
+ m_rateBox->addItem(QStringLiteral("%1x").arg(rate), QVariant(rate));
+ m_rateBox->setCurrentIndex(m_rateBox->count() - 1);
+}
+
+void PlayerControls::updateRate()
+{
+ emit changeRate(playbackRate());
+}
+
+void PlayerControls::onVolumeSliderValueChanged()
+{
+ emit changeVolume(volume());
+}
+
+#include "moc_playercontrols.cpp"