Implement basic user popup

What needs more work:
 - Make sure popup is gone if you click away
 - Add timeouts etc and make them work (relies on Channel being able to
         send messages)
This commit is contained in:
Rasmus Karlsson 2017-03-23 23:23:32 +01:00
parent 8ef492d7ae
commit b010d90689
6 changed files with 285 additions and 7 deletions

View file

@ -55,7 +55,8 @@ SOURCES += main.cpp\
windows.cpp \
messages/messageref.cpp \
logging/loggingmanager.cpp \
logging/loggingchannel.cpp
logging/loggingchannel.cpp \
widgets/userpopupwidget.cpp
HEADERS += account.h \
asyncexec.h \
@ -101,7 +102,8 @@ HEADERS += account.h \
messages/limitedqueuesnapshot.h \
messages/messageref.h \
logging/loggingmanager.h \
logging/loggingchannel.h
logging/loggingchannel.h \
widgets/userpopupwidget.h
PRECOMPILED_HEADER =
@ -118,3 +120,6 @@ win32 {
macx {
INCLUDEPATH += /usr/local/include
}
FORMS += \
forms/userpopup.ui

124
forms/userpopup.ui Normal file
View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>UserPopup</class>
<widget class="QWidget" name="UserPopup">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>131</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>UserPopup</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="0">
<widget class="QPushButton" name="btnPurge">
<property name="text">
<string>Purge</string>
</property>
</widget>
</item>
<item row="1" column="1" rowspan="2" colspan="2">
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Views</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lblViews">
<property name="text">
<string>420</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Followers</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lblFollowers">
<property name="text">
<string>69</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Account Age</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="lblAccountAge">
<property name="text">
<string>6 years</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="lblUsername">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>USERNAME</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnClose">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0" rowspan="3">
<widget class="QLabel" name="lblAvatar">
<property name="text">
<string>AVATAR</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View file

@ -4,6 +4,7 @@
#include "messages/message.h"
#include "messages/wordpart.h"
#include "settings.h"
#include "ui_userpopup.h"
#include "widgets/chatwidget.h"
#include <math.h>
@ -20,7 +21,7 @@ ChatWidgetView::ChatWidgetView(ChatWidget *parent)
: QWidget()
, chatWidget(parent)
, scrollbar(this)
, onlyUpdateEmotes(false)
, userPopupWidget(this->chatWidget->getChannel())
{
this->setAttribute(Qt::WA_OpaquePaintEvent);
this->scrollbar.setSmallChange(5);
@ -311,16 +312,78 @@ ChatWidgetView::mouseMoveEvent(QMouseEvent *event)
int index = message->getSelectionIndex(relativePos);
qDebug() << index;
if (hoverWord.getLink().getIsValid()) {
this->setCursor(Qt::PointingHandCursor);
qDebug() << hoverWord.getLink().getValue();
} else {
this->setCursor(Qt::ArrowCursor);
}
}
void
ChatWidgetView::mousePressEvent(QMouseEvent *event)
{
this->mouseDown = true;
this->latestPressPosition = event->screenPos();
}
static float
distanceBetweenPoints(const QPointF &p1, const QPointF &p2)
{
QPointF tmp = p1 - p2;
float distance = 0.f;
distance += tmp.x() * tmp.x();
distance += tmp.y() * tmp.y();
return std::sqrt(distance);
}
void
ChatWidgetView::mouseReleaseEvent(QMouseEvent *event)
{
if (!this->mouseDown) {
// We didn't grab the mouse press, so we shouldn't be handling the mouse
// release
return;
}
this->mouseDown = false;
float distance =
distanceBetweenPoints(this->latestPressPosition, event->screenPos());
qDebug() << "Distance: " << distance;
if (std::fabsf(distance) > 15.f) {
// It wasn't a proper click, so we don't care about that here
return;
}
// If you clicked and released less than X pixels away, it counts
// as a click!
// show user thing pajaW
std::shared_ptr<messages::MessageRef> message;
QPoint relativePos;
if (!tryGetMessageAt(event->pos(), message, relativePos)) {
// No message at clicked position
this->userPopupWidget.hide();
return;
}
auto _message = message->getMessage();
auto user = _message->getUserName();
qDebug() << "Clicked " << user << "s message";
this->userPopupWidget.setName(user);
this->userPopupWidget.move(event->screenPos().toPoint());
this->userPopupWidget.show();
this->userPopupWidget.setFocus();
}
bool
ChatWidgetView::tryGetMessageAt(QPoint p,
std::shared_ptr<messages::MessageRef> &_message,

View file

@ -6,6 +6,7 @@
#include "messages/messageref.h"
#include "messages/word.h"
#include "widgets/scrollbar.h"
#include "widgets/userpopupwidget.h"
#include <QPaintEvent>
#include <QScroller>
@ -40,6 +41,8 @@ protected:
void wheelEvent(QWheelEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
bool tryGetMessageAt(QPoint p,
std::shared_ptr<messages::MessageRef> &message,
@ -56,7 +59,13 @@ private:
ChatWidget *chatWidget;
ScrollBar scrollbar;
bool onlyUpdateEmotes;
UserPopupWidget userPopupWidget;
bool onlyUpdateEmotes = false;
// Mouse event variables
bool mouseDown = false;
QPointF latestPressPosition;
private slots:
void

View file

@ -0,0 +1,42 @@
#include "userpopupwidget.h"
#include "channel.h"
#include "ui_userpopup.h"
#include <QDebug>
namespace chatterino {
namespace widgets {
UserPopupWidget::UserPopupWidget(std::shared_ptr<Channel> &&_channel)
: QWidget(nullptr)
, ui(new Ui::UserPopup)
, channel(std::move(_channel))
{
this->ui->setupUi(this);
this->resize(0, 0);
this->setWindowFlags(Qt::FramelessWindowHint);
// Close button
connect(this->ui->btnClose, &QPushButton::clicked, [=]() {
this->hide(); //
});
connect(this->ui->btnPurge, &QPushButton::clicked, [=]() {
qDebug() << "xD: " << this->channel->getName();
/*
this->channel->sendMessage(
QString(".timeout %1 0").arg(this->ui->lblUsername->text()));
*/
});
}
void
UserPopupWidget::setName(const QString &name)
{
this->ui->lblUsername->setText(name);
}
} // namespace widgets
} // namespace chatterino

35
widgets/userpopupwidget.h Normal file
View file

@ -0,0 +1,35 @@
#ifndef USERPOPUPWIDGET_H
#define USERPOPUPWIDGET_H
#include <QWidget>
#include <memory>
namespace Ui {
class UserPopup;
}
namespace chatterino {
class Channel;
namespace widgets {
class UserPopupWidget : public QWidget
{
Q_OBJECT
public:
UserPopupWidget(std::shared_ptr<Channel> &&_channel);
void setName(const QString &name);
private:
Ui::UserPopup *ui;
std::shared_ptr<Channel> channel;
};
} // namespace widgets
} // namespace chatterino
#endif // USERPOPUPWIDGET_H