]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/information/informationpanel.cpp
Fixed issue that when renaming an item that still the old item name will be shown...
[dolphin.git] / src / panels / information / informationpanel.cpp
index 35d29869e249a620998469fb9659d959510243d6..adf53348fd105e7207930f7211e90eb17fd3e52f 100644 (file)
 #include <kglobalsettings.h>
 #include <kfilemetainfo.h>
 #include <kiconeffect.h>
+#include <kmenu.h>
 #include <kseparator.h>
 #include <kiconloader.h>
 
+#ifdef HAVE_NEPOMUK
+#include <Nepomuk/Resource>
+#include <Nepomuk/Types/Property>
+#include <Nepomuk/Variant>
+#endif
+
+#include <Phonon/BackendCapabilities>
+#include <Phonon/MediaObject>
+#include <Phonon/SeekSlider>
+
 #include <QEvent>
-#include <QtGui/QToolButton>
 #include <QInputDialog>
 #include <QLabel>
 #include <QPainter>
 #include <QPixmap>
 #include <QResizeEvent>
+#include <QScrollArea>
 #include <QTextLayout>
 #include <QTextLine>
 #include <QTimer>
+#include <QScrollBar>
 #include <QVBoxLayout>
 
 #include "settings/dolphinsettings.h"
+#include "informationpaneldialog.h"
 #include "metadatawidget.h"
-#include "phononwidget.h"
 #include "metatextlabel.h"
+#include "phononwidget.h"
 #include "pixmapviewer.h"
-#include <Phonon/BackendCapabilities>
-#include <Phonon/MediaObject>
-#include <Phonon/SeekSlider>
 
 InformationPanel::InformationPanel(QWidget* parent) :
     Panel(parent),
@@ -65,12 +75,13 @@ InformationPanel::InformationPanel(QWidget* parent) :
     m_urlCandidate(),
     m_fileItem(),
     m_selection(),
-    m_infoLabel(0),
-    m_phononWidget(0),
     m_nameLabel(0),
     m_preview(0),
+    m_phononWidget(0),
     m_metaDataWidget(0),
-    m_metaTextLabel(0)
+    m_metaTextArea(0),
+    m_metaTextLabel(0),
+    m_dialog(0)
 {
 }
 
@@ -185,10 +196,37 @@ void InformationPanel::resizeEvent(QResizeEvent* event)
         m_urlCandidate = m_shownUrl; // reset the URL candidate if a resizing is done
         m_infoTimer->start();
     }
-
     Panel::resizeEvent(event);
 }
 
