X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8eb9b508ca87fb1d634d8b8ba62c054ed04466d2..781e8e9e18579c0fe368ed9fe295f908493272b3:/src/panels/information/phononwidget.cpp diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index b6da339ea..3365998f4 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -1,104 +1,115 @@ -/* This file is part of the KDE project - Copyright (C) 2007 Matthias Kretz - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. +/* + SPDX-FileCopyrightText: 2007 Matthias Kretz + SPDX-License-Identifier: GPL-2.0-or-later */ #include "phononwidget.h" -#include -#include -#include -#include +#include +#include +#include +#include +#include -#include -#include #include +#include #include +#include -#include -#include -#include -#include - -class EmbeddedVideoPlayer : public Phonon::VideoPlayer +class EmbeddedVideoPlayer : public Phonon::VideoWidget { - public: - EmbeddedVideoPlayer(Phonon::Category category, QWidget *parent = 0) : - Phonon::VideoPlayer(category, parent) - { - } + Q_OBJECT - void setSizeHint(const QSize& size) - { - m_sizeHint = size; - updateGeometry(); - } +public: + EmbeddedVideoPlayer(QWidget *parent = nullptr) + : Phonon::VideoWidget(parent) + { + } - virtual QSize sizeHint() const - { - return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoPlayer::sizeHint(); - } + void setSizeHint(const QSize &size) + { + m_sizeHint = size; + updateGeometry(); + } - private: - QSize m_sizeHint; + QSize sizeHint() const override + { + return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoWidget::sizeHint(); + } + +private: + QSize m_sizeHint; }; PhononWidget::PhononWidget(QWidget *parent) - : QWidget(parent), - m_mode(Audio), - m_url(), - m_playButton(0), - m_stopButton(0), - m_topLayout(0), - m_audioMedia(0), - m_media(0), - m_seekSlider(0), - m_videoPlayer(0) + : QWidget(parent) + , m_url() + , m_playButton(nullptr) + , m_pauseButton(nullptr) + , m_topLayout(nullptr) + , m_media(nullptr) + , m_seekSlider(nullptr) + , m_audioOutput(nullptr) + , m_videoPlayer(nullptr) { } -void PhononWidget::setUrl(const KUrl &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(); } } -KUrl PhononWidget::url() const +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(); + } +} + +QUrl PhononWidget::url() const { return m_url; } -void PhononWidget::setMode(Mode mode) +void PhononWidget::clearUrl() { - if (m_mode != mode) { - stop(); // emits playingStopped() signal - m_mode = mode; + m_url.clear(); +} + +void PhononWidget::togglePlayback() +{ + if (m_media && m_media->state() == Phonon::State::PlayingState) { + m_media->pause(); + } else { + play(); } } -PhononWidget::Mode PhononWidget::mode() const +bool PhononWidget::eventFilter(QObject *object, QEvent *event) { - return m_mode; + Q_UNUSED(object) + if (event->type() == QEvent::MouseButtonPress) { + const QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() == Qt::LeftButton) { + // toggle playback + togglePlayback(); + return true; + } + } + return false; } -void PhononWidget::setVideoSize(const QSize& size) +void PhononWidget::setVideoSize(const QSize &size) { if (m_videoSize != size) { m_videoSize = size; @@ -118,34 +129,39 @@ void PhononWidget::showEvent(QShowEvent *event) return; } - if (m_topLayout == 0) { + if (!m_topLayout) { m_topLayout = new QVBoxLayout(this); - m_topLayout->setMargin(0); - m_topLayout->setSpacing(KDialog::spacingHint()); - QHBoxLayout *controlsLayout = new QHBoxLayout(this); - controlsLayout->setMargin(0); + m_topLayout->setContentsMargins(0, 0, 0, 0); + + QHBoxLayout *controlsLayout = new QHBoxLayout(); + controlsLayout->setContentsMargins(0, 0, 0, 0); controlsLayout->setSpacing(0); m_playButton = new QToolButton(this); - m_stopButton = new QToolButton(this); + m_pauseButton = new QToolButton(this); m_seekSlider = new Phonon::SeekSlider(this); controlsLayout->addWidget(m_playButton); - controlsLayout->addWidget(m_stopButton); + controlsLayout->addWidget(m_pauseButton); controlsLayout->addWidget(m_seekSlider); m_topLayout->addLayout(controlsLayout); - m_playButton->setToolTip(i18n("play")); - m_playButton->setIconSize(QSize(16, 16)); - m_playButton->setIcon(KIcon("media-playback-start")); - connect(m_playButton, SIGNAL(clicked()), this, SLOT(play())); + const int smallIconSize = style()->pixelMetric(QStyle::PM_SmallIconSize); + const QSize buttonSize(smallIconSize, smallIconSize); - m_stopButton->setToolTip(i18n("stop")); - m_stopButton->setIconSize(QSize(16, 16)); - m_stopButton->setIcon(KIcon("media-playback-stop")); - m_stopButton->hide(); - connect(m_stopButton, SIGNAL(clicked()), this, SLOT(stop())); + m_playButton->setToolTip(i18n("play")); + m_playButton->setIconSize(buttonSize); + m_playButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-start"))); + m_playButton->setAutoRaise(true); + connect(m_playButton, &QToolButton::clicked, this, &PhononWidget::play); + + m_pauseButton->setToolTip(i18n("pause")); + m_pauseButton->setIconSize(buttonSize); + m_pauseButton->setIcon(QIcon::fromTheme(QStringLiteral("media-playback-pause"))); + m_pauseButton->setAutoRaise(true); + m_pauseButton->hide(); + connect(m_pauseButton, &QToolButton::clicked, this, &PhononWidget::togglePlayback); m_seekSlider->setIconVisible(false); @@ -170,11 +186,11 @@ void PhononWidget::stateChanged(Phonon::State newstate) switch (newstate) { case Phonon::PlayingState: case Phonon::BufferingState: - m_stopButton->show(); m_playButton->hide(); + m_pauseButton->show(); break; default: - m_stopButton->hide(); + m_pauseButton->hide(); m_playButton->show(); break; } @@ -183,60 +199,67 @@ void PhononWidget::stateChanged(Phonon::State newstate) void PhononWidget::play() { - switch (m_mode) { - case Audio: - if (m_audioMedia == 0) { - m_audioMedia = Phonon::createPlayer(Phonon::MusicCategory, m_url); - m_audioMedia->setParent(this); - } - m_media = m_audioMedia; - m_media->setCurrentSource(m_url); - m_media->play(); - break; + if (!m_media) { + m_media = new Phonon::MediaObject(this); + connect(m_media, &Phonon::MediaObject::stateChanged, this, &PhononWidget::stateChanged); + connect(m_media, &Phonon::MediaObject::finished, this, &PhononWidget::finished); + m_seekSlider->setMediaObject(m_media); + } - case Video: - if (m_videoPlayer == 0) { - m_videoPlayer = new EmbeddedVideoPlayer(Phonon::VideoCategory, this); - m_topLayout->insertWidget(0, m_videoPlayer); - } + 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(); - m_videoPlayer->show(); - m_videoPlayer->play(m_url); - m_media = m_videoPlayer->mediaObject(); - break; + } - default: - break; + if (!m_audioOutput) { + m_audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); + Phonon::createPath(m_media, m_audioOutput); + } + + if (m_isVideo) { + Q_EMIT hasVideoChanged(true); + } + + if (m_url != m_media->currentSource().url()) { + m_media->setCurrentSource(m_url); } + m_media->play(); - Q_ASSERT(m_media != 0); - connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), - this, SLOT(stateChanged(Phonon::State))); - m_seekSlider->setMediaObject(m_media); + m_videoPlayer->setVisible(m_isVideo); +} - emit playingStarted(); +void PhononWidget::finished() +{ + if (m_isVideo) { + m_videoPlayer->hide(); + Q_EMIT hasVideoChanged(false); + } +} + +Phonon::State PhononWidget::state() const +{ + return m_media == nullptr ? Phonon::State::StoppedState : m_media->state(); } void PhononWidget::stop() { - if (m_media != 0) { + if (m_media) { m_media->stop(); - disconnect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), - this, SLOT(stateChanged(Phonon::State))); - emit playingStopped(); - - m_stopButton->hide(); - m_playButton->show(); - } - - if (m_videoPlayer != 0) { m_videoPlayer->hide(); + Q_EMIT hasVideoChanged(false); } } void PhononWidget::applyVideoSize() { - if ((m_videoPlayer != 0) && m_videoSize.isValid()) { + if ((m_videoPlayer) && m_videoSize.isValid()) { m_videoPlayer->setSizeHint(m_videoSize); } } + +#include "moc_phononwidget.cpp" +#include "phononwidget.moc"