Add prototype room settings menu

This commit is contained in:
Konstantinos Sideris 2018-04-30 21:41:47 +03:00
parent 21c68c5824
commit 3097037c3d
14 changed files with 309 additions and 12 deletions

View file

@ -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();

View file

@ -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(),

View file

@ -41,6 +41,7 @@
#include "dialogs/JoinRoom.h"
#include "dialogs/LeaveRoom.h"
#include "dialogs/Logout.h"
#include "dialogs/RoomSettings.hpp"
MainWindow *MainWindow::instance_ = nullptr;
@ -262,6 +263,27 @@ MainWindow::hasActiveUser()
settings.contains("auth/user_id");
}
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)
{

View file

@ -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());

View file

@ -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_);
}
}