diff --git a/src/Cache.cc b/src/Cache.cc
index 699774ce..60181afc 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -538,9 +538,10 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms)
// Check if the room is joined.
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room), data)) {
try {
- room_info.emplace(
- QString::fromStdString(room),
- json::parse(std::string(data.data(), data.size())));
+ RoomInfo tmp = json::parse(std::string(data.data(), data.size()));
+ tmp.member_count = getMembersDb(txn, room).size(txn);
+
+ room_info.emplace(QString::fromStdString(room), std::move(tmp));
} catch (const json::exception &e) {
qWarning()
<< "failed to parse room info:" << QString::fromStdString(room)
@@ -550,9 +551,12 @@ Cache::getRoomInfo(const std::vector<std::string> &rooms)
// Check if the room is an invite.
if (lmdb::dbi_get(txn, invitesDb_, lmdb::val(room), data)) {
try {
- room_info.emplace(
- QString::fromStdString(room),
- json::parse(std::string(data.data(), data.size())));
+ RoomInfo tmp =
+ json::parse(std::string(data.data(), data.size()));
+ tmp.member_count = getInviteMembersDb(txn, room).size(txn);
+
+ room_info.emplace(QString::fromStdString(room),
+ std::move(tmp));
} catch (const json::exception &e) {
qWarning() << "failed to parse room info for invite:"
<< QString::fromStdString(room)
@@ -581,7 +585,8 @@ Cache::roomInfo(bool withInvites)
// Gather info about the joined rooms.
auto roomsCursor = lmdb::cursor::open(txn, roomsDb_);
while (roomsCursor.get(room_id, room_data, MDB_NEXT)) {
- RoomInfo tmp = json::parse(std::move(room_data));
+ RoomInfo tmp = json::parse(std::move(room_data));
+ tmp.member_count = getMembersDb(txn, room_id).size(txn);
result.insert(QString::fromStdString(std::move(room_id)), std::move(tmp));
}
roomsCursor.close();
@@ -590,7 +595,8 @@ Cache::roomInfo(bool withInvites)
// Gather info about the invites.
auto invitesCursor = lmdb::cursor::open(txn, invitesDb_);
while (invitesCursor.get(room_id, room_data, MDB_NEXT)) {
- RoomInfo tmp = json::parse(room_data);
+ RoomInfo tmp = json::parse(room_data);
+ tmp.member_count = getInviteMembersDb(txn, room_id).size(txn);
result.insert(QString::fromStdString(std::move(room_id)), std::move(tmp));
}
invitesCursor.close();
diff --git a/src/CommunitiesListItem.cc b/src/CommunitiesListItem.cc
index e86216e8..0650c0cf 100644
--- a/src/CommunitiesListItem.cc
+++ b/src/CommunitiesListItem.cc
@@ -2,6 +2,7 @@
#include "Painter.h"
#include "Ripple.h"
#include "RippleOverlay.h"
+#include "Utils.h"
CommunitiesListItem::CommunitiesListItem(QSharedPointer<Community> community,
QString community_id,
@@ -74,7 +75,7 @@ CommunitiesListItem::paintEvent(QPaintEvent *)
font.setPixelSize(conf::roomlist::fonts::communityBubble);
p.setFont(font);
- p.drawLetterAvatar(community_->getName()[0],
+ p.drawLetterAvatar(utils::firstChar(community_->getName()),
avatarFgColor_,
avatarBgColor_,
width(),
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
index c59ce2d9..66f956a5 100644
--- a/src/MainWindow.cc
+++ b/src/MainWindow.cc
@@ -41,6 +41,7 @@
#include "dialogs/JoinRoom.h"
#include "dialogs/LeaveRoom.h"
#include "dialogs/Logout.h"
+#include "dialogs/RoomSettings.hpp"
MainWindow *MainWindow::instance_ = nullptr;
@@ -263,6 +264,27 @@ MainWindow::hasActiveUser()
}
void
+MainWindow::openRoomSettings(const QString &room_id)
+{
+ const auto roomToSearch = room_id.isEmpty() ? chat_page_->currentRoom() : "";
+
+ qDebug() << "room settings" << roomToSearch;
+
+ roomSettingsDialog_ = QSharedPointer<dialogs::RoomSettings>(
+ new dialogs::RoomSettings(roomToSearch, chat_page_->cache(), this));
+
+ connect(roomSettingsDialog_.data(), &dialogs::RoomSettings::closing, this, [this]() {
+ roomSettingsModal_->hide();
+ });
+
+ roomSettingsModal_ =
+ QSharedPointer<OverlayModal>(new OverlayModal(this, roomSettingsDialog_.data()));
+ roomSettingsModal_->setColor(QColor(30, 30, 30, 170));
+
+ roomSettingsModal_->show();
+}
+
+void
MainWindow::openLeaveRoomDialog(const QString &room_id)
{
auto roomToLeave = room_id.isEmpty() ? chat_page_->currentRoom() : room_id;
diff --git a/src/TopRoomBar.cc b/src/TopRoomBar.cc
index 3b60ab6a..beca1d51 100644
--- a/src/TopRoomBar.cc
+++ b/src/TopRoomBar.cc
@@ -95,8 +95,14 @@ TopRoomBar::TopRoomBar(QWidget *parent)
MainWindow::instance()->openLeaveRoomDialog();
});
+ roomSettings_ = new QAction(tr("Settings"), this);
+ connect(roomSettings_, &QAction::triggered, this, []() {
+ MainWindow::instance()->openRoomSettings();
+ });
+
menu_->addAction(inviteUsers_);
menu_->addAction(leaveRoom_);
+ menu_->addAction(roomSettings_);
connect(settingsBtn_, &QPushButton::clicked, this, [this]() {
auto pos = mapToGlobal(settingsBtn_->pos());
diff --git a/src/dialogs/RoomSettings.cpp b/src/dialogs/RoomSettings.cpp
new file mode 100644
index 00000000..8fcbc82f
--- /dev/null
+++ b/src/dialogs/RoomSettings.cpp
@@ -0,0 +1,147 @@
+#include "Avatar.h"
+#include "Config.h"
+#include "FlatButton.h"
+#include "Painter.h"
+#include "Utils.h"
+#include "dialogs/RoomSettings.hpp"
+
+#include <QComboBox>
+#include <QLabel>
+#include <QPainter>
+#include <QPixmap>
+#include <QSharedPointer>
+#include <QStyleOption>
+#include <QVBoxLayout>
+
+using namespace dialogs;
+
+RoomSettings::RoomSettings(const QString &room_id, QSharedPointer<Cache> cache, QWidget *parent)
+ : QFrame(parent)
+ , cache_{cache}
+ , room_id_{std::move(room_id)}
+{
+ setMaximumWidth(385);
+
+ try {
+ auto res = cache_->getRoomInfo({room_id_.toStdString()});
+ info_ = res[room_id_];
+
+ setAvatar(QImage::fromData(cache_->image(info_.avatar_url)));
+ } catch (const lmdb::error &e) {
+ qWarning() << "failed to retrieve room info from cache" << room_id;
+ }
+
+ auto layout = new QVBoxLayout(this);
+ layout->setSpacing(30);
+ layout->setMargin(20);
+
+ saveBtn_ = new FlatButton("SAVE", this);
+ saveBtn_->setFontSize(conf::btn::fontSize);
+ cancelBtn_ = new FlatButton(tr("CANCEL"), this);
+ cancelBtn_->setFontSize(conf::btn::fontSize);
+
+ auto btnLayout = new QHBoxLayout();
+ btnLayout->setSpacing(0);
+ btnLayout->setMargin(0);
+ btnLayout->addStretch(1);
+ btnLayout->addWidget(saveBtn_);
+ btnLayout->addWidget(cancelBtn_);
+
+ auto notifOptionLayout_ = new QHBoxLayout;
+ notifOptionLayout_->setMargin(5);
+ auto themeLabel_ = new QLabel(tr("Notifications"), this);
+ auto notifCombo = new QComboBox(this);
+ notifCombo->addItem("Nothing");
+ notifCombo->addItem("Mentions only");
+ notifCombo->addItem("All messages");
+ themeLabel_->setStyleSheet("font-size: 15px;");
+
+ notifOptionLayout_->addWidget(themeLabel_);
+ notifOptionLayout_->addWidget(notifCombo, 0, Qt::AlignBottom | Qt::AlignRight);
+
+ layout->addWidget(new TopSection(info_, avatarImg_, this));
+ layout->addLayout(notifOptionLayout_);
+ layout->addLayout(btnLayout);
+
+ connect(cancelBtn_, &FlatButton::clicked, this, &RoomSettings::closing);
+ connect(saveBtn_, &FlatButton::clicked, this, [this]() { emit closing(); });
+}
+
+void
+RoomSettings::paintEvent(QPaintEvent *)
+{
+ QStyleOption opt;
+ opt.init(this);
+ QPainter p(this);
+ style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+}
+
+void
+TopSection::paintEvent(QPaintEvent *)
+{
+ Painter p(this);
+ PainterHighQualityEnabler hq(p);
+
+ constexpr int textPadding = 23;
+ constexpr int textStartX = AvatarSize + 5 * Padding;
+ const int availableTextWidth = width() - textStartX;
+
+ constexpr int nameFont = 15;
+ constexpr int membersFont = 14;
+ constexpr int labelFont = 18;
+
+ QFont font;
+ font.setPixelSize(labelFont);
+ font.setWeight(70);
+
+ p.setFont(font);
+ p.setPen(textColor());
+ p.drawTextLeft(Padding, Padding, "Room settings");
+ p.translate(0, textPadding + QFontMetrics(p.font()).ascent());
+
+ p.save();
+ p.translate(textStartX, 2 * Padding);
+
+ // Draw the name.
+ font.setPixelSize(membersFont);
+ const auto members = QString("%1 members").arg(info_.member_count);
+
+ font.setPixelSize(nameFont);
+ const auto name = QFontMetrics(font).elidedText(
+ QString::fromStdString(info_.name), Qt::ElideRight, availableTextWidth - 4 * Padding);
+
+ font.setWeight(60);
+ p.setFont(font);
+ p.drawTextLeft(0, 0, name);
+
+ // Draw the number of members
+ p.translate(0, QFontMetrics(p.font()).ascent() + 2 * Padding);
+
+ font.setPixelSize(membersFont);
+ font.setWeight(50);
+ p.setFont(font);
+ p.drawTextLeft(0, 0, members);
+ p.restore();
+
+ if (avatar_.isNull()) {
+ font.setPixelSize(AvatarSize / 2);
+ font.setWeight(60);
+ p.setFont(font);
+
+ p.translate(Padding, Padding);
+ p.drawLetterAvatar(utils::firstChar(name),
+ QColor("white"),
+ QColor("black"),
+ AvatarSize + Padding,
+ AvatarSize + Padding,
+ AvatarSize);
+ } else {
+ QRect avatarRegion(Padding, Padding, AvatarSize, AvatarSize);
+
+ QPainterPath pp;
+ pp.addEllipse(avatarRegion.center(), AvatarSize, AvatarSize);
+
+ p.setClipPath(pp);
+ p.drawPixmap(avatarRegion, avatar_);
+ }
+}
|