nheko/src/CommunitiesList.cpp

196 lines
6.4 KiB
C++
Raw Normal View History

#include "CommunitiesList.h"
#include "Cache.h"
2018-07-17 15:37:25 +02:00
#include "Logging.h"
#include "MatrixClient.h"
2018-01-09 14:07:32 +01:00
#include <QLabel>
CommunitiesList::CommunitiesList(QWidget *parent)
2018-01-09 14:07:32 +01:00
: QWidget(parent)
{
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(1);
setSizePolicy(sizePolicy);
setStyleSheet("border-style: none;");
topLayout_ = new QVBoxLayout(this);
topLayout_->setSpacing(0);
topLayout_->setMargin(0);
setFixedWidth(ui::sidebar::CommunitiesSidebarSize);
scrollArea_ = new QScrollArea(this);
scrollArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea_->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
scrollArea_->setWidgetResizable(true);
scrollArea_->setAlignment(Qt::AlignLeading | Qt::AlignTop | Qt::AlignVCenter);
scrollAreaContents_ = new QWidget();
contentsLayout_ = new QVBoxLayout(scrollAreaContents_);
contentsLayout_->setSpacing(0);
contentsLayout_->setMargin(0);
addGlobalItem();
2018-01-09 14:07:32 +01:00
contentsLayout_->addStretch(1);
scrollArea_->setWidget(scrollAreaContents_);
topLayout_->addWidget(scrollArea_);
connect(
this, &CommunitiesList::avatarRetrieved, this, &CommunitiesList::updateCommunityAvatar);
2018-01-09 14:07:32 +01:00
}
void
2018-07-14 11:08:16 +02:00
CommunitiesList::setCommunities(const mtx::responses::JoinedGroups &response)
2018-01-09 14:07:32 +01:00
{
communities_.clear();
addGlobalItem();
2018-01-09 14:07:32 +01:00
2018-07-14 11:08:16 +02:00
for (const auto &group : response.groups)
addCommunity(group);
2018-01-09 14:07:32 +01:00
communities_["world"]->setPressedState(true);
2018-01-09 14:07:32 +01:00
emit communityChanged("world");
}
void
2018-07-14 11:08:16 +02:00
CommunitiesList::addCommunity(const std::string &group_id)
2018-01-09 14:07:32 +01:00
{
2018-07-14 11:08:16 +02:00
const auto id = QString::fromStdString(group_id);
2018-01-09 14:07:32 +01:00
2018-07-14 11:08:16 +02:00
CommunitiesListItem *list_item = new CommunitiesListItem(id, scrollArea_);
communities_.emplace(id, QSharedPointer<CommunitiesListItem>(list_item));
2018-01-09 14:07:32 +01:00
contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item);
2018-07-14 11:08:16 +02:00
connect(this,
&CommunitiesList::groupProfileRetrieved,
this,
[this](const QString &id, const mtx::responses::GroupProfile &profile) {
if (communities_.find(id) == communities_.end())
return;
communities_.at(id)->setName(QString::fromStdString(profile.name));
if (!profile.avatar_url.empty())
fetchCommunityAvatar(id,
QString::fromStdString(profile.avatar_url));
});
connect(this,
&CommunitiesList::groupRoomsRetrieved,
this,
[this](const QString &id, const std::map<QString, bool> &rooms) {
2018-07-14 11:08:16 +02:00
if (communities_.find(id) == communities_.end())
return;
communities_.at(id)->setRooms(rooms);
});
2018-01-09 14:07:32 +01:00
connect(list_item,
&CommunitiesListItem::clicked,
this,
&CommunitiesList::highlightSelectedCommunity);
2018-07-14 11:08:16 +02:00
http::client()->group_profile(
2018-07-14 11:08:16 +02:00
group_id, [id, this](const mtx::responses::GroupProfile &res, mtx::http::RequestErr err) {
if (err) {
return;
}
emit groupProfileRetrieved(id, res);
});
http::client()->group_rooms(
2018-07-14 11:08:16 +02:00
group_id, [id, this](const nlohmann::json &res, mtx::http::RequestErr err) {
if (err) {
return;
}
std::map<QString, bool> room_ids;
2018-07-14 11:08:16 +02:00
for (const auto &room : res.at("chunk"))
room_ids.emplace(QString::fromStdString(room.at("room_id")), true);
2018-07-14 11:08:16 +02:00
emit groupRoomsRetrieved(id, room_ids);
});
2018-01-09 14:07:32 +01:00
}
void
CommunitiesList::updateCommunityAvatar(const QString &community_id, const QPixmap &img)
{
if (!communityExists(community_id)) {
2018-01-09 14:07:32 +01:00
qWarning() << "Avatar update on nonexistent community" << community_id;
return;
}
2018-07-14 11:08:16 +02:00
communities_.at(community_id)->setAvatar(img.toImage());
2018-01-09 14:07:32 +01:00
}
void
CommunitiesList::highlightSelectedCommunity(const QString &community_id)
{
if (!communityExists(community_id)) {
2018-01-09 14:07:32 +01:00
qDebug() << "CommunitiesList: clicked unknown community";
return;
}
emit communityChanged(community_id);
for (const auto &community : communities_) {
if (community.first != community_id) {
community.second->setPressedState(false);
2018-01-09 14:07:32 +01:00
} else {
community.second->setPressedState(true);
scrollArea_->ensureWidgetVisible(community.second.data());
2018-01-09 14:07:32 +01:00
}
}
}
void
CommunitiesList::fetchCommunityAvatar(const QString &id, const QString &avatarUrl)
{
auto savedImgData = cache::client()->image(avatarUrl);
if (!savedImgData.isNull()) {
QPixmap pix;
pix.loadFromData(savedImgData);
emit avatarRetrieved(id, pix);
return;
}
if (avatarUrl.isEmpty())
return;
mtx::http::ThumbOpts opts;
opts.mxc_url = avatarUrl.toStdString();
http::client()->get_thumbnail(
opts, [this, opts, id](const std::string &res, mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to download avatar: {} - ({} {})",
opts.mxc_url,
mtx::errors::to_string(err->matrix_error.errcode),
err->matrix_error.error);
return;
}
cache::client()->saveImage(opts.mxc_url, res);
auto data = QByteArray(res.data(), res.size());
QPixmap pix;
pix.loadFromData(data);
emit avatarRetrieved(id, pix);
});
}
2018-07-14 11:08:16 +02:00
std::map<QString, bool>
2018-07-14 11:08:16 +02:00
CommunitiesList::roomList(const QString &id) const
{
if (communityExists(id))
return communities_.at(id)->rooms();
return {};
}