nheko/src/CommunitiesList.cc

120 lines
4.0 KiB
C++
Raw Normal View History

2018-01-09 14:07:32 +01:00
#include "CommunitiesList.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(http::client(),
2018-01-09 14:07:32 +01:00
&MatrixClient::communityProfileRetrieved,
this,
[](QString communityId, QJsonObject profile) {
http::client()->fetchCommunityAvatar(
communityId, QUrl(profile["avatar_url"].toString()));
2018-01-09 14:07:32 +01:00
});
connect(http::client(),
2018-01-09 14:07:32 +01:00
SIGNAL(communityAvatarRetrieved(const QString &, const QPixmap &)),
this,
SLOT(updateCommunityAvatar(const QString &, const QPixmap &)));
}
void
CommunitiesList::setCommunities(const std::map<QString, QSharedPointer<Community>> &communities)
2018-01-09 14:07:32 +01:00
{
communities_.clear();
addGlobalItem();
2018-01-09 14:07:32 +01:00
for (const auto &community : communities) {
addCommunity(community.second, community.first);
2018-01-09 14:07:32 +01:00
http::client()->fetchCommunityProfile(community.first);
http::client()->fetchCommunityRooms(community.first);
2018-01-09 14:07:32 +01:00
}
communities_["world"]->setPressedState(true);
2018-01-09 14:07:32 +01:00
emit communityChanged("world");
}
void
CommunitiesList::addCommunity(QSharedPointer<Community> community, const QString &community_id)
{
CommunitiesListItem *list_item =
new CommunitiesListItem(community, community_id, scrollArea_);
communities_.emplace(community_id, QSharedPointer<CommunitiesListItem>(list_item));
2018-01-09 14:07:32 +01:00
http::client()->fetchCommunityAvatar(community_id, community->getAvatar());
2018-01-09 14:07:32 +01:00
contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item);
connect(list_item,
&CommunitiesListItem::clicked,
this,
&CommunitiesList::highlightSelectedCommunity);
}
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;
}
communities_.find(community_id)->second->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
}
}
}