]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
when the column view is used, then 'Split view' should take the root URL of the colum...
[dolphin.git] / src / dolphinview.cpp
index 48f0214bcbaaa06556d5e87de623ccd253d05902..d33ed3eba5b7856486ff9c73c5725c913e3cce76 100644 (file)
 
 #include "dolphinview.h"
 
-#include <QApplication>
-#include <QClipboard>
-#include <QDropEvent>
-#include <QItemSelectionModel>
-#include <QMouseEvent>
-#include <QVBoxLayout>
-#include <QTimer>
-#include <QScrollBar>
+#include <QtGui/QApplication>
+#include <QtGui/QClipboard>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QItemSelection>
+#include <QtGui/QBoxLayout>
+#include <QtCore/QTimer>
+#include <QtGui/QScrollBar>
 
 #include <kdirmodel.h>
 #include <kfileitemdelegate.h>
 #include <kfileplacesmodel.h>
+#include <kglobalsettings.h>
 #include <klocale.h>
 #include <kiconeffect.h>
 #include <kio/netaccess.h>
@@ -64,26 +64,27 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow,
                          const KUrl& url,
                          Mode mode,
                          bool showHiddenFiles) :
-        QWidget(parent),
-        m_showProgress(false),
-        m_blockContentsMovedSignal(false),
-        m_mode(mode),
-        m_iconSize(0),
-        m_folderCount(0),
-        m_fileCount(0),
-        m_mainWindow(mainWindow),
-        m_topLayout(0),
-        m_urlNavigator(0),
-        m_controller(0),
-        m_iconsView(0),
-        m_detailsView(0),
-        m_columnView(0),
-        m_fileItemDelegate(0),
-        m_filterBar(0),
-        m_statusBar(0),
-        m_dirModel(0),
-        m_dirLister(0),
-        m_proxyModel(0)
+    QWidget(parent),
+    m_showProgress(false),
+    m_blockContentsMovedSignal(false),
+    m_initializeColumnView(false),
+    m_mode(mode),
+    m_iconSize(0),
+    m_folderCount(0),
+    m_fileCount(0),
+    m_mainWindow(mainWindow),
+    m_topLayout(0),
+    m_urlNavigator(0),
+    m_controller(0),
+    m_iconsView(0),
+    m_detailsView(0),
+    m_columnView(0),
+    m_fileItemDelegate(0),
+    m_filterBar(0),
+    m_statusBar(0),
+    m_dirModel(0),
+    m_dirLister(0),
+    m_proxyModel(0)
 {
     hide();
     setFocusPolicy(Qt::StrongFocus);
@@ -102,7 +103,7 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow,
     m_urlNavigator->setUrlEditable(DolphinSettings::instance().generalSettings()->editableUrl());
     m_urlNavigator->setHomeUrl(DolphinSettings::instance().generalSettings()->homeUrl());
     connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
-            this, SLOT(loadDirectory(const KUrl&)));
+            this, SLOT(changeDirectory(const KUrl&)));
     connect(m_urlNavigator, SIGNAL(urlsDropped(const KUrl::List&, const KUrl&)),
             this, SLOT(dropUrls(const KUrl::List&, const KUrl&)));
     connect(m_urlNavigator, SIGNAL(activated()),
@@ -157,6 +158,10 @@ DolphinView::DolphinView(DolphinMainWindow* mainWindow,
             this, SLOT(emitSelectionChangedSignal()));
     connect(m_controller, SIGNAL(activated()),
             this, SLOT(requestActivation()));
+    connect(m_controller, SIGNAL(itemEntered(const QModelIndex&)),
+            this, SLOT(showHoverInformation(const QModelIndex&)));
+    connect(m_controller, SIGNAL(viewportEntered()),
+            this, SLOT(clearHoverInformation()));
 
     createView();
 
@@ -192,6 +197,11 @@ const KUrl& DolphinView::url() const
     return m_urlNavigator->url();
 }
 
