|
|
|
|
@ -5,27 +5,6 @@
|
|
|
|
|
ChannelDelegate::ChannelDelegate(QObject *parent) |
|
|
|
|
: QStyledItemDelegate(parent) {} |
|
|
|
|
|
|
|
|
|
QRect ChannelDelegate::inviteButtonRect(const QRect &itemRect) { |
|
|
|
|
const int margin = 6; |
|
|
|
|
return QRect(itemRect.right() - margin - InviteBtnSize, |
|
|
|
|
itemRect.top() + margin, |
|
|
|
|
InviteBtnSize, InviteBtnSize); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QRect ChannelDelegate::inviteByLinkButtonRect(const QRect &itemRect) { |
|
|
|
|
const int margin = 6; |
|
|
|
|
return QRect(itemRect.right() - margin - InviteBtnSize * 2 - InviteBtnGap, |
|
|
|
|
itemRect.top() + margin, |
|
|
|
|
InviteBtnSize, InviteBtnSize); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QRect ChannelDelegate::settingsButtonRect(const QRect &itemRect) { |
|
|
|
|
const int margin = 6; |
|
|
|
|
return QRect(itemRect.right() - margin - InviteBtnSize * 3 - InviteBtnGap * 2, |
|
|
|
|
itemRect.top() + margin, |
|
|
|
|
InviteBtnSize, InviteBtnSize); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ChannelDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, |
|
|
|
|
const QModelIndex &index) const { |
|
|
|
|
painter->save(); |
|
|
|
|
@ -115,7 +94,11 @@ void ChannelDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio
|
|
|
|
|
|
|
|
|
|
QRect nameRect = textRect; |
|
|
|
|
nameRect.setHeight(QFontMetrics(nameFont).height()); |
|
|
|
|
nameRect.setRight(nameRect.right() - InviteBtnSize * 3 - InviteBtnGap * 2 - 4); |
|
|
|
|
int unread = index.data(ChannelUnreadCountRole).toInt(); |
|
|
|
|
QString unreadText = unread > 99 ? QStringLiteral("99+") : QString::number(unread); |
|
|
|
|
QFont unreadFont = option.font; unreadFont.setBold(true); unreadFont.setPixelSize(11); |
|
|
|
|
int unreadWidth = qMax(18, QFontMetrics(unreadFont).horizontalAdvance(unreadText) + 8); |
|
|
|
|
if (unread > 0) nameRect.setRight(nameRect.right() - unreadWidth - 6); |
|
|
|
|
painter->drawText(nameRect, Qt::AlignLeft | Qt::AlignTop, |
|
|
|
|
painter->fontMetrics().elidedText(name, Qt::ElideRight, nameRect.width())); |
|
|
|
|
|
|
|
|
|
@ -159,77 +142,18 @@ void ChannelDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ── unread count badge (right of channel name) ── */ |
|
|
|
|
int unread = index.data(ChannelUnreadCountRole).toInt(); |
|
|
|
|
if (unread > 0) { |
|
|
|
|
QString unreadText = unread > 99 ? QStringLiteral("99+") : QString::number(unread); |
|
|
|
|
QFont badgeFont = option.font; |
|
|
|
|
badgeFont.setBold(true); |
|
|
|
|
badgeFont.setPixelSize(11); |
|
|
|
|
QFontMetrics badgeFm(badgeFont); |
|
|
|
|
int textW = badgeFm.horizontalAdvance(unreadText) + 8; |
|
|
|
|
int badgeH = 18; |
|
|
|
|
if (textW < badgeH) textW = badgeH; |
|
|
|
|
QRect badgeRect(textRect.right() - textW, nameRect.top(), |
|
|
|
|
textW, badgeH); |
|
|
|
|
QRect badgeRect(textRect.right() - unreadWidth, nameRect.top(), unreadWidth, badgeH); |
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing); |
|
|
|
|
painter->setBrush(QColor("#E53935")); |
|
|
|
|
painter->setPen(Qt::NoPen); |
|
|
|
|
painter->drawRoundedRect(badgeRect, badgeH / 2, badgeH / 2); |
|
|
|
|
painter->setFont(badgeFont); |
|
|
|
|
painter->setFont(unreadFont); |
|
|
|
|
painter->setPen(Qt::white); |
|
|
|
|
painter->drawText(badgeRect, Qt::AlignCenter, unreadText); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ── invite plus button (top-right) ── */ |
|
|
|
|
QRect plusRect = inviteButtonRect(option.rect); |
|
|
|
|
bool plusHovered = index.data(ChannelInviteBtnHoveredRole).toInt() != 0; |
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing); |
|
|
|
|
QColor plusFill = plusHovered ? QColor(0x4A, 0xA4, 0xF0) : QColor(0x33, 0x90, 0xEC); |
|
|
|
|
painter->setBrush(plusFill); |
|
|
|
|
painter->setPen(Qt::NoPen); |
|
|
|
|
painter->drawEllipse(plusRect); |
|
|
|
|
painter->setPen(QPen(Qt::white, 2)); |
|
|
|
|
painter->drawLine(plusRect.center().x(), plusRect.top() + 5, |
|
|
|
|
plusRect.center().x(), plusRect.bottom() - 5); |
|
|
|
|
painter->drawLine(plusRect.left() + 5, plusRect.center().y(), |
|
|
|
|
plusRect.right() - 5, plusRect.center().y()); |
|
|
|
|
|
|
|
|
|
/* ── invite-by-link button (left of plus, orange square with arrow) ── */ |
|
|
|
|
QRect invRect = inviteByLinkButtonRect(option.rect); |
|
|
|
|
bool invHovered = index.data(ChannelInviteByLinkBtnHoveredRole).toInt() != 0; |
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing); |
|
|
|
|
QColor invFill = invHovered ? QColor(0xF0, 0x90, 0x30) : QColor(0xE6, 0x7E, 0x22); |
|
|
|
|
painter->setBrush(invFill); |
|
|
|
|
painter->setPen(Qt::NoPen); |
|
|
|
|
painter->drawRoundedRect(invRect, 3, 3); |
|
|
|
|
painter->setPen(QPen(Qt::white, 1.5)); |
|
|
|
|
/* arrow: ← */ |
|
|
|
|
int cx = invRect.center().x(), cy = invRect.center().y(); |
|
|
|
|
int dx = 3; |
|
|
|
|
painter->drawLine(cx + dx, cy - 3, cx - dx, cy); |
|
|
|
|
painter->drawLine(cx + dx, cy + 3, cx - dx, cy); |
|
|
|
|
painter->drawLine(cx + dx + 1, cy, cx + dx + 1, cy - 3 + 1); |
|
|
|
|
painter->drawLine(cx + dx + 1, cy, cx + dx + 1, cy + 3 - 1); |
|
|
|
|
|
|
|
|
|
/* ── settings gear (left of invite-by-link button) ── */ |
|
|
|
|
QRect gearRect = settingsButtonRect(option.rect); |
|
|
|
|
bool gearHovered = index.data(ChannelSettingsBtnHoveredRole).toInt() != 0; |
|
|
|
|
QColor gearColor = gearHovered ? QColor("#3390EC") : QColor("#555"); |
|
|
|
|
painter->setPen(QPen(gearColor, 2)); |
|
|
|
|
painter->setBrush(Qt::NoBrush); |
|
|
|
|
int gr = 5; |
|
|
|
|
painter->drawEllipse(gearRect.center(), gr, gr); |
|
|
|
|
painter->drawEllipse(gearRect.center(), gr / 2, gr / 2); |
|
|
|
|
int gcx = gearRect.center().x(), gcy = gearRect.center().y(); |
|
|
|
|
painter->drawLine(gcx, gcy - gr, gcx, gcy - gr + 1); |
|
|
|
|
painter->drawLine(gcx, gcy + gr, gcx, gcy + gr - 1); |
|
|
|
|
painter->drawLine(gcx - gr, gcy, gcx - gr + 1, gcy); |
|
|
|
|
painter->drawLine(gcx + gr, gcy, gcx + gr - 1, gcy); |
|
|
|
|
painter->drawLine(gcx - 3, gcy - 4, gcx - 3, gcy - 5); |
|
|
|
|
painter->drawLine(gcx + 3, gcy + 4, gcx + 3, gcy + 5); |
|
|
|
|
painter->drawLine(gcx - 4, gcy - 3, gcx - 5, gcy - 3); |
|
|
|
|
painter->drawLine(gcx + 4, gcy + 3, gcx + 5, gcy + 3); |
|
|
|
|
|
|
|
|
|
painter->restore(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|