]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinview.cpp
Improve the performance of the code part which checks which items are visible. Althou...
[dolphin.git] / src / dolphinview.cpp
index 5a0f00beecd7b11ddc9449205f633e6701fa3b09..783131c3241e9f3db92bb0d69a1c06f6c7da8106 100644 (file)
@@ -41,6 +41,7 @@
 #include <kmenu.h>
 #include <kmessagebox.h>
 #include <kmimetyperesolver.h>
+#include <konq_fileitemcapabilities.h>
 #include <konq_operations.h>
 #include <konqmimedata.h>
 #include <ktoggleaction.h>
@@ -84,9 +85,10 @@ DolphinView::DolphinView(QWidget* parent,
     m_dirLister(dirLister),
     m_proxyModel(proxyModel),
     m_iconManager(0),
-    m_toolTipManager(0)
+    m_toolTipManager(0),
+    m_rootUrl(),
+    m_currentItemUrl()
 {
-    setFocusPolicy(Qt::StrongFocus);
     m_topLayout = new QVBoxLayout(this);
     m_topLayout->setSpacing(0);
     m_topLayout->setMargin(0);
@@ -94,14 +96,10 @@ DolphinView::DolphinView(QWidget* parent,
     m_controller = new DolphinController(this);
     m_controller->setUrl(url);
 
-    // Receiver of the DolphinView signal 'urlChanged()' don't need
-    // to care whether the internal controller changed the URL already or whether
-    // the controller just requested an URL change and will be updated later.
-    // In both cases the URL has been changed:
     connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
             this, SIGNAL(urlChanged(const KUrl&)));
     connect(m_controller, SIGNAL(requestUrlChange(const KUrl&)),
-            this, SIGNAL(urlChanged(const KUrl&)));
+            this, SLOT(slotRequestUrlChange(const KUrl&)));
 
     connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)),
             this, SLOT(openContextMenu(const QPoint&)));
@@ -124,6 +122,11 @@ DolphinView::DolphinView(QWidget* parent,
     connect(m_controller, SIGNAL(viewportEntered()),
             this, SLOT(clearHoverInformation()));
 
+    connect(m_dirLister, SIGNAL(redirection(KUrl, KUrl)),
+            this, SLOT(slotRedirection(KUrl, KUrl)));
+    connect(m_dirLister, SIGNAL(completed()),
+            this, SLOT(restoreCurrentItem()));
+
     applyViewProperties(url);
     m_topLayout->addWidget(itemView());
 }
@@ -149,7 +152,6 @@ void DolphinView::setActive(bool active)
     }
 
     m_active = active;
-    m_selectionModel->clearSelection();
 
     QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
     if (active) {
@@ -170,6 +172,7 @@ void DolphinView::setActive(bool active)
     update();
 
     if (active) {
+        itemView()->setFocus();
         emit activated();
     }
 
@@ -480,6 +483,8 @@ void DolphinView::calculateItemCount(int& fileCount, int& folderCount)
 
 void DolphinView::setUrl(const KUrl& url)
 {
+    // remember current item candidate (see restoreCurrentItem())
+    m_currentItemUrl = url;
     updateView(url, KUrl());
 }
 
@@ -749,7 +754,7 @@ void DolphinView::triggerItem(const KFileItem& item)
         return;
     }
 
-    // TODO: the m_isContextMenuOpen check is a workaround for Qt-issue xxxxxx
+    // TODO: the m_isContextMenuOpen check is a workaround for Qt-issue 207192
     if (item.isNull() || m_isContextMenuOpen) {
         return;
     }
@@ -778,7 +783,7 @@ void DolphinView::openContextMenu(const QPoint& pos)
         m_toolTipManager->hideTip();
     }
 
-    m_isContextMenuOpen = true; // TODO: workaround for Qt-issue xxxxxx
+    m_isContextMenuOpen = true; // TODO: workaround for Qt-issue 207192
     emit requestContextMenu(item, url());
     m_isContextMenuOpen = false;
 }
@@ -897,7 +902,10 @@ QPair<bool, QString> DolphinView::pasteInfo() const
 
     KUrl::List urls = KUrl::List::fromMimeData(mimeData);
     if (!urls.isEmpty()) {
-        ret.first = true;
+        // disable the paste action if no writing is supported
+        KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url());
+        ret.first = KonqFileItemCapabilities(KFileItemList() << item).supportsWriting();
+
         if (urls.count() == 1) {
             const KFileItem item(KFileItem::Unknown, KFileItem::Unknown, urls.first(), true);
             ret.second = item.isDir() ? i18nc("@action:inmenu", "Paste One Folder") :
@@ -956,6 +964,21 @@ void DolphinView::slotDeleteFileFinished(KJob* job)
     }
 }
 
+
+void DolphinView::restoreCurrentItem()
+{
+    const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_currentItemUrl);
+    if (dirIndex.isValid()) {
+        const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
+        QAbstractItemView* view = itemView();
+        const bool clearSelection = !hasSelection();
+        view->setCurrentIndex(proxyIndex);
+        if (clearSelection) {
+            view->clearSelection();
+        }
+    }
+}
+
 void DolphinView::loadDirectory(const KUrl& url, bool reload)
 {
     if (!url.isValid()) {
@@ -1102,7 +1125,6 @@ void DolphinView::createView()
 
     view->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
-    new KMimeTypeResolver(view, m_dolphinModel);
     m_iconManager = new IconManager(view, m_proxyModel);
     m_iconManager->setShowPreview(m_showPreview);
 
@@ -1182,4 +1204,17 @@ void DolphinView::pasteToUrl(const KUrl& url)
     }
 }
 
+void DolphinView::slotRequestUrlChange(const KUrl& url)
+{
+    emit requestUrlChange(url);
+    m_controller->setUrl(url);
+}
+
+void DolphinView::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl)
+{
+    if (oldUrl == m_controller->url()) {
+        m_controller->setUrl(newUrl);
+    }
+}
+
 #include "dolphinview.moc"