]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincolumnviewcontainer.cpp
Allow to add menu groups like "View Mode", "Sort By"... to be added as toolbar item...
[dolphin.git] / src / dolphincolumnviewcontainer.cpp
index dd7ee1c9c4e44f9eed5edcaccf2ef2f201e7c7fb..421f195d55f73979235dfd4c28773d365e474525 100644 (file)
 
 #include "dolphincolumnviewcontainer.h"
 
+#include "dolphin_columnmodesettings.h"
+
 #include "dolphincolumnview.h"
-#include "dolphincontroller.h"
+#include "dolphinviewcontroller.h"
 #include "dolphinsortfilterproxymodel.h"
+#include "draganddrophelper.h"
 #include "settings/dolphinsettings.h"
-#include "zoomlevelinfo.h"
-
-#include "dolphin_columnmodesettings.h"
-
-#include <kfilepreviewgenerator.h>
+#include "viewmodecontroller.h"
 
 #include <QPoint>
 #include <QScrollBar>
 #include <QTimeLine>
+#include <QTimer>
 
-DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent, DolphinController* controller) :
+DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
+                                                       DolphinViewController* dolphinViewController,
+                                                       const ViewModeController* viewModeController) :
     QScrollArea(parent),
-    m_controller(controller),
+    m_dolphinViewController(dolphinViewController),
+    m_viewModeController(viewModeController),
     m_active(false),
     m_index(-1),
     m_contentX(0),
     m_columns(),
     m_emptyViewport(0),
     m_animation(0),
-    m_nameFilter()
+    m_dragSource(0),
+    m_activeUrlTimer(0)
 {
-    Q_ASSERT(controller != 0);
+    Q_ASSERT(dolphinViewController != 0);
+    Q_ASSERT(viewModeController != 0);
 
     setAcceptDrops(true);
     setFocusPolicy(Qt::NoFocus);
     setFrameShape(QFrame::NoFrame);
     setLayoutDirection(Qt::LeftToRight);
 
-    connect(this, SIGNAL(viewportEntered()),
-            controller, SLOT(emitViewportEntered()));
-    connect(controller, SIGNAL(zoomLevelChanged(int)),
-            this, SLOT(setZoomLevel(int)));
-    connect(controller, SIGNAL(activationChanged(bool)),
+    connect(viewModeController, SIGNAL(activationChanged(bool)),
             this, SLOT(updateColumnsBackground(bool)));
 
     connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
@@ -64,7 +65,13 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent, DolphinC
     m_animation = new QTimeLine(500, this);
     connect(m_animation, SIGNAL(frameChanged(int)), horizontalScrollBar(), SLOT(setValue(int)));
 
-    DolphinColumnView* column = new DolphinColumnView(viewport(), this, m_controller->url());
+    m_activeUrlTimer = new QTimer(this);
+    m_activeUrlTimer->setSingleShot(true);
+    m_activeUrlTimer->setInterval(200);
+    connect(m_activeUrlTimer, SIGNAL(timeout()),
+            this, SLOT(updateActiveUrl()));
+
+    DolphinColumnView* column = new DolphinColumnView(viewport(), this, viewModeController->url());
     m_columns.append(column);
     setActiveColumnIndex(0);
 
@@ -72,26 +79,13 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent, DolphinC
     m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
 
     updateColumnsBackground(true);
-}
 
-DolphinColumnViewContainer::~DolphinColumnViewContainer()
-{
 }
 
-void DolphinColumnViewContainer::setNameFilter(const QString& nameFilter)
-{
-    if (nameFilter != m_nameFilter) {
-        m_nameFilter = nameFilter;
-        foreach (DolphinColumnView* column, m_columns) {
-            DolphinSortFilterProxyModel* proxyModel = static_cast<DolphinSortFilterProxyModel*>(column->model());
-            proxyModel->setFilterRegExp(nameFilter);
-        }
-    }
-}
-
-QString DolphinColumnViewContainer::nameFilter() const
+DolphinColumnViewContainer::~DolphinColumnViewContainer()
 {
-    return m_nameFilter;
+    delete m_dragSource;
+    m_dragSource = 0;
 }
 
 KUrl DolphinColumnViewContainer::rootUrl() const
@@ -104,12 +98,12 @@ QAbstractItemView* DolphinColumnViewContainer::activeColumn() const
     return m_columns[m_index];
 }
 
