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);
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);
m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
updateColumnsBackground(true);
-
}
DolphinColumnViewContainer::~DolphinColumnViewContainer()
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();
column->setGeometry(QRect(-1, -1, 1, 1));
column->show();
layoutColumns();
- updateScrollBar();
}
}
{
QScrollArea::resizeEvent(event);
layoutColumns();
- updateScrollBar();
assureVisibleActiveColumn();
}
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)));
}
}
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);
m_index = index;
m_columns[m_index]->setActive(true);
- assureVisibleActiveColumn();
m_activeUrlTimer->start(); // calls slot updateActiveUrl()
}
+
+ assureVisibleActiveColumn();
}
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) {
m_dragSource->deleteLater();
m_dragSource = 0;
}
- column->hide();
- column->setParent(0);
- column->disconnect();
-
m_dragSource = column;
} else {
- column->deleteLater();
+ delete column;
+ column = 0;
}
}