summary refs log tree commit diff
path: root/src/SuggestionsPopup.cpp
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-03-24 23:16:15 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-03-24 23:16:15 +0200
commit553a97c8bb5042fbef0487255af52a4a6793d0fd (patch)
tree637a38c762fa6847c16cc9245a795c69314941f6 /src/SuggestionsPopup.cpp
parentAdjust version number for the windows build (diff)
downloadnheko-553a97c8bb5042fbef0487255af52a4a6793d0fd.tar.xz
Add basic support for username auto-completion
fixes #40
Diffstat (limited to 'src/SuggestionsPopup.cpp')
-rw-r--r--src/SuggestionsPopup.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/SuggestionsPopup.cpp b/src/SuggestionsPopup.cpp
new file mode 100644

index 00000000..3a7b3852 --- /dev/null +++ b/src/SuggestionsPopup.cpp
@@ -0,0 +1,105 @@ +#include "Avatar.h" +#include "AvatarProvider.h" +#include "Config.h" +#include "DropShadow.h" +#include "SuggestionsPopup.hpp" +#include "Utils.h" +#include "timeline/TimelineViewManager.h" + +#include <QDebug> +#include <QPaintEvent> +#include <QPainter> +#include <QStyleOption> + +constexpr int PopupHMargin = 5; +constexpr int PopupItemMargin = 4; + +PopupItem::PopupItem(QWidget *parent, const QString &user_id) + : QWidget(parent) + , avatar_{new Avatar(this)} + , user_id_{user_id} +{ + setMouseTracking(true); + setAttribute(Qt::WA_Hover); + + topLayout_ = new QHBoxLayout(this); + topLayout_->setContentsMargins( + PopupHMargin, PopupItemMargin, PopupHMargin, PopupItemMargin); + + QFont font; + font.setPixelSize(conf::popup::font); + + auto displayName = TimelineViewManager::displayName(user_id); + + avatar_->setSize(conf::popup::avatar); + avatar_->setLetter(utils::firstChar(displayName)); + + // If it's a matrix id we use the second letter. + if (displayName.size() > 1 && displayName.at(0) == '@') + avatar_->setLetter(QChar(displayName.at(1))); + + userName_ = new QLabel(displayName, this); + userName_->setFont(font); + + topLayout_->addWidget(avatar_); + topLayout_->addWidget(userName_, 1); + + /* AvatarProvider::resolve(user_id, [this](const QImage &img) { avatar_->setImage(img); }); + */ +} + +void +PopupItem::paintEvent(QPaintEvent *) +{ + QStyleOption opt; + opt.init(this); + QPainter p(this); + style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); + + if (underMouse()) + p.fillRect(rect(), hoverColor_); +} + +void +PopupItem::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() != Qt::RightButton) + emit clicked(TimelineViewManager::displayName(user_id_)); + + QWidget::mousePressEvent(event); +} + +SuggestionsPopup::SuggestionsPopup(QWidget *parent) + : QWidget(parent) +{ + setAttribute(Qt::WA_ShowWithoutActivating, true); + setWindowFlags(Qt::ToolTip | Qt::NoDropShadowWindowHint); + + layout_ = new QVBoxLayout(this); + layout_->setMargin(0); + layout_->setSpacing(0); +} + +void +SuggestionsPopup::addUsers(const QVector<SearchResult> &users) +{ + // Remove all items from the layout. + QLayoutItem *item; + while ((item = layout_->takeAt(0)) != 0) { + delete item->widget(); + delete item; + } + + if (users.isEmpty()) { + hide(); + return; + } + + for (const auto &u : users) { + auto user = new PopupItem(this, u.user_id); + layout_->addWidget(user); + connect(user, &PopupItem::clicked, this, &SuggestionsPopup::itemSelected); + } + + resize(geometry().width(), 40 * users.size()); +}