summary refs log tree commit diff
path: root/src/dialogs/MemberList.cpp
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-05-01 19:35:28 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-05-01 19:35:28 +0300
commit763330fd3c259b7a877eb05944783e92c0afcb80 (patch)
treecf6810cba9aded346ecf8c3dbede7ed0e7d8d68f /src/dialogs/MemberList.cpp
parentAdd prototype room settings menu (diff)
downloadnheko-763330fd3c259b7a877eb05944783e92c0afcb80.tar.xz
Add member list
Diffstat (limited to 'src/dialogs/MemberList.cpp')
-rw-r--r--src/dialogs/MemberList.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/dialogs/MemberList.cpp b/src/dialogs/MemberList.cpp
new file mode 100644

index 00000000..26f526dd --- /dev/null +++ b/src/dialogs/MemberList.cpp
@@ -0,0 +1,145 @@ +#include <QListWidgetItem> +#include <QPainter> +#include <QStyleOption> +#include <QVBoxLayout> + +#include "Config.h" +#include "FlatButton.h" +#include "Utils.h" + +#include "Avatar.h" +#include "Cache.h" +#include "dialogs/MemberList.hpp" + +using namespace dialogs; + +MemberItem::MemberItem(const RoomMember &member, QWidget *parent) + : QWidget(parent) +{ + topLayout_ = new QHBoxLayout(this); + topLayout_->setMargin(0); + + textLayout_ = new QVBoxLayout; + textLayout_->setMargin(0); + textLayout_->setSpacing(0); + + avatar_ = new Avatar(this); + avatar_->setSize(44); + avatar_->setLetter(utils::firstChar(member.display_name)); + + if (!member.avatar.isNull()) + avatar_->setImage(member.avatar); + + QFont nameFont, idFont; + nameFont.setWeight(65); + nameFont.setPixelSize(conf::receipts::font + 1); + idFont.setWeight(50); + idFont.setPixelSize(conf::receipts::font); + + userName_ = new QLabel(member.display_name, this); + userName_->setFont(nameFont); + + userId_ = new QLabel(member.user_id, this); + userId_->setFont(idFont); + + textLayout_->addWidget(userName_); + textLayout_->addWidget(userId_); + + topLayout_->addWidget(avatar_); + topLayout_->addLayout(textLayout_, 1); +} + +MemberList::MemberList(const QString &room_id, QSharedPointer<Cache> cache, QWidget *parent) + : QFrame(parent) + , room_id_{room_id} + , cache_{cache} +{ + setMaximumSize(420, 380); + setAttribute(Qt::WA_DeleteOnClose, true); + + auto layout = new QVBoxLayout(this); + layout->setSpacing(30); + layout->setMargin(20); + + list_ = new QListWidget; + list_->setFrameStyle(QFrame::NoFrame); + list_->setSelectionMode(QAbstractItemView::NoSelection); + list_->setAttribute(Qt::WA_MacShowFocusRect, 0); + list_->setSpacing(5); + + QFont font; + font.setPixelSize(conf::headerFontSize); + + topLabel_ = new QLabel(tr("Room members"), this); + topLabel_->setAlignment(Qt::AlignCenter); + topLabel_->setFont(font); + + layout->addWidget(topLabel_); + layout->addWidget(list_); + + list_->clear(); + + // Add button at the bottom. + moreBtn_ = new FlatButton(tr("SHOW MORE"), this); + auto item = new QListWidgetItem; + item->setSizeHint(moreBtn_->minimumSizeHint()); + item->setFlags(Qt::NoItemFlags); + item->setTextAlignment(Qt::AlignCenter); + list_->insertItem(0, item); + list_->setItemWidget(item, moreBtn_); + + connect(moreBtn_, &FlatButton::clicked, this, [this]() { + const size_t numMembers = list_->count() - 1; + + if (numMembers > 0) + addUsers(cache_->getMembers(room_id_.toStdString(), numMembers)); + }); + + try { + addUsers(cache_->getMembers(room_id_.toStdString())); + } catch (const lmdb::error &e) { + qCritical() << e.what(); + } +} + +void +MemberList::moveButtonToBottom() +{ + auto item = new QListWidgetItem(list_); + item->setSizeHint(moreBtn_->minimumSizeHint()); + item->setFlags(Qt::NoItemFlags); + item->setTextAlignment(Qt::AlignCenter); + list_->setItemWidget(item, moreBtn_); + list_->addItem(item); +} + +void +MemberList::addUsers(const std::vector<RoomMember> &members) +{ + if (members.size() == 0) { + moreBtn_->hide(); + } else { + moreBtn_->show(); + } + + for (const auto &member : members) { + auto user = new MemberItem(member, this); + auto item = new QListWidgetItem; + + item->setSizeHint(user->minimumSizeHint()); + item->setFlags(Qt::NoItemFlags); + item->setTextAlignment(Qt::AlignCenter); + + list_->insertItem(list_->count() - 1, item); + list_->setItemWidget(item, user); + } +} + +void +MemberList::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); +}