]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/views/tooltips/tooltipmanager.cpp
placespanel: Use correct loop index when connecting device signals
[dolphin.git] / src / views / tooltips / tooltipmanager.cpp
index e80d45e614c1c9125d821672ddc64befdb0f293c..0f540e1626f896a26c532ff9b2e6b94753420795 100644 (file)
@@ -8,23 +8,20 @@
 
 #include "dolphinfilemetadatawidget.h"
 
-#include <KIO/JobUiDelegate>
-#include <KIO/PreviewJob>
 #include <KConfigGroup>
+#include <KIO/PreviewJob>
+#include <KIconLoader>
 #include <KJobWidgets>
 #include <KSharedConfig>
 #include <KToolTipWidget>
-#include <KIconLoader>
 
 #include <QApplication>
-#include <QDesktopWidget>
-#include <QIcon>
-#include <QLayout>
 #include <QStyle>
 #include <QTimer>
 #include <QWindow>
 
-class IconLoaderSingleton {
+class IconLoaderSingleton
+{
 public:
     IconLoaderSingleton() = default;
 
@@ -33,18 +30,17 @@ public:
 
 Q_GLOBAL_STATIC(IconLoaderSingleton, iconLoader)
 
-ToolTipManager::ToolTipManager(QWidget* parent) :
-    QObject(parent),
-    m_showToolTipTimer(nullptr),
-    m_contentRetrievalTimer(nullptr),
-    m_transientParent(nullptr),
-    m_fileMetaDataWidget(nullptr),
-    m_toolTipRequested(false),
-    m_metaDataRequested(false),
-    m_appliedWaitCursor(false),
-    m_margin(4),
-    m_item(),
-    m_itemRect()
+ToolTipManager::ToolTipManager(QWidget *parent)
+    : QObject(parent)
+    , m_showToolTipTimer(nullptr)
+    , m_contentRetrievalTimer(nullptr)
+    , m_transientParent(nullptr)
+    , m_toolTipRequested(false)
+    , m_metaDataRequested(false)
+    , m_appliedWaitCursor(false)
+    , m_margin(4)
+    , m_item()
+    , m_itemRect()
 {
     if (parent) {
         m_margin = qMax(m_margin, parent->style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth));
@@ -61,20 +57,16 @@ ToolTipManager::ToolTipManager(QWidget* parent) :
     connect(m_contentRetrievalTimer, &QTimer::timeout, this, &ToolTipManager::startContentRetrieval);
 
     Q_ASSERT(m_contentRetrievalTimer->interval() < m_showToolTipTimer->interval());
-
-    // Only start the retrieving of the content, when the mouse has been over this
-    // item for 200 milliseconds. This prevents a lot of useless preview jobs and
-    // meta data retrieval, when passing rapidly over a lot of items.
-    m_fileMetaDataWidget = new DolphinFileMetaDataWidget(parent);
-    connect(m_fileMetaDataWidget, &DolphinFileMetaDataWidget::metaDataRequestFinished, this, &ToolTipManager::slotMetaDataRequestFinished);
-    connect(m_fileMetaDataWidget, &DolphinFileMetaDataWidget::urlActivated, this, &ToolTipManager::urlActivated);
 }
 
 ToolTipManager::~ToolTipManager()
 {
+    if (!m_fileMetaDatWidgetOwnershipTransferred) {
+        delete m_fileMetaDataWidget;
+    }
 }
 
-void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect, QWindow *transientParent)
+void ToolTipManager::showToolTip(const KFileItem &item, const QRectF &itemRect, QWindow *transientParent)
 {
     hideToolTip(HideBehavior::Instantly);
 
@@ -85,6 +77,15 @@ void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect,
 
     m_transientParent = transientParent;
 
+    // Only start the retrieving of the content, when the mouse has been over this
+    // item for 200 milliseconds. This prevents a lot of useless preview jobs and
+    // meta data retrieval, when passing rapidly over a lot of items.
+    if (!m_fileMetaDataWidget) {
+        m_fileMetaDataWidget = new DolphinFileMetaDataWidget();
+        connect(m_fileMetaDataWidget, &DolphinFileMetaDataWidget::metaDataRequestFinished, this, &ToolTipManager::slotMetaDataRequestFinished);
+        connect(m_fileMetaDataWidget, &DolphinFileMetaDataWidget::urlActivated, this, &ToolTipManager::urlActivated);
+    }
+
     m_contentRetrievalTimer->start();
     m_showToolTipTimer->start();
     m_toolTipRequested = true;
@@ -132,25 +133,20 @@ void ToolTipManager::startContentRetrieval()
     // Request a preview of the item
     m_fileMetaDataWidget->setPreview(QPixmap());
 
-    const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings");
+    const KConfigGroup globalConfig(KSharedConfig::openConfig(), QLatin1String("PreviewSettings"));
     const QStringList plugins = globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins());
-    KIO::PreviewJob* job = new KIO::PreviewJob(KFileItemList() << m_item,
-                                               QSize(256, 256),
-                                               &plugins);
+    KIO::PreviewJob *job = new KIO::PreviewJob(KFileItemList() << m_item, QSize(512, 512), &plugins);
+    job->setDevicePixelRatio(m_fileMetaDataWidget->devicePixelRatioF());
     job->setIgnoreMaximumSize(m_item.isLocalFile() && !m_item.isSlow());
     if (job->uiDelegate()) {
         KJobWidgets::setWindow(job, qApp->activeWindow());
     }
 
-    connect(job, &KIO::PreviewJob::gotPreview,
-            this, &ToolTipManager::setPreviewPix);
-    connect(job, &KIO::PreviewJob::failed,
-            this, &ToolTipManager::previewFailed);
+    connect(job, &KIO::PreviewJob::gotPreview, this, &ToolTipManager::setPreviewPix);
+    connect(job, &KIO::PreviewJob::failed, this, &ToolTipManager::previewFailed);
 }
 
-
-void ToolTipManager::setPreviewPix(const KFileItem& item,
-                                   const QPixmap& pixmap)
+void ToolTipManager::setPreviewPix(const KFileItem &item, const QPixmap &pixmap)
 {
     if (!m_toolTipRequested || (m_item.url() != item.url())) {
         // No tooltip is requested anymore or an old preview has been received
@@ -173,7 +169,7 @@ void ToolTipManager::previewFailed()
         return;
     }
     QPalette pal;
-    for (auto state : { QPalette::Active, QPalette::Inactive, QPalette::Disabled }) {
+    for (auto state : {QPalette::Active, QPalette::Inactive, QPalette::Disabled}) {
         pal.setBrush(state, QPalette::WindowText, pal.toolTipText());
         pal.setBrush(state, QPalette::Window, pal.toolTipBase());
     }
@@ -219,6 +215,10 @@ void ToolTipManager::showToolTip()
         m_tooltipWidget.reset(new KToolTipWidget());
     }
     m_tooltipWidget->showBelow(m_itemRect, m_fileMetaDataWidget, m_transientParent);
+    // At this point KToolTipWidget adopted our parent-less metadata widget.
+    m_fileMetaDatWidgetOwnershipTransferred = true;
+
     m_toolTipRequested = false;
 }
 
+#include "moc_tooltipmanager.cpp"