return m_selectionMode;
}
+bool KItemListController::isSearchAsYouTypeActive() const
+{
+ return m_keyboardManager->isSearchAsYouTypeActive();
+}
+
bool KItemListController::keyPressEvent(QKeyEvent *event)
{
int index = m_selectionManager->currentItem();
int key = event->key();
+ const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
// Handle the expanding/collapsing of items
- if (m_view->supportsItemExpanding() && m_model->isExpandable(index)) {
- if (key == Qt::Key_Right) {
- if (m_model->setExpanded(index, true)) {
- return true;
+ // expand / collapse all selected directories
+ if (m_view->supportsItemExpanding() && m_model->isExpandable(index) && (key == Qt::Key_Right || key == Qt::Key_Left)) {
+ const bool expandOrCollapse = key == Qt::Key_Right ? true : false;
+ bool shouldReturn = m_model->setExpanded(index, expandOrCollapse);
+
+ // edit in reverse to preserve index of the first handled items
+ const auto selectedItems = m_selectionManager->selectedItems();
+ for (auto it = selectedItems.rbegin(); it != selectedItems.rend(); ++it) {
+ shouldReturn |= m_model->setExpanded(*it, expandOrCollapse);
+ if (!shiftPressed) {
+ m_selectionManager->setSelected(*it);
}
- } else if (key == Qt::Key_Left) {
- if (m_model->setExpanded(index, false)) {
- return true;
+ }
+ if (shouldReturn) {
+ // update keyboard anchors
+ if (shiftPressed) {
+ m_keyboardAnchorIndex = selectedItems.count() > 0 ? qMin(index, selectedItems.last()) : index;
+ m_keyboardAnchorPos = keyboardAnchorPos(m_keyboardAnchorIndex);
}
+
+ event->ignore();
+ return true;
}
}
- const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
const bool controlPressed = event->modifiers() & Qt::ControlModifier;
const bool shiftOrControlPressed = shiftPressed || controlPressed;
const bool navigationPressed = key == Qt::Key_Home || key == Qt::Key_End || key == Qt::Key_PageUp || key == Qt::Key_PageDown || key == Qt::Key_Up
case Qt::Key_Up:
updateKeyboardAnchor();
+ if (shiftPressed && !m_selectionManager->isAnchoredSelectionActive() && m_selectionManager->isSelected(index)) {
+ m_selectionManager->beginAnchoredSelection(index);
+ }
index = previousRowIndex(index);
break;
case Qt::Key_Down:
updateKeyboardAnchor();
+ if (shiftPressed && !m_selectionManager->isAnchoredSelectionActive() && m_selectionManager->isSelected(index)) {
+ m_selectionManager->beginAnchoredSelection(index);
+ }
index = nextRowIndex(index);
break;
m_selectionManager->setSelected(index, 1, KItemListSelectionManager::Toggle);
m_selectionManager->beginAnchoredSelection(index);
break;
- } else if (m_keyboardManager->addKeyBeginsNewSearch()) { // File names shouldn't start with a space,
- // so we can use this press as a keyboard shortcut instead.
- Q_EMIT selectionModeChangeRequested(!m_selectionMode);
- break;
+ } else {
+ // Select the current item if it is not selected yet.
+ const int current = m_selectionManager->currentItem();
+ if (!m_selectionManager->isSelected(current)) {
+ m_selectionManager->setSelected(current);
+ break;
+ }
}
}
Q_FALLTHROUGH(); // fall through to the default case and add the Space to the current search string.
*
* See Bug 293200 and 305783
*/
- if (m_model->supportsDropping(index) && m_view->isUnderMouse()) {
+ if (m_view->isUnderMouse()) {
if (m_view->supportsItemExpanding() && m_model->isExpandable(index)) {
const bool expanded = m_model->isExpanded(index);
m_model->setExpanded(index, !expanded);
const QPointF pos = transform.map(event->pos());
KItemListWidget *newHoveredWidget = widgetForDropPos(pos);
+ int index = -1;
if (oldHoveredWidget != newHoveredWidget) {
m_autoActivationTimer->stop();
droppingBetweenItems = (m_view->showDropIndicator(pos) >= 0);
}
- const int index = newHoveredWidget->index();
+ index = newHoveredWidget->index();
if (m_model->isDir(index)) {
hoveredDir = m_model->url(index);
}
if (!droppingBetweenItems) {
- if (m_model->supportsDropping(index)) {
- // Something has been dragged on an item.
- m_view->hideDropIndicator();
- if (!newHoveredWidget->isHovered()) {
- newHoveredWidget->setHovered(true);
- Q_EMIT itemHovered(index);
- }
+ // Something has been dragged on an item.
+ m_view->hideDropIndicator();
+ if (!newHoveredWidget->isHovered()) {
+ newHoveredWidget->setHovered(true);
+ Q_EMIT itemHovered(index);
+ }
- if (!m_autoActivationTimer->isActive() && m_autoActivationTimer->interval() >= 0) {
- m_autoActivationTimer->setProperty("index", index);
- m_autoActivationTimer->start();
- }
+ if (!m_autoActivationTimer->isActive() && m_autoActivationTimer->interval() >= 0) {
+ m_autoActivationTimer->setProperty("index", index);
+ m_autoActivationTimer->start();
}
} else {
m_autoActivationTimer->stop();
event->setDropAction(Qt::IgnoreAction);
event->ignore();
} else {
- event->setDropAction(event->proposedAction());
- event->accept();
+ if (m_model->supportsDropping(index)) {
+ event->setDropAction(event->proposedAction());
+ event->accept();
+ } else {
+ event->setDropAction(Qt::IgnoreAction);
+ event->ignore();
+ }
}
return false;
}
m_scrollerIsScrolling = false;
}
}
+
+#include "moc_kitemlistcontroller.cpp"