┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dolphinplacesmodelsingleton.cpp11
-rw-r--r--src/dolphinplacesmodelsingleton.h5
-rw-r--r--src/dolphinrecenttabsmenu.cpp12
-rw-r--r--src/dolphinviewcontainer.cpp6
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp16
-rw-r--r--src/kitemviews/kitemlistview.cpp20
-rw-r--r--src/kitemviews/kitemlistview.h18
-rw-r--r--src/kitemviews/kitemlistviewaccessible.cpp7
-rw-r--r--src/kitemviews/kitemlistviewaccessible.h5
-rw-r--r--src/kitemviews/kitemlistwidget.cpp12
-rw-r--r--src/tests/dolphinmainwindowtest.cpp37
-rw-r--r--src/tests/kitemlistcontrollerexpandtest.cpp3
-rw-r--r--src/tests/kitemlistcontrollertest.cpp3
-rw-r--r--src/views/dolphinview.cpp3
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();