X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/652d08c9242ed51d86dba3b2afda9d3b2e9a9cd7..39f89141b06c:/src/views/dolphincolumnviewcontainer.cpp diff --git a/src/views/dolphincolumnviewcontainer.cpp b/src/views/dolphincolumnviewcontainer.cpp index 344d38d8a..7346532a1 100644 --- a/src/views/dolphincolumnviewcontainer.cpp +++ b/src/views/dolphincolumnviewcontainer.cpp @@ -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; } }