]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/folders/folderspanel.cpp
Coding style update for pointer comparison
[dolphin.git] / src / panels / folders / folderspanel.cpp
index 1dabefd110dd36fe9ca91ed0bedf7b0334b0b58e..ccdf13decc165cfe886498e198643dea191caa46 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2006 by Peter Penz <peter.penz@gmx.at>                  *
+ *   Copyright (C) 2006-2010 by Peter Penz <peter.penz19@gmail.com>        *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
 #include "paneltreeview.h"
 #include "treeviewcontextmenu.h"
 
-#include <kfileplacesmodel.h>
-#include <kdirlister.h>
-#include <kfileitem.h>
+#include <KFilePlacesModel>
+#include <KDirLister>
+#include <KFileItem>
 #include <konq_operations.h>
 
 #include <QApplication>
-#include <QItemSelection>
-#include <QTreeView>
 #include <QBoxLayout>
+#include <QItemSelection>
 #include <QModelIndex>
+#include <QPointer>
+#include <QTreeView>
 #include <QScrollBar>
 #include <QTimer>
 
@@ -69,15 +70,10 @@ FoldersPanel::~FoldersPanel()
     m_dirLister = 0; // deleted by m_dolphinModel
 }
 
-QSize FoldersPanel::sizeHint() const
-{
-    return QSize(200, 400);
-}
-
 void FoldersPanel::setShowHiddenFiles(bool show)
 {
     FoldersPanelSettings::setShowHiddenFiles(show);
-    if (m_dirLister != 0) {
+    if (m_dirLister) {
         m_dirLister->setShowingDotFiles(show);
         m_dirLister->openUrl(m_dirLister->url(), KDirLister::Reload);
     }
@@ -88,6 +84,17 @@ bool FoldersPanel::showHiddenFiles() const
     return FoldersPanelSettings::showHiddenFiles();
 }
 
+void FoldersPanel::setAutoScrolling(bool enable)
+{
+    m_treeView->setAutoHorizontalScroll(enable);
+    FoldersPanelSettings::setAutoScrolling(enable);
+}
+
+bool FoldersPanel::autoScrolling() const
+{
+    return FoldersPanelSettings::autoScrolling();
+}
+
 void FoldersPanel::rename(const KFileItem& item)
 {
     if (DolphinSettings::instance().generalSettings()->renameInline()) {
@@ -103,17 +110,20 @@ void FoldersPanel::rename(const KFileItem& item)
     }
 }
 
-void FoldersPanel::setUrl(const KUrl& url)
+bool FoldersPanel::urlChanged()
 {
-    if (!url.isValid() || (url == Panel::url())) {
-        return;
+    if (!url().isValid() || url().protocol().contains("search")) {
+        // Skip results shown by a search, as possible identical
+        // directory names are useless without parent-path information.
+        return false;
     }
 
-    Panel::setUrl(url);
-    if (m_dirLister != 0) {
+    if (m_dirLister) {
         m_setLeafVisible = true;
-        loadTree(url);
+        loadTree(url());
     }
+
+    return true;
 }
 
 void FoldersPanel::showEvent(QShowEvent* event)
@@ -123,7 +133,7 @@ void FoldersPanel::showEvent(QShowEvent* event)
         return;
     }
 
-    if (m_dirLister == 0) {
+    if (!m_dirLister) {
         // Postpone the creating of the dir lister to the first show event.
         // This assures that no performance and memory overhead is given when the TreeView is not
         // used at all (see FoldersPanel::setUrl()).
@@ -134,23 +144,25 @@ void FoldersPanel::showEvent(QShowEvent* event)
         m_dirLister->setDelayedMimeTypes(true);
         m_dirLister->setAutoErrorHandlingEnabled(false, this);
         m_dirLister->setShowingDotFiles(FoldersPanelSettings::showHiddenFiles());
+        connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotDirListerCompleted()));
 
-        Q_ASSERT(m_dolphinModel == 0);
+        Q_ASSERT(!m_dolphinModel);
         m_dolphinModel = new DolphinModel(this);
         m_dolphinModel->setDirLister(m_dirLister);
         m_dolphinModel->setDropsAllowed(DolphinModel::DropOnDirectory);
         connect(m_dolphinModel, SIGNAL(expand(const QModelIndex&)),
                 this, SLOT(expandToDir(const QModelIndex&)));
 
-        Q_ASSERT(m_proxyModel == 0);
+        Q_ASSERT(!m_proxyModel);
         m_proxyModel = new DolphinSortFilterProxyModel(this);
         m_proxyModel->setSourceModel(m_dolphinModel);
 
-        Q_ASSERT(m_treeView == 0);
+        Q_ASSERT(!m_treeView);
         m_treeView = new PanelTreeView(this);
         m_treeView->setModel(m_proxyModel);
         m_proxyModel->setSorting(DolphinView::SortByName);
         m_proxyModel->setSortOrder(Qt::AscendingOrder);
+        m_treeView->setAutoHorizontalScroll(FoldersPanelSettings::autoScrolling());
 
         new FolderExpander(m_treeView, m_proxyModel);
 
@@ -161,6 +173,11 @@ void FoldersPanel::showEvent(QShowEvent* event)
         connect(m_treeView, SIGNAL(pressed(const QModelIndex&)),
                 this, SLOT(updateMouseButtons()));
 
+        connect(m_treeView->horizontalScrollBar(), SIGNAL(sliderMoved(int)),
+                this, SLOT(slotHorizontalScrollBarMoved(int)));
+        connect(m_treeView->verticalScrollBar(), SIGNAL(valueChanged(int)),
+                this, SLOT(slotVerticalScrollBarMoved(int)));
+
         QVBoxLayout* layout = new QVBoxLayout(this);
         layout->setMargin(0);
         layout->addWidget(m_treeView);
@@ -181,8 +198,9 @@ void FoldersPanel::contextMenuEvent(QContextMenuEvent* event)
         item = m_dolphinModel->itemForIndex(dolphinModelIndex);
     }
 
-    TreeViewContextMenu contextMenu(this, item);
-    contextMenu.open();
+    QPointer<TreeViewContextMenu> contextMenu = new TreeViewContextMenu(this, item);
+    contextMenu->open();
+    delete contextMenu;
 }
 
 void FoldersPanel::keyPressEvent(QKeyEvent* event)
