┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/accessibility/kitemlistviewaccessible.cpp2
-rw-r--r--src/kitemviews/kfileitemmodel.cpp2
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.cpp46
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp8
-rw-r--r--src/kitemviews/kitemlistcontroller.h6
-rw-r--r--src/kitemviews/kitemlistview.cpp2
-rw-r--r--src/kitemviews/kitemlistview.h3
-rw-r--r--src/kitemviews/kitemlistwidget.cpp16
-rw-r--r--src/kitemviews/kitemlistwidget.h1
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp7
-rw-r--r--src/kitemviews/kstandarditemlistwidget.h1
-rw-r--r--src/kitemviews/private/kfileitemmodelfilter.h3
12 files changed, 67 insertions, 30 deletions
diff --git a/src/kitemviews/accessibility/kitemlistviewaccessible.cpp b/src/kitemviews/accessibility/kitemlistviewaccessible.cpp
index 21bf7a3f6..0107f3b55 100644
--- a/src/kitemviews/accessibility/kitemlistviewaccessible.cpp
+++ b/src/kitemviews/accessibility/kitemlistviewaccessible.cpp
@@ -34,7 +34,7 @@ KItemListViewAccessible::KItemListViewAccessible(KItemListView *view_, KItemList
{
Q_ASSERT(view());
Q_ASSERT(parent);
- m_accessibleDelegates.resize(childCount());
+ m_accessibleDelegates.resize(view()->model()->count());
m_announceCurrentItemTimer = new QTimer{view_};
m_announceCurrentItemTimer->setSingleShot(true);
diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp
index 72c3d1410..0bfc74155 100644
--- a/src/kitemviews/kfileitemmodel.cpp
+++ b/src/kitemviews/kfileitemmodel.cpp
@@ -1155,7 +1155,7 @@ void KFileItemModel::applyFilters()
// ===STEP 3===
// Handles the ancestorsOfNewVisibleItems.
// Now that we are done iterating through m_filteredItems we can safely move the ancestorsOfNewVisibleItems from m_filteredItems to newVisibleItems.
- for (it = ancestorsOfNewVisibleItems.begin(); it != ancestorsOfNewVisibleItems.end(); it++) {
+ for (it = ancestorsOfNewVisibleItems.begin(); it != ancestorsOfNewVisibleItems.end(); ++it) {
if (m_filteredItems.remove(it.key())) {
// m_filteredItems still contained this ancestor until now so we can be sure that we aren't adding a duplicate ancestor to newVisibleItems.
newVisibleItems.append(it.value());
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp
index 0f4816424..38fa58436 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.cpp
+++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp
@@ -1288,36 +1288,40 @@ void KFileItemModelRolesUpdater::startDirectorySizeCounting(const KFileItem &ite
m_model->setData(index, data);
connect(m_model, &KFileItemModel::itemsChanged, this, &KFileItemModelRolesUpdater::slotItemsChanged);
- auto listJob = KIO::listDir(url, KIO::HideProgressInfo);
+ // Use KIO flags to exclude dot entries at the source to simplify counting
+ KIO::ListJob::ListFlags flags = KIO::ListJob::ListFlag::ExcludeDotAndDotDot;
+ if (!m_model->showHiddenFiles()) {
+ flags |= KIO::ListJob::ListFlag::ExcludeHidden;
+ }
+
+ auto listJob = KIO::listDir(url, KIO::HideProgressInfo, flags);
- QObject::connect(listJob, &KIO::ListJob::entries, this, [this, item](const KJob *job, const KIO::UDSEntryList &list) {
+ // Define a local counter to accumulate results for THIS specific job instance.
+ // Using a shared pointer allows the lambda batches to share and update the same state.
+ auto totalCount = std::make_shared<int>(0);
+
+ QObject::connect(listJob, &KIO::ListJob::entries, this, [this, item, totalCount](const KJob *job, const KIO::UDSEntryList &list) {
+ Q_UNUSED(job)
int index = m_model->index(item);
if (index < 0) {
return;
}
- auto data = m_model->data(index);
- int origCount = data.value("count").toInt();
- // Get the amount of processed items...
- int entryCount = job->processedAmount(KJob::Bytes);
-
- // ...and then remove the unwanted items from the amount.
- for (const KIO::UDSEntry &entry : list) {
- const auto name = entry.stringValue(KIO::UDSEntry::UDS_NAME);
- if (name == QStringLiteral("..") || name == QStringLiteral(".")) {
- --entryCount;
- continue;
- }
- if (!m_model->showHiddenFiles() && name.startsWith(QLatin1Char('.'))) {
- --entryCount;
- continue;
- }
- if (m_model->showDirectoriesOnly() && !entry.isDir()) {
- --entryCount;
- continue;
+ // Accumulate entries for this batch into our job-specific counter
+ if (!m_model->showDirectoriesOnly()) {
+ *totalCount += list.size();
+ } else {
+ for (const KIO::UDSEntry &entry : list) {
+ if (entry.isDir()) {
+ (*totalCount)++;
+ }
}
}
+ const int entryCount = *totalCount;
+ auto data = m_model->data(index);
+ int origCount = data.value("count").toInt();
+
QHash<QByteArray, QVariant> newData;
QVariant expandable = data.value("isExpandable");
if (expandable.isNull() || expandable.toBool() != (entryCount > 0)) {
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index e87ed3c18..b1927fc71 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -604,6 +604,10 @@ bool KItemListController::mousePressEvent(QGraphicsSceneMouseEvent *event, const
const Qt::MouseButtons buttons = event->buttons();
+ if (!m_pressedIndex.has_value()) {
+ Q_EMIT clickViewBackground(event->button());
+ }
+
if (!onPress(event->pos(), event->modifiers(), buttons)) {
startRubberBand();
return false;
@@ -873,7 +877,7 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent *event, cons
} else {
m_autoActivationTimer->stop();
- if (newHoveredWidget && newHoveredWidget->isHovered()) {
+ if (newHoveredWidget->isHovered()) {
newHoveredWidget->setHovered(false);
Q_EMIT itemUnhovered(index);
}
@@ -1807,7 +1811,7 @@ bool KItemListController::onRelease(const QPointF &pos, const Qt::KeyboardModifi
return true;
}
- if (!isAboveSelectionToggle && m_selectionTogglePressed) {
+ if (m_selectionTogglePressed) {
m_selectionManager->setSelected(m_pressedIndex.value_or(-1), 1, KItemListSelectionManager::Toggle);
m_selectionTogglePressed = false;
return true;
diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h
index 6379acbd8..38a4b6038 100644
--- a/src/kitemviews/kitemlistcontroller.h
+++ b/src/kitemviews/kitemlistcontroller.h
@@ -223,6 +223,12 @@ Q_SIGNALS:
void swipeUp();
/**
+ * Emitted when the view's background is clicked.
+ * Used to trigger a user configured action.
+ */
+ void clickViewBackground(Qt::MouseButton button);
+
+ /**
* Emitted when the view's background is double-clicked.
* Used to trigger an user configured action.
*/
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 452567f05..b87216d4b 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -353,6 +353,8 @@ void KItemListView::setAccessibleParentsObject(KItemListContainer *accessiblePar
{
Q_ASSERT(!m_accessibleParent);
m_accessibleParent = new KItemListContainerAccessible(accessibleParentsObject);
+ // Make sure Qt's accessibility cache takes ownership; tests have no AT client.
+ QAccessible::queryAccessibleInterface(accessibleParentsObject);
}
KItemListContainerAccessible *KItemListView::accessibleParent()
{
diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h
index c8ab796a9..8dc83d528 100644
--- a/src/kitemviews/kitemlistview.h
+++ b/src/kitemviews/kitemlistview.h
@@ -866,6 +866,9 @@ public:
KItemListWidgetCreator();
~KItemListWidgetCreator() override;
+ KItemListWidgetCreator(const KItemListWidgetCreator &) = delete;
+ KItemListWidgetCreator &operator=(const KItemListWidgetCreator &) = delete;
+
KItemListWidget *create(KItemListView *view) override;
void calculateItemSizeHints(QVector<std::pair<qreal, bool>> &logicalHeightHints, qreal &logicalWidthHint, const KItemListView *view) const override;
diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp
index 32118c569..1650ea190 100644
--- a/src/kitemviews/kitemlistwidget.cpp
+++ b/src/kitemviews/kitemlistwidget.cpp
@@ -506,6 +506,11 @@ void KItemListWidget::hoveredChanged(bool hovered)
Q_UNUSED(hovered)
}
+void KItemListWidget::pressedChanged(bool pressed)
+{
+ Q_UNUSED(pressed)
+}
+
void KItemListWidget::alternateBackgroundChanged(bool enabled)
{
Q_UNUSED(enabled)
@@ -616,6 +621,7 @@ void KItemListWidget::setPressed(bool enabled)
if (m_clickHighlighted != enabled) {
m_clickHighlighted = enabled;
clearHoverCache();
+ pressedChanged(enabled);
update();
}
}
@@ -634,18 +640,18 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS
// TODO: Remove this check after Plasma 6.8 release
// See: https://invent.kde.org/plasma/breeze/-/merge_requests/595
if (style()->name() == QStringLiteral("breeze")) {
- QColor backgroundColor{widget->palette().color(QPalette::Highlight)};
+ QColor backgroundColor{widget->palette().color(QPalette::Active, QPalette::Highlight)};
backgroundColor.setAlphaF(0.0);
if (m_clickHighlighted) {
backgroundColor.setAlphaF(1.0);
} else {
if (m_selected && m_hovered) {
- backgroundColor.setAlphaF(0.40);
+ backgroundColor.setAlphaF(0.85);
} else if (m_selected) {
- backgroundColor.setAlphaF(0.32);
+ backgroundColor.setAlphaF(0.70);
} else if (m_hovered) {
backgroundColor = widget->palette().color(QPalette::Text);
- backgroundColor.setAlphaF(0.06);
+ backgroundColor.setAlphaF(0.12);
}
}
painter->setRenderHint(QPainter::Antialiasing);
@@ -658,7 +664,7 @@ void KItemListWidget::drawItemStyleOption(QPainter *painter, QWidget *widget, QS
// Focus decoration
if (current) {
- QColor focusColor{widget->palette().color(QPalette::Highlight)};
+ QColor focusColor{widget->palette().color(QPalette::Active, QPalette::Highlight)};
// Set the pen color lighter or darker depending on background color
focusColor = m_styleOption.palette.color(QPalette::Base).lightnessF() > 0.5 ? focusColor.darker(110) : focusColor.lighter(110);
focusColor.setAlphaF(m_selected || m_hovered ? 1.0 : 0.8);
diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h
index b87a3b34e..100c13466 100644
--- a/src/kitemviews/kitemlistwidget.h
+++ b/src/kitemviews/kitemlistwidget.h
@@ -214,6 +214,7 @@ protected:
virtual void currentChanged(bool current);
virtual void selectedChanged(bool selected);
virtual void hoveredChanged(bool hovered);
+ virtual void pressedChanged(bool pressed);
virtual void alternateBackgroundChanged(bool enabled);
virtual void siblingsInformationChanged(const QBitArray &current, const QBitArray &previous);
virtual void editedRoleChanged(const QByteArray &current, const QByteArray &previous);
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index ddbb8b6a1..036aff608 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -828,6 +828,13 @@ void KStandardItemListWidget::selectedChanged(bool selected)
m_dirtyContent = true;
}
+void KStandardItemListWidget::pressedChanged(bool pressed)
+{
+ Q_UNUSED(pressed)
+ updateAdditionalInfoTextColor();
+ m_dirtyContent = true;
+}
+
void KStandardItemListWidget::siblingsInformationChanged(const QBitArray &current, const QBitArray &previous)
{
Q_UNUSED(current)
diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h
index e0a32b745..2b2412abb 100644
--- a/src/kitemviews/kstandarditemlistwidget.h
+++ b/src/kitemviews/kstandarditemlistwidget.h
@@ -180,6 +180,7 @@ protected:
void styleOptionChanged(const KItemListStyleOption &current, const KItemListStyleOption &previous) override;
void hoveredChanged(bool hovered) override;
void selectedChanged(bool selected) override;
+ void pressedChanged(bool pressed) override;
void siblingsInformationChanged(const QBitArray &current, const QBitArray &previous) override;
void editedRoleChanged(const QByteArray &current, const QByteArray &previous) override;
void iconSizeChanged(int current, int previous) override;
diff --git a/src/kitemviews/private/kfileitemmodelfilter.h b/src/kitemviews/private/kfileitemmodelfilter.h
index 9d93d42cc..4559f880f 100644
--- a/src/kitemviews/private/kfileitemmodelfilter.h
+++ b/src/kitemviews/private/kfileitemmodelfilter.h
@@ -28,6 +28,9 @@ public:
KFileItemModelFilter();
virtual ~KFileItemModelFilter();
+ KFileItemModelFilter(const KFileItemModelFilter &) = delete;
+ KFileItemModelFilter &operator=(const KFileItemModelFilter &) = delete;
+
/** Filtering modes of KFileItemModelFilter */
enum FilterMode {
/** Substring matching. */