summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-30 21:41:47 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-30 21:41:47 +0300
commit3097037c3dc882be2efe64dce6aefeea43d5f040 (patch)
tree1e3375fbd423c3bd18513e6d2a502b7fa1e4cfb8 /src
parentShow room tooltips when the sidebar is collapsed (diff)
downloadnheko-3097037c3dc882be2efe64dce6aefeea43d5f040.tar.xz
Add prototype room settings menu
Diffstat (limited to 'src')
-rw-r--r--src/Cache.cc22
-rw-r--r--src/CommunitiesListItem.cc3
-rw-r--r--src/MainWindow.cc22
-rw-r--r--src/TopRoomBar.cc6
-rw-r--r--src/dialogs/RoomSettings.cpp147
5 files changed, 191 insertions, 9 deletions
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_); + } +}