X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/9d3ed99ab02271496c0412fe97ad89575492582c..4cf04b91dd8804f2536fc31ae2f1b486bfc8cf9c:/src/panels/information/phononwidget.cpp diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index d52ae9d8a..4b2cc28c5 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -20,50 +20,140 @@ #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::VideoWidget +{ + public: + EmbeddedVideoPlayer(QWidget *parent = 0) : + Phonon::VideoWidget(parent) + { + } + + void setSizeHint(const QSize& size) + { + m_sizeHint = size; + updateGeometry(); + } + + virtual QSize sizeHint() const + { + return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoWidget::sizeHint(); + } + + private: + QSize m_sizeHint; +}; PhononWidget::PhononWidget(QWidget *parent) : QWidget(parent), - m_media(0) + m_url(), + m_playButton(0), + m_stopButton(0), + m_topLayout(0), + m_media(0), + m_seekSlider(0), + m_audioOutput(0), + m_videoPlayer(0) { - QHBoxLayout *innerLayout = new QHBoxLayout(this); - innerLayout->setMargin(0); - innerLayout->setSpacing(0); - m_playButton = new QToolButton(this); - m_stopButton = new QToolButton(this); - m_seekSlider = new Phonon::SeekSlider(this); - innerLayout->addWidget(m_playButton); - innerLayout->addWidget(m_stopButton); - innerLayout->addWidget(m_seekSlider); - - m_playButton->setToolTip(i18n("play")); - m_playButton->setIconSize(QSize(16, 16)); - m_playButton->setIcon(KIcon("media-playback-start")); - m_stopButton->setToolTip(i18n("stop")); - m_stopButton->setIconSize(QSize(16, 16)); - m_stopButton->setIcon(KIcon("media-playback-stop")); - m_stopButton->hide(); - m_seekSlider->setIconVisible(false); } void PhononWidget::setUrl(const KUrl &url) { - if (m_media) { - m_media->setCurrentSource(url); - } else { - m_media = Phonon::createPlayer(Phonon::MusicCategory, url); - m_media->setParent(this); - connect(m_playButton, SIGNAL(clicked()), m_media, SLOT(play())); - connect(m_stopButton, SIGNAL(clicked()), m_media, SLOT(stop())); - connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), SLOT(stateChanged(Phonon::State))); - m_seekSlider->setMediaObject(m_media); + if (m_url != url) { + stop(); // emits playingStopped() signal + m_url = url; + } +} + +KUrl PhononWidget::url() const +{ + return m_url; +} + +void PhononWidget::setVideoSize(const QSize& size) +{ + if (m_videoSize != size) { + m_videoSize = size; + applyVideoSize(); + } +} + +QSize PhononWidget::videoSize() const +{ + return m_videoSize; +} + +void PhononWidget::showEvent(QShowEvent *event) +{ + if (event->spontaneous()) { + QWidget::showEvent(event); + return; + } + + 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); + controlsLayout->setSpacing(0); + + m_playButton = new QToolButton(this); + m_stopButton = new QToolButton(this); + m_seekSlider = new Phonon::SeekSlider(this); + + controlsLayout->addWidget(m_playButton); + controlsLayout->addWidget(m_stopButton); + controlsLayout->addWidget(m_seekSlider); + + m_topLayout->addLayout(controlsLayout); + + const int smallIconSize = IconSize(KIconLoader::Small); + const QSize buttonSize(smallIconSize, smallIconSize); + + m_playButton->setToolTip(i18n("play")); + m_playButton->setIconSize(buttonSize); + m_playButton->setIcon(KIcon("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(KIcon("media-playback-stop")); + m_stopButton->setAutoRaise(true); + m_stopButton->hide(); + connect(m_stopButton, &QToolButton::clicked, this, &PhononWidget::stop); + + m_seekSlider->setIconVisible(false); + + // Creating an audio player or video player instance might take up to + // 2 seconds when doing it the first time. To prevent that the user + // interface gets noticeable blocked, the creation is delayed until + // the play button has been pressed (see PhononWidget::play()). + } +} + +void PhononWidget::hideEvent(QHideEvent *event) +{ + QWidget::hideEvent(event); + if (!event->spontaneous()) { + stop(); } } @@ -83,3 +173,67 @@ void PhononWidget::stateChanged(Phonon::State newstate) } setUpdatesEnabled(true); } + +void PhononWidget::play() +{ + if (!m_media) { + m_media = new Phonon::MediaObject(this); + connect(m_media, &Phonon::MediaObject::stateChanged, + this, &PhononWidget::stateChanged); + connect(m_media, &Phonon::MediaObject::hasVideoChanged, + this, &PhononWidget::slotHasVideoChanged); + m_seekSlider->setMediaObject(m_media); + } + + if (!m_audioOutput) { + m_audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); + Phonon::createPath(m_media, m_audioOutput); + } + + emit hasVideoChanged(false); + + m_media->setCurrentSource(m_url); + m_media->hasVideo(); + m_media->play(); +} + +void PhononWidget::stop() +{ + if (m_media) { + m_media->stop(); + + m_stopButton->hide(); + m_playButton->show(); + } + + if (m_videoPlayer) { + m_videoPlayer->hide(); + } + + emit hasVideoChanged(false); +} + +void PhononWidget::slotHasVideoChanged(bool hasVideo) +{ + emit hasVideoChanged(hasVideo); + + if (hasVideo) { + if (!m_videoPlayer) { + // Replay the media to apply path changes + m_media->stop(); + m_videoPlayer = new EmbeddedVideoPlayer(this); + m_topLayout->insertWidget(0, m_videoPlayer); + Phonon::createPath(m_media, m_videoPlayer); + m_media->play(); + } + applyVideoSize(); + m_videoPlayer->show(); + } +} + +void PhononWidget::applyVideoSize() +{ + if ((m_videoPlayer) && m_videoSize.isValid()) { + m_videoPlayer->setSizeHint(m_videoSize); + } +}