summary refs log tree commit diff
path: root/src/CommunitiesList.cc
diff options
context:
space:
mode:
authorMax Sandholm <max@sandholm.org>2018-01-09 15:07:32 +0200
committermujx <mujx@users.noreply.github.com>2018-01-09 15:07:32 +0200
commit312df6f3bbcba0ad502864b13f9c51b4854ea2ce (patch)
treed43396836cb2ba21b13f218a6d25a7c82049338b /src/CommunitiesList.cc
parentMake usernames in timeline less bold (diff)
downloadnheko-312df6f3bbcba0ad502864b13f9c51b4854ea2ce.tar.xz
Communities (#195)
Diffstat (limited to 'src/CommunitiesList.cc')
-rw-r--r--src/CommunitiesList.cc150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/CommunitiesList.cc b/src/CommunitiesList.cc
new file mode 100644

index 00000000..c40155e5 --- /dev/null +++ b/src/CommunitiesList.cc
@@ -0,0 +1,150 @@ +#include "CommunitiesList.h" + +#include <QLabel> + +CommunitiesList::CommunitiesList(QSharedPointer<MatrixClient> client, QWidget *parent) + : QWidget(parent) + , client_(client) +{ + 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); + + WorldCommunityListItem *world_list_item = new WorldCommunityListItem(); + contentsLayout_->addWidget(world_list_item); + communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item)); + connect(world_list_item, + &WorldCommunityListItem::clicked, + this, + &CommunitiesList::highlightSelectedCommunity); + contentsLayout_->addStretch(1); + + scrollArea_->setWidget(scrollAreaContents_); + topLayout_->addWidget(scrollArea_); + + connect(client_.data(), + &MatrixClient::communityProfileRetrieved, + this, + [=](QString communityId, QJsonObject profile) { + client_->fetchCommunityAvatar(communityId, + QUrl(profile["avatar_url"].toString())); + }); + connect(client_.data(), + SIGNAL(communityAvatarRetrieved(const QString &, const QPixmap &)), + this, + SLOT(updateCommunityAvatar(const QString &, const QPixmap &))); +} + +CommunitiesList::~CommunitiesList() {} + +void +CommunitiesList::setCommunities(const QMap<QString, QSharedPointer<Community>> &communities) +{ + communities_.clear(); + + // TODO: still not sure how to handle the "world" special-case + WorldCommunityListItem *world_list_item = new WorldCommunityListItem(); + communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item)); + connect(world_list_item, + &WorldCommunityListItem::clicked, + this, + &CommunitiesList::highlightSelectedCommunity); + contentsLayout_->insertWidget(0, world_list_item); + + for (auto it = communities.constBegin(); it != communities.constEnd(); it++) { + const auto community_id = it.key(); + const auto community = it.value(); + + addCommunity(community, community_id); + + client_->fetchCommunityProfile(community_id); + client_->fetchCommunityRooms(community_id); + } + + world_list_item->setPressedState(true); + emit communityChanged("world"); +} + +void +CommunitiesList::clear() +{ + communities_.clear(); +} + +void +CommunitiesList::addCommunity(QSharedPointer<Community> community, const QString &community_id) +{ + CommunitiesListItem *list_item = + new CommunitiesListItem(community, community_id, scrollArea_); + + communities_.insert(community_id, QSharedPointer<CommunitiesListItem>(list_item)); + + client_->fetchCommunityAvatar(community_id, community->getAvatar()); + + contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item); + + connect(list_item, + &CommunitiesListItem::clicked, + this, + &CommunitiesList::highlightSelectedCommunity); +} + +void +CommunitiesList::removeCommunity(const QString &community_id) +{ + communities_.remove(community_id); +} + +void +CommunitiesList::updateCommunityAvatar(const QString &community_id, const QPixmap &img) +{ + if (!communities_.contains(community_id)) { + qWarning() << "Avatar update on nonexistent community" << community_id; + return; + } + + communities_.value(community_id)->setAvatar(img.toImage()); +} + +void +CommunitiesList::highlightSelectedCommunity(const QString &community_id) +{ + emit communityChanged(community_id); + + if (!communities_.contains(community_id)) { + qDebug() << "CommunitiesList: clicked unknown community"; + return; + } + + for (auto it = communities_.constBegin(); it != communities_.constEnd(); it++) { + if (it.key() != community_id) { + it.value()->setPressedState(false); + } else { + it.value()->setPressedState(true); + scrollArea_->ensureWidgetVisible( + qobject_cast<QWidget *>(it.value().data())); + } + } +}