diff options
| author | Nate Graham <[email protected]> | 2023-10-05 09:15:35 -0600 |
|---|---|---|
| committer | Nate Graham <[email protected]> | 2023-10-05 09:15:35 -0600 |
| commit | 30a807e44afb334dd153c8bcbdbde4f36942bee0 (patch) | |
| tree | f2bb4b386ac76e257f87689e75db7364c7a12f6c /src | |
| parent | b6d9cb9949111fbaf5c875e76619ca7af83c6fc3 (diff) | |
| parent | b58fead9beaf3165146d3e536b6b14ae1cc9514d (diff) | |
Merge branch 'master' into kf6
Diffstat (limited to 'src')
| -rw-r--r-- | src/dolphinplacesmodelsingleton.cpp | 11 | ||||
| -rw-r--r-- | src/dolphinplacesmodelsingleton.h | 5 | ||||
| -rw-r--r-- | src/dolphinrecenttabsmenu.cpp | 12 | ||||
| -rw-r--r-- | src/dolphinviewcontainer.cpp | 6 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 16 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.cpp | 20 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistview.h | 18 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistviewaccessible.cpp | 7 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistviewaccessible.h | 5 | ||||
| -rw-r--r-- | src/kitemviews/kitemlistwidget.cpp | 12 | ||||
| -rw-r--r-- | src/tests/dolphinmainwindowtest.cpp | 37 | ||||
| -rw-r--r-- | src/tests/kitemlistcontrollerexpandtest.cpp | 3 | ||||
| -rw-r--r-- | src/tests/kitemlistcontrollertest.cpp | 3 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 3 |
14 files changed, 124 insertions, 34 deletions
diff --git a/src/dolphinplacesmodelsingleton.cpp b/src/dolphinplacesmodelsingleton.cpp index 3044dc8f5..301150394 100644 --- a/src/dolphinplacesmodelsingleton.cpp +++ b/src/dolphinplacesmodelsingleton.cpp @@ -13,8 +13,8 @@ #include <QIcon> #include <QMimeData> -DolphinPlacesModel::DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent) - : KFilePlacesModel(alternativeApplicationName, parent) +DolphinPlacesModel::DolphinPlacesModel(QObject *parent) + : KFilePlacesModel(parent) { connect(&Trash::instance(), &Trash::emptinessChanged, this, &DolphinPlacesModel::slotTrashEmptinessChanged); } @@ -118,7 +118,7 @@ bool DolphinPlacesModel::isTrash(const QModelIndex &index) const } DolphinPlacesModelSingleton::DolphinPlacesModelSingleton() - : m_placesModel(new DolphinPlacesModel(KAboutData::applicationData().componentName() + applicationNameSuffix())) + : m_placesModel(new DolphinPlacesModel()) { } @@ -133,9 +133,4 @@ DolphinPlacesModel *DolphinPlacesModelSingleton::placesModel() const return m_placesModel.data(); } -QString DolphinPlacesModelSingleton::applicationNameSuffix() -{ - return QStringLiteral("-places-panel"); -} - #include "moc_dolphinplacesmodelsingleton.cpp" diff --git a/src/dolphinplacesmodelsingleton.h b/src/dolphinplacesmodelsingleton.h index a0524068f..161a19cbc 100644 --- a/src/dolphinplacesmodelsingleton.h +++ b/src/dolphinplacesmodelsingleton.h @@ -23,7 +23,7 @@ class DolphinPlacesModel : public KFilePlacesModel Q_OBJECT public: - explicit DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent = nullptr); + explicit DolphinPlacesModel(QObject *parent = nullptr); ~DolphinPlacesModel() override; bool panelsLocked() const; @@ -54,9 +54,6 @@ public: static DolphinPlacesModelSingleton &instance(); DolphinPlacesModel *placesModel() const; - /** A suffix to the application-name of the stored bookmarks is - added, which is only read by PlacesItemModel. */ - static QString applicationNameSuffix(); DolphinPlacesModelSingleton(const DolphinPlacesModelSingleton &) = delete; DolphinPlacesModelSingleton &operator=(const DolphinPlacesModelSingleton &) = delete; diff --git a/src/dolphinrecenttabsmenu.cpp b/src/dolphinrecenttabsmenu.cpp index 6a647c177..74aaf232e 100644 --- a/src/dolphinrecenttabsmenu.cpp +++ b/src/dolphinrecenttabsmenu.cpp @@ -5,12 +5,14 @@ */ #include "dolphinrecenttabsmenu.h" +#include "search/dolphinquery.h" #include <KAcceleratorManager> #include <KLocalizedString> #include <kio/global.h> #include <QMenu> +#include <QUrlQuery> DolphinRecentTabsMenu::DolphinRecentTabsMenu(QObject *parent) : KActionMenu(QIcon::fromTheme(QStringLiteral("edit-undo")), i18n("Recently Closed Tabs"), parent) @@ -30,7 +32,15 @@ DolphinRecentTabsMenu::DolphinRecentTabsMenu(QObject *parent) void DolphinRecentTabsMenu::rememberClosedTab(const QUrl &url, const QByteArray &state) { QAction *action = new QAction(menu()); - action->setText(url.path()); + if (DolphinQuery::supportsScheme(url.scheme())) { + const DolphinQuery query = DolphinQuery::fromSearchUrl(url); + action->setText(i18n("Search for %1 in %2", query.text(), query.includeFolder())); + } else if (url.scheme() == QLatin1String("filenamesearch")) { + const QUrlQuery query(url); + action->setText(i18n("Search for %1 in %2", query.queryItemValue(QStringLiteral("search")), query.queryItemValue(QStringLiteral("url")))); + } else { + action->setText(url.path()); + } action->setData(state); const QString iconName = KIO::iconNameForUrl(url); action->setIcon(QIcon::fromTheme(iconName)); diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 66a9a116a..5b2a318d6 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -818,11 +818,13 @@ void DolphinViewContainer::slotUrlNavigatorLocationChanged(const QUrl &url) } if (KProtocolManager::supportsListing(url)) { - setSearchModeEnabled(isSearchUrl(url)); + const bool searchBoxInitialized = isSearchModeEnabled() && m_searchBox->text().isEmpty(); + setSearchModeEnabled(isSearchUrl(url) || searchBoxInitialized); + m_view->setUrl(url); tryRestoreViewState(); - if (m_autoGrabFocus && isActive() && !isSearchUrl(url)) { + if (m_autoGrabFocus && isActive() && !isSearchModeEnabled()) { // When an URL has been entered, the view should get the focus. // The focus must be requested asynchronously, as changing the URL might create // a new view widget. diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 0f3c5bc8c..be7a63e09 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -654,11 +654,6 @@ bool KItemListController::mouseMoveEvent(QGraphicsSceneMouseEvent *event, const if (m_view->scrollOrientation() == Qt::Vertical) { endPos.ry() += m_view->scrollOffset(); - if (m_view->itemSize().width() < 0) { - // Use a special rubberband for views that have only one column and - // expand the rubberband to use the whole width of the view. - endPos.setX(m_view->size().width()); - } } else { endPos.rx() += m_view->scrollOffset(); } @@ -1302,9 +1297,9 @@ void KItemListController::slotRubberBandChanged() const QRectF widgetRect = m_view->itemRect(index); if (widgetRect.intersects(rubberBandRect)) { - const QRectF iconRect = widget->iconRect().translated(widgetRect.topLeft()); - const QRectF textRect = widget->textRect().translated(widgetRect.topLeft()); - if (iconRect.intersects(rubberBandRect) || textRect.intersects(rubberBandRect)) { + // Select the full row intersecting with the rubberband rectangle + const QRectF selectionRect = widget->selectionRect().translated(widgetRect.topLeft()); + if (selectionRect.intersects(rubberBandRect)) { selectedItems.insert(index); } } @@ -1809,11 +1804,6 @@ void KItemListController::startRubberBand() QPoint startPos = m_view->transform().map(m_view->scene()->views().first()->mapFromGlobal(m_pressedMouseGlobalPos.toPoint())); if (m_view->scrollOrientation() == Qt::Vertical) { startPos.ry() += m_view->scrollOffset(); - if (m_view->itemSize().width() < 0) { - // Use a special rubberband for views that have only one column and - // expand the rubberband to use the whole width of the view. - startPos.setX(0); - } } else { startPos.rx() += m_view->scrollOffset(); } diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index d43438c30..659e59f0f 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -50,9 +50,14 @@ QAccessibleInterface *accessibleInterfaceFactory(const QString &key, QObject *ob Q_UNUSED(key) if (KItemListContainer *container = qobject_cast<KItemListContainer *>(object)) { + if (auto controller = container->controller(); controller) { + if (KItemListView *view = controller->view(); view && view->accessibleParent()) { + return view->accessibleParent(); + } + } return new KItemListContainerAccessible(container); } else if (KItemListView *view = qobject_cast<KItemListView *>(object)) { - return new KItemListViewAccessible(view); + return new KItemListViewAccessible(view, view->accessibleParent()); } return nullptr; @@ -337,6 +342,19 @@ KItemListGroupHeaderCreatorBase *KItemListView::groupHeaderCreator() const return m_groupHeaderCreator; } +#ifndef QT_NO_ACCESSIBILITY +void KItemListView::setAccessibleParentsObject(KItemListContainer *accessibleParentsObject) +{ + Q_ASSERT(!m_accessibleParent); + m_accessibleParent = new KItemListContainerAccessible(accessibleParentsObject); +} +KItemListContainerAccessible *KItemListView::accessibleParent() +{ + Q_CHECK_PTR(m_accessibleParent); // We always want the accessibility tree/hierarchy to be complete. + return m_accessibleParent; +} +#endif + QSizeF KItemListView::itemSize() const { return m_itemSize; diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index ff51af922..7bcaec704 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -21,6 +21,8 @@ #include <QGraphicsWidget> #include <QSet> +class KItemListContainer; +class KItemListContainerAccessible; class KItemListController; class KItemListGroupHeaderCreatorBase; class KItemListHeader; @@ -142,6 +144,18 @@ public: void setGroupHeaderCreator(KItemListGroupHeaderCreatorBase *groupHeaderCreator); KItemListGroupHeaderCreatorBase *groupHeaderCreator() const; +#ifndef QT_NO_ACCESSIBILITY + /** + * Uses \a parent to create an accessible object for \a parent. That accessible object will + * then be used as the accessible parent of the accessible object for this KItemListView. + * Make sure \a parent is the container which contains this specific KItemListView. + * This method must be called once before the accessible interface is queried for this class. + */ + void setAccessibleParentsObject(KItemListContainer *accessibleParentsObject); + /** The parent of the QAccessibilityInterface of this class. */ + KItemListContainerAccessible *accessibleParent(); +#endif + /** * @return The basic size of all items. The size of an item may be larger than * the basic size (see KItemListView::itemRect()). @@ -711,6 +725,10 @@ private: QList<QByteArray> m_visibleRoles; mutable KItemListWidgetCreatorBase *m_widgetCreator; mutable KItemListGroupHeaderCreatorBase *m_groupHeaderCreator; +#ifndef QT_NO_ACCESSIBILITY + /** The object that will be the parent of this classes QAccessibleInterface. */ + KItemListContainerAccessible *m_accessibleParent = nullptr; +#endif KItemListStyleOption m_styleOption; QHash<int, KItemListWidget *> m_visibleItems; diff --git a/src/kitemviews/kitemlistviewaccessible.cpp b/src/kitemviews/kitemlistviewaccessible.cpp index 8df0b0196..a8d80ab52 100644 --- a/src/kitemviews/kitemlistviewaccessible.cpp +++ b/src/kitemviews/kitemlistviewaccessible.cpp @@ -21,10 +21,12 @@ KItemListView *KItemListViewAccessible::view() const return qobject_cast<KItemListView *>(object()); } -KItemListViewAccessible::KItemListViewAccessible(KItemListView *view_) +KItemListViewAccessible::KItemListViewAccessible(KItemListView *view_, KItemListContainerAccessible *parent) : QAccessibleObject(view_) + , m_parent(parent) { Q_ASSERT(view()); + Q_CHECK_PTR(parent); m_cells.resize(childCount()); } @@ -208,8 +210,7 @@ QAccessibleInterface *KItemListViewAccessible::childAt(int x, int y) const QAccessibleInterface *KItemListViewAccessible::parent() const { - // FIXME: return KItemListContainerAccessible here - return nullptr; + return m_parent; } int KItemListViewAccessible::childCount() const diff --git a/src/kitemviews/kitemlistviewaccessible.h b/src/kitemviews/kitemlistviewaccessible.h index 628c32fc2..41aacf367 100644 --- a/src/kitemviews/kitemlistviewaccessible.h +++ b/src/kitemviews/kitemlistviewaccessible.h @@ -18,11 +18,12 @@ class KItemListView; class KItemListContainer; +class KItemListContainerAccessible; class DOLPHIN_EXPORT KItemListViewAccessible : public QAccessibleObject, public QAccessibleTableInterface { public: - explicit KItemListViewAccessible(KItemListView *view); + explicit KItemListViewAccessible(KItemListView *view, KItemListContainerAccessible *parent); ~KItemListViewAccessible() override; void *interface_cast(QAccessible::InterfaceType type) override; @@ -81,6 +82,8 @@ private: QAccessible::Id id; }; mutable QVector<AccessibleIdWrapper> m_cells; + + KItemListContainerAccessible *m_parent; }; class DOLPHIN_EXPORT KItemListAccessibleCell : public QAccessibleInterface, public QAccessibleTableCellInterface diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index cfaf89175..fb985ba23 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -105,7 +105,17 @@ void KItemListWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *o Q_UNUSED(option) if (m_alternateBackground) { - const QColor backgroundColor = m_styleOption.palette.color(QPalette::AlternateBase); + QColor backgroundColor = m_styleOption.palette.color(QPalette::AlternateBase); + if (!widget->hasFocus()) { + QColor baseColor = m_styleOption.palette.color(QPalette::Base); + if (baseColor.lightnessF() > 0.5) { + // theme seems light + backgroundColor = backgroundColor.lighter(101); + } else { + // theme seems dark + backgroundColor = backgroundColor.darker(101); + } + } const QRectF backgroundRect(0, 0, size().width(), size().height()); painter->fillRect(backgroundRect, backgroundColor); } diff --git a/src/tests/dolphinmainwindowtest.cpp b/src/tests/dolphinmainwindowtest.cpp index 009008002..e6c355a87 100644 --- a/src/tests/dolphinmainwindowtest.cpp +++ b/src/tests/dolphinmainwindowtest.cpp @@ -14,11 +14,14 @@ #include <KActionCollection> +#include <QAccessible> #include <QScopedPointer> #include <QSignalSpy> #include <QStandardPaths> #include <QTest> +#include <set> + class DolphinMainWindowTest : public QObject { Q_OBJECT @@ -39,6 +42,7 @@ private Q_SLOTS: void testPlacesPanelWidthResistance(); void testGoActions(); void testOpenFiles(); + void testAccessibilityAncestorTree(); void cleanupTestCase(); private: @@ -524,6 +528,39 @@ void DolphinMainWindowTest::testOpenFiles() QTRY_COMPARE(m_mainWindow->m_activeViewContainer->view()->selectedItems().count(), 1); } +void DolphinMainWindowTest::testAccessibilityAncestorTree() +{ + m_mainWindow->openDirectories({QUrl::fromLocalFile(QDir::homePath())}, false); + m_mainWindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(m_mainWindow.data())); + QVERIFY(m_mainWindow->isVisible()); + + std::set<const QObject *> testedObjects; // Makes sure we stop testing if we arrive at an item that was already tested. + QAccessibleInterface *accessibleInterfaceOfMainWindow = QAccessible::queryAccessibleInterface(m_mainWindow.get()); + Q_CHECK_PTR(accessibleInterfaceOfMainWindow); + + // We will do accessibility checks for every object that gets focus. Focus will be changed using the Tab key. + while (qApp->focusObject() && !testedObjects.count(qApp->focusObject())) { + const auto currentlyFocusedObject = qApp->focusObject(); + QAccessibleInterface *accessibleInterface = QAccessible::queryAccessibleInterface(currentlyFocusedObject); + + // The accessibleInterfaces of focused objects might themselves have children. + // We go down that hierarchy as far as possible and then test the ancestor tree from there. + while (accessibleInterface->childCount() > 0) { + accessibleInterface = accessibleInterface->child(0); + } + while (accessibleInterface != accessibleInterfaceOfMainWindow) { + QVERIFY2(accessibleInterface, + qPrintable(QString("%1's accessibleInterface or one of its accessible children doesn't have the main window as an ancestor.") + .arg(currentlyFocusedObject->metaObject()->className()))); + accessibleInterface = accessibleInterface->parent(); + } + + testedObjects.insert(currentlyFocusedObject); // Add it to testedObjects so we won't test it again later. + QTest::keyClick(m_mainWindow.get(), Qt::Key::Key_Tab, Qt::ShiftModifier); // ShiftModifier because the Tab cycle is currently broken going forward. + } +} + void DolphinMainWindowTest::cleanupTestCase() { m_mainWindow->showNormal(); diff --git a/src/tests/kitemlistcontrollerexpandtest.cpp b/src/tests/kitemlistcontrollerexpandtest.cpp index 368ec67ce..05708f4d2 100644 --- a/src/tests/kitemlistcontrollerexpandtest.cpp +++ b/src/tests/kitemlistcontrollerexpandtest.cpp @@ -48,6 +48,9 @@ void KItemListControllerExpandTest::initTestCase() m_view = new KFileItemListView(); m_controller = new KItemListController(m_model, m_view, this); m_container = new KItemListContainer(m_controller); +#ifndef QT_NO_ACCESSIBILITY + m_view->setAccessibleParentsObject(m_container); +#endif m_controller = m_container->controller(); m_controller->setSelectionBehavior(KItemListController::MultiSelection); m_selectionManager = m_controller->selectionManager(); diff --git a/src/tests/kitemlistcontrollertest.cpp b/src/tests/kitemlistcontrollertest.cpp index ac2110c0f..f462947c6 100644 --- a/src/tests/kitemlistcontrollertest.cpp +++ b/src/tests/kitemlistcontrollertest.cpp @@ -109,6 +109,9 @@ void KItemListControllerTest::initTestCase() m_view = new KFileItemListView(); m_controller = new KItemListController(m_model, m_view, this); m_container = new KItemListContainer(m_controller); +#ifndef QT_NO_ACCESSIBILITY + m_view->setAccessibleParentsObject(m_container); +#endif m_controller = m_container->controller(); m_controller->setSelectionBehavior(KItemListController::MultiSelection); m_selectionManager = m_controller->selectionManager(); diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index e27f423f6..5bdc9e15f 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -126,6 +126,9 @@ DolphinView::DolphinView(const QUrl &url, QWidget *parent) m_container = new KItemListContainer(controller, this); m_container->installEventFilter(this); +#ifndef QT_NO_ACCESSIBILITY + m_view->setAccessibleParentsObject(m_container); +#endif setFocusProxy(m_container); connect(m_container->horizontalScrollBar(), &QScrollBar::valueChanged, this, [=] { hideToolTip(); |
