Commit e56a363a authored by Frank Reininghaus's avatar Frank Reininghaus
Browse files

Make PageUp/PageDown work in Dolphin's new view engine

BUG: 288748
FIXED-IN: 4.8.0
REVIEW: 103721
parent dbf0bfff
/***************************************************************************
* Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
* Copyright (C) 2012 by Frank Reininghaus <frank78ac@googlemail.com> *
* *
* Based on the Itemviews NG project from Trolltech Labs: *
* http://qt.gitorious.org/qt-labs/itemviews-ng *
......@@ -239,12 +240,68 @@ bool KItemListController::keyPressEvent(QKeyEvent* event)
case Qt::Key_Up:
updateKeyboardAnchor();
index = previousRowIndex();
index = previousRowIndex(index);
break;
case Qt::Key_Down:
updateKeyboardAnchor();
index = nextRowIndex();
index = nextRowIndex(index);
break;
case Qt::Key_PageUp:
if (m_view->scrollOrientation() == Qt::Horizontal) {
// The new current index should correspond to the first item in the current column.
int newIndex = qMax(index - 1, 0);
while (newIndex != index && m_view->itemRect(newIndex).topLeft().y() < m_view->itemRect(index).topLeft().y()) {
index = newIndex;
newIndex = qMax(index - 1, 0);
}
m_keyboardAnchorIndex = index;
m_keyboardAnchorPos = keyboardAnchorPos(index);
} else {
const qreal currentItemBottom = m_view->itemRect(index).bottomLeft().y();
const qreal height = m_view->geometry().height();
// The new current item should be the first item in the current
// column whose itemRect's top coordinate is larger than targetY.
const qreal targetY = currentItemBottom - height;
updateKeyboardAnchor();
int newIndex = previousRowIndex(index);
do {
index = newIndex;
updateKeyboardAnchor();
newIndex = previousRowIndex(index);
} while (m_view->itemRect(newIndex).topLeft().y() > targetY && newIndex != index);
}
break;
case Qt::Key_PageDown:
if (m_view->scrollOrientation() == Qt::Horizontal) {
// The new current index should correspond to the last item in the current column.
int newIndex = qMin(index + 1, m_model->count() - 1);
while (newIndex != index && m_view->itemRect(newIndex).topLeft().y() > m_view->itemRect(index).topLeft().y()) {
index = newIndex;
newIndex = qMin(index + 1, m_model->count() - 1);
}
m_keyboardAnchorIndex = index;
m_keyboardAnchorPos = keyboardAnchorPos(index);
} else {
const qreal currentItemTop = m_view->itemRect(index).topLeft().y();
const qreal height = m_view->geometry().height();
// The new current item should be the last item in the current
// column whose itemRect's bottom coordinate is smaller than targetY.
const qreal targetY = currentItemTop + height;
updateKeyboardAnchor();
int newIndex = nextRowIndex(index);
do {
index = newIndex;
updateKeyboardAnchor();
newIndex = nextRowIndex(index);
} while (m_view->itemRect(newIndex).bottomLeft().y() < targetY && newIndex != index);
}
break;
case Qt::Key_Enter:
......@@ -994,24 +1051,23 @@ void KItemListController::updateKeyboardAnchor()
}
}
int KItemListController::nextRowIndex() const
int KItemListController::nextRowIndex(int index) const
{
const int currentIndex = m_selectionManager->currentItem();
if (m_keyboardAnchorIndex < 0) {
return currentIndex;
return index;
}
const int maxIndex = m_model->count() - 1;
if (currentIndex == maxIndex) {
return currentIndex;
if (index == maxIndex) {
return index;
}
// Calculate the index of the last column inside the row of the current index
int lastColumnIndex = currentIndex;
int lastColumnIndex = index;
while (keyboardAnchorPos(lastColumnIndex + 1) > keyboardAnchorPos(lastColumnIndex)) {
++lastColumnIndex;
if (lastColumnIndex >= maxIndex) {
return currentIndex;
return index;
}
}
......@@ -1032,19 +1088,18 @@ int KItemListController::nextRowIndex() const
return nextRowIndex;
}
int KItemListController::previousRowIndex() const
int KItemListController::previousRowIndex(int index) const
{
const int currentIndex = m_selectionManager->currentItem();
if (m_keyboardAnchorIndex < 0 || currentIndex == 0) {
return currentIndex;
if (m_keyboardAnchorIndex < 0 || index == 0) {
return index;
}
// Calculate the index of the first column inside the row of the current index
int firstColumnIndex = currentIndex;
int firstColumnIndex = index;
while (keyboardAnchorPos(firstColumnIndex - 1) < keyboardAnchorPos(firstColumnIndex)) {
--firstColumnIndex;
if (firstColumnIndex <= 0) {
return currentIndex;
return index;
}
}
......
......@@ -238,16 +238,16 @@ private:
void updateKeyboardAnchor();
/**
* @return Index for the next row based on the current index.
* If there is no next row the current index will be returned.
* @return Index for the next row based on \a index.
* If there is no next row \a index will be returned.
*/
int nextRowIndex() const;
int nextRowIndex(int index) const;
/**
* @return Index for the previous row based on the current index.
* If there is no previous row the current index will be returned.
* @return Index for the previous row based on \a index.
* If there is no previous row \a index will be returned.
*/
int previousRowIndex() const;
int previousRowIndex(int index) const;
/**
* Helper method for updateKeyboardAnchor(), previousRowIndex() and nextRowIndex().
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment