summary refs log tree commit diff
path: root/src/CommunitiesListItem.cc
diff options
context:
space:
mode:
authorMax Sandholm <max@sandholm.org>2018-01-09 15:07:32 +0200
committermujx <mujx@users.noreply.github.com>2018-01-09 15:07:32 +0200
commit312df6f3bbcba0ad502864b13f9c51b4854ea2ce (patch)
treed43396836cb2ba21b13f218a6d25a7c82049338b /src/CommunitiesListItem.cc
parentMake usernames in timeline less bold (diff)
downloadnheko-312df6f3bbcba0ad502864b13f9c51b4854ea2ce.tar.xz
Communities (#195)
Diffstat (limited to 'src/CommunitiesListItem.cc')
-rw-r--r--src/CommunitiesListItem.cc200
1 files changed, 200 insertions, 0 deletions
diff --git a/src/CommunitiesListItem.cc b/src/CommunitiesListItem.cc
new file mode 100644

index 00000000..a7789df7 --- /dev/null +++ b/src/CommunitiesListItem.cc
@@ -0,0 +1,200 @@ +#include "CommunitiesListItem.h" + +CommunitiesListItem::CommunitiesListItem(QSharedPointer<Community> community, + QString community_id, + QWidget *parent) + : QWidget(parent) + , community_(community) + , communityId_(community_id) +{ + // menu_ = new Menu(this); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + setFixedHeight(ui::sidebar::CommunitiesSidebarSize); + setFixedWidth(ui::sidebar::CommunitiesSidebarSize); +} + +CommunitiesListItem::~CommunitiesListItem() {} + +void +CommunitiesListItem::setCommunity(QSharedPointer<Community> community) +{ + community_ = community; +} + +void +CommunitiesListItem::setPressedState(bool state) +{ + if (isPressed_ != state) { + isPressed_ = state; + update(); + } +} + +void +CommunitiesListItem::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::RightButton) { + QWidget::mousePressEvent(event); + return; + } + + emit clicked(communityId_); + + setPressedState(true); +} + +void +CommunitiesListItem::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + QPainter p(this); + p.setRenderHint(QPainter::TextAntialiasing); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.setRenderHint(QPainter::Antialiasing); + + if (isPressed_) + p.fillRect(rect(), highlightedBackgroundColor_); + else if (underMouse()) + p.fillRect(rect(), hoverBackgroundColor_); + else + p.fillRect(rect(), backgroundColor_); + + QFont font; + font.setPixelSize(conf::fontSize); + + p.setPen(QColor("#333")); + + QRect avatarRegion((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize); + + font.setBold(false); + p.setPen(Qt::NoPen); + + // We using the first letter of room's name. + if (communityAvatar_.isNull()) { + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor("#eee"); + + p.setPen(Qt::NoPen); + p.setBrush(brush); + + p.drawEllipse(avatarRegion.center(), IconSize / 2, IconSize / 2); + + font.setPixelSize(conf::roomlist::fonts::bubble); + p.setFont(font); + p.setPen(QColor("#000")); + p.setBrush(Qt::NoBrush); + p.drawText( + avatarRegion.translated(0, -1), Qt::AlignCenter, QChar(community_->getName()[0])); + } else { + p.save(); + + QPainterPath path; + path.addEllipse( + (width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize); + p.setClipPath(path); + + p.drawPixmap(avatarRegion, communityAvatar_); + p.restore(); + } + + // TODO: Discord-style community ping counts? + /*if (unreadMsgCount_ > 0) { + QColor textColor("white"); + QColor backgroundColor("#38A3D8"); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor(backgroundColor); + + if (isPressed_) + brush.setColor(textColor); + + QFont unreadCountFont; + unreadCountFont.setPixelSize(conf::roomlist::fonts::badge); + unreadCountFont.setBold(true); + + p.setBrush(brush); + p.setPen(Qt::NoPen); + p.setFont(unreadCountFont); + + int diameter = 20; + + QRectF r( + width() - diameter - 5, height() - diameter - 5, diameter, diameter); + + p.setPen(Qt::NoPen); + p.drawEllipse(r); + + p.setPen(QPen(textColor)); + + if (isPressed_) + p.setPen(QPen(backgroundColor)); + + p.setBrush(Qt::NoBrush); + p.drawText( + r.translated(0, -0.5), Qt::AlignCenter, QString::number(unreadMsgCount_)); + }*/ +} + +void +CommunitiesListItem::contextMenuEvent(QContextMenuEvent *event) +{ + Q_UNUSED(event); + + // menu_->popup(event->globalPos()); +} + +WorldCommunityListItem::WorldCommunityListItem(QWidget *parent) + : CommunitiesListItem(QSharedPointer<Community>(), "", parent) +{} + +WorldCommunityListItem::~WorldCommunityListItem() {} + +void +WorldCommunityListItem::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::RightButton) { + QWidget::mousePressEvent(event); + return; + } + + emit CommunitiesListItem::clicked("world"); + + setPressedState(true); +} + +void +WorldCommunityListItem::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + static QPixmap worldIcon(":/icons/icons/ui/world.png"); + + QPainter p(this); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.setRenderHint(QPainter::Antialiasing); + + if (isPressed()) + p.fillRect(rect(), highlightedBackgroundColor_); + else if (underMouse()) + p.fillRect(rect(), hoverBackgroundColor_); + else + p.fillRect(rect(), backgroundColor_); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor("#FFFFFF"); + + p.setPen(Qt::NoPen); + p.setBrush(brush); + + QRect avatarRegion((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize); + p.drawEllipse(avatarRegion.center(), IconSize / 2, IconSize / 2); + QPainterPath path; + path.addEllipse((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize); + p.setClipPath(path); + + p.drawPixmap(avatarRegion, worldIcon); +}