From 5325c7b826d8d75fdfda195de3690a9a9de89ef8 Mon Sep 17 00:00:00 2001 From: nerix Date: Sat, 4 Nov 2023 19:13:34 +0100 Subject: [PATCH] Fix tooltips appearing too large and/or away from the cursor (#4920) --- CHANGELOG.md | 1 + src/singletons/WindowManager.cpp | 6 ---- src/singletons/WindowManager.hpp | 5 ---- src/widgets/TooltipEntryWidget.cpp | 5 ++++ src/widgets/TooltipWidget.cpp | 44 +++++++++++++++++++----------- 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e310e203c..557a469ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - Bugfix: Fixed the input completion popup from disappearing when clicking on it on Windows and macOS. (#4876) - Bugfix: Fixed double-click text selection moving its position with each new message. (#4898) - Bugfix: Fixed an issue where notifications on Windows would contain no or an old avatar. (#4899) +- Bugfix: Fixed tooltips appearing too large and/or away from the cursor. (#4920) - Bugfix: Fixed a crash when clicking `More messages below` button in a usercard and closing it quickly. (#4933) - Dev: Change clang-format from v14 to v16. (#4929) - Dev: Fixed UTF16 encoding of `modes` file for the installer. (#4791) diff --git a/src/singletons/WindowManager.cpp b/src/singletons/WindowManager.cpp index 431886822..a86fdbc5a 100644 --- a/src/singletons/WindowManager.cpp +++ b/src/singletons/WindowManager.cpp @@ -125,12 +125,6 @@ WindowManager::WindowManager() QObject::connect(this->saveTimer, &QTimer::timeout, [] { getApp()->windows->save(); }); - - this->miscUpdateTimer_.start(100); - - QObject::connect(&this->miscUpdateTimer_, &QTimer::timeout, [this] { - this->miscUpdate.invoke(); - }); } WindowManager::~WindowManager() = default; diff --git a/src/singletons/WindowManager.hpp b/src/singletons/WindowManager.hpp index 78b7b9e53..22a68655c 100644 --- a/src/singletons/WindowManager.hpp +++ b/src/singletons/WindowManager.hpp @@ -122,10 +122,6 @@ public: pajlada::Signals::NoArgSignal wordFlagsChanged; - // This signal fires every 100ms and can be used to trigger random things that require a recheck. - // It is currently being used by the "Tooltip Preview Image" system to recheck if an image is ready to be rendered. - pajlada::Signals::NoArgSignal miscUpdate; - pajlada::Signals::Signal selectSplit; pajlada::Signals::Signal selectSplitContainer; pajlada::Signals::Signal scrollToMessageSignal; @@ -159,7 +155,6 @@ private: pajlada::SettingListener wordFlagsListener_; QTimer *saveTimer; - QTimer miscUpdateTimer_; friend class Window; // this is for selectedWindow_ }; diff --git a/src/widgets/TooltipEntryWidget.cpp b/src/widgets/TooltipEntryWidget.cpp index 6fbaec1fd..ff5692812 100644 --- a/src/widgets/TooltipEntryWidget.cpp +++ b/src/widgets/TooltipEntryWidget.cpp @@ -91,6 +91,11 @@ bool TooltipEntryWidget::refreshPixmap() this->displayImage_->setPixmap(pixmap->scaled(this->customImgWidth_, this->customImgHeight_, Qt::KeepAspectRatio)); + if (this->displayImage_->size() != + QSize{this->customImgWidth_, this->customImgHeight_}) + { + this->adjustSize(); + } } else { diff --git a/src/widgets/TooltipWidget.cpp b/src/widgets/TooltipWidget.cpp index f979c03d2..dba8afc77 100644 --- a/src/widgets/TooltipWidget.cpp +++ b/src/widgets/TooltipWidget.cpp @@ -37,11 +37,16 @@ TooltipWidget::TooltipWidget(BaseWidget *parent) }); this->updateFont(); - auto windows = getApp()->windows; + auto *windows = getApp()->windows; this->connections_.managedConnect(windows->gifRepaintRequested, [this] { + if (!this->isVisible()) + { + return; + } + for (int i = 0; i < this->visibleEntries_; ++i) { - auto entry = this->entryAt(i); + auto *entry = this->entryAt(i); if (entry && entry->animated()) { entry->refreshPixmap(); @@ -49,23 +54,29 @@ TooltipWidget::TooltipWidget(BaseWidget *parent) } }); - this->connections_.managedConnect(windows->miscUpdate, [this] { - bool needSizeAdjustment = false; - for (int i = 0; i < this->visibleEntries_; ++i) - { - auto entry = this->entryAt(i); - if (entry->hasImage() && entry->attemptRefresh()) + this->connections_.managedConnect( + windows->layoutRequested, [this](auto *chan) { + if (chan != nullptr || !this->isVisible()) { - bool successfullyUpdated = entry->refreshPixmap(); - needSizeAdjustment |= successfullyUpdated; + return; } - } - if (needSizeAdjustment) - { - this->adjustSize(); - } - }); + bool needSizeAdjustment = false; + for (int i = 0; i < this->visibleEntries_; ++i) + { + auto *entry = this->entryAt(i); + if (entry->hasImage() && entry->attemptRefresh()) + { + bool successfullyUpdated = entry->refreshPixmap(); + needSizeAdjustment |= successfullyUpdated; + } + } + + if (needSizeAdjustment) + { + this->adjustSize(); + } + }); } void TooltipWidget::setOne(const TooltipEntry &entry, TooltipStyle style) @@ -101,6 +112,7 @@ void TooltipWidget::set(const std::vector &entries, entryWidget->setImageScale(entry.customWidth, entry.customHeight); } } + this->adjustSize(); } void TooltipWidget::setVisibleEntries(int n)