From e9b697bdf6b8de3a40ac2d4689a9b20a6d7cf550 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Sun, 12 Apr 2009 19:00:59 +0000 Subject: [PATCH] The feature freeze is near: Add video support to the Information Panel. Phonon is quite cool BTW :-) svn path=/trunk/KDE/kdebase/apps/; revision=952882 --- src/panels/information/informationpanel.cpp | 61 +++++--- src/panels/information/informationpanel.h | 5 + src/panels/information/phononwidget.cpp | 158 +++++++++++++++----- src/panels/information/phononwidget.h | 25 +++- 4 files changed, 190 insertions(+), 59 deletions(-) diff --git a/src/panels/information/informationpanel.cpp b/src/panels/information/informationpanel.cpp index 753fbe0f8..8fd29651a 100644 --- a/src/panels/information/informationpanel.cpp +++ b/src/panels/information/informationpanel.cpp @@ -324,6 +324,7 @@ void InformationPanel::contextMenuEvent(QContextMenuEvent* event) m_preview->setVisible(isChecked); m_previewSeparator->setVisible(isChecked); InformationPanelSettings::setShowPreview(isChecked); + updatePhononWidget(); } else if (action == ratingAction) { m_metaDataWidget->setRatingVisible(isChecked); InformationPanelSettings::setShowRating(isChecked); @@ -506,6 +507,16 @@ void InformationPanel::slotLeftDirectory(const QString& directory) } } +void InformationPanel::slotPlayingStarted() +{ + m_preview->setVisible(m_phononWidget->mode() != PhononWidget::Video); +} + +void InformationPanel::slotPlayingStopped() +{ + m_preview->setVisible(true); +} + bool InformationPanel::applyPlace(const KUrl& url) { KFilePlacesModel* placesModel = DolphinSettings::instance().placesModel(); @@ -551,9 +562,6 @@ void InformationPanel::showMetaInfo() } } m_metaTextLabel->add(i18nc("@label", "Total size:"), KIO::convertSize(totalSize)); - - delete m_phononWidget; - m_phononWidget = 0; } else { const KFileItem item = fileItem(); if (item.isDir()) { @@ -590,21 +598,9 @@ void InformationPanel::showMetaInfo() if (m_metaDataWidget != 0) { m_metaDataWidget->setFile(item.targetUrl()); } - - if (Phonon::BackendCapabilities::isMimeTypeAvailable(item.mimetype())) { - if (m_phononWidget == 0) { - m_phononWidget = new PhononWidget(this); - - QVBoxLayout* vBoxLayout = qobject_cast(layout()); - Q_ASSERT(vBoxLayout != 0); - vBoxLayout->insertWidget(3, m_phononWidget); - } - m_phononWidget->setUrl(item.url()); - } else { - delete m_phononWidget; - m_phononWidget = 0; - } } + + updatePhononWidget(); } KFileItem InformationPanel::fileItem() const @@ -691,6 +687,30 @@ void InformationPanel::initMetaInfoSettings(KConfigGroup& group) } } +void InformationPanel::updatePhononWidget() +{ + const bool multipleSelections = showMultipleSelectionInfo(); + const bool showPreview = InformationPanelSettings::showPreview(); + + if (multipleSelections || !showPreview) { + m_phononWidget->hide(); + } else if (!multipleSelections && showPreview) { + const KFileItem item = fileItem(); + const QString mimeType = item.mimetype(); + if (Phonon::BackendCapabilities::isMimeTypeAvailable(mimeType)) { + m_phononWidget->show(); + PhononWidget::Mode mode = mimeType.startsWith("video") + ? PhononWidget::Video + : PhononWidget::Audio; + m_phononWidget->setMode(mode); + m_phononWidget->setUrl(item.url()); + } else { + m_phononWidget->hide(); + m_preview->setVisible(true); + } + } +} + void InformationPanel::init() { const int spacing = KDialog::spacingHint(); @@ -726,6 +746,12 @@ void InformationPanel::init() m_preview->setMinimumWidth(KIconLoader::SizeEnormous + KIconLoader::SizeMedium); m_preview->setMinimumHeight(KIconLoader::SizeEnormous); + m_phononWidget = new PhononWidget(this); + connect(m_phononWidget, SIGNAL(playingStarted()), + this, SLOT(slotPlayingStarted())); + connect(m_phononWidget, SIGNAL(playingStopped()), + this, SLOT(slotPlayingStopped())); + m_previewSeparator = new KSeparator(this); const bool showPreview = InformationPanelSettings::showPreview(); @@ -768,6 +794,7 @@ void InformationPanel::init() layout->addWidget(m_nameLabel); layout->addWidget(new KSeparator(this)); layout->addWidget(m_preview); + layout->addWidget(m_phononWidget); layout->addWidget(m_previewSeparator); if (m_metaDataWidget != 0) { layout->addWidget(m_metaDataWidget); diff --git a/src/panels/information/informationpanel.h b/src/panels/information/informationpanel.h index 67722f6e3..46f080507 100644 --- a/src/panels/information/informationpanel.h +++ b/src/panels/information/informationpanel.h @@ -129,6 +129,9 @@ private slots: void slotEnteredDirectory(const QString& directory); void slotLeftDirectory(const QString& directory); + void slotPlayingStarted(); + void slotPlayingStopped(); + private: /** * Checks whether the an URL is repesented by a place. If yes, @@ -189,6 +192,8 @@ private: */ void initMetaInfoSettings(KConfigGroup& group); + void updatePhononWidget(); + void init(); private: diff --git a/src/panels/information/phononwidget.cpp b/src/panels/information/phononwidget.cpp index d27b78a3c..4294c50b1 100644 --- a/src/panels/information/phononwidget.cpp +++ b/src/panels/information/phononwidget.cpp @@ -23,7 +23,10 @@ #include #include #include +#include +#include #include +#include #include #include #include @@ -31,41 +34,99 @@ PhononWidget::PhononWidget(QWidget *parent) : QWidget(parent), + m_mode(Audio), m_url(), m_playButton(0), m_stopButton(0), m_media(0), - m_seekSlider(0) + m_seekSlider(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")); - connect(m_playButton, SIGNAL(clicked()), this, SLOT(play())); - - 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_seekSlider->setIconVisible(false); } void PhononWidget::setUrl(const KUrl &url) { - m_url = url; - if (m_media) { - m_media->setCurrentSource(url); + if (m_url != url) { + stop(); // emits playingStopped() signal + m_url = url; + m_videoPlayer->hide(); + } +} + +KUrl PhononWidget::url() const +{ + return m_url; +} + +void PhononWidget::setMode(Mode mode) +{ + if (m_mode != mode) { + stop(); // emits playingStopped() signal + + m_mode = mode; + if (m_mode == Audio) { + m_videoPlayer->hide(); + m_media = 0; + } + } +} + +PhononWidget::Mode PhononWidget::mode() const +{ + return m_mode; +} + +void PhononWidget::showEvent(QShowEvent *event) +{ + if (event->spontaneous()) { + QWidget::showEvent(event); + return; + } + + if (m_playButton == 0) { + QVBoxLayout *topLayout = new QVBoxLayout(this); + topLayout->setMargin(0); + topLayout->setSpacing(0); + 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); + 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_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())); + + 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_seekSlider->setIconVisible(false); + } +} + +void PhononWidget::hideEvent(QHideEvent *event) +{ + QWidget::hideEvent(event); + if (!event->spontaneous()) { + stop(); + if (m_videoPlayer != 0) { + m_videoPlayer->hide(); + } } } @@ -88,23 +149,42 @@ void PhononWidget::stateChanged(Phonon::State newstate) void PhononWidget::play() { - requestMedia(); - m_media->play(); + switch (m_mode) { + case Audio: + if (m_media == 0) { + m_media = Phonon::createPlayer(Phonon::MusicCategory, m_url); + m_media->setParent(this); + } + m_media->setCurrentSource(m_url); + break; + + case Video: + m_videoPlayer->show(); + m_videoPlayer->play(m_url); + m_media = m_videoPlayer->mediaObject(); + break; + + default: + break; + } + + Q_ASSERT(m_media != 0); + connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), + this, SLOT(stateChanged(Phonon::State))); + m_seekSlider->setMediaObject(m_media); + + emit playingStarted(); } void PhononWidget::stop() { - requestMedia(); - m_media->stop(); -} + if (m_media != 0) { + m_media->stop(); + disconnect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), + this, SLOT(stateChanged(Phonon::State))); + emit playingStopped(); -void PhononWidget::requestMedia() -{ - if (!m_media) { - m_media = Phonon::createPlayer(Phonon::MusicCategory, m_url); - m_media->setParent(this); - connect(m_media, SIGNAL(stateChanged(Phonon::State, Phonon::State)), SLOT(stateChanged(Phonon::State))); - m_seekSlider->setMediaObject(m_media); + m_stopButton->hide(); + m_playButton->show(); } } - diff --git a/src/panels/information/phononwidget.h b/src/panels/information/phononwidget.h index 00c6574bf..81fb1e8f0 100644 --- a/src/panels/information/phononwidget.h +++ b/src/panels/information/phononwidget.h @@ -31,6 +31,7 @@ namespace Phonon { class MediaObject; class SeekSlider; + class VideoPlayer; } // namespace Phonon class QToolButton; @@ -39,8 +40,27 @@ class PhononWidget : public QWidget { Q_OBJECT public: + enum Mode + { + Audio, + Video + }; + PhononWidget(QWidget *parent = 0); + void setUrl(const KUrl &url); + KUrl url() const; + + void setMode(Mode mode); + Mode mode() const; + + signals: + void playingStarted(); + void playingStopped(); + + protected: + virtual void showEvent(QShowEvent *event); + virtual void hideEvent(QHideEvent *event); private slots: void stateChanged(Phonon::State); @@ -48,14 +68,13 @@ class PhononWidget : public QWidget void stop(); private: - void requestMedia(); - - private: + Mode m_mode; KUrl m_url; QToolButton *m_playButton; QToolButton *m_stopButton; Phonon::MediaObject *m_media; Phonon::SeekSlider *m_seekSlider; + Phonon::VideoPlayer *m_videoPlayer; }; #endif // PHONONWIDGET_H -- 2.47.3