summary refs log tree commit diff
path: root/src/dialogs
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/dialogs
parentShow room tooltips when the sidebar is collapsed (diff)
downloadnheko-3097037c3dc882be2efe64dce6aefeea43d5f040.tar.xz
Add prototype room settings menu
Diffstat (limited to 'src/dialogs')
-rw-r--r--src/dialogs/RoomSettings.cpp147
1 files changed, 147 insertions, 0 deletions
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_); + } +}