X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/897f481e96afa4ae35a22713552858da69a532a3..c8d8556950005dfd96ebdb41d2f43ad90356367c:/src/panels/information/phononwidget.cpp diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index 405172b8d..5f0c11158 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -24,13 +24,39 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +class EmbeddedVideoPlayer : public Phonon::VideoPlayer +{ + public: + EmbeddedVideoPlayer(Phonon::Category category, QWidget *parent = 0) : + Phonon::VideoPlayer(category, parent) + { + } + + void setSizeHint(const QSize& size) + { + m_sizeHint = size; + updateGeometry(); + } + + virtual QSize sizeHint() const + { + return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoPlayer::sizeHint(); + } + + private: + QSize m_sizeHint; +}; PhononWidget::PhononWidget(QWidget *parent) : QWidget(parent), @@ -38,6 +64,7 @@ PhononWidget::PhononWidget(QWidget *parent) m_url(), m_playButton(0), m_stopButton(0), + m_topLayout(0), m_audioMedia(0), m_media(0), m_seekSlider(0), @@ -71,6 +98,19 @@ PhononWidget::Mode PhononWidget::mode() const return m_mode; } +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()) { @@ -78,10 +118,10 @@ void PhononWidget::showEvent(QShowEvent *event) return; } - if (m_playButton == 0) { - QVBoxLayout *topLayout = new QVBoxLayout(this); - topLayout->setMargin(0); - topLayout->setSpacing(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); controlsLayout->setSpacing(0); @@ -89,15 +129,12 @@ void PhononWidget::showEvent(QShowEvent *event) m_playButton = new QToolButton(this); m_stopButton = new QToolButton(this); m_seekSlider = new Phonon::SeekSlider(this); - m_videoPlayer = new Phonon::VideoPlayer(Phonon::VideoCategory, this); - m_videoPlayer->hide(); controlsLayout->addWidget(m_playButton); controlsLayout->addWidget(m_stopButton); controlsLayout->addWidget(m_seekSlider); - topLayout->addWidget(m_videoPlayer); - topLayout->addLayout(controlsLayout); + m_topLayout->addLayout(controlsLayout); m_playButton->setToolTip(i18n("play")); m_playButton->setIconSize(QSize(16, 16)); @@ -111,6 +148,11 @@ void PhononWidget::showEvent(QShowEvent *event) connect(m_stopButton, SIGNAL(clicked()), this, SLOT(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()). } } @@ -143,19 +185,21 @@ void PhononWidget::play() { switch (m_mode) { case Audio: - if (m_audioMedia == 0) { - // Creating an audio player might take up to 2 seconds when doing - // it the first time. To prevent that the user interface gets - // noticable blocked, the creation is delayed until the play button - // has been pressed. + if (!m_audioMedia) { 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; case Video: + if (!m_videoPlayer) { + m_videoPlayer = new EmbeddedVideoPlayer(Phonon::VideoCategory, this); + m_topLayout->insertWidget(0, m_videoPlayer); + } + applyVideoSize(); m_videoPlayer->show(); m_videoPlayer->play(m_url); m_media = m_videoPlayer->mediaObject(); @@ -165,8 +209,8 @@ void PhononWidget::play() break; } - Q_ASSERT(m_media != 0); - connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), + Q_ASSERT(m_media); + connect(m_media, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State))); m_seekSlider->setMediaObject(m_media); @@ -175,9 +219,9 @@ void PhononWidget::play() void PhononWidget::stop() { - if (m_media != 0) { + if (m_media) { m_media->stop(); - disconnect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), + disconnect(m_media, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State))); emit playingStopped(); @@ -185,7 +229,14 @@ void PhononWidget::stop() m_playButton->show(); } - if (m_videoPlayer != 0) { + if (m_videoPlayer) { m_videoPlayer->hide(); } } + +void PhononWidget::applyVideoSize() +{ + if ((m_videoPlayer) && m_videoSize.isValid()) { + m_videoPlayer->setSizeHint(m_videoSize); + } +}