]> cloud.milkyroute.net Git - dolphin.git/commitdiff
The feature freeze is near: Add video support to the Information Panel. Phonon is...
authorPeter Penz <peter.penz19@gmail.com>
Sun, 12 Apr 2009 19:00:59 +0000 (19:00 +0000)
committerPeter Penz <peter.penz19@gmail.com>
Sun, 12 Apr 2009 19:00:59 +0000 (19:00 +0000)
svn path=/trunk/KDE/kdebase/apps/; revision=952882

src/panels/information/informationpanel.cpp
src/panels/information/informationpanel.h
src/panels/information/phononwidget.cpp
src/panels/information/phononwidget.h

index 753fbe0f899cb3e2a10aca0d004bb0005f6c0fc5..8fd29651a134c93c8c126bce31cc9eee72f7ddc3 100644 (file)
@@ -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<QVBoxLayout*>(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);
index 67722f6e3924c0dcd277e80fe3e6c387f46a9c8b..46f0805078b3da34ea01faa5592981eb653d54cb 100644 (file)
@@ -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:
index d27b78a3ccacaf8b8fc91eb065a16af31393e470..4294c50b1fd6f95c8bbb35247a4bb20f06799309 100644 (file)
 #include <Phonon/Global>
 #include <Phonon/MediaObject>
 #include <Phonon/SeekSlider>
+#include <Phonon/VideoPlayer>
+#include <QtGui/QVBoxLayout>
 #include <QtGui/QHBoxLayout>
+#include <QtGui/QShowEvent>
 #include <QtGui/QToolButton>
 #include <kicon.h>
 #include <kurl.h>
 
 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();
     }
 }
-
index 00c6574bf61ec372288a2c2e7b156089c0edadb7..81fb1e8f044871332e919db44972efcc39a6aa60 100644 (file)
@@ -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