]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/dolphincolumnviewcontainer.cpp
The &-shortcut from another action is not set until the action has been shown at...
[dolphin.git] / src / views / dolphincolumnviewcontainer.cpp
index 344d38d8a343b186bbe2aebf7e1ba73781fd6140..7346532a16f4274e380ccdd0e4a0093eb0080005 100644 (file)
@@ -46,7 +46,8 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
     m_emptyViewport(0),
     m_animation(0),
     m_dragSource(0),
-    m_activeUrlTimer(0)
+    m_activeUrlTimer(0),
+    m_assureVisibleActiveColumnTimer(0)
 {
     Q_ASSERT(dolphinViewController != 0);
     Q_ASSERT(viewModeController != 0);
@@ -71,6 +72,15 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
     connect(m_activeUrlTimer, SIGNAL(timeout()),
             this, SLOT(updateActiveUrl()));
 
+    // Assuring that the active column gets fully visible is done with a small delay. This
+    // prevents that for temporary activations an animation gets started (e. g. when clicking
+    // on any folder of the parent column, the child column gets activated).
+    m_assureVisibleActiveColumnTimer = new QTimer(this);
+    m_assureVisibleActiveColumnTimer->setSingleShot(true);
+    m_assureVisibleActiveColumnTimer->setInterval(200);
+    connect(m_assureVisibleActiveColumnTimer, SIGNAL(timeout()),
+            this, SLOT(slotAssureVisibleActiveColumn()));
+
     DolphinColumnView* column = new DolphinColumnView(viewport(), this, viewModeController->url());
     m_columns.append(column);
     requestActivation(column);
@@ -79,7 +89,6 @@ DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
     m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
 
     updateColumnsBackground(true);
-
 }
 
 DolphinColumnViewContainer::~DolphinColumnViewContainer()
@@ -108,7 +117,7 @@ void DolphinColumnViewContainer::showColumn(const KUrl& url)
 
     int columnIndex = 0;
     foreach (DolphinColumnView* column, m_columns) {
-        if (column->url() == url) {
+        if (column->url().equals(url, KUrl::CompareWithoutTrailingSlash)) {
             // the column represents already the requested URL, hence activate it
             requestActivation(column);
             layoutColumns();
@@ -171,7 +180,6 @@ void DolphinColumnViewContainer::showColumn(const KUrl& url)
             column->setGeometry(QRect(-1, -1, 1, 1));
             column->show();
             layoutColumns();
-            updateScrollBar();
         }
     }
 
@@ -199,7 +207,6 @@ void DolphinColumnViewContainer::resizeEvent(QResizeEvent* event)
 {
     QScrollArea::resizeEvent(event);
     layoutColumns();
-    updateScrollBar();
     assureVisibleActiveColumn();
 }
 
@@ -247,75 +254,92 @@ void DolphinColumnViewContainer::updateActiveUrl()
     m_dolphinViewController->requestUrlChange(activeUrl);
 }
 
-void DolphinColumnViewContainer::layoutColumns()
+void DolphinColumnViewContainer::slotAssureVisibleActiveColumn()
 {
-    const int gap = 4;
+    const int viewportWidth = viewport()->width();
+    const int x = activeColumn()->x();
 
-    ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
-    const int columnWidth = settings->columnWidth();
+    // When a column that is partly visible on the left side gets activated,
+    // it is useful to also assure that the previous column is partly visible.
+    // This allows the user to scroll to the first column without using the
+    // scrollbar and drag & drop operations to invisible columns.
+    const int previousColumnGap = 3 * style()->pixelMetric(QStyle::PM_ScrollBarExtent, 0, verticalScrollBar());
 
+    const int width = activeColumn()->maximumWidth();
+    if (x + width > viewportWidth) {
+        const int newContentX = m_contentX - x - width + viewportWidth;
+        if (isRightToLeft()) {
+            m_animation->setFrameRange(m_contentX, newContentX + previousColumnGap);
+        } else {
+            m_animation->setFrameRange(-m_contentX, -newContentX);
+        }
+        if (m_animation->state() != QTimeLine::Running) {
+           m_animation->start();
+        }
+    } else if (x < 0) {
+        const int newContentX = m_contentX - x;
+        if (isRightToLeft()) {
+            m_animation->setFrameRange(m_contentX, newContentX);
+        } else {
+            m_animation->setFrameRange(-m_contentX, -newContentX - previousColumnGap);
+        }
+        if (m_animation->state() != QTimeLine::Running) {
+           m_animation->start();
+        }
+    }
+}
+
+void DolphinColumnViewContainer::assureVisibleActiveColumn()
+{
+    m_assureVisibleActiveColumnTimer->start();
+}
+
+void DolphinColumnViewContainer::layoutColumns()
+{
+    // Layout the position of the columns corresponding to their maximum width
     QRect emptyViewportRect;
     if (isRightToLeft()) {
+        int columnWidth = m_columns[0]->maximumWidth();
         int x = viewport()->width() - columnWidth + m_contentX;
         foreach (DolphinColumnView* column, m_columns) {
-            column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height()));
+            columnWidth = column->maximumWidth();
+            column->setGeometry(QRect(x, 0, columnWidth, viewport()->height()));
             x -= columnWidth;
         }