+KUrl DolphinView::rootUrl() const
+{
+    return isColumnViewActive() ? m_dirLister->url() : url();
+}
+
 bool DolphinView::isActive() const
 {
     return m_mainWindow->activeView() == this;
@@ -205,6 +215,14 @@ void DolphinView::setMode(Mode mode)
 
     m_mode = mode;
 
+    if (isColumnViewActive()) {
+        // When changing the mode in the column view, it makes sense
+        // to go back to the root URL of the column view automatically.
+        // Otherwise there it would not be possible to turn off the column view
+        // without focusing the first column.
+        setUrl(m_dirLister->url());
+    }
+
     ViewProperties props(m_urlNavigator->url());
     props.setViewMode(m_mode);
 
@@ -225,9 +243,9 @@ void DolphinView::setShowPreview(bool show)
     props.setShowPreview(show);
 
     m_controller->setShowPreview(show);
-
     emit showPreviewChanged();
-    reload();
+
+    startDirLister(m_urlNavigator->url(), true);
 }
 
 bool DolphinView::showPreview() const
@@ -243,12 +261,11 @@ void DolphinView::setShowHiddenFiles(bool show)
 
     ViewProperties props(m_urlNavigator->url());
     props.setShowHiddenFiles(show);
-    props.save();
 
     m_dirLister->setShowingDotFiles(show);
     emit showHiddenFilesChanged();
 
-    reload();
+    startDirLister(m_urlNavigator->url(), true);
 }
 
 bool DolphinView::showHiddenFiles() const
@@ -453,10 +470,11 @@ void DolphinView::setAdditionalInfo(KFileItemDelegate::AdditionalInformation inf
     ViewProperties props(m_urlNavigator->url());
     props.setAdditionalInfo(info);
 
+    m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
     m_fileItemDelegate->setAdditionalInformation(info);
 
     emit additionalInfoChanged(info);
-    reload();
+    startDirLister(m_urlNavigator->url(), true);
 }
 
 KFileItemDelegate::AdditionalInformation DolphinView::additionalInfo() const
@@ -583,7 +601,6 @@ void DolphinView::rename(const KUrl& source, const QString& newName)
 
         default:
             // the renaming operation has been canceled
-            reload();
             return;
         }
     } else {
@@ -601,13 +618,20 @@ void DolphinView::rename(const KUrl& source, const QString& newName)
     } else {
         m_statusBar->setMessage(i18n("Renaming of file '%1' to '%2' failed.", source.fileName(), destFileName),
                                 DolphinStatusBar::Error);
-        reload();
     }
 }
 
 void DolphinView::reload()
 {
-    startDirLister(m_urlNavigator->url(), true);
+    const KUrl& url = m_urlNavigator->url();
+    changeDirectory(url);
+    startDirLister(url, true);
+}
+
+void DolphinView::refresh()
+{
+    createView();
+    reload();
 }
 
 void DolphinView::mouseReleaseEvent(QMouseEvent* event)
@@ -621,7 +645,7 @@ DolphinMainWindow* DolphinView::mainWindow() const
     return m_mainWindow;
 }
 
-void DolphinView::loadDirectory(const KUrl& url)
+void DolphinView::changeDirectory(const KUrl& url)
 {
     if (!isActive()) {
         requestActivation();
@@ -643,6 +667,14 @@ void DolphinView::loadDirectory(const KUrl& url)
         m_mode = mode;
         createView();
         emit modeChanged();
+
+        if (m_mode == ColumnView) {
+            // The mode has been changed to the Column View. When starting the dir
+            // lister with DolphinView::startDirLister() it is important to give a
+            // hint that the dir lister may not keep the current directory
+            // although this is the default for showing a hierarchy.
+            m_initializeColumnView = true;
+        }
     }
 
     const bool showHiddenFiles = props.showHiddenFiles();
@@ -681,8 +713,8 @@ void DolphinView::loadDirectory(const KUrl& url)
 
     KFileItemDelegate::AdditionalInformation info = props.additionalInfo();
     if (info != m_fileItemDelegate->additionalInformation()) {
+        m_controller->setShowAdditionalInfo(info != KFileItemDelegate::NoInformation);
         m_fileItemDelegate->setAdditionalInformation(info);
-
         emit additionalInfoChanged(info);
     }
 
@@ -793,19 +825,31 @@ void DolphinView::updateItemCount()
 void DolphinView::generatePreviews(const KFileItemList& items)
 {
     if (m_controller->showPreview()) {
-        KIO::PreviewJob* job = KIO::filePreview(items, 128);
-        connect(job, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
-                this, SLOT(showPreview(const KFileItem*, const QPixmap&)));
+
+        // Must turn QList<KFileItem *> to QList<KFileItem>...
+        QList<KFileItem> itemsToPreview;
+        foreach( KFileItem* it, items )
+            itemsToPreview.append( *it );
+
+        KIO::PreviewJob* job = KIO::filePreview(itemsToPreview, 128);
+        connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)),
+                this, SLOT(showPreview(const KFileItem&, const QPixmap&)));
     }
 }
 
-void DolphinView::showPreview(const KFileItem* item, const QPixmap& pixmap)
+void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap)
 {
-    Q_ASSERT(item != 0);
-    const QModelIndex idx = m_dirModel->indexForItem(*item);
+    Q_ASSERT(!item.isNull());
+    if (item.url().directory() != m_dirLister->url().path()) {
+        // the preview job is still working on items of an older URL, hence
+        // the item is not part of the directory model anymore
+        return;
+    }
+
+    const QModelIndex idx = m_dirModel->indexForItem(item);
     if (idx.isValid() && (idx.column() == 0)) {
         const QMimeData* mimeData = QApplication::clipboard()->mimeData();
-        if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(*item)) {
+        if (KonqMimeData::decodeIsCutSelection(mimeData) && isCutItem(item)) {
             KIconEffect iconEffect;
             const QPixmap cutPixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
             m_dirModel->setData(idx, QIcon(cutPixmap), Qt::DecorationRole);
@@ -866,9 +910,9 @@ void DolphinView::startDirLister(const KUrl& url, bool reload)
     // the directory loading progress information has the lowest priority.
     const QString progressText(m_statusBar->progressText());
     m_showProgress = progressText.isEmpty() ||
-                     (progressText == i18n("Loading directory..."));
+                     (progressText == i18n("Loading folder..."));
     if (m_showProgress) {
-        m_statusBar->setProgressText(i18n("Loading directory..."));
+        m_statusBar->setProgressText(i18n("Loading folder..."));
         m_statusBar->setProgress(0);
     }
 
@@ -877,7 +921,9 @@ void DolphinView::startDirLister(const KUrl& url, bool reload)
     m_dirLister->stop();
 
     bool openDir = true;
-    bool keepOldDirs = isColumnViewActive();
+    bool keepOldDirs = isColumnViewActive() && !m_initializeColumnView;
+    m_initializeColumnView = false;
+
     if (keepOldDirs) {
         if (reload) {
             keepOldDirs = false;
@@ -1119,10 +1165,23 @@ void DolphinView::emitContentsMoved()
 void DolphinView::updateActivationState()
 {
     m_urlNavigator->setActive(isActive());
+
+    QColor color = KGlobalSettings::baseColor();
     if (isActive()) {
         emit urlChanged(url());
         emit selectionChanged(selectedItems());
+    } else {
+        // darken the background if the view is inactive
+        // TODO: does not work for a black background
+        color = color.darker(105);
     }
+
+    QWidget* viewport = itemView()->viewport();
+    QPalette palette;
+    palette.setColor(viewport->backgroundRole(), color);
+    viewport->setPalette(palette);
+
+    update();
 }
 
 void DolphinView::updateCutItems()
@@ -1144,6 +1203,25 @@ void DolphinView::updateCutItems()
     applyCutItemEffect();
 }
 
+void DolphinView::showHoverInformation(const QModelIndex& index)
+{
+    if (hasSelection()) {
+        return;
+    }
+
+    const KFileItem* item = fileItem(index);
+    if (item != 0) {
+        m_statusBar->setMessage(item->getStatusBarInfo(), DolphinStatusBar::Default);
+        emit requestItemInfo(item->url());
+    }
+}
+
+void DolphinView::clearHoverInformation()
+{
+    m_statusBar->clear();
+}
+
+
 void DolphinView::createView()
 {
     // delete current view