DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controller) :
KCategorizedView(parent),
- m_enableScrollTo(false),
m_controller(controller),
m_selectionManager(0),
m_autoScroller(0),
m_categoryDrawer = 0;
}
-void DolphinIconsView::scrollTo(const QModelIndex& index, ScrollHint hint)
-{
- // Enable the QListView implementation of scrollTo() only if it has been
- // triggered by a key press. Otherwise QAbstractItemView wants to scroll to the current
- // index each time the layout has been changed. This becomes an issue when
- // previews are loaded and the scrollbar is used: the scrollbar will always
- // be reset to 0 on each new preview.
- if (m_enableScrollTo || (state() != QAbstractItemView::NoState)) {
- KCategorizedView::scrollTo(index, hint);
- m_enableScrollTo = false;
- }
-}
-
void DolphinIconsView::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight)
{
KCategorizedView::dataChanged(topLeft, bottomRight);
KCategorizedView::dropEvent(event);
}
+QModelIndex DolphinIconsView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
+{
+ QModelIndex current = currentIndex();
+
+ QModelIndex newCurrent = QListView::moveCursor(cursorAction, modifiers);
+ if (newCurrent != current) {
+ return newCurrent;
+ }
+
+ // The cursor has not been moved by the base implementation. Provide a
+ // wrap behavior, so that the cursor will go to the next item when reaching
+ // the border.
+ const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+ if (settings->arrangement() == QListView::LeftToRight) {
+ switch (cursorAction) {
+ case MoveUp:
+ if (newCurrent.row() == 0) {
+ return newCurrent;
+ }
+ newCurrent = QListView::moveCursor(MoveLeft, modifiers);
+ selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+ newCurrent = QListView::moveCursor(MovePageDown, modifiers);
+ break;
+
+ case MoveDown:
+ if (newCurrent.row() == (model()->rowCount() - 1)) {
+ return newCurrent;
+ }
+ newCurrent = QListView::moveCursor(MovePageUp, modifiers);
+ selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Clear);
+ newCurrent = QListView::moveCursor(MoveRight, modifiers);
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (cursorAction) {
+ case MoveLeft:
+ if (newCurrent.row() == 0) {
+ return newCurrent;
+ }
+ newCurrent = QListView::moveCursor(MoveUp, modifiers);
+ do {
+ selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+ current = newCurrent;
+ newCurrent = QListView::moveCursor(MoveRight, modifiers);
+ } while (newCurrent != current);
+
+ if (!(modifiers & Qt::ControlModifier)) {
+ // Ctrl is not pressed -> selection is updated
+ if (!(modifiers & Qt::ShiftModifier)) {
+ // Shift is not pressed -> previous selection is lost
+ selectionModel()->clearSelection();
+ }
+ selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::Select);
+ }
+ break;
+
+ case MoveRight:
+ if (newCurrent.row() == (model()->rowCount() - 1)) {
+ return newCurrent;
+ }
+ do {
+ selectionModel()->setCurrentIndex(newCurrent, QItemSelectionModel::NoUpdate);
+ current = newCurrent;
+ newCurrent = QListView::moveCursor(MoveLeft, modifiers);
+ } while (newCurrent != current);
+ newCurrent = QListView::moveCursor(MoveDown, modifiers);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return newCurrent;
+}
+
void DolphinIconsView::keyPressEvent(QKeyEvent* event)
{
- m_enableScrollTo = true; // see DolphinIconsView::scrollTo()
KCategorizedView::keyPressEvent(event);
m_controller->handleKeyPressEvent(event);
}
void DolphinIconsView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
KCategorizedView::currentChanged(current, previous);
- if (current.isValid() && !m_autoScroller->isActive()) {
- scrollTo(current);
- }
+ m_autoScroller->handleCurrentIndexChange(current, previous);
}
void DolphinIconsView::resizeEvent(QResizeEvent* event)