-        emptyViewportRect = QRect(0, 0, x + columnWidth - gap, viewport()->height());
+        emptyViewportRect = QRect(0, 0, x + columnWidth, viewport()->height());
     } else {
         int x = m_contentX;
         foreach (DolphinColumnView* column, m_columns) {
-            column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height()));
+            const int columnWidth = column->maximumWidth();
+            column->setGeometry(QRect(x, 0, columnWidth, viewport()->height()));
             x += columnWidth;
         }
-        emptyViewportRect = QRect(x, 0, viewport()->width() - x - gap, viewport()->height());
+        emptyViewportRect = QRect(x, 0, viewport()->width() - x, viewport()->height());
     }
 
+    // Show an empty viewport if the columns don't cover the whole viewport
     if (emptyViewportRect.isValid()) {
         m_emptyViewport->show();
         m_emptyViewport->setGeometry(emptyViewportRect);
     } else {
         m_emptyViewport->hide();
     }
-}
-
-void DolphinColumnViewContainer::updateScrollBar()
-{
-    ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
-    const int contentWidth = m_columns.count() * settings->columnWidth();
 
-    horizontalScrollBar()->setPageStep(contentWidth);
-    horizontalScrollBar()->setRange(0, contentWidth - viewport()->width());
-}
+    // Update the horizontal position indicator
+    int contentWidth = 0;
+    foreach (DolphinColumnView* column, m_columns) {
+        contentWidth += column->maximumWidth();
+    }
 
-void DolphinColumnViewContainer::assureVisibleActiveColumn()
-{
-    const int viewportWidth = viewport()->width();
-    const int x = activeColumn()->x();
+    if (horizontalScrollBar()->pageStep() != contentWidth) {
+        disconnect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
+                this, SLOT(moveContentHorizontally(int)));
 
-    ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
-    const int width = settings->columnWidth();
+        horizontalScrollBar()->setPageStep(contentWidth);
+        horizontalScrollBar()->setRange(0, contentWidth - viewport()->width());
 
-    if (x + width > viewportWidth) {
-        const int newContentX = m_contentX - x - width + viewportWidth;
-        if (isRightToLeft()) {
-            m_animation->setFrameRange(m_contentX, newContentX);
-        } else {
-            m_animation->setFrameRange(-m_contentX, -newContentX);
-        }
-        if (m_animation->state() != QTimeLine::Running) {
-           m_animation->start();
-        }
-    } else if (x < 0) {
-        const int newContentX = m_contentX - x;
-        if (isRightToLeft()) {
-            m_animation->setFrameRange(m_contentX, newContentX);
-        } else {
-            m_animation->setFrameRange(-m_contentX, -newContentX);
-        }
-        if (m_animation->state() != QTimeLine::Running) {
-           m_animation->start();
-        }
+        connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
+                this, SLOT(moveContentHorizontally(int)));
     }
 }
 
@@ -328,9 +352,7 @@ void DolphinColumnViewContainer::requestActivation(DolphinColumnView* column)
         setFocusProxy(column);
     }
     
-    if (column->isActive()) {
-        assureVisibleActiveColumn();
-    } else {
+    if (!column->isActive()) {
         // Deactivate the currently active column
         if (m_index >= 0) {
             m_columns[m_index]->setActive(false);
@@ -352,9 +374,10 @@ void DolphinColumnViewContainer::requestActivation(DolphinColumnView* column)
         m_index = index;
         m_columns[m_index]->setActive(true);
 
-        assureVisibleActiveColumn();
         m_activeUrlTimer->start(); // calls slot updateActiveUrl()
     }
+
+    assureVisibleActiveColumn();
 }
 
 void DolphinColumnViewContainer::removeAllColumns()
@@ -370,12 +393,6 @@ void DolphinColumnViewContainer::removeAllColumns()
     assureVisibleActiveColumn();
 }
 
-QPoint DolphinColumnViewContainer::columnPosition(DolphinColumnView* column, const QPoint& point) const
-{
-    const QPoint topLeft = column->frameGeometry().topLeft();
-    return QPoint(point.x() - topLeft.x(), point.y() - topLeft.y());
-}
-
 void DolphinColumnViewContainer::deleteColumn(DolphinColumnView* column)
 {
     if (column == 0) {
@@ -403,13 +420,10 @@ void DolphinColumnViewContainer::deleteColumn(DolphinColumnView* column)
             m_dragSource->deleteLater();
             m_dragSource = 0;
         }
-        column->hide();
-        column->setParent(0);
-        column->disconnect();
-
         m_dragSource = column;
     } else {
-        column->deleteLater();
+        delete column;
+        column = 0;
     }
 }