From fe23f4ca564ad491fa74109244a3be07ab6a0c1c Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 4 Oct 2026 14:54:58 +0200 Subject: [PATCH] Add invitation action to desktop member rows --- tools/chatgui/src/accountdelegate.cpp | 31 ++++++++++++++++++++++++++- tools/chatgui/src/accountdelegate.h | 7 ++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/tools/chatgui/src/accountdelegate.cpp b/tools/chatgui/src/accountdelegate.cpp index 05f5df31..245c900e 100644 --- a/tools/chatgui/src/accountdelegate.cpp +++ b/tools/chatgui/src/accountdelegate.cpp @@ -3,6 +3,11 @@ #include "memberlistmodel.h" #include #include +#include + +static QRect inviteButtonRect(const QRect& row) { + return QRect(row.right() - 31, row.center().y() - 14, 28, 28); +} AccountDelegate::AccountDelegate(QObject *parent) : QStyledItemDelegate(parent) {} @@ -26,7 +31,8 @@ void AccountDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio icon.paint(painter, option.rect.left() + margin, option.rect.top() + (option.rect.height() - iconSz) / 2, iconSz, iconSz); const int x = option.rect.left() + iconSz + margin * 3; - const int w = option.rect.right() - x - margin; + const bool canInvite = !index.data(Qt::UserRole + 2).toBool(); + const int w = option.rect.right() - x - margin - (canInvite ? 32 : 0); const int yMid = option.rect.top() + option.rect.height() / 2; uint8_t flags = (uint8_t)(index.data(Qt::UserRole + 3).toInt() & 0xFF); @@ -69,9 +75,32 @@ void AccountDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio painter->drawText(QRect(flagX, yMid + 2, w - (flagX - x), option.rect.bottom() - yMid - 2), Qt::AlignLeft | Qt::AlignTop, sub); + if (canInvite) { + QFont plusFont = nameFont; plusFont.setPixelSize(22); plusFont.setStrikeOut(false); + painter->setFont(plusFont); + painter->setPen(option.palette.color(QPalette::Link)); + painter->drawText(inviteButtonRect(option.rect), Qt::AlignCenter, QStringLiteral("+")); + } painter->restore(); } +bool AccountDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, + const QModelIndex& index) { + Q_UNUSED(model); + if (index.data(Qt::UserRole + 2).toBool()) return false; + if (event->type() != QEvent::MouseButtonPress && event->type() != QEvent::MouseButtonRelease && + event->type() != QEvent::MouseButtonDblClick) return false; + auto* mouse = static_cast(event); + if (mouse->button() != Qt::LeftButton) return false; + const bool inside = inviteButtonRect(option.rect).contains(mouse->pos()); + if (event->type() == QEvent::MouseButtonPress) { m_invitePress = inside ? index : QModelIndex(); return inside; } + if (event->type() == QEvent::MouseButtonDblClick) return inside; + const bool activate = inside && m_invitePress == index; + m_invitePress = QPersistentModelIndex(); + if (activate) emit inviteRequested(index); + return activate; +} + QSize AccountDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { (void)option; (void)index; diff --git a/tools/chatgui/src/accountdelegate.h b/tools/chatgui/src/accountdelegate.h index 06a84a3b..47a7a28e 100644 --- a/tools/chatgui/src/accountdelegate.h +++ b/tools/chatgui/src/accountdelegate.h @@ -2,6 +2,7 @@ #pragma once #include +#include class AccountDelegate : public QStyledItemDelegate { Q_OBJECT @@ -12,4 +13,10 @@ public: const QModelIndex &index) const override; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, + const QModelIndex& index) override; +signals: + void inviteRequested(const QModelIndex& index); +private: + QPersistentModelIndex m_invitePress; };