@@ -221,7 +239,6 @@ void FoldersPanel::expandToDir(const QModelIndex& index)
 {
     m_treeView->setExpanded(index, true);
     selectLeafDirectory();
-    m_treeView->resizeColumnToContents(DolphinModel::Name);
 }
 
 void FoldersPanel::scrollToLeaf()
@@ -238,9 +255,30 @@ void FoldersPanel::updateMouseButtons()
     m_mouseButtons = QApplication::mouseButtons();
 }
 
+void FoldersPanel::slotDirListerCompleted()
+{
+    m_treeView->resizeColumnToContents(DolphinModel::Name);
+}
+
+void FoldersPanel::slotHorizontalScrollBarMoved(int value)
+{
+    Q_UNUSED(value);
+    // Disable the auto-scrolling until the vertical scrollbar has
+    // been moved by the user.
+    m_treeView->setAutoHorizontalScroll(false);
+}
+
+void FoldersPanel::slotVerticalScrollBarMoved(int value)
+{
+    Q_UNUSED(value);
+    // Enable the auto-scrolling again (it might have been disabled by
+    // moving the horizontal scrollbar).
+    m_treeView->setAutoHorizontalScroll(FoldersPanelSettings::autoScrolling());
+}
+
 void FoldersPanel::loadTree(const KUrl& url)
 {
-    Q_ASSERT(m_dirLister != 0);
+    Q_ASSERT(m_dirLister);
     m_leafDir = url;
 
     KUrl baseUrl;
@@ -264,21 +302,19 @@ void FoldersPanel::selectLeafDirectory()
 {
     const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_leafDir);
     const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
-    if (!proxyIndex.isValid()) {
-        return;
-    }
 
-    if (m_setLeafVisible) {
-        // Invoke m_treeView->scrollTo(proxyIndex) asynchronously by
-        // scrollToLeaf(). This assures that the scrolling is done after
-        // the horizontal scrollbar gets visible (otherwise the scrollbar
-        // might hide the leaf).
-        QTimer::singleShot(100, this, SLOT(scrollToLeaf()));
-        m_setLeafVisible = false;
+    if (proxyIndex.isValid()) {
+        QItemSelectionModel* selModel = m_treeView->selectionModel();
+        selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::ClearAndSelect);
+
+        if (m_setLeafVisible) {
+            // Invoke scrollToLeaf() asynchronously. This assures that
+            // the horizontal scrollbar is shown after resizing the column
+            // (otherwise the scrollbar might hide the leaf).
+            QTimer::singleShot(0, this, SLOT(scrollToLeaf()));
+            m_setLeafVisible = false;
+        }
     }
-
-    QItemSelectionModel* selModel = m_treeView->selectionModel();
-    selModel->setCurrentIndex(proxyIndex, QItemSelectionModel::ClearAndSelect);
 }
 
 #include "folderspanel.moc"