-bool DolphinColumnViewContainer::showColumn(const KUrl& url)
+void DolphinColumnViewContainer::showColumn(const KUrl& url)
 {
     if (!rootUrl().isParentOf(url)) {
         removeAllColumns();
         m_columns[0]->setUrl(url);
-        return false;
+        return;
     }
 
     int columnIndex = 0;
@@ -118,7 +112,7 @@ bool DolphinColumnViewContainer::showColumn(const KUrl& url)
             // the column represents already the requested URL, hence activate it
             requestActivation(column);
             layoutColumns();
-            return false;
+            return;
         } else if (!column->url().isParentOf(url)) {
             // the column is no parent of the requested URL, hence
             // just delete all remaining columns
@@ -170,12 +164,6 @@ bool DolphinColumnViewContainer::showColumn(const KUrl& url)
             columnIndex++;
 
             DolphinColumnView* column = new DolphinColumnView(viewport(), this, childUrl);
-            if (!m_nameFilter.isEmpty()) {
-                DolphinSortFilterProxyModel* proxyModel = static_cast<DolphinSortFilterProxyModel*>(column->model());
-                proxyModel->setFilterRegExp(m_nameFilter);
-            }
-            column->setActive(false);
-
             m_columns.append(column);
 
             // Before invoking layoutColumns() the column must be set visible temporary.
@@ -193,16 +181,23 @@ bool DolphinColumnViewContainer::showColumn(const KUrl& url)
     m_index = columnIndex;
     m_columns[m_index]->setActive(true);
     assureVisibleActiveColumn();
-
-    return true;
 }
 
 void DolphinColumnViewContainer::mousePressEvent(QMouseEvent* event)
 {
-    m_controller->requestActivation();
+    m_dolphinViewController->requestActivation();
     QScrollArea::mousePressEvent(event);
 }
 
+void DolphinColumnViewContainer::keyPressEvent(QKeyEvent* event)
+{
+    if (event->key() == Qt::Key_Left) {
+        setActiveColumnIndex(m_index - 1);
+    } else {
+        QScrollArea::keyPressEvent(event);
+    }
+}
+
 void DolphinColumnViewContainer::resizeEvent(QResizeEvent* event)
 {
     QScrollArea::resizeEvent(event);
@@ -221,19 +216,6 @@ void DolphinColumnViewContainer::wheelEvent(QWheelEvent* event)
     }
 }
 
-void DolphinColumnViewContainer::setZoomLevel(int level)
-{
-    const int size = ZoomLevelInfo::iconSizeForZoomLevel(level);
-    ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
-
-    const bool showPreview = m_controller->dolphinView()->showPreview();
-    if (showPreview) {
-        settings->setPreviewSize(size);
-    } else {
-        settings->setIconSize(size);
-    }
-}
-
 void DolphinColumnViewContainer::moveContentHorizontally(int x)
 {
     m_contentX = isRightToLeft() ? +x : -x;
@@ -262,9 +244,15 @@ void DolphinColumnViewContainer::updateColumnsBackground(bool active)
     }
 }
 
+void DolphinColumnViewContainer::updateActiveUrl()
+{
+    const KUrl activeUrl = m_columns[m_index]->url();
+    m_dolphinViewController->requestUrlChange(activeUrl);
+}
+
 void DolphinColumnViewContainer::setActiveColumnIndex(int index)
 {
-    if (m_index == index) {
+    if ((m_index == index) || (index < 0) || (index >= m_columns.count())) {
         return;
     }
 
@@ -277,6 +265,7 @@ void DolphinColumnViewContainer::setActiveColumnIndex(int index)
     m_columns[m_index]->setActive(true);
 
     assureVisibleActiveColumn();
+    m_activeUrlTimer->start(); // calls slot updateActiveUrl()
 }
 
 void DolphinColumnViewContainer::layoutColumns()
@@ -353,7 +342,7 @@ void DolphinColumnViewContainer::assureVisibleActiveColumn()
 
 void DolphinColumnViewContainer::requestActivation(DolphinColumnView* column)
 {
-    m_controller->setItemView(column);
+    m_dolphinViewController->setItemView(column);
     if (column->isActive()) {
         assureVisibleActiveColumn();
     } else {
@@ -389,20 +378,38 @@ QPoint DolphinColumnViewContainer::columnPosition(DolphinColumnView* column, con
 
 void DolphinColumnViewContainer::deleteColumn(DolphinColumnView* column)
 {
-    if (column != 0) {
-        if (m_controller->itemView() == column) {
-            m_controller->setItemView(0);
+    if (column == 0) {
+        return;
+    }
+
+    if (m_dolphinViewController->itemView() == column) {
+        m_dolphinViewController->setItemView(0);
+    }
+    // deleteWhenNotDragSource(column) does not necessarily delete column,
+    // and we want its preview generator destroyed immediately.
+    column->hide();
+    // Prevent automatic destruction of column when this DolphinColumnViewContainer
+    // is destroyed.
+    column->setParent(0);
+    column->disconnect();
+
+    if (DragAndDropHelper::instance().isDragSource(column)) {
+        // The column is a drag source (the feature "Open folders
+        // during drag operations" is used). Deleting the view
+        // during an ongoing drag operation is not allowed, so
+        // this will postponed.
+        if (m_dragSource != 0) {
+            // the old stored view is obviously not the drag source anymore
+            m_dragSource->deleteLater();
+            m_dragSource = 0;
         }
-        // deleteWhenNotDragSource(column) does not necessarily delete column,
-        // and we want its preview generator destroyed immediately.
-        column->m_previewGenerator->deleteLater();
-        column->m_previewGenerator = 0;
         column->hide();
-        // Prevent automatic destruction of column when this DolphinColumnViewContainer
-        // is destroyed.
         column->setParent(0);
         column->disconnect();
-        emit requestColumnDeletion(column);
+
+        m_dragSource = column;
+    } else {
+        column->deleteLater();
     }
 }