Skip to content
Snippets Groups Projects
CommunitiesListItem.cpp 4.25 KiB
Newer Older
  • Learn to ignore specific revisions
  • Max Sandholm's avatar
    Max Sandholm committed
    #include "CommunitiesListItem.h"
    
    #include "Utils.h"
    
    #include "ui/Painter.h"
    #include "ui/Ripple.h"
    #include "ui/RippleOverlay.h"
    
    Max Sandholm's avatar
    Max Sandholm committed
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    CommunitiesListItem::CommunitiesListItem(QString group_id, QWidget *parent)
    
    Max Sandholm's avatar
    Max Sandholm committed
      : QWidget(parent)
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
      , groupId_(group_id)
    
    Max Sandholm's avatar
    Max Sandholm committed
    {
    
            setMouseTracking(true);
            setAttribute(Qt::WA_Hover);
    
    Max Sandholm's avatar
    Max Sandholm committed
    
    
            QPainterPath path;
            path.addRect(0, 0, parent->width(), height());
            rippleOverlay_ = new RippleOverlay(this);
            rippleOverlay_->setClipPath(path);
            rippleOverlay_->setClipping(true);
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            if (groupId_ == "world")
    
                    avatar_ = QPixmap(":/icons/icons/ui/world.png");
    
            else if (groupId_ == "tag:m.favourite")
                    avatar_ = QPixmap(":/icons/icons/ui/star.png");
            else if (groupId_ == "tag:m.lowpriority")
                    avatar_ = QPixmap(":/icons/icons/ui/lowprio.png");
            else if (groupId_.startsWith("tag:"))
                    avatar_ = QPixmap(":/icons/icons/ui/tag.png");
    
            updateTooltip();
    }
    
    void
    CommunitiesListItem::setName(QString name)
    {
            name_ = name;
            updateTooltip();
    
    Max Sandholm's avatar
    Max Sandholm committed
    }
    
    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;
            }
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            emit clicked(groupId_);
    
    Max Sandholm's avatar
    Max Sandholm committed
    
            setPressedState(true);
    
    
            QPoint pos           = event->pos();
            qreal radiusEndValue = static_cast<qreal>(width()) / 3;
    
            auto ripple = new Ripple(pos);
            ripple->setRadiusEndValue(radiusEndValue);
            ripple->setOpacityStartValue(0.15);
            ripple->setColor("white");
            ripple->radiusAnimation()->setDuration(200);
            ripple->opacityAnimation()->setDuration(400);
            rippleOverlay_->addRipple(ripple);
    
    Max Sandholm's avatar
    Max Sandholm committed
    }
    
    void
    
    CommunitiesListItem::paintEvent(QPaintEvent *)
    
    Max Sandholm's avatar
    Max Sandholm committed
    {
    
            Painter p(this);
            PainterHighQualityEnabler hq(p);
    
    Max Sandholm's avatar
    Max Sandholm committed
    
            if (isPressed_)
                    p.fillRect(rect(), highlightedBackgroundColor_);
            else if (underMouse())
                    p.fillRect(rect(), hoverBackgroundColor_);
            else
                    p.fillRect(rect(), backgroundColor_);
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            if (avatar_.isNull()) {
    
                    font.setPointSizeF(font.pointSizeF() * 1.3);
    
    Max Sandholm's avatar
    Max Sandholm committed
                    p.setFont(font);
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
                    p.drawLetterAvatar(utils::firstChar(resolveName()),
    
                                       avatarFgColor_,
                                       avatarBgColor_,
                                       width(),
                                       height(),
                                       IconSize);
    
    Max Sandholm's avatar
    Max Sandholm committed
            } else {
                    p.save();
    
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
                    p.drawAvatar(avatar_, width(), height(), IconSize);
    
    Max Sandholm's avatar
    Max Sandholm committed
                    p.restore();
            }
    }
    
    
    void
    CommunitiesListItem::setAvatar(const QImage &img)
    {
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            avatar_ = utils::scaleImageToPixmap(img, IconSize);
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
    
    QString
    CommunitiesListItem::resolveName() const
    {
            if (!name_.isEmpty())
                    return name_;
    
            if (groupId_.startsWith("tag:"))
                    return groupId_.right(groupId_.size() - strlen("tag:"));
    
    Konstantinos Sideris's avatar
    Konstantinos Sideris committed
            if (!groupId_.startsWith("+"))
                    return QString("Group"); // Group with no name or id.
    
            // Extract the localpart of the group.
            auto firstPart = groupId_.split(':').at(0);
            return firstPart.right(firstPart.size() - 1);
    }
    
    
    void
    CommunitiesListItem::updateTooltip()
    {
            if (groupId_ == "world")
                    setToolTip(tr("All rooms"));
            else if (is_tag()) {
                    QString tag = groupId_.right(groupId_.size() - strlen("tag:"));
                    if (tag == "m.favourite")
                            setToolTip(tr("Favourite rooms"));
                    else if (tag == "m.lowpriority")
                            setToolTip(tr("Low priority rooms"));
                    else if (tag.startsWith("u."))
                            setToolTip(tag.right(tag.size() - 2) + tr(" (tag)"));
                    else
                            setToolTip(tag + tr(" (tag)"));
            } else {
                    QString name = resolveName();
                    setToolTip(name + tr(" (community)"));
            }