┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.cpp39
-rw-r--r--src/kitemviews/kfileitemmodelrolesupdater.h10
-rw-r--r--src/kitemviews/private/kitemlistsmoothscroller.cpp24
3 files changed, 64 insertions, 9 deletions
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.cpp b/src/kitemviews/kfileitemmodelrolesupdater.cpp
index b03fd9c1a..d3d3745fc 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.cpp
+++ b/src/kitemviews/kfileitemmodelrolesupdater.cpp
@@ -29,6 +29,8 @@
#include <KJobWidgets>
#include <KIO/JobUiDelegate>
#include <KIO/PreviewJob>
+#include <KPluginLoader>
+#include <KOverlayIconPlugin>
#include "private/kpixmapmodifier.h"
#include "private/kdirectorycontentscounter.h"
@@ -47,6 +49,7 @@
#include <Baloo/FileMonitor>
#endif
+
// #define KFILEITEMMODELROLESUPDATER_DEBUG
namespace {
@@ -129,6 +132,18 @@ KFileItemModelRolesUpdater::KFileItemModelRolesUpdater(KFileItemModel* model, QO
m_directoryContentsCounter = new KDirectoryContentsCounter(m_model, this);
connect(m_directoryContentsCounter, &KDirectoryContentsCounter::result,
this, &KFileItemModelRolesUpdater::slotDirectoryContentsCountReceived);
+
+ auto plugins = KPluginLoader::instantiatePlugins(QStringLiteral("kf5/overlayicon"), nullptr, this);
+ foreach (QObject *it, plugins) {
+ auto plugin = qobject_cast<KOverlayIconPlugin*>(it);
+ if (plugin) {
+ m_overlayIconsPlugin.append(plugin);
+ connect(plugin, &KOverlayIconPlugin::overlaysChanged, this, &KFileItemModelRolesUpdater::slotOverlaysChanged);
+ } else {
+ // not our/valid plugin, so delete the created object
+ it->deleteLater();
+ }
+ }
}
KFileItemModelRolesUpdater::~KFileItemModelRolesUpdater()
@@ -278,7 +293,7 @@ void KFileItemModelRolesUpdater::setRoles(const QSet<QByteArray>& roles)
}
}
- if (hasBalooRole && !m_balooFileMonitor) {
+ if (hasBalooRole && m_balooConfig.fileIndexingEnabled() && !m_balooFileMonitor) {
m_balooFileMonitor = new Baloo::FileMonitor(this);
connect(m_balooFileMonitor, &Baloo::FileMonitor::fileMetaDataChanged,
this, &KFileItemModelRolesUpdater::applyChangedBalooRoles);
@@ -1065,7 +1080,11 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
data.insert("type", item.mimeComment());
}
- data.insert("iconOverlays", item.overlays());
+ QStringList overlays = item.overlays();
+ foreach(KOverlayIconPlugin *it, m_overlayIconsPlugin) {
+ overlays.append(it->getOverlays(item.url()));
+ }
+ data.insert("iconOverlays", overlays);
#ifdef HAVE_BALOO
if (m_balooFileMonitor) {
@@ -1076,6 +1095,22 @@ QHash<QByteArray, QVariant> KFileItemModelRolesUpdater::rolesData(const KFileIte
return data;
}
+void KFileItemModelRolesUpdater::slotOverlaysChanged(const QUrl& url, const QStringList &)
+{
+ const KFileItem item = m_model->fileItem(url);
+ if (item.isNull()) {
+ return;
+ }
+ const int index = m_model->index(item);
+ QHash<QByteArray, QVariant> data = m_model->data(index);
+ QStringList overlays = item.overlays();
+ foreach (KOverlayIconPlugin *it, m_overlayIconsPlugin) {
+ overlays.append(it->getOverlays(url));
+ }
+ data.insert("iconOverlays", overlays);
+ m_model->setData(index, data);
+}
+
void KFileItemModelRolesUpdater::updateAllPreviews()
{
if (m_state == Paused) {
diff --git a/src/kitemviews/kfileitemmodelrolesupdater.h b/src/kitemviews/kfileitemmodelrolesupdater.h
index 216b0a501..f3d40a6c5 100644
--- a/src/kitemviews/kfileitemmodelrolesupdater.h
+++ b/src/kitemviews/kfileitemmodelrolesupdater.h
@@ -36,6 +36,7 @@ class KDirectoryContentsCounter;
class KFileItemModel;
class QPixmap;
class QTimer;
+class KOverlayIconPlugin;
namespace KIO {
class PreviewJob;
@@ -46,6 +47,7 @@ namespace KIO {
{
class FileMonitor;
}
+ #include <Baloo/IndexerConfig>
#endif
/**
@@ -183,6 +185,11 @@ private slots:
void slotPreviewJobFinished();
/**
+ * Is invoked when one of the KOverlayIconPlugin emit the signal that an overlay has changed
+ */
+ void slotOverlaysChanged(const QUrl& url, const QStringList&);
+
+ /**
* Resolves the sort role of the next item in m_pendingSortRole, applies it
* to the model, and invokes itself if there are any pending items left. If
* that is not the case, \a startUpdating() is called.
@@ -333,8 +340,11 @@ private:
KDirectoryContentsCounter* m_directoryContentsCounter;
+ QList<KOverlayIconPlugin*> m_overlayIconsPlugin;
+
#ifdef HAVE_BALOO
Baloo::FileMonitor* m_balooFileMonitor;
+ Baloo::IndexerConfig m_balooConfig;
#endif
};
diff --git a/src/kitemviews/private/kitemlistsmoothscroller.cpp b/src/kitemviews/private/kitemlistsmoothscroller.cpp
index e70f47890..2bd467aa5 100644
--- a/src/kitemviews/private/kitemlistsmoothscroller.cpp
+++ b/src/kitemviews/private/kitemlistsmoothscroller.cpp
@@ -172,7 +172,7 @@ bool KItemListSmoothScroller::eventFilter(QObject* obj, QEvent* event)
case QEvent::Wheel:
handleWheelEvent(static_cast<QWheelEvent*>(event));
- break;
+ return true; // eat event so that QScrollBar does not scroll one step more by itself
default:
break;
@@ -192,15 +192,25 @@ void KItemListSmoothScroller::slotAnimationStateChanged(QAbstractAnimation::Stat
void KItemListSmoothScroller::handleWheelEvent(QWheelEvent* event)
{
- const int numDegrees = event->delta() / 8;
- const int numSteps = numDegrees / 15;
-
const bool previous = m_smoothScrolling;
m_smoothScrolling = true;
- const int value = m_scrollBar->value();
- const int pageStep = m_scrollBar->pageStep();
- m_scrollBar->setValue(value - numSteps * pageStep);
+ int numPixels;
+ if (!event->pixelDelta().isNull()) {
+ numPixels = event->pixelDelta().y();
+ } else {
+ const int numDegrees = event->angleDelta().y() / 8;
+ const int numSteps = numDegrees / 15;
+ numPixels = numSteps * m_scrollBar->pageStep() / 4;
+ }
+ int value = m_scrollBar->value();
+ if (event->modifiers().testFlag(Qt::ShiftModifier)) {
+ const int scrollingDirection = numPixels > 0 ? 1 : -1;
+ value -= m_scrollBar->pageStep() * scrollingDirection;
+ } else {
+ value -= numPixels;
+ }
+ m_scrollBar->setValue(value);
m_smoothScrolling = previous;