diff options
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kfileitemmodelrolesupdater.cpp | 39 | ||||
| -rw-r--r-- | src/kitemviews/kfileitemmodelrolesupdater.h | 10 | ||||
| -rw-r--r-- | src/kitemviews/private/kitemlistsmoothscroller.cpp | 24 |
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; |
