┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistcontroller.cpp
diff options
context:
space:
mode:
authorEugene Popov <[email protected]>2024-03-27 10:28:15 +0000
committerMéven Car <[email protected]>2024-03-27 10:28:15 +0000
commit240d33ce17fc531e8bc6638af8f71454fe7c05e6 (patch)
tree11eea661f23034830e9358df1ced907b95b9f0a7 /src/kitemviews/kitemlistcontroller.cpp
parent7a7cab61b6fd8d058ca47887f90fa5cd12a3ccca (diff)
Better support for RTL
This MR fixes some issues related to RTL scripts: - wrong layout in Compact View mode - broken horizontal scrolling in Icon View and Details View modes - broken navigation with left and right arrow keys in Details View mode BUG: 484012 BUG: 449493
Diffstat (limited to 'src/kitemviews/kitemlistcontroller.cpp')
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp62
1 files changed, 39 insertions, 23 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index 3c1b088be..71c37a7af 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -241,6 +241,8 @@ bool KItemListController::keyPressEvent(QKeyEvent *event)
int key = event->key();
const bool shiftPressed = event->modifiers() & Qt::ShiftModifier;
+ const bool horizontalScrolling = m_view->scrollOrientation() == Qt::Horizontal;
+
// Handle the expanding/collapsing of items
// expand / collapse all selected directories
if (m_view->supportsItemExpanding() && m_model->isExpandable(index) && (key == Qt::Key_Right || key == Qt::Key_Left)) {
@@ -276,7 +278,7 @@ bool KItemListController::keyPressEvent(QKeyEvent *event)
// For horizontal scroll orientation, transform
// the arrow keys to simplify the event handling.
- if (m_view->scrollOrientation() == Qt::Horizontal) {
+ if (horizontalScrolling) {
switch (key) {
case Qt::Key_Up:
key = Qt::Key_Left;
@@ -295,17 +297,31 @@ bool KItemListController::keyPressEvent(QKeyEvent *event)
}
}
- // For right to left languages, exchange right and left arrow keys.
if (m_view->layoutDirection() == Qt::RightToLeft) {
- switch (key) {
- case Qt::Key_Left:
- key = Qt::Key_Right;
- break;
- case Qt::Key_Right:
- key = Qt::Key_Left;
- break;
- default:
- break;
+ if (horizontalScrolling) {
+ // swap up and down arrow keys
+ switch (key) {
+ case Qt::Key_Up:
+ key = Qt::Key_Down;
+ break;
+ case Qt::Key_Down:
+ key = Qt::Key_Up;
+ break;
+ default:
+ break;
+ }
+ } else if (!m_view->supportsItemExpanding()) {
+ // swap left and right arrow keys
+ switch (key) {
+ case Qt::Key_Left:
+ key = Qt::Key_Right;
+ break;
+ case Qt::Key_Right:
+ key = Qt::Key_Left;
+ break;
+ default:
+ break;
+ }
}
}
@@ -371,7 +387,7 @@ bool KItemListController::keyPressEvent(QKeyEvent *event)
break;
case Qt::Key_PageUp:
- if (m_view->scrollOrientation() == Qt::Horizontal) {
+ if (horizontalScrolling) {
// 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()) {
@@ -399,7 +415,7 @@ bool KItemListController::keyPressEvent(QKeyEvent *event)
break;
case Qt::Key_PageDown:
- if (m_view->scrollOrientation() == Qt::Horizontal) {
+ if (horizontalScrolling) {
// 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()) {
@@ -1486,12 +1502,12 @@ int KItemListController::nextRowIndex(int index) const
return index;
}
- const bool leftToRight = m_view->layoutDirection() != Qt::RightToLeft;
+ const bool reversed = m_view->layoutDirection() == Qt::RightToLeft && m_view->scrollOrientation() == Qt::Vertical;
// Calculate the index of the last column inside the row of the current index
int lastColumnIndex = index;
- while ((leftToRight && keyboardAnchorPos(lastColumnIndex + 1) > keyboardAnchorPos(lastColumnIndex))
- || (!leftToRight && keyboardAnchorPos(lastColumnIndex + 1) < keyboardAnchorPos(lastColumnIndex))) {
+ while ((!reversed && keyboardAnchorPos(lastColumnIndex + 1) > keyboardAnchorPos(lastColumnIndex))
+ || (reversed && keyboardAnchorPos(lastColumnIndex + 1) < keyboardAnchorPos(lastColumnIndex))) {
++lastColumnIndex;
if (lastColumnIndex >= maxIndex) {
return index;
@@ -1504,8 +1520,8 @@ int KItemListController::nextRowIndex(int index) const
int searchIndex = nextRowIndex;
qreal minDiff = qAbs(m_keyboardAnchorPos - keyboardAnchorPos(nextRowIndex));
while (searchIndex < maxIndex
- && ((leftToRight && keyboardAnchorPos(searchIndex + 1) > keyboardAnchorPos(searchIndex))
- || (!leftToRight && keyboardAnchorPos(searchIndex + 1) < keyboardAnchorPos(searchIndex)))) {
+ && ((!reversed && keyboardAnchorPos(searchIndex + 1) > keyboardAnchorPos(searchIndex))
+ || (reversed && keyboardAnchorPos(searchIndex + 1) < keyboardAnchorPos(searchIndex)))) {
++searchIndex;
const qreal searchDiff = qAbs(m_keyboardAnchorPos - keyboardAnchorPos(searchIndex));
if (searchDiff < minDiff) {
@@ -1523,12 +1539,12 @@ int KItemListController::previousRowIndex(int index) const
return index;
}
- const bool leftToRight = m_view->layoutDirection() != Qt::RightToLeft;
+ const bool reversed = m_view->layoutDirection() == Qt::RightToLeft && m_view->scrollOrientation() == Qt::Vertical;
// Calculate the index of the first column inside the row of the current index
int firstColumnIndex = index;
- while ((leftToRight && keyboardAnchorPos(firstColumnIndex - 1) < keyboardAnchorPos(firstColumnIndex))
- || (!leftToRight && keyboardAnchorPos(firstColumnIndex - 1) > keyboardAnchorPos(firstColumnIndex))) {
+ while ((!reversed && keyboardAnchorPos(firstColumnIndex - 1) < keyboardAnchorPos(firstColumnIndex))
+ || (reversed && keyboardAnchorPos(firstColumnIndex - 1) > keyboardAnchorPos(firstColumnIndex))) {
--firstColumnIndex;
if (firstColumnIndex <= 0) {
return index;
@@ -1541,8 +1557,8 @@ int KItemListController::previousRowIndex(int index) const
int searchIndex = previousRowIndex;
qreal minDiff = qAbs(m_keyboardAnchorPos - keyboardAnchorPos(previousRowIndex));
while (searchIndex > 0
- && ((leftToRight && keyboardAnchorPos(searchIndex - 1) < keyboardAnchorPos(searchIndex))
- || (!leftToRight && keyboardAnchorPos(searchIndex - 1) > keyboardAnchorPos(searchIndex)))) {
+ && ((!reversed && keyboardAnchorPos(searchIndex - 1) < keyboardAnchorPos(searchIndex))
+ || (reversed && keyboardAnchorPos(searchIndex - 1) > keyboardAnchorPos(searchIndex)))) {
--searchIndex;
const qreal searchDiff = qAbs(m_keyboardAnchorPos - keyboardAnchorPos(searchIndex));
if (searchDiff < minDiff) {