+bool InformationPanel::eventFilter(QObject* obj, QEvent* event)
+{
+    // Check whether the size of the meta text area has changed and adjust
+    // the fixed width in a way that no horizontal scrollbar needs to be shown.
+    if ((obj == m_metaTextArea->viewport()) && (event->type() == QEvent::Resize)) {
+        QResizeEvent* resizeEvent = static_cast<QResizeEvent*>(event);
+        m_metaTextLabel->setFixedWidth(resizeEvent->size().width());
+    }
+    return Panel::eventFilter(obj, event);
+}
+
+void InformationPanel::contextMenuEvent(QContextMenuEvent* event)
+{
+    Panel::contextMenuEvent(event);
+
+    KMenu popup(this);
+    popup.addAction(i18nc("@action:inmenu", "Configure..."));
+    if (popup.exec(QCursor::pos()) != 0) {
+        if (m_dialog == 0) {
+            m_dialog = new InformationPanelDialog(this);
+            m_dialog->setAttribute(Qt::WA_DeleteOnClose);
+            m_dialog->show();
+        } else {
+            m_dialog->raise();
+        }
+    }
+}
+
 void InformationPanel::showItemInfo()
 {
     if (!isVisible()) {
@@ -275,11 +313,26 @@ void InformationPanel::showPreview(const KFileItem& item,
 
 void InformationPanel::slotFileRenamed(const QString& source, const QString& dest)
 {
-    if (m_shownUrl == KUrl(source)) {
-        // the currently shown file has been renamed, hence update the item information
-        // for the renamed file
-        KFileItem item(KFileItem::Unknown, KFileItem::Unknown, KUrl(dest));
-        requestDelayedItemInfo(item);
+    const KUrl sourceUrl = KUrl(source);
+
+    // Verify whether the renamed item is selected. If this is the case, the
+    // selection must be updated with the renamed item.
+    bool isSelected = false;
+    for (int i = m_selection.size() - 1; i >= 0; --i) {
+        if (m_selection[i].url() == sourceUrl) {
+            m_selection.removeAt(i);
+            isSelected = true;
+            break;
+        }
+    }
+
+    if ((m_shownUrl == sourceUrl) || isSelected) {
+        m_shownUrl = KUrl(dest);
+        m_fileItem = KFileItem(KFileItem::Unknown, KFileItem::Unknown, m_shownUrl);
+        if (isSelected) {
+            m_selection.append(m_fileItem);
+        }
+        showItemInfo();
     }
 }
 
@@ -309,8 +362,7 @@ void InformationPanel::slotFilesRemoved(const QStringList& files)
         if (m_shownUrl == KUrl(fileName)) {
             // the currently shown item has been removed, show
             // the parent directory as fallback
-            m_shownUrl = url();
-            showItemInfo();
+            reset();
             break;
         }
     }
@@ -331,8 +383,7 @@ void InformationPanel::slotLeftDirectory(const QString& directory)
         // has been unmounted. In this case no directory change will be
         // done in Dolphin, but the Information Panel must be updated to
         // indicate an invalid directory.
-        m_shownUrl = url();
-        showItemInfo();
+        reset();
     }
 }
 
@@ -361,9 +412,6 @@ void InformationPanel::cancelRequest()
 
 void InformationPanel::showMetaInfo()
 {
-    delete m_phononWidget;
-    m_phononWidget = 0;
-
     m_metaTextLabel->clear();
 
     if (showMultipleSelectionInfo()) {
@@ -384,6 +432,9 @@ 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()) {
@@ -395,29 +446,19 @@ void InformationPanel::showMetaInfo()
             m_metaTextLabel->add(i18nc("@label", "Size:"), KIO::convertSize(item.size()));
             m_metaTextLabel->add(i18nc("@label", "Modified:"), item.timeString());
 
-            if (item.isLocalFile()) {
-                // TODO: See convertMetaInfo below, find a way to display only interesting information
-                // in a readable way
-                const KFileMetaInfo::WhatFlags flags = KFileMetaInfo::Fastest |
-                                                       KFileMetaInfo::TechnicalInfo |
-                                                       KFileMetaInfo::ContentInfo;
-                const QString path = item.url().path();
-                const KFileMetaInfo fileMetaInfo(path, QString(), flags);
-                if (fileMetaInfo.isValid()) {
-                    const QHash<QString, KFileMetaInfoItem>& items = fileMetaInfo.items();
-                    QHash<QString, KFileMetaInfoItem>::const_iterator it = items.constBegin();
-                    const QHash<QString, KFileMetaInfoItem>::const_iterator end = items.constEnd();
-                    QString labelText;
-                    while (it != end) {
-                        const KFileMetaInfoItem& metaInfoItem = it.value();
-                        const QVariant& value = metaInfoItem.value();
-                        if (value.isValid() && convertMetaInfo(metaInfoItem.name(), labelText)) {
-                            m_metaTextLabel->add(labelText, value.toString());
-                        }
-                        ++it;
-                    }
-                }
+#ifdef HAVE_NEPOMUK
+            Nepomuk::Resource res(item.url());
+
+            QHash<QUrl, Nepomuk::Variant> properties = res.properties();
+            QHash<QUrl, Nepomuk::Variant>::const_iterator it = properties.constBegin();
+            while (it != properties.constEnd()) {
+                Nepomuk::Types::Property prop(it.key());
+                // TODO: use Nepomuk::formatValue(res, prop) if available
+                // instead of it.value().toString()
+                m_metaTextLabel->add(prop.label(), it.value().toString());
+                ++it;
             }
+#endif
         }
 
         if (m_metaDataWidget != 0) {
@@ -425,54 +466,19 @@ void InformationPanel::showMetaInfo()
         }
 
         if (Phonon::BackendCapabilities::isMimeTypeAvailable(item.mimetype())) {
-            PhononWidget *p = new PhononWidget(this);
-            p->setUrl(item.url());
-            m_phononWidget = p;
-
-            QVBoxLayout *l = qobject_cast<QVBoxLayout *>(layout());
-            Q_ASSERT(l);
-            l->insertWidget(3, m_phononWidget);
-        }
-    }
-}
+            if (m_phononWidget == 0) {
+                m_phononWidget = new PhononWidget(this);
 
-bool InformationPanel::convertMetaInfo(const QString& key, QString& text) const
-{
-    struct MetaKey {
-        const char* key;
-        QString text;
-    };
-
-    // sorted list of keys, where its data should be shown
-    static const MetaKey keys[] = {
-        { "http://freedesktop.org/standards/xesam/1.0/core#album",       i18nc("@label", "Album:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#artist",      i18nc("@label", "Artist:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#genre",       i18nc("@label", "Genre:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#height",      i18nc("@label", "Height:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#lineCount",   i18nc("@label", "Lines:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#title",       i18nc("@label", "Title:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#type",        i18nc("@label", "Type:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#trackNumber", i18nc("@label", "Track:") },
-        { "http://freedesktop.org/standards/xesam/1.0/core#width",       i18nc("@label", "Width:") }
-    };
-
-    // do a binary search for the key...
-    int top = 0;
-    int bottom = sizeof(keys) / sizeof(MetaKey) - 1;
-    while (top <= bottom) {
-        const int middle = (top + bottom) / 2;
-        const int result = key.compare(keys[middle].key);
-        if (result < 0) {
-            bottom = middle - 1;
-        } else if (result > 0) {
-            top = middle + 1;
+                QVBoxLayout* vBoxLayout = qobject_cast<QVBoxLayout*>(layout());
+                Q_ASSERT(vBoxLayout != 0);
+                vBoxLayout->insertWidget(3, m_phononWidget);
+            }
+            m_phononWidget->setUrl(item.url());
         } else {
-            text = keys[middle].text;
-            return true;
+            delete m_phononWidget;
+            m_phononWidget = 0;
         }
     }
-
-    return false;
 }
 
 KFileItem InformationPanel::fileItem() const
@@ -532,6 +538,14 @@ void InformationPanel::setNameLabelText(const QString& text)
     m_nameLabel->setText(wrappedText);
 }
 
+void InformationPanel::reset()
+{
+    m_selection.clear();
+    m_shownUrl = url();
+    m_fileItem = KFileItem();
+    showItemInfo();
+}
+
 void InformationPanel::init()
 {
     const int spacing = KDialog::spacingHint();
@@ -575,9 +589,20 @@ void InformationPanel::init()
 
     // general meta text information
     m_metaTextLabel = new MetaTextLabel(this);
-    m_metaTextLabel->setMinimumWidth(spacing);
     m_metaTextLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
 
+    m_metaTextArea = new QScrollArea(this);
+    m_metaTextArea->setWidget(m_metaTextLabel);
+    m_metaTextArea->setWidgetResizable(true);
+    m_metaTextArea->setFrameShape(QFrame::NoFrame);
+
+    QWidget* viewport = m_metaTextArea->viewport();
+    viewport->installEventFilter(this);
+
+    QPalette palette = viewport->palette();
+    palette.setColor(viewport->backgroundRole(), QColor(Qt::transparent));
+    viewport->setPalette(palette);
+
     layout->addWidget(m_nameLabel);
     layout->addWidget(new KSeparator(this));
     layout->addWidget(m_preview);
@@ -586,10 +611,7 @@ void InformationPanel::init()
         layout->addWidget(m_metaDataWidget);
         layout->addWidget(new KSeparator(this));
     }
-    layout->addWidget(m_metaTextLabel);
-
-    // ensure that widgets in the information side bar are aligned towards the top
-    layout->addStretch(1);
+    layout->addWidget(m_metaTextArea);
     setLayout(layout);
 
     org::kde::KDirNotify* dirNotify = new org::kde::KDirNotify(QString(), QString(),