]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
As requested by Peter: upgrade version to 1.0
[dolphin.git] / src / dolphinview.cpp
index 51e2a0a575ae6e2e8e3ef48c1c83531abb1b1935..7418997d94dc16fcbc025c736eda5dd9920c38b3 100644 (file)
@@ -29,7 +29,6 @@
 #include <QBoxLayout>
 #include <QTimer>
 #include <QScrollBar>
-#include <QClipboard>
 
 #include <kcolorscheme.h>
 #include <kdirlister.h>
 #include <kio/deletejob.h>
 #include <kio/netaccess.h>
 #include <kio/previewjob.h>
+#include <kjob.h>
+#include <kmenu.h>
 #include <kmimetyperesolver.h>
 #include <konqmimedata.h>
 #include <konq_operations.h>
 #include <kurl.h>
 
+#include "dolphindropcontroller.h"
 #include "dolphinmodel.h"
 #include "dolphincolumnview.h"
 #include "dolphincontroller.h"
@@ -72,9 +74,11 @@ DolphinView::DolphinView(QWidget* parent,
     m_detailsView(0),
     m_columnView(0),
     m_fileItemDelegate(0),
+    m_selectionModel(0),
     m_dolphinModel(dolphinModel),
     m_dirLister(dirLister),
-    m_proxyModel(proxyModel)
+    m_proxyModel(proxyModel),
+    m_previewJob(0)
 {
     setFocusPolicy(Qt::StrongFocus);
     m_topLayout = new QVBoxLayout(this);
@@ -127,6 +131,10 @@ DolphinView::DolphinView(QWidget* parent,
 
 DolphinView::~DolphinView()
 {
+    if (m_previewJob != 0) {
+        m_previewJob->kill();
+        m_previewJob = 0;
+    }
 }
 
 const KUrl& DolphinView::url() const
@@ -146,6 +154,7 @@ void DolphinView::setActive(bool active)
     }
 
     m_active = active;
+    m_selectionModel->clearSelection();
 
     QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
     if (active) {
@@ -203,7 +212,6 @@ void DolphinView::setMode(Mode mode)
     const KUrl viewPropsUrl = viewPropertiesUrl();
     ViewProperties props(viewPropsUrl);
     props.setViewMode(m_mode);
-
     createView();
 
     // the file item delegate has been recreated, apply the current
@@ -222,8 +230,6 @@ void DolphinView::setMode(Mode mode)
         emit categorizedSortingChanged();
     }
 
-    loadDirectory(viewPropsUrl);
-
     emit modeChanged();
 }
 
@@ -314,7 +320,13 @@ bool DolphinView::supportsCategorizedSorting() const
 
 void DolphinView::selectAll()
 {
-    itemView()->selectAll();
+    QAbstractItemView* view = itemView();
+    // TODO: there seems to be a bug in QAbstractItemView::selectAll(); if
+    // the Ctrl-key is pressed (e. g. for Ctrl+A), selectAll() inverts the
+    // selection instead of selecting all items. This is bypassed for KDE 4.0
+    // by invoking clearSelection() first.
+    view->clearSelection();
+    view->selectAll();
 }
 
 void DolphinView::invertSelection()
@@ -569,17 +581,25 @@ void DolphinView::triggerItem(const KFileItem& item)
 void DolphinView::generatePreviews(const KFileItemList& items)
 {
     if (m_controller->dolphinView()->showPreview()) {
-        KIO::PreviewJob* job = KIO::filePreview(items, 128);
-        connect(job, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)),
-                this, SLOT(showPreview(const KFileItem&, const QPixmap&)));
+        if (m_previewJob != 0) {
+            m_previewJob->kill();
+            m_previewJob = 0;
+        }
+
+        m_previewJob = KIO::filePreview(items, 128);
+        connect(m_previewJob, SIGNAL(gotPreview(const KFileItem&, const QPixmap&)),
+                this, SLOT(replaceIcon(const KFileItem&, const QPixmap&)));
+        connect(m_previewJob, SIGNAL(finished(KJob*)),
+                this, SLOT(slotPreviewJobFinished(KJob*)));
     }
 }
 
-void DolphinView::showPreview(const KFileItem& item, const QPixmap& pixmap)
+void DolphinView::replaceIcon(const KFileItem& item, const QPixmap& pixmap)
 {
     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
+    if (!m_showPreview || (item.url().directory() != m_dirLister->url().path())) {
+        // the preview has been deactivated in the meanwhile or the preview
+        // job is still working on items of an older URL, hence
         // the item is not part of the directory model anymore
         return;
     }
@@ -738,6 +758,7 @@ void DolphinView::dropUrls(const KUrl::List& urls,
                            const KUrl& destPath,
                            const KFileItem& destItem)
 {
+    Q_ASSERT(!urls.isEmpty());
     const KUrl& destination = !destItem.isNull() && destItem.isDir() ?
                               destItem.url() : destPath;
     const KUrl sourceDir = KUrl(urls.first().directory());
@@ -749,7 +770,11 @@ void DolphinView::dropUrls(const KUrl::List& urls,
 void DolphinView::dropUrls(const KUrl::List& urls,
                            const KUrl& destination)
 {
-    emit urlsDropped(urls, destination);
+    DolphinDropController dropController(this);
+    // forward doingOperation signal up to the mainwindow
+    connect(&dropController, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)),
+            this, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)));
+    dropController.dropUrls(urls, destination);
 }
 
 void DolphinView::updateSorting(DolphinView::Sorting sorting)
@@ -818,7 +843,7 @@ void DolphinView::updateCutItems()
 
 void DolphinView::showHoverInformation(const KFileItem& item)
 {
-    if (hasSelection()) {
+    if (hasSelection() || !m_active) {
         return;
     }
 
@@ -827,7 +852,9 @@ void DolphinView::showHoverInformation(const KFileItem& item)
 
 void DolphinView::clearHoverInformation()
 {
-    emit requestItemInfo(KFileItem());
+    if (m_active) {
+        emit requestItemInfo(KFileItem());
+    }
 }
 
 
@@ -863,6 +890,16 @@ void DolphinView::createView()
     view->setItemDelegate(m_fileItemDelegate);
 
     view->setModel(m_proxyModel);
+    if (m_selectionModel != 0) {
+        view->setSelectionModel(m_selectionModel);
+    } else {
+        m_selectionModel = view->selectionModel();
+    }
+
+    // reparent the selection model, as it should not be deleted
+    // when deleting the model
+    m_selectionModel->setParent(this);
+
     view->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
     new KMimeTypeResolver(view, m_dolphinModel);
@@ -961,7 +998,7 @@ KToggleAction* DolphinView::iconsModeAction(KActionCollection* actionCollection)
     KToggleAction* iconsView = actionCollection->add<KToggleAction>("icons");
     iconsView->setText(i18nc("@action:inmenu View Mode", "Icons"));
     iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
-    iconsView->setIcon(KIcon("fileview-icon"));
+    iconsView->setIcon(KIcon("view-list-icons"));
     iconsView->setData(QVariant::fromValue(IconsView));
     return iconsView;
 }
@@ -971,7 +1008,7 @@ KToggleAction* DolphinView::detailsModeAction(KActionCollection* actionCollectio
     KToggleAction* detailsView = actionCollection->add<KToggleAction>("details");
     detailsView->setText(i18nc("@action:inmenu View Mode", "Details"));
     detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
-    detailsView->setIcon(KIcon("fileview-detailed"));
+    detailsView->setIcon(KIcon("view-list-details"));
     detailsView->setData(QVariant::fromValue(DetailsView));
     return detailsView;
 }
@@ -981,7 +1018,7 @@ KToggleAction* DolphinView::columnsModeAction(KActionCollection* actionCollectio
     KToggleAction* columnView = actionCollection->add<KToggleAction>("columns");
     columnView->setText(i18nc("@action:inmenu View Mode", "Columns"));
     columnView->setShortcut(Qt::CTRL | Qt::Key_3);
-    columnView->setIcon(KIcon("fileview-column"));
+    columnView->setIcon(KIcon("view-file-columns"));
     columnView->setData(QVariant::fromValue(ColumnView));
     return columnView;
 }
@@ -1098,6 +1135,12 @@ void DolphinView::slotDeleteFileFinished(KJob* job)
     }
 }
 
+void DolphinView::slotPreviewJobFinished(KJob* job)
+{
+    Q_ASSERT(job == m_previewJob);
+    m_previewJob = 0;
+}
+
 void DolphinView::cutSelectedItems()
 {
     QMimeData* mimeData = new QMimeData();
@@ -1166,8 +1209,8 @@ QPair<bool, QString> DolphinView::pasteInfo() const
     }
 
     if (ret.first) {
-        const KUrl::List urls = selectedUrls();
-        const uint count = urls.count();
+        const KFileItemList items = selectedItems();
+        const uint count = items.count();
         if (count > 1) {
             // pasting should not be allowed when more than one file
             // is selected
@@ -1175,13 +1218,7 @@ QPair<bool, QString> DolphinView::pasteInfo() const
         } else if (count == 1) {
             // Only one file is selected. Pasting is only allowed if this
             // file is a directory.
-            // TODO: this doesn't work with remote protocols; instead we need a
-            // m_activeViewContainer->selectedFileItems() to get the real KFileItems
-            const KFileItem fileItem(S_IFDIR,
-                                     KFileItem::Unknown,
-                                     urls.first(),
-                                     true);
-            ret.first = fileItem.isDir();
+            ret.first = items.first().isDir();
         }
     }
     return ret;