X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9aee5d22513f0367febab54b38b3a7dc58d120bb..eaec53a7af4e098acd957a274f059920d569e0be:/src/panels/information/phononwidget.cpp diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index 1d6361f19..e301df270 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -20,26 +20,23 @@ #include "phononwidget.h" +#include +#include #include -#include #include #include #include -#include -#include #include #include -#include -#include -#include -#include -#include +#include class EmbeddedVideoPlayer : public Phonon::VideoWidget { + Q_OBJECT + public: - EmbeddedVideoPlayer(QWidget *parent = 0) : + EmbeddedVideoPlayer(QWidget *parent = nullptr) : Phonon::VideoWidget(parent) { } @@ -50,7 +47,7 @@ class EmbeddedVideoPlayer : public Phonon::VideoWidget updateGeometry(); } - virtual QSize sizeHint() const + QSize sizeHint() const override { return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoWidget::sizeHint(); } @@ -62,21 +59,34 @@ class EmbeddedVideoPlayer : public Phonon::VideoWidget PhononWidget::PhononWidget(QWidget *parent) : QWidget(parent), m_url(), - m_playButton(0), - m_stopButton(0), - m_topLayout(0), - m_media(0), - m_seekSlider(0), - m_audioOutput(0), - m_videoPlayer(0) + m_playButton(nullptr), + m_stopButton(nullptr), + m_topLayout(nullptr), + m_media(nullptr), + m_seekSlider(nullptr), + m_audioOutput(nullptr), + m_videoPlayer(nullptr) { } -void PhononWidget::setUrl(const QUrl &url) +void PhononWidget::setUrl(const QUrl &url, MediaKind kind) { if (m_url != url) { - stop(); // emits playingStopped() signal m_url = url; + m_isVideo = kind == MediaKind::Video; + } + if (m_autoPlay) { + play(); + } else { + stop(); + } +} + +void PhononWidget::setAutoPlay(bool autoPlay) +{ + m_autoPlay = autoPlay; + if (!m_url.isEmpty() && (m_media == nullptr || m_media->state() != Phonon::State::PlayingState) && m_autoPlay && isVisible()) { + play(); } } @@ -85,6 +95,29 @@ QUrl PhononWidget::url() const return m_url; } +void PhononWidget::clearUrl() +{ + m_url.clear(); +} + +bool PhononWidget::eventFilter(QObject *object, QEvent *event) +{ + Q_UNUSED(object) + if (event->type() == QEvent::MouseButtonPress) { + const QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() == Qt::LeftButton) { + // toggle playback + if (m_media && m_media->state() == Phonon::State::PlayingState) { + m_media->pause(); + } else { + play(); + } + return true; + } + } + return false; +} + void PhononWidget::setVideoSize(const QSize& size) { if (m_videoSize != size) { @@ -107,10 +140,10 @@ void PhononWidget::showEvent(QShowEvent *event) if (!m_topLayout) { m_topLayout = new QVBoxLayout(this); - m_topLayout->setMargin(0); + m_topLayout->setContentsMargins(0, 0, 0, 0); - QHBoxLayout *controlsLayout = new QHBoxLayout(this); - controlsLayout->setMargin(0); + QHBoxLayout *controlsLayout = new QHBoxLayout(); + controlsLayout->setContentsMargins(0, 0, 0, 0); controlsLayout->setSpacing(0); m_playButton = new QToolButton(this); @@ -128,13 +161,13 @@ void PhononWidget::showEvent(QShowEvent *event) m_playButton->setToolTip(i18n("play")); m_playButton->setIconSize(buttonSize); - m_playButton->setIcon(QIcon::fromTheme("media-playback-start")); + m_playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"))); m_playButton->setAutoRaise(true); connect(m_playButton, &QToolButton::clicked, this, &PhononWidget::play); m_stopButton->setToolTip(i18n("stop")); m_stopButton->setIconSize(buttonSize); - m_stopButton->setIcon(QIcon::fromTheme("media-playback-stop")); + m_stopButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-stop"))); m_stopButton->setAutoRaise(true); m_stopButton->hide(); connect(m_stopButton, &QToolButton::clicked, this, &PhononWidget::stop); @@ -162,15 +195,9 @@ void PhononWidget::stateChanged(Phonon::State newstate) switch (newstate) { case Phonon::PlayingState: case Phonon::BufferingState: - m_stopButton->show(); m_playButton->hide(); + m_stopButton->show(); break; - case Phonon::StoppedState: - if (m_videoPlayer) { - m_videoPlayer->hide(); - } - emit hasVideoChanged(false); - // fall through default: m_stopButton->hide(); m_playButton->show(); @@ -185,13 +212,15 @@ void PhononWidget::play() m_media = new Phonon::MediaObject(this); connect(m_media, &Phonon::MediaObject::stateChanged, this, &PhononWidget::stateChanged); - connect(m_media, &Phonon::MediaObject::hasVideoChanged, - this, &PhononWidget::slotHasVideoChanged); + connect(m_media, &Phonon::MediaObject::finished, + this, &PhononWidget::finished); m_seekSlider->setMediaObject(m_media); } if (!m_videoPlayer) { m_videoPlayer = new EmbeddedVideoPlayer(this); + m_videoPlayer->setCursor(Qt::PointingHandCursor); + m_videoPlayer->installEventFilter(this); m_topLayout->insertWidget(0, m_videoPlayer); Phonon::createPath(m_media, m_videoPlayer); applyVideoSize(); @@ -202,26 +231,37 @@ void PhononWidget::play() Phonon::createPath(m_media, m_audioOutput); } - emit hasVideoChanged(false); + if (m_isVideo) { + emit hasVideoChanged(true); + } - m_media->setCurrentSource(m_url); - m_media->hasVideo(); + if (m_url != m_media->currentSource().url()) { + m_media->setCurrentSource(m_url); + } m_media->play(); + + m_videoPlayer->setVisible(m_isVideo); } -void PhononWidget::stop() +void PhononWidget::finished() { - if (m_media) { - m_media->stop(); + if (m_isVideo) { + m_videoPlayer->hide(); + emit hasVideoChanged(false); } } -void PhononWidget::slotHasVideoChanged(bool hasVideo) +Phonon::State PhononWidget::state() const { - emit hasVideoChanged(hasVideo); + return m_media == nullptr ? Phonon::State::StoppedState : m_media->state(); +} - if (hasVideo) { - m_videoPlayer->show(); +void PhononWidget::stop() +{ + if (m_media) { + m_media->stop(); + m_videoPlayer->hide(); + emit hasVideoChanged(false); } } @@ -231,3 +271,5 @@ void PhononWidget::applyVideoSize() m_videoPlayer->setSizeHint(m_videoSize); } } + +#include "phononwidget.moc"