matrixion/src/dialogs/ReadReceipts.cpp

180 lines
5.7 KiB
C++
Raw Normal View History

2021-03-05 02:35:15 +03:00
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
2018-01-03 19:05:49 +03:00
#include <QDebug>
#include <QIcon>
2020-05-25 14:03:49 +03:00
#include <QLabel>
2018-01-03 19:05:49 +03:00
#include <QListWidgetItem>
#include <QPainter>
2018-09-21 13:56:39 +03:00
#include <QPushButton>
2018-09-19 22:42:26 +03:00
#include <QShortcut>
2018-01-03 19:05:49 +03:00
#include <QStyleOption>
#include <QTimer>
#include <QVBoxLayout>
2018-07-17 16:37:25 +03:00
#include "dialogs/ReadReceipts.h"
2018-01-03 19:05:49 +03:00
#include "AvatarProvider.h"
2018-04-21 16:34:50 +03:00
#include "Cache.h"
2018-07-17 16:37:25 +03:00
#include "ChatPage.h"
#include "Config.h"
#include "Utils.h"
#include "ui/Avatar.h"
2018-01-03 19:05:49 +03:00
using namespace dialogs;
2018-04-21 16:34:50 +03:00
ReceiptItem::ReceiptItem(QWidget *parent,
const QString &user_id,
uint64_t timestamp,
const QString &room_id)
2018-01-03 19:05:49 +03:00
: QWidget(parent)
{
topLayout_ = new QHBoxLayout(this);
topLayout_->setMargin(0);
textLayout_ = new QVBoxLayout;
textLayout_->setMargin(0);
textLayout_->setSpacing(conf::modals::TEXT_SPACING);
2018-01-03 19:05:49 +03:00
QFont nameFont;
nameFont.setPointSizeF(nameFont.pointSizeF() * 1.1);
2018-01-03 19:05:49 +03:00
2019-12-15 04:56:04 +03:00
auto displayName = cache::displayName(room_id, user_id);
2018-01-03 19:05:49 +03:00
avatar_ = new Avatar(this, 44);
avatar_->setLetter(utils::firstChar(displayName));
2018-01-03 19:05:49 +03:00
// 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(nameFont);
2018-01-03 19:05:49 +03:00
timestamp_ = new QLabel(dateFormat(QDateTime::fromMSecsSinceEpoch(timestamp)), this);
textLayout_->addWidget(userName_);
textLayout_->addWidget(timestamp_);
topLayout_->addWidget(avatar_);
topLayout_->addLayout(textLayout_, 1);
avatar_->setImage(ChatPage::instance()->currentRoom(), user_id);
2018-01-03 19:05:49 +03:00
}
2018-09-19 22:42:26 +03:00
void
ReceiptItem::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
2018-01-03 19:05:49 +03:00
QString
ReceiptItem::dateFormat(const QDateTime &then) const
{
auto now = QDateTime::currentDateTime();
auto days = then.daysTo(now);
if (days == 0)
2020-06-06 00:34:00 +03:00
return tr("Today %1")
.arg(QLocale::system().toString(then.time(), QLocale::ShortFormat));
2018-01-03 19:05:49 +03:00
else if (days < 2)
2020-06-06 00:34:00 +03:00
return tr("Yesterday %1")
.arg(QLocale::system().toString(then.time(), QLocale::ShortFormat));
else if (days < 7)
return QString("%1 %2")
.arg(then.toString("dddd"))
2020-06-06 00:34:00 +03:00
.arg(QLocale::system().toString(then.time(), QLocale::ShortFormat));
2018-01-03 19:05:49 +03:00
2020-06-06 00:34:00 +03:00
return QLocale::system().toString(then.time(), QLocale::ShortFormat);
2018-01-03 19:05:49 +03:00
}
ReadReceipts::ReadReceipts(QWidget *parent)
: QFrame(parent)
{
2018-09-19 22:42:26 +03:00
setAutoFillBackground(true);
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);
setAttribute(Qt::WA_DeleteOnClose, true);
2018-01-03 19:05:49 +03:00
auto layout = new QVBoxLayout(this);
layout->setSpacing(conf::modals::WIDGET_SPACING);
layout->setMargin(conf::modals::WIDGET_MARGIN);
2018-01-03 19:05:49 +03:00
userList_ = new QListWidget;
userList_->setFrameStyle(QFrame::NoFrame);
userList_->setSelectionMode(QAbstractItemView::NoSelection);
userList_->setSpacing(conf::modals::TEXT_SPACING);
2018-01-03 19:05:49 +03:00
2018-09-30 13:24:36 +03:00
QFont largeFont;
largeFont.setPointSizeF(largeFont.pointSizeF() * 1.5);
2018-08-11 17:55:44 +03:00
setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
setMinimumHeight(userList_->sizeHint().height() * 2);
setMinimumWidth(std::max(userList_->sizeHint().width() + 4 * conf::modals::WIDGET_MARGIN,
2018-09-30 13:24:36 +03:00
QFontMetrics(largeFont).averageCharWidth() * 30 -
2018-08-11 17:55:44 +03:00
2 * conf::modals::WIDGET_MARGIN));
2018-01-03 19:05:49 +03:00
QFont font;
font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO);
2018-01-03 19:05:49 +03:00
topLabel_ = new QLabel(tr("Read receipts"), this);
topLabel_->setAlignment(Qt::AlignCenter);
topLabel_->setFont(font);
2018-09-21 13:56:39 +03:00
auto okBtn = new QPushButton(tr("Close"), this);
auto buttonLayout = new QHBoxLayout();
buttonLayout->setSpacing(15);
buttonLayout->addStretch(1);
buttonLayout->addWidget(okBtn);
2018-01-03 19:05:49 +03:00
layout->addWidget(topLabel_);
layout->addWidget(userList_);
2018-09-21 13:56:39 +03:00
layout->addLayout(buttonLayout);
2018-09-19 22:42:26 +03:00
auto closeShortcut = new QShortcut(QKeySequence(QKeySequence::Cancel), this);
2018-09-19 22:42:26 +03:00
connect(closeShortcut, &QShortcut::activated, this, &ReadReceipts::close);
2018-09-21 13:56:39 +03:00
connect(okBtn, &QPushButton::clicked, this, &ReadReceipts::close);
2018-01-03 19:05:49 +03:00
}
void
ReadReceipts::addUsers(const std::multimap<uint64_t, std::string, std::greater<uint64_t>> &receipts)
2018-01-03 19:05:49 +03:00
{
// We want to remove any previous items that have been set.
userList_->clear();
2018-02-28 13:12:07 +03:00
for (const auto &receipt : receipts) {
2018-04-21 16:34:50 +03:00
auto user = new ReceiptItem(this,
QString::fromStdString(receipt.second),
receipt.first,
ChatPage::instance()->currentRoom());
2018-01-03 19:05:49 +03:00
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);
}
2020-05-25 14:03:49 +03:00
void
ReadReceipts::hideEvent(QHideEvent *event)
{
userList_->clear();
QFrame::hideEvent(event);
}