#include #include #include #include #include #include #include #include "Config.h" #include "Utils.h" #include "Avatar.h" #include "AvatarProvider.h" #include "dialogs/ReadReceipts.h" #include "timeline/TimelineViewManager.h" using namespace dialogs; ReceiptItem::ReceiptItem(QWidget *parent, const QString &user_id, uint64_t timestamp) : QWidget(parent) { topLayout_ = new QHBoxLayout(this); topLayout_->setMargin(0); textLayout_ = new QVBoxLayout; textLayout_->setMargin(0); textLayout_->setSpacing(5); QFont font; font.setPixelSize(conf::receipts::font); auto displayName = TimelineViewManager::displayName(user_id); avatar_ = new Avatar(this); avatar_->setSize(40); avatar_->setLetter(utils::firstChar(displayName)); // If it's a matrix id we use the second letter. if (displayName.size() > 1 && displayName.at(0) == '@') avatar_->setLetter(QChar(displayName.at(1))); userName_ = new QLabel(displayName, this); userName_->setFont(font); timestamp_ = new QLabel(dateFormat(QDateTime::fromMSecsSinceEpoch(timestamp)), this); timestamp_->setFont(font); textLayout_->addWidget(userName_); textLayout_->addWidget(timestamp_); topLayout_->addWidget(avatar_); topLayout_->addLayout(textLayout_, 1); AvatarProvider::resolve(user_id, [this](const QImage &img) { avatar_->setImage(img); }); } QString ReceiptItem::dateFormat(const QDateTime &then) const { auto now = QDateTime::currentDateTime(); auto days = then.daysTo(now); if (days == 0) return QString("Today %1").arg(then.toString("HH:mm")); else if (days < 2) return QString("Yesterday %1").arg(then.toString("HH:mm")); else if (days < 365) return then.toString("dd/MM HH:mm"); return then.toString("dd/MM/yy"); } ReadReceipts::ReadReceipts(QWidget *parent) : QFrame(parent) { setMaximumSize(400, 350); auto layout = new QVBoxLayout(this); layout->setSpacing(30); layout->setMargin(20); userList_ = new QListWidget; userList_->setFrameStyle(QFrame::NoFrame); userList_->setSelectionMode(QAbstractItemView::NoSelection); userList_->setAttribute(Qt::WA_MacShowFocusRect, 0); userList_->setSpacing(5); QFont font; font.setPixelSize(conf::headerFontSize); topLabel_ = new QLabel(tr("Read receipts"), this); topLabel_->setAlignment(Qt::AlignCenter); topLabel_->setFont(font); layout->addWidget(topLabel_); layout->addWidget(userList_); } void ReadReceipts::addUsers(const std::multimap> &receipts) { // We want to remove any previous items that have been set. userList_->clear(); for (auto receipt : receipts) { auto user = new ReceiptItem(this, QString::fromStdString(receipt.second), receipt.first); auto item = new QListWidgetItem(userList_); item->setSizeHint(user->minimumSizeHint()); item->setFlags(Qt::NoItemFlags); item->setTextAlignment(Qt::AlignCenter); userList_->setItemWidget(item, user); } } void ReadReceipts::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }