This commit is contained in:
Max Sandholm 2017-10-31 07:26:41 +02:00
parent 4040fd3901
commit 0f76f0115e
11 changed files with 261 additions and 248 deletions

View File

@ -1,44 +1,42 @@
#pragma once #pragma once
#include <QWidget>
#include <QScrollArea> #include <QScrollArea>
#include <QSharedPointer> #include <QSharedPointer>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget>
#include "MatrixClient.h"
#include "CommunitiesListItem.h" #include "CommunitiesListItem.h"
#include "Community.h" #include "Community.h"
#include "MatrixClient.h"
#include "ui/Theme.h" #include "ui/Theme.h"
class CommunitiesList : public QWidget class CommunitiesList : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
CommunitiesList(QSharedPointer<MatrixClient> client, QWidget *parent = nullptr); CommunitiesList(QSharedPointer<MatrixClient> client, QWidget *parent = nullptr);
~CommunitiesList(); ~CommunitiesList();
void setCommunities(const QMap<QString, QSharedPointer<Community>> &communities); void setCommunities(const QMap<QString, QSharedPointer<Community>> &communities);
void clear(); void clear();
void addCommunity(QSharedPointer<Community> community, void addCommunity(QSharedPointer<Community> community, const QString &community_id);
const QString &community_id); void removeCommunity(const QString &community_id);
void removeCommunity(const QString &community_id);
signals: signals:
void communityChanged(const QString &community_id); void communityChanged(const QString &community_id);
public slots: public slots:
void updateCommunityAvatar(const QString &community_id, void updateCommunityAvatar(const QString &community_id, const QPixmap &img);
const QPixmap &img); void highlightSelectedCommunity(const QString &community_id);
void highlightSelectedCommunity(const QString &community_id);
private: private:
QVBoxLayout *topLayout_; QVBoxLayout *topLayout_;
QVBoxLayout *contentsLayout_; QVBoxLayout *contentsLayout_;
QWidget *scrollAreaContents_; QWidget *scrollAreaContents_;
QScrollArea *scrollArea_; QScrollArea *scrollArea_;
QMap<QString, QSharedPointer<CommunitiesListItem>> communities_; QMap<QString, QSharedPointer<CommunitiesListItem>> communities_;
QSharedPointer<MatrixClient> client_; QSharedPointer<MatrixClient> client_;
}; };

View File

@ -1,83 +1,81 @@
#pragma once #pragma once
#include <QWidget> #include <QDebug>
#include <QSharedPointer>
#include <QMouseEvent> #include <QMouseEvent>
#include <QPainter> #include <QPainter>
#include <QDebug> #include <QSharedPointer>
#include <QWidget>
#include "ui/Theme.h"
#include "Menu.h"
#include "Community.h" #include "Community.h"
#include "Menu.h"
#include "ui/Theme.h"
class CommunitiesListItem : public QWidget class CommunitiesListItem : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
CommunitiesListItem(QSharedPointer<Community> community, CommunitiesListItem(QSharedPointer<Community> community,
QString community_id, QString community_id,
QWidget *parent = nullptr); QWidget *parent = nullptr);
~CommunitiesListItem(); ~CommunitiesListItem();
void setCommunity(QSharedPointer<Community> community); void setCommunity(QSharedPointer<Community> community);
inline bool isPressed() const; inline bool isPressed() const;
inline void setAvatar(const QImage &avatar_image); inline void setAvatar(const QImage &avatar_image);
signals: signals:
void clicked(const QString &community_id); void clicked(const QString &community_id);
public slots: public slots:
void setPressedState(bool state); void setPressedState(bool state);
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void contextMenuEvent(QContextMenuEvent *event) override; void contextMenuEvent(QContextMenuEvent *event) override;
private: private:
const int IconSize = 55; const int IconSize = 55;
QSharedPointer<Community> community_; QSharedPointer<Community> community_;
QString communityId_; QString communityId_;
QString communityName_; QString communityName_;
QString communityShortDescription; QString communityShortDescription;
QPixmap communityAvatar_; QPixmap communityAvatar_;
Menu *menu_; Menu *menu_;
bool isPressed_ = false; bool isPressed_ = false;
}; };
inline bool inline bool
CommunitiesListItem::isPressed() const CommunitiesListItem::isPressed() const
{ {
return isPressed_; return isPressed_;
} }
inline void inline void
CommunitiesListItem::setAvatar(const QImage &avatar_image) CommunitiesListItem::setAvatar(const QImage &avatar_image)
{ {
communityAvatar_ = QPixmap::fromImage( communityAvatar_ = QPixmap::fromImage(
avatar_image.scaled(IconSize, avatar_image.scaled(IconSize, IconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
IconSize, update();
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation));
update();
} }
class WorldCommunityListItem : public CommunitiesListItem class WorldCommunityListItem : public CommunitiesListItem
{ {
Q_OBJECT Q_OBJECT
public: public:
WorldCommunityListItem(QWidget *parent = nullptr); WorldCommunityListItem(QWidget *parent = nullptr);
~WorldCommunityListItem(); ~WorldCommunityListItem();
protected: protected:
void mousePressEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
private: private:
const int IconSize = 55; const int IconSize = 55;
}; };

View File

@ -1,13 +1,13 @@
#pragma once #pragma once
#include <QObject>
#include <QJsonObject> #include <QJsonObject>
#include <QUrl> #include <QObject>
#include <QString> #include <QString>
#include <QUrl>
class Community : public QObject class Community : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
void parseProfile(const QJsonObject &profile); void parseProfile(const QJsonObject &profile);
@ -55,7 +55,6 @@ Community::getLongDescription() const
return long_description_; return long_description_;
} }
inline const QList<QString> inline const QList<QString>
Community::getRoomList() const Community::getRoomList() const
{ {

View File

@ -87,8 +87,8 @@ private:
QMap<QString, QSharedPointer<RoomInfoListItem>> rooms_; QMap<QString, QSharedPointer<RoomInfoListItem>> rooms_;
QString selectedRoom_; QString selectedRoom_;
bool filterRooms_ = false; bool filterRooms_ = false;
QList<QString> roomFilter_ = QList<QString>(); //which rooms to include in the room list QList<QString> roomFilter_ = QList<QString>(); // which rooms to include in the room list
QSharedPointer<MatrixClient> client_; QSharedPointer<MatrixClient> client_;
}; };

View File

@ -13,8 +13,8 @@ enum class AvatarType
}; };
namespace sidebar { namespace sidebar {
static const int SmallSize = 60; static const int SmallSize = 60;
static const int NormalSize = 300; static const int NormalSize = 300;
static const int CommunitiesSidebarSize = 64; static const int CommunitiesSidebarSize = 64;
} }
// Default font size. // Default font size.

View File

@ -63,7 +63,7 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
communitiesList_ = new CommunitiesList(client, this); communitiesList_ = new CommunitiesList(client, this);
communitiesSideBarLayout_->addWidget(communitiesList_); communitiesSideBarLayout_->addWidget(communitiesList_);
//communitiesSideBarLayout_->addStretch(1); // communitiesSideBarLayout_->addStretch(1);
topLayout_->addWidget(communitiesSideBar_); topLayout_->addWidget(communitiesSideBar_);
auto splitter = new Splitter(this); auto splitter = new Splitter(this);
@ -256,22 +256,27 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
SIGNAL(getOwnCommunitiesResponse(QList<QString>)), SIGNAL(getOwnCommunitiesResponse(QList<QString>)),
this, this,
SLOT(updateOwnCommunitiesInfo(QList<QString>))); SLOT(updateOwnCommunitiesInfo(QList<QString>)));
connect(client_.data(), &MatrixClient::communityProfileRetrieved, this, connect(client_.data(),
&MatrixClient::communityProfileRetrieved,
this,
[=](QString communityId, QJsonObject profile) { [=](QString communityId, QJsonObject profile) {
communityManager_[communityId]->parseProfile(profile); communityManager_[communityId]->parseProfile(profile);
}); });
connect(client_.data(), &MatrixClient::communityRoomsRetrieved, this, connect(client_.data(),
&MatrixClient::communityRoomsRetrieved,
this,
[=](QString communityId, QJsonObject rooms) { [=](QString communityId, QJsonObject rooms) {
communityManager_[communityId]->parseRooms(rooms); communityManager_[communityId]->parseRooms(rooms);
if (communityId == current_community_) { if (communityId == current_community_) {
if (communityId == "world") { if (communityId == "world") {
room_list_->setFilterRooms(false); room_list_->setFilterRooms(false);
} else { } else {
room_list_->setRoomFilter(communityManager_[communityId]->getRoomList()); room_list_->setRoomFilter(
} communityManager_[communityId]->getRoomList());
} }
}); }
});
connect(client_.data(), connect(client_.data(),
SIGNAL(ownAvatarRetrieved(const QPixmap &)), SIGNAL(ownAvatarRetrieved(const QPixmap &)),
this, this,
@ -301,14 +306,18 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
} }
}); });
connect(communitiesList_, &CommunitiesList::communityChanged, this, [=](const QString &communityId) { connect(communitiesList_,
current_community_ = communityId; &CommunitiesList::communityChanged,
if (communityId == "world") { this,
room_list_->setFilterRooms(false); [=](const QString &communityId) {
} else { current_community_ = communityId;
room_list_->setRoomFilter(communityManager_[communityId]->getRoomList()); if (communityId == "world") {
} room_list_->setFilterRooms(false);
}); } else {
room_list_->setRoomFilter(
communityManager_[communityId]->getRoomList());
}
});
AvatarProvider::init(client); AvatarProvider::init(client);
} }
@ -489,13 +498,13 @@ ChatPage::updateOwnProfileInfo(const QUrl &avatar_url, const QString &display_na
void void
ChatPage::updateOwnCommunitiesInfo(const QList<QString> &own_communities) ChatPage::updateOwnCommunitiesInfo(const QList<QString> &own_communities)
{ {
for (int i = 0; i < own_communities.size(); i++) { for (int i = 0; i < own_communities.size(); i++) {
QSharedPointer<Community> community = QSharedPointer<Community>(new Community()); QSharedPointer<Community> community = QSharedPointer<Community>(new Community());
communityManager_[own_communities[i]] = community; communityManager_[own_communities[i]] = community;
} }
communitiesList_->setCommunities(communityManager_); communitiesList_->setCommunities(communityManager_);
} }
void void

View File

@ -3,53 +3,58 @@
#include <QLabel> #include <QLabel>
CommunitiesList::CommunitiesList(QSharedPointer<MatrixClient> client, QWidget *parent) CommunitiesList::CommunitiesList(QSharedPointer<MatrixClient> client, QWidget *parent)
: QWidget(parent) : QWidget(parent)
, client_(client) , client_(client)
{ {
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
sizePolicy.setHorizontalStretch(0); sizePolicy.setHorizontalStretch(0);
sizePolicy.setVerticalStretch(1); sizePolicy.setVerticalStretch(1);
setSizePolicy(sizePolicy); setSizePolicy(sizePolicy);
setStyleSheet("border-style: none;"); setStyleSheet("border-style: none;");
topLayout_ = new QVBoxLayout(this); topLayout_ = new QVBoxLayout(this);
topLayout_->setSpacing(0); topLayout_->setSpacing(0);
topLayout_->setMargin(0); topLayout_->setMargin(0);
setFixedWidth(ui::sidebar::CommunitiesSidebarSize); setFixedWidth(ui::sidebar::CommunitiesSidebarSize);
scrollArea_ = new QScrollArea(this); scrollArea_ = new QScrollArea(this);
scrollArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea_->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); scrollArea_->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
scrollArea_->setWidgetResizable(true); scrollArea_->setWidgetResizable(true);
scrollArea_->setAlignment(Qt::AlignLeading | Qt::AlignTop | Qt::AlignVCenter); scrollArea_->setAlignment(Qt::AlignLeading | Qt::AlignTop | Qt::AlignVCenter);
scrollAreaContents_ = new QWidget(); scrollAreaContents_ = new QWidget();
contentsLayout_ = new QVBoxLayout(scrollAreaContents_); contentsLayout_ = new QVBoxLayout(scrollAreaContents_);
contentsLayout_->setSpacing(0); contentsLayout_->setSpacing(0);
contentsLayout_->setMargin(0); contentsLayout_->setMargin(0);
WorldCommunityListItem *world_list_item = new WorldCommunityListItem(); WorldCommunityListItem *world_list_item = new WorldCommunityListItem();
contentsLayout_->addWidget(world_list_item); contentsLayout_->addWidget(world_list_item);
communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item)); communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item));
connect(world_list_item, &WorldCommunityListItem::clicked, connect(world_list_item,
this, &CommunitiesList::highlightSelectedCommunity); &WorldCommunityListItem::clicked,
contentsLayout_->addStretch(1); this,
&CommunitiesList::highlightSelectedCommunity);
contentsLayout_->addStretch(1);
scrollArea_->setWidget(scrollAreaContents_); scrollArea_->setWidget(scrollAreaContents_);
topLayout_->addWidget(scrollArea_); topLayout_->addWidget(scrollArea_);
connect(client_.data(), &MatrixClient::communityProfileRetrieved, this, connect(client_.data(),
[=](QString communityId, QJsonObject profile) { &MatrixClient::communityProfileRetrieved,
client_->fetchCommunityAvatar(communityId, QUrl(profile["avatar_url"].toString())); this,
}); [=](QString communityId, QJsonObject profile) {
connect(client_.data(), client_->fetchCommunityAvatar(communityId,
SIGNAL(communityAvatarRetrieved(const QString &, const QPixmap &)), QUrl(profile["avatar_url"].toString()));
this, });
SLOT(updateCommunityAvatar(const QString &,const QPixmap &))); connect(client_.data(),
SIGNAL(communityAvatarRetrieved(const QString &, const QPixmap &)),
this,
SLOT(updateCommunityAvatar(const QString &, const QPixmap &)));
} }
CommunitiesList::~CommunitiesList() {} CommunitiesList::~CommunitiesList() {}
@ -57,87 +62,89 @@ CommunitiesList::~CommunitiesList() {}
void void
CommunitiesList::setCommunities(const QMap<QString, QSharedPointer<Community>> &communities) CommunitiesList::setCommunities(const QMap<QString, QSharedPointer<Community>> &communities)
{ {
communities_.clear(); communities_.clear();
//TODO: still not sure how to handle the "world" special-case // TODO: still not sure how to handle the "world" special-case
WorldCommunityListItem *world_list_item = new WorldCommunityListItem(); WorldCommunityListItem *world_list_item = new WorldCommunityListItem();
communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item)); communities_.insert("world", QSharedPointer<CommunitiesListItem>(world_list_item));
connect(world_list_item, &WorldCommunityListItem::clicked, connect(world_list_item,
this, &CommunitiesList::highlightSelectedCommunity); &WorldCommunityListItem::clicked,
contentsLayout_->insertWidget(0, world_list_item); this,
&CommunitiesList::highlightSelectedCommunity);
contentsLayout_->insertWidget(0, world_list_item);
for (auto it = communities.constBegin(); it != communities.constEnd(); it++) { for (auto it = communities.constBegin(); it != communities.constEnd(); it++) {
const auto community_id = it.key(); const auto community_id = it.key();
const auto community = it.value(); const auto community = it.value();
addCommunity(community, community_id); addCommunity(community, community_id);
client_->fetchCommunityProfile(community_id); client_->fetchCommunityProfile(community_id);
client_->fetchCommunityRooms(community_id); client_->fetchCommunityRooms(community_id);
} }
world_list_item->setPressedState(true); world_list_item->setPressedState(true);
emit communityChanged("world"); emit communityChanged("world");
} }
void void
CommunitiesList::clear() CommunitiesList::clear()
{ {
communities_.clear(); communities_.clear();
} }
void void
CommunitiesList::addCommunity(QSharedPointer<Community> community, const QString &community_id) CommunitiesList::addCommunity(QSharedPointer<Community> community, const QString &community_id)
{ {
CommunitiesListItem *list_item = new CommunitiesListItem(community, CommunitiesListItem *list_item =
community_id, new CommunitiesListItem(community, community_id, scrollArea_);
scrollArea_);
communities_.insert(community_id, QSharedPointer<CommunitiesListItem>(list_item)); communities_.insert(community_id, QSharedPointer<CommunitiesListItem>(list_item));
client_->fetchCommunityAvatar(community_id, community->getAvatar()); client_->fetchCommunityAvatar(community_id, community->getAvatar());
contentsLayout_->insertWidget(contentsLayout_->count()-1, list_item); contentsLayout_->insertWidget(contentsLayout_->count() - 1, list_item);
connect(list_item, &CommunitiesListItem::clicked, connect(list_item,
this, &CommunitiesList::highlightSelectedCommunity); &CommunitiesListItem::clicked,
this,
&CommunitiesList::highlightSelectedCommunity);
} }
void void
CommunitiesList::removeCommunity(const QString &community_id) CommunitiesList::removeCommunity(const QString &community_id)
{ {
communities_.remove(community_id); communities_.remove(community_id);
} }
void void
CommunitiesList::updateCommunityAvatar(const QString &community_id, const QPixmap &img) CommunitiesList::updateCommunityAvatar(const QString &community_id, const QPixmap &img)
{ {
if (!communities_.contains(community_id)) { if (!communities_.contains(community_id)) {
qWarning() << "Avatar update on nonexistent community" << community_id; qWarning() << "Avatar update on nonexistent community" << community_id;
return; return;
} }
communities_.value(community_id)->setAvatar(img.toImage());
communities_.value(community_id)->setAvatar(img.toImage());
} }
void void
CommunitiesList::highlightSelectedCommunity(const QString &community_id) CommunitiesList::highlightSelectedCommunity(const QString &community_id)
{ {
emit communityChanged(community_id); emit communityChanged(community_id);
if (!communities_.contains(community_id)) { if (!communities_.contains(community_id)) {
qDebug() << "CommunitiesList: clicked unknown community"; qDebug() << "CommunitiesList: clicked unknown community";
return; return;
} }
for (auto it = communities_.constBegin(); it != communities_.constEnd(); it++) { for (auto it = communities_.constBegin(); it != communities_.constEnd(); it++) {
if (it.key() != community_id) { if (it.key() != community_id) {
it.value()->setPressedState(false); it.value()->setPressedState(false);
} else { } else {
it.value()->setPressedState(true); it.value()->setPressedState(true);
scrollArea_->ensureWidgetVisible( scrollArea_->ensureWidgetVisible(
qobject_cast<QWidget *>(it.value().data())); qobject_cast<QWidget *>(it.value().data()));
}
} }
}
} }

View File

@ -3,14 +3,14 @@
CommunitiesListItem::CommunitiesListItem(QSharedPointer<Community> community, CommunitiesListItem::CommunitiesListItem(QSharedPointer<Community> community,
QString community_id, QString community_id,
QWidget *parent) QWidget *parent)
: QWidget(parent) : QWidget(parent)
, community_(community) , community_(community)
, communityId_(community_id) , communityId_(community_id)
{ {
//menu_ = new Menu(this); // menu_ = new Menu(this);
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
setFixedHeight(ui::sidebar::CommunitiesSidebarSize); setFixedHeight(ui::sidebar::CommunitiesSidebarSize);
setFixedWidth(ui::sidebar::CommunitiesSidebarSize); setFixedWidth(ui::sidebar::CommunitiesSidebarSize);
} }
CommunitiesListItem::~CommunitiesListItem() {} CommunitiesListItem::~CommunitiesListItem() {}
@ -18,20 +18,21 @@ CommunitiesListItem::~CommunitiesListItem() {}
void void
CommunitiesListItem::setCommunity(QSharedPointer<Community> community) CommunitiesListItem::setCommunity(QSharedPointer<Community> community)
{ {
community_ = community; community_ = community;
} }
void void
CommunitiesListItem::setPressedState(bool state) CommunitiesListItem::setPressedState(bool state)
{ {
if (isPressed_ != state) { if (isPressed_ != state) {
isPressed_ = state; isPressed_ = state;
update(); update();
} }
} }
void void
CommunitiesListItem::mousePressEvent(QMouseEvent *event) { CommunitiesListItem::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::RightButton) { if (event->buttons() == Qt::RightButton) {
QWidget::mousePressEvent(event); QWidget::mousePressEvent(event);
return; return;
@ -47,7 +48,6 @@ CommunitiesListItem::paintEvent(QPaintEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
QPainter p(this); QPainter p(this);
p.setRenderHint(QPainter::TextAntialiasing); p.setRenderHint(QPainter::TextAntialiasing);
p.setRenderHint(QPainter::SmoothPixmapTransform); p.setRenderHint(QPainter::SmoothPixmapTransform);
@ -65,7 +65,7 @@ CommunitiesListItem::paintEvent(QPaintEvent *event)
p.setPen(QColor("#333")); p.setPen(QColor("#333"));
QRect avatarRegion((width()-IconSize)/2, (height()-IconSize)/2, IconSize, IconSize); QRect avatarRegion((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize);
font.setBold(false); font.setBold(false);
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
@ -91,14 +91,15 @@ CommunitiesListItem::paintEvent(QPaintEvent *event)
p.save(); p.save();
QPainterPath path; QPainterPath path;
path.addEllipse((width()-IconSize)/2, (height()-IconSize)/2, IconSize, IconSize); path.addEllipse(
(width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize);
p.setClipPath(path); p.setClipPath(path);
p.drawPixmap(avatarRegion, communityAvatar_); p.drawPixmap(avatarRegion, communityAvatar_);
p.restore(); p.restore();
} }
//TODO: Discord-style community ping counts? // TODO: Discord-style community ping counts?
/*if (unreadMsgCount_ > 0) { /*if (unreadMsgCount_ > 0) {
QColor textColor("white"); QColor textColor("white");
QColor backgroundColor("#38A3D8"); QColor backgroundColor("#38A3D8");
@ -142,11 +143,11 @@ CommunitiesListItem::contextMenuEvent(QContextMenuEvent *event)
{ {
Q_UNUSED(event); Q_UNUSED(event);
//menu_->popup(event->globalPos()); // menu_->popup(event->globalPos());
} }
WorldCommunityListItem::WorldCommunityListItem(QWidget *parent) WorldCommunityListItem::WorldCommunityListItem(QWidget *parent)
: CommunitiesListItem(QSharedPointer<Community>(), "", parent) : CommunitiesListItem(QSharedPointer<Community>(), "", parent)
{ {
} }
@ -190,10 +191,10 @@ WorldCommunityListItem::paintEvent(QPaintEvent *event)
p.setPen(Qt::NoPen); p.setPen(Qt::NoPen);
p.setBrush(brush); p.setBrush(brush);
QRect avatarRegion((width()-IconSize)/2, (height()-IconSize)/2, IconSize, IconSize); QRect avatarRegion((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize);
p.drawEllipse(avatarRegion.center(), IconSize / 2, IconSize / 2); p.drawEllipse(avatarRegion.center(), IconSize / 2, IconSize / 2);
QPainterPath path; QPainterPath path;
path.addEllipse((width()-IconSize)/2, (height()-IconSize)/2, IconSize, IconSize); path.addEllipse((width() - IconSize) / 2, (height() - IconSize) / 2, IconSize, IconSize);
p.setClipPath(path); p.setClipPath(path);
p.drawPixmap(avatarRegion, worldIcon); p.drawPixmap(avatarRegion, worldIcon);

View File

@ -1,45 +1,44 @@
#include "include/Community.h" #include "include/Community.h"
#include <QJsonValue>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonValue>
void void
Community::parseProfile(const QJsonObject &profile) Community::parseProfile(const QJsonObject &profile)
{ {
if (profile["name"].type() == QJsonValue::Type::String) { if (profile["name"].type() == QJsonValue::Type::String) {
name_ = profile["name"].toString(); name_ = profile["name"].toString();
} else { } else {
name_ = "Unnamed Community"; //TODO: what is correct here? name_ = "Unnamed Community"; // TODO: what is correct here?
} }
if (profile["avatar_url"].type() == QJsonValue::Type::String) { if (profile["avatar_url"].type() == QJsonValue::Type::String) {
avatar_ = QUrl(profile["avatar_url"].toString()); avatar_ = QUrl(profile["avatar_url"].toString());
} else { } else {
avatar_ = QUrl(); avatar_ = QUrl();
} }
if (profile["short_description"].type() == QJsonValue::Type::String) { if (profile["short_description"].type() == QJsonValue::Type::String) {
short_description_ = profile["short_description"].toString(); short_description_ = profile["short_description"].toString();
} else { } else {
short_description_ = ""; short_description_ = "";
} }
if (profile["long_description"].type() == QJsonValue::Type::String) {
long_description_ = profile["long_description"].toString();
} else {
long_description_ = "";
}
if (profile["long_description"].type() == QJsonValue::Type::String) {
long_description_ = profile["long_description"].toString();
} else {
long_description_ = "";
}
} }
void void
Community::parseRooms(const QJsonObject &rooms) Community::parseRooms(const QJsonObject &rooms)
{ {
rooms_.clear(); rooms_.clear();
for (auto i = 0; i<rooms["chunk"].toArray().size(); i++) { for (auto i = 0; i < rooms["chunk"].toArray().size(); i++) {
rooms_.append(rooms["chunk"].toArray()[i].toObject()["room_id"].toString()); rooms_.append(rooms["chunk"].toArray()[i].toObject()["room_id"].toString());
} }
emit roomsChanged(rooms_); emit roomsChanged(rooms_);
} }

View File

@ -489,13 +489,15 @@ MatrixClient::getOwnCommunities() noexcept
auto data = reply->readAll(); auto data = reply->readAll();
auto json = QJsonDocument::fromJson(data); auto json = QJsonDocument::fromJson(data);
try { try {
QList<QString> response; QList<QString> response;
for (auto it = json["groups"].toArray().constBegin(); it != json["groups"].toArray().constEnd(); it++) { for (auto it = json["groups"].toArray().constBegin();
response.append(it->toString()); it != json["groups"].toArray().constEnd();
} it++) {
emit getOwnCommunitiesResponse(response); response.append(it->toString());
}
emit getOwnCommunitiesResponse(response);
} catch (DeserializationException &e) { } catch (DeserializationException &e) {
qWarning() << "Own communities:" << e.what(); qWarning() << "Own communities:" << e.what();
} }
}); });
} }
@ -606,7 +608,7 @@ MatrixClient::fetchCommunityProfile(const QString &communityId)
QNetworkReply *reply = get(request); QNetworkReply *reply = get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply, communityId]() { connect(reply, &QNetworkReply::finished, this, [this, reply, communityId]() {
reply->deleteLater(); reply->deleteLater();
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@ -615,7 +617,7 @@ MatrixClient::fetchCommunityProfile(const QString &communityId)
return; return;
} }
auto data = reply->readAll(); auto data = reply->readAll();
const auto json = QJsonDocument::fromJson(data).object(); const auto json = QJsonDocument::fromJson(data).object();
emit communityProfileRetrieved(communityId, json); emit communityProfileRetrieved(communityId, json);
@ -636,7 +638,7 @@ MatrixClient::fetchCommunityRooms(const QString &communityId)
QNetworkReply *reply = get(request); QNetworkReply *reply = get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply, communityId]() { connect(reply, &QNetworkReply::finished, this, [this, reply, communityId]() {
reply->deleteLater(); reply->deleteLater();
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
@ -645,7 +647,7 @@ MatrixClient::fetchCommunityRooms(const QString &communityId)
return; return;
} }
auto data = reply->readAll(); auto data = reply->readAll();
const auto json = QJsonDocument::fromJson(data).object(); const auto json = QJsonDocument::fromJson(data).object();
emit communityRoomsRetrieved(communityId, json); emit communityRoomsRetrieved(communityId, json);

View File

@ -296,21 +296,21 @@ RoomList::setFilterRooms(bool filterRooms)
{ {
filterRooms_ = filterRooms; filterRooms_ = filterRooms;
for (int i=0; i<contentsLayout_->count(); i++) { for (int i = 0; i < contentsLayout_->count(); i++) {
// If roomFilter_ contains the room for the current RoomInfoListItem,
// show the list item, otherwise hide it
RoomInfoListItem *listitem =
(RoomInfoListItem *)contentsLayout_->itemAt(i)->widget();
//If roomFilter_ contains the room for the current RoomInfoListItem, if (listitem != nullptr) {
//show the list item, otherwise hide it if (!filterRooms) {
RoomInfoListItem *listitem = (RoomInfoListItem *) contentsLayout_->itemAt(i)->widget(); contentsLayout_->itemAt(i)->widget()->show();
} else if (roomFilter_.contains(listitem->roomId())) {
if (listitem != nullptr) { contentsLayout_->itemAt(i)->widget()->show();
if (!filterRooms) { } else {
contentsLayout_->itemAt(i)->widget()->show(); contentsLayout_->itemAt(i)->widget()->hide();
} else if (roomFilter_.contains(listitem->roomId())) { }
contentsLayout_->itemAt(i)->widget()->show();
} else {
contentsLayout_->itemAt(i)->widget()->hide();
} }
}
} }
if (filterRooms_ && !roomFilter_.contains(selectedRoom_)) { if (filterRooms_ && !roomFilter_.contains(selectedRoom_)) {