[network/ruqola/2.8] src/widgets: Fix icon position when scale != 100

Laurent Montel <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit d13a410bb1a46ac1f91f691105e3c6c9b687c6a5 by Laurent Montel.
Committed on 31/07/2026 at 11:43.
Pushed by mlaurent into branch '2.8'.

Fix icon position when scale != 100

(cherry picked from commit 0db0d28f289ef30f1585b5b65eb174b99c51b191)

M  +10   -8    src/widgets/common/teamroomcompletiondelegate.cpp
M  +12   -11   src/widgets/common/userandchannelcompletiondelegate.cpp
M  +12   -11   src/widgets/common/usercompletiondelegate.cpp
M  +12   -11   src/widgets/common/usersforroommodeldelegate.cpp
M  +10   -8    src/widgets/dialogs/showbannedusersdelegate.cpp
M  +10   -8    src/widgets/teams/teamchannelsdelegate.cpp

https://invent.kde.org/network/ruqola/-/commit/d13a410bb1a46ac1f91f691105e3c6c9b687c6a5

diff --git a/src/widgets/common/teamroomcompletiondelegate.cpp b/src/widgets/common/teamroomcompletiondelegate.cpp
index 18e43385a0..5c37cc5d8e 100644
--- a/src/widgets/common/teamroomcompletiondelegate.cpp
+++ b/src/widgets/common/teamroomcompletiondelegate.cpp
@@ -35,17 +35,19 @@ void TeamRoomCompletionDelegate::paint(QPainter *painter, const QStyleOptionView
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
-    QFontMetrics fontMetrics(boldFont);
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(TeamRoomCompleterModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
     const QString name = index.data(TeamRoomCompleterModel::TeamName).toString();
@@ -61,7 +63,7 @@ void TeamRoomCompletionDelegate::setRocketChatAccount(RocketChatAccount *newRock
 QSize TeamRoomCompletionDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 #include "moc_teamroomcompletiondelegate.cpp"
diff --git a/src/widgets/common/userandchannelcompletiondelegate.cpp b/src/widgets/common/userandchannelcompletiondelegate.cpp
index 08ed825422..9a6f58a7ba 100644
--- a/src/widgets/common/userandchannelcompletiondelegate.cpp
+++ b/src/widgets/common/userandchannelcompletiondelegate.cpp
@@ -39,29 +39,30 @@ void UserAndChannelCompletionDelegate::paint(QPainter *painter, const QStyleOpti
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
+    QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(InputCompleterModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
     const QIcon iconStatus = index.data(InputCompleterModel::IconStatus).value<QIcon>();
     if (!iconStatus.isNull()) {
-        const QRect displayRect(margin + xPos, option.rect.y(), option.rect.height(), option.rect.height());
-        drawDecoration(painter, option, displayRect, iconStatus.pixmap(option.rect.height(), option.rect.height()));
-        xPos += margin + option.rect.height();
+        painter->drawPixmap(margin + xPos, iconY, iconSize, iconSize, iconStatus.pixmap(iconSize, iconSize));
+        xPos += margin + iconSize;
     }
 
-    QFontMetrics fontMetrics(boldFont);
     const QString name = index.data(InputCompleterModel::DisplayName).toString();
     const QString userName = index.data(InputCompleterModel::UserName).toString();
     int nameWidth = -1;
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
     if (name.isEmpty()) {
         nameWidth = fontMetrics.horizontalAdvance(userName);
         painter->drawText(xPos + margin, defaultCharHeight, userName);
@@ -107,7 +108,7 @@ void UserAndChannelCompletionDelegate::setRocketChatAccount(RocketChatAccount *n
 QSize UserAndChannelCompletionDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 #include "moc_userandchannelcompletiondelegate.cpp"
diff --git a/src/widgets/common/usercompletiondelegate.cpp b/src/widgets/common/usercompletiondelegate.cpp
index 9c1c74e1d1..3c0d140326 100644
--- a/src/widgets/common/usercompletiondelegate.cpp
+++ b/src/widgets/common/usercompletiondelegate.cpp
@@ -37,28 +37,29 @@ void UserCompletionDelegate::paint(QPainter *painter, const QStyleOptionViewItem
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
+    QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(UserCompleterModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
     const QIcon iconStatus = index.data(UserCompleterModel::UserIconStatus).value<QIcon>();
     if (!iconStatus.isNull()) {
-        const QRect displayRect(margin + xPos, option.rect.y(), option.rect.height(), option.rect.height());
-        drawDecoration(painter, option, displayRect, iconStatus.pixmap(option.rect.height(), option.rect.height()));
-        xPos += margin + option.rect.height();
+        painter->drawPixmap(margin + xPos, iconY, iconSize, iconSize, iconStatus.pixmap(iconSize, iconSize));
+        xPos += margin + iconSize;
     }
 
-    QFontMetrics fontMetrics(boldFont);
     const QString name = index.data(UserCompleterModel::DisplayName).toString();
     const QString userName = index.data(UserCompleterModel::UserName).toString();
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
     if (name.isEmpty()) {
         painter->drawText(xPos + margin, defaultCharHeight, userName);
     } else {
@@ -81,7 +82,7 @@ void UserCompletionDelegate::setRocketChatAccount(RocketChatAccount *newRocketCh
 QSize UserCompletionDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 #include "moc_usercompletiondelegate.cpp"
diff --git a/src/widgets/common/usersforroommodeldelegate.cpp b/src/widgets/common/usersforroommodeldelegate.cpp
index dbde655f85..4acd4b267d 100644
--- a/src/widgets/common/usersforroommodeldelegate.cpp
+++ b/src/widgets/common/usersforroommodeldelegate.cpp
@@ -40,30 +40,31 @@ void UsersForRoomModelDelegate::paint(QPainter *painter, const QStyleOptionViewI
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
+    const QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(UsersForRoomModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
         // Add extra size even if we don't have avatar pix
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
     const QString iconStatusStr = index.data(UsersForRoomModel::IconStatus).toString();
     if (!iconStatusStr.isEmpty()) {
         const QIcon iconStatus = QIcon::fromTheme(iconStatusStr);
-        const QRect displayRect(margin + xPos, option.rect.y(), option.rect.height(), option.rect.height());
-        drawDecoration(painter, option, displayRect, iconStatus.pixmap(option.rect.height(), option.rect.height()));
-        xPos += margin + option.rect.height();
+        painter->drawPixmap(margin + xPos, iconY, iconSize, iconSize, iconStatus.pixmap(iconSize, iconSize));
+        xPos += margin + iconSize;
     }
 
-    const QFontMetrics fontMetrics(boldFont);
     const QString name = index.data(UsersForRoomModel::Name).toString();
     const QString userName = index.data(UsersForRoomModel::UserName).toString();
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
     if (name.isEmpty()) {
         painter->drawText(xPos + margin, defaultCharHeight, userName);
     } else {
@@ -86,7 +87,7 @@ void UsersForRoomModelDelegate::setRocketChatAccount(RocketChatAccount *newRocke
 QSize UsersForRoomModelDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 bool UsersForRoomModelDelegate::helpEvent(QHelpEvent *helpEvent, QAbstractItemView *view, const QStyleOptionViewItem &, const QModelIndex &index)
diff --git a/src/widgets/dialogs/showbannedusersdelegate.cpp b/src/widgets/dialogs/showbannedusersdelegate.cpp
index 8977e6a8e3..1e03d91456 100644
--- a/src/widgets/dialogs/showbannedusersdelegate.cpp
+++ b/src/widgets/dialogs/showbannedusersdelegate.cpp
@@ -35,22 +35,24 @@ void ShowBannedUsersDelegate::paint(QPainter *painter, const QStyleOptionViewIte
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
+    const QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(BannedUsersModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
         // Add extra size even if we don't have avatar pix
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
-    const QFontMetrics fontMetrics(boldFont);
     const QString name = index.data(BannedUsersModel::Name).toString();
     const QString userName = index.data(BannedUsersModel::UserName).toString();
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
     if (name.isEmpty()) {
         painter->drawText(xPos + margin, defaultCharHeight, userName);
     } else {
@@ -73,7 +75,7 @@ void ShowBannedUsersDelegate::setRocketChatAccount(RocketChatAccount *newRocketC
 QSize ShowBannedUsersDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 #include "moc_showbannedusersdelegate.cpp"
diff --git a/src/widgets/teams/teamchannelsdelegate.cpp b/src/widgets/teams/teamchannelsdelegate.cpp
index 4292a4fe0e..dba45d5bda 100644
--- a/src/widgets/teams/teamchannelsdelegate.cpp
+++ b/src/widgets/teams/teamchannelsdelegate.cpp
@@ -39,21 +39,23 @@ void TeamChannelsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
     boldFont.setBold(true);
     painter->setFont(boldFont);
 
-    int xPos = -1;
+    const QFontMetrics fontMetrics(boldFont);
+    const int iconSize = option.rect.height() - 4;
+    const int iconY = option.rect.y() + 2;
+
+    int xPos = 0;
     const Utils::AvatarInfo info = index.data(TeamRoomsModel::AvatarInfo).value<Utils::AvatarInfo>();
     if (info.isValid()) {
-        const QRect displayRect(margin, option.rect.y(), option.rect.height(), option.rect.height());
-        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, option.rect.height());
+        const QPixmap pix = mAvatarCacheManager->makeRoundedAvatarPixmap(option.widget, info, iconSize);
         if (!pix.isNull()) {
-            drawDecoration(painter, option, displayRect, pix);
+            painter->drawPixmap(margin, iconY, iconSize, iconSize, pix);
         }
         // Add extra size even if we don't have avatar pix
-        xPos = margin + option.rect.height();
+        xPos = margin + iconSize;
     }
 
-    const QFontMetrics fontMetrics(boldFont);
     const QString name = index.data(TeamRoomsModel::Name).toString();
-    const int defaultCharHeight = option.rect.y() + fontMetrics.ascent();
+    const int defaultCharHeight = option.rect.y() + (option.rect.height() - fontMetrics.height()) / 2 + fontMetrics.ascent();
     painter->drawText(xPos + margin, defaultCharHeight, name);
     painter->setFont(oldFont);
 }
@@ -61,7 +63,7 @@ void TeamChannelsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &
 QSize TeamChannelsDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
 {
     const QSize size = QItemDelegate::sizeHint(option, index);
-    return size + QSize(0, 4 * option.widget->devicePixelRatioF());
+    return size + QSize(0, 4);
 }
 
 #include "moc_teamchannelsdelegate.cpp"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.