#include #include #include #include #include "PlayerControls.h" ///////////////// // constructor // ///////////////// PlayerControls::PlayerControls(QWidget *parent) : QWidget(parent), playerState(QMediaPlayer::StoppedState), m_isMuted(false) { m_durationSlider = new QSlider(Qt::Horizontal); connect(m_durationSlider, SIGNAL(sliderMoved(int)), this, SLOT(sliderMoved(int))); m_currentTimeLabel = new QLabel("--:--"); QLabel *separatorLabel = new QLabel("/"); m_durationLabel = new QLabel("--:--"); QToolButton *previousButton = new QToolButton(this); previousButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward)); m_playButton = new QToolButton; m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); connect(m_playButton, SIGNAL(clicked()), this, SLOT(playClicked())); QToolButton *nextButton = new QToolButton(this); nextButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward)); QToolButton *stopButton = new QToolButton; stopButton->setIcon(style()->standardIcon(QStyle::SP_MediaStop)); connect(stopButton, SIGNAL(clicked()), this, SLOT(stopClicked())); m_muteButton = new QToolButton; m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); connect(m_muteButton, SIGNAL(clicked()), this, SLOT(switchMuted())); QLabel *rateMult = new QLabel("x"); m_rateBox = new QComboBox; m_rateBox->addItem("0.25"); m_rateBox->addItem("0.5"); m_rateBox->addItem("1.0"); m_rateBox->addItem("2.0"); m_rateBox->addItem("4.0"); m_rateBox->setCurrentIndex(2); connect(m_rateBox, SIGNAL(currentTextChanged(const QString&)), this, SLOT(rateChanged(const QString&))); QHBoxLayout *durationLayout = new QHBoxLayout; durationLayout->addWidget(m_durationSlider); durationLayout->addWidget(m_currentTimeLabel); durationLayout->addWidget(separatorLabel); durationLayout->addWidget(m_durationLabel); QHBoxLayout *buttonBarLayout = new QHBoxLayout; buttonBarLayout->addWidget(previousButton); buttonBarLayout->addWidget(m_playButton); buttonBarLayout->addWidget(nextButton); buttonBarLayout->addWidget(stopButton); buttonBarLayout->addWidget(m_muteButton); buttonBarLayout->addWidget(m_durationSlider); buttonBarLayout->addWidget(m_durationLabel); buttonBarLayout->addWidget(m_rateBox); buttonBarLayout->addWidget(rateMult); QVBoxLayout *controlsLayout = new QVBoxLayout; controlsLayout->addLayout(durationLayout); controlsLayout->addLayout(buttonBarLayout); setLayout(controlsLayout); } //////////////// // destructor // //////////////// PlayerControls::~PlayerControls() { } void PlayerControls::reset() { m_currentTimeLabel->setText("--:--"); m_durationLabel->setText("--:--"); setEnabled(false); } ///////////////////////////////////////// // public slots in reaction to signals // // emitted by the player // ///////////////////////////////////////// void PlayerControls::durationChanged(qint64 duration) { QString tStr; m_durationSlider->setMaximum(duration); duration /= 1000; QTime totalTime(duration / 3600, (duration / 60) % 60, duration % 60); if (duration > 3600) m_timeFormat = "hh:mm:ss"; else m_timeFormat = "mm:ss"; tStr = totalTime.toString(m_timeFormat); m_durationLabel->setText(tStr); } void PlayerControls::positionChanged(qint64 position) { QString tStr; m_durationSlider->setSliderPosition(position); position /= 1000; QTime currentTime((position / 3600) % 60, (position / 60) % 60, position % 60); tStr = currentTime.toString(m_timeFormat); m_currentTimeLabel->setText(tStr); } void PlayerControls::mediaStatusChanged(QMediaPlayer::MediaStatus status) { if (status == QMediaPlayer::EndOfMedia) stopClicked(); } //////////////////////////////// // private slots used to emit // // signals to the player // //////////////////////////////// void PlayerControls::playClicked() { if (playerState == QMediaPlayer::StoppedState || playerState == QMediaPlayer::PausedState) { emit play(); m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPause)); playerState = QMediaPlayer::PlayingState; } else { emit pause(); m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); playerState = QMediaPlayer::PausedState; } } void PlayerControls::stopClicked() { m_playButton->setIcon(style()->standardIcon(QStyle::SP_MediaPlay)); playerState = QMediaPlayer::StoppedState; emit stop(); sliderMoved(0); m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); m_muteButton->setEnabled(true); emit setMuted(false); m_rateBox->setCurrentIndex(2); emit playbackRateChanged(1.0); } void PlayerControls::switchMuted() { m_isMuted = !m_isMuted; emit setMuted(m_isMuted); if (m_isMuted) m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolumeMuted)); else m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); } void PlayerControls::sliderMoved(int value) { positionChanged(value); emit positionManuallyChanged(value); } void PlayerControls::rateChanged(const QString &rate) { qreal doubleRate = rate.toDouble(); emit playbackRateChanged(doubleRate); if (doubleRate != 1.0) { emit setMuted(true); m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolumeMuted)); m_muteButton->setEnabled(false); } else { emit setMuted(false); m_muteButton->setIcon(style()->standardIcon(QStyle::SP_MediaVolume)); m_muteButton->setEnabled(true); } }