forked from mirror/nheko
Merge branch '0.7.0-dev' of https://github.com/Nheko-Reborn/nheko into 0.7.0-dev
commit
35759d2c6c
@ -0,0 +1,35 @@ |
||||
# - Translate CMake compilers to the Boost.Build toolset equivalents |
||||
# To build Boost reliably when a non-system compiler may be used, we |
||||
# need to both specify the toolset when running bootstrap.sh *and* in |
||||
# the user-config.jam file. |
||||
# |
||||
# This module provides the following functions to help translate between |
||||
# the systems: |
||||
# |
||||
# function Boost_Get_ToolsetId(<var>) |
||||
# Set var equal to Boost's name for the CXX toolchain picked |
||||
# up by CMake. Only supports GNU and Clang families at present. |
||||
# Intel support is provisional |
||||
# |
||||
# downloaded from https://github.com/drbenmorgan/BoostBuilder/blob/master/BoostToolsetId.cmake |
||||
|
||||
function(Boost_Get_ToolsetId _var) |
||||
set(BOOST_TOOLSET) |
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") |
||||
if(APPLE) |
||||
set(BOOST_TOOLSET "darwin") |
||||
else() |
||||
set(BOOST_TOOLSET "gcc") |
||||
endif() |
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang") |
||||
set(BOOST_TOOLSET "clang") |
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel") |
||||
set(BOOST_TOOLSET "intel") |
||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") |
||||
set(BOOST_TOOLSET "msvc") |
||||
endif() |
||||
|
||||
set(${_var} ${BOOST_TOOLSET} PARENT_SCOPE) |
||||
endfunction() |
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,309 +0,0 @@ |
||||
#include <QDateTime> |
||||
#include <QDebug> |
||||
#include <QMouseEvent> |
||||
#include <QPainter> |
||||
#include <QtGlobal> |
||||
|
||||
#include "MainWindow.h" |
||||
#include "UserMentionsWidget.h" |
||||
#include "Utils.h" |
||||
#include "ui/Ripple.h" |
||||
#include "ui/RippleOverlay.h" |
||||
|
||||
constexpr int MaxUnreadCountDisplayed = 99; |
||||
|
||||
struct WMetrics |
||||
{ |
||||
int maxHeight; |
||||
int iconSize; |
||||
int padding; |
||||
int unit; |
||||
|
||||
int unreadLineWidth; |
||||
int unreadLineOffset; |
||||
|
||||
int inviteBtnX; |
||||
int inviteBtnY; |
||||
}; |
||||
|
||||
WMetrics |
||||
getWMetrics(const QFont &font) |
||||
{ |
||||
WMetrics m; |
||||
|
||||
const int height = QFontMetrics(font).lineSpacing(); |
||||
|
||||
m.unit = height; |
||||
m.maxHeight = std::ceil((double)height * 3.8); |
||||
m.iconSize = std::ceil((double)height * 2.8); |
||||
m.padding = std::ceil((double)height / 2.0); |
||||
m.unreadLineWidth = m.padding - m.padding / 3; |
||||
m.unreadLineOffset = m.padding - m.padding / 4; |
||||
|
||||
m.inviteBtnX = m.iconSize + 2 * m.padding; |
||||
m.inviteBtnX = m.iconSize / 2.0 + m.padding + m.padding / 3.0; |
||||
|
||||
return m; |
||||
} |
||||
|
||||
UserMentionsWidget::UserMentionsWidget(QWidget *parent) |
||||
: QWidget(parent) |
||||
, isPressed_(false) |
||||
, unreadMsgCount_(0) |
||||
{ |
||||
init(parent); |
||||
|
||||
QFont f; |
||||
f.setPointSizeF(f.pointSizeF()); |
||||
|
||||
const int fontHeight = QFontMetrics(f).height(); |
||||
const int widgetMargin = fontHeight / 3; |
||||
const int contentHeight = fontHeight * 3; |
||||
|
||||
setFixedHeight(contentHeight + widgetMargin); |
||||
|
||||
topLayout_ = new QHBoxLayout(this); |
||||
topLayout_->setSpacing(0); |
||||
topLayout_->setMargin(widgetMargin); |
||||
} |
||||
|
||||
void |
||||
UserMentionsWidget::init(QWidget *parent) |
||||
{ |
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); |
||||
setMouseTracking(true); |
||||
setAttribute(Qt::WA_Hover); |
||||
|
||||
setFixedHeight(getWMetrics(QFont{}).maxHeight); |
||||
|
||||
QPainterPath path; |
||||
path.addRect(0, 0, parent->width(), height()); |
||||
|
||||
ripple_overlay_ = new RippleOverlay(this); |
||||
ripple_overlay_->setClipPath(path); |
||||
ripple_overlay_->setClipping(true); |
||||
|
||||
unreadCountFont_.setPointSizeF(unreadCountFont_.pointSizeF() * 0.8); |
||||
unreadCountFont_.setBold(true); |
||||
|
||||
bubbleDiameter_ = QFontMetrics(unreadCountFont_).averageCharWidth() * 3; |
||||
} |
||||
|
||||
// void
|
||||
// UserMentionsWidget::resizeEvent(QResizeEvent *event)
|
||||
// {
|
||||
// Q_UNUSED(event);
|
||||
|
||||
// const auto sz = utils::calculateSidebarSizes(QFont{});
|
||||
|
||||
// if (width() <= sz.small) {
|
||||
// topLayout_->setContentsMargins(0, 0, logoutButtonSize_, 0);
|
||||
|
||||
// } else {
|
||||
// topLayout_->setMargin(5);
|
||||
// }
|
||||
|
||||
// QWidget::resizeEvent(event);
|
||||
// }
|
||||
|
||||
void |
||||
UserMentionsWidget::setPressedState(bool state) |
||||
{ |
||||
if (isPressed_ != state) { |
||||
isPressed_ = state; |
||||
update(); |
||||
} |
||||
} |
||||
|
||||
void |
||||
UserMentionsWidget::resizeEvent(QResizeEvent *) |
||||
{ |
||||
// Update ripple's clipping path.
|
||||
QPainterPath path; |
||||
path.addRect(0, 0, width(), height()); |
||||
|
||||
const auto sidebarSizes = utils::calculateSidebarSizes(QFont{}); |
||||
|
||||
if (width() > sidebarSizes.small) |
||||
setToolTip(""); |
||||
else |
||||
setToolTip(""); |
||||
|
||||
ripple_overlay_->setClipPath(path); |
||||
ripple_overlay_->setClipping(true); |
||||
} |
||||
|
||||
void |
||||
UserMentionsWidget::mousePressEvent(QMouseEvent *event) |
||||
{ |
||||
if (event->buttons() == Qt::RightButton) { |
||||
QWidget::mousePressEvent(event); |
||||
return; |
||||
} |
||||
|
||||
emit clicked(); |
||||
|
||||
setPressedState(true); |
||||
|
||||
// Ripple on mouse position by default.
|
||||
QPoint pos = event->pos(); |
||||
qreal radiusEndValue = static_cast<qreal>(width()) / 3; |
||||
|
||||
Ripple *ripple = new Ripple(pos); |
||||
|
||||
ripple->setRadiusEndValue(radiusEndValue); |
||||
ripple->setOpacityStartValue(0.15); |
||||
ripple->setColor(QColor("white")); |
||||
ripple->radiusAnimation()->setDuration(200); |
||||
ripple->opacityAnimation()->setDuration(400); |
||||
|
||||
ripple_overlay_->addRipple(ripple); |
||||
} |
||||
|
||||
void |
||||
UserMentionsWidget::paintEvent(QPaintEvent *event) |
||||
{ |
||||
Q_UNUSED(event); |
||||
|
||||
QPainter p(this); |
||||
p.setRenderHint(QPainter::TextAntialiasing); |
||||
p.setRenderHint(QPainter::SmoothPixmapTransform); |
||||
p.setRenderHint(QPainter::Antialiasing); |
||||
|
||||
auto wm = getWMetrics(QFont{}); |
||||
|
||||
QPen titlePen(titleColor_); |
||||
QPen subtitlePen(subtitleColor_); |
||||
|
||||
QFontMetrics metrics(QFont{}); |
||||
|
||||
if (isPressed_) { |
||||
p.fillRect(rect(), highlightedBackgroundColor_); |
||||
titlePen.setColor(highlightedTitleColor_); |
||||
subtitlePen.setColor(highlightedSubtitleColor_); |
||||
} else if (underMouse()) { |
||||
p.fillRect(rect(), hoverBackgroundColor_); |
||||
titlePen.setColor(hoverTitleColor_); |
||||
subtitlePen.setColor(hoverSubtitleColor_); |
||||
} else { |
||||
p.fillRect(rect(), backgroundColor_); |
||||
titlePen.setColor(titleColor_); |
||||
subtitlePen.setColor(subtitleColor_); |
||||
} |
||||
|
||||
// Description line with the default font.
|
||||
int bottom_y = wm.maxHeight - wm.padding - metrics.ascent() / 2; |
||||
|
||||
const auto sidebarSizes = utils::calculateSidebarSizes(QFont{}); |
||||
|
||||
if (width() > sidebarSizes.small) { |
||||
QFont headingFont; |
||||
headingFont.setWeight(QFont::Medium); |
||||
p.setFont(headingFont); |
||||
p.setPen(titlePen); |
||||
|
||||
QFont tsFont; |
||||
tsFont.setPointSizeF(tsFont.pointSizeF() * 0.9); |
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 11, 0) |
||||
const int msgStampWidth = QFontMetrics(tsFont).width("timestamp") + 4; |
||||
#else |
||||
const int msgStampWidth = QFontMetrics(tsFont).horizontalAdvance("timestamp") + 4; |
||||
#endif |
||||
// We use the full width of the widget if there is no unread msg bubble.
|
||||
// const int bottomLineWidthLimit = (unreadMsgCount_ > 0) ? msgStampWidth : 0;
|
||||
|
||||
// Name line.
|
||||
QFontMetrics fontNameMetrics(headingFont); |
||||
int top_y = 2 * wm.padding + fontNameMetrics.ascent() / 2; |
||||
|
||||
const auto name = metrics.elidedText( |
||||
"Mentions", |
||||
Qt::ElideRight, |
||||
(width() - wm.iconSize - 2 * wm.padding - msgStampWidth) * 0.8); |
||||
p.drawText(QPoint(2 * wm.padding + wm.iconSize, top_y), name); |
||||
|
||||
p.setFont(QFont{}); |
||||
p.setPen(subtitlePen); |
||||
|
||||
// The limit is the space between the end of the avatar and the start of the
|
||||
// timestamp.
|
||||
int usernameLimit = |
||||
std::max(0, width() - 3 * wm.padding - msgStampWidth - wm.iconSize - 20); |
||||
auto userName = |
||||
metrics.elidedText("Show Mentioned Messages", Qt::ElideRight, usernameLimit); |
||||
|
||||
p.setFont(QFont{}); |
||||
p.drawText(QPoint(2 * wm.padding + wm.iconSize, bottom_y), userName); |
||||
|
||||
// We show the last message timestamp.
|
||||
p.save(); |
||||
if (isPressed_) { |
||||
p.setPen(QPen(highlightedTimestampColor_)); |
||||
} else if (underMouse()) { |
||||
p.setPen(QPen(hoverTimestampColor_)); |
||||
} else { |
||||
p.setPen(QPen(timestampColor_)); |
||||
} |
||||
|
||||
// p.setFont(tsFont);
|
||||
// p.drawText(QPoint(width() - wm.padding - msgStampWidth, top_y), "timestamp");
|
||||
p.restore(); |
||||
} |
||||
|
||||
p.setPen(Qt::NoPen); |
||||
|
||||
if (unreadMsgCount_ > 0) { |
||||
QBrush brush; |
||||
brush.setStyle(Qt::SolidPattern); |
||||
|
||||
brush.setColor(mentionedColor()); |
||||
|
||||
if (isPressed_) |
||||
brush.setColor(bubbleFgColor()); |
||||
|
||||
p.setBrush(brush); |
||||
p.setPen(Qt::NoPen); |
||||
p.setFont(unreadCountFont_); |
||||
|
||||
// Extra space on the x-axis to accomodate the extra character space
|
||||
// inside the bubble.
|
||||
const int x_width = unreadMsgCount_ > MaxUnreadCountDisplayed |
||||
? QFontMetrics(p.font()).averageCharWidth() |
||||
: 0; |
||||
|
||||
QRectF r(width() - bubbleDiameter_ - wm.padding - x_width, |
||||
bottom_y - bubbleDiameter_ / 2 - 5, |
||||
bubbleDiameter_ + x_width, |
||||
bubbleDiameter_); |
||||
|
||||
if (width() == sidebarSizes.small) |
||||
r = QRectF(width() - bubbleDiameter_ - 5, |
||||
height() - bubbleDiameter_ - 5, |
||||
bubbleDiameter_ + x_width, |
||||
bubbleDiameter_); |
||||
|
||||
p.setPen(Qt::NoPen); |
||||
p.drawEllipse(r); |
||||
|
||||
p.setPen(QPen(bubbleFgColor())); |
||||
|
||||
if (isPressed_) |
||||
p.setPen(QPen(bubbleBgColor())); |
||||
|
||||
auto countTxt = unreadMsgCount_ > MaxUnreadCountDisplayed |
||||
? QString("99+") |
||||
: QString::number(unreadMsgCount_); |
||||
|
||||
p.setBrush(Qt::NoBrush); |
||||
p.drawText(r.translated(0, -0.5), Qt::AlignCenter, countTxt); |
||||
} |
||||
|
||||
if (!isPressed_ && hasUnreadMessages_) { |
||||
QPen pen; |
||||
pen.setWidth(wm.unreadLineWidth); |
||||
pen.setColor(highlightedBackgroundColor_); |
||||
|
||||
p.setPen(pen); |
||||
p.drawLine(0, wm.unreadLineOffset, 0, height() - wm.unreadLineOffset); |
||||
} |
||||
} |
@ -1,164 +0,0 @@ |
||||
#pragma once |
||||
|
||||
#include <QColor> |
||||
#include <QHBoxLayout> |
||||
#include <QLabel> |
||||
#include <QLayout> |
||||
#include <QWidget> |
||||
|
||||
class FlatButton; |
||||
class RippleOverlay; |
||||
|
||||
class UserMentionsWidget : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) |
||||
|
||||
Q_PROPERTY(QColor highlightedBackgroundColor READ highlightedBackgroundColor WRITE |
||||
setHighlightedBackgroundColor) |
||||
Q_PROPERTY( |
||||
QColor hoverBackgroundColor READ hoverBackgroundColor WRITE setHoverBackgroundColor) |
||||
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) |
||||
|
||||
Q_PROPERTY(QColor avatarBgColor READ avatarBgColor WRITE setAvatarBgColor) |
||||
Q_PROPERTY(QColor avatarFgColor READ avatarFgColor WRITE setAvatarFgColor) |
||||
|
||||
Q_PROPERTY(QColor bubbleBgColor READ bubbleBgColor WRITE setBubbleBgColor) |
||||
Q_PROPERTY(QColor bubbleFgColor READ bubbleFgColor WRITE setBubbleFgColor) |
||||
|
||||
Q_PROPERTY(QColor titleColor READ titleColor WRITE setTitleColor) |
||||
Q_PROPERTY(QColor subtitleColor READ subtitleColor WRITE setSubtitleColor) |
||||
|
||||
Q_PROPERTY(QColor timestampColor READ timestampColor WRITE setTimestampColor) |
||||
Q_PROPERTY(QColor highlightedTimestampColor READ highlightedTimestampColor WRITE |
||||
setHighlightedTimestampColor) |
||||
Q_PROPERTY(QColor hoverTimestampColor READ hoverTimestampColor WRITE setHoverTimestampColor) |
||||
|
||||
Q_PROPERTY( |
||||
QColor highlightedTitleColor READ highlightedTitleColor WRITE setHighlightedTitleColor) |
||||
Q_PROPERTY(QColor highlightedSubtitleColor READ highlightedSubtitleColor WRITE |
||||
setHighlightedSubtitleColor) |
||||
|
||||
Q_PROPERTY(QColor hoverTitleColor READ hoverTitleColor WRITE setHoverTitleColor) |
||||
Q_PROPERTY(QColor hoverSubtitleColor READ hoverSubtitleColor WRITE setHoverSubtitleColor) |
||||
|
||||
Q_PROPERTY(QColor mentionedColor READ mentionedColor WRITE setMentionedColor) |
||||
Q_PROPERTY(QColor btnColor READ btnColor WRITE setBtnColor) |
||||
Q_PROPERTY(QColor btnTextColor READ btnTextColor WRITE setBtnTextColor) |
||||
|
||||
public: |
||||
UserMentionsWidget(QWidget *parent = 0); |
||||
|
||||
void updateUnreadMessageCount(int count); |
||||
void clearUnreadMessageCount() { updateUnreadMessageCount(0); }; |
||||
bool isPressed() const { return isPressed_; } |
||||
int unreadMessageCount() const { return unreadMsgCount_; } |
||||
QColor borderColor() const { return borderColor_; } |
||||
void setBorderColor(QColor &color) { borderColor_ = color; } |
||||
QColor highlightedBackgroundColor() const { return highlightedBackgroundColor_; } |
||||
QColor hoverBackgroundColor() const { return hoverBackgroundColor_; } |
||||
QColor hoverTitleColor() const { return hoverTitleColor_; } |
||||
QColor hoverSubtitleColor() const { return hoverSubtitleColor_; } |
||||
QColor hoverTimestampColor() const { return hoverTimestampColor_; } |
||||
QColor backgroundColor() const { return backgroundColor_; } |
||||
QColor avatarBgColor() const { return avatarBgColor_; } |
||||
QColor avatarFgColor() const { return avatarFgColor_; } |
||||
|
||||
QColor highlightedTitleColor() const { return highlightedTitleColor_; } |
||||
QColor highlightedSubtitleColor() const { return highlightedSubtitleColor_; } |
||||
QColor highlightedTimestampColor() const { return highlightedTimestampColor_; } |
||||
|
||||
QColor titleColor() const { return titleColor_; } |
||||
QColor subtitleColor() const { return subtitleColor_; } |
||||
QColor timestampColor() const { return timestampColor_; } |
||||
QColor btnColor() const { return btnColor_; } |
||||
QColor btnTextColor() const { return btnTextColor_; } |
||||
|
||||
QColor bubbleFgColor() const { return bubbleFgColor_; } |
||||
QColor bubbleBgColor() const { return bubbleBgColor_; } |
||||
QColor mentionedColor() const { return mentionedFontColor_; } |
||||
|
||||
void setHighlightedBackgroundColor(QColor &color) { highlightedBackgroundColor_ = color; } |
||||
void setHoverBackgroundColor(QColor &color) { hoverBackgroundColor_ = color; } |
||||
void setHoverSubtitleColor(QColor &color) { hoverSubtitleColor_ = color; } |
||||
void setHoverTitleColor(QColor &color) { hoverTitleColor_ = color; } |
||||
void setHoverTimestampColor(QColor &color) { hoverTimestampColor_ = color; } |
||||
void setBackgroundColor(QColor &color) { backgroundColor_ = color; } |
||||
void setTimestampColor(QColor &color) { timestampColor_ = color; } |
||||
void setAvatarFgColor(QColor &color) { avatarFgColor_ = color; } |
||||
void setAvatarBgColor(QColor &color) { avatarBgColor_ = color; } |
||||
|
||||
void setHighlightedTitleColor(QColor &color) { highlightedTitleColor_ = color; } |
||||
void setHighlightedSubtitleColor(QColor &color) { highlightedSubtitleColor_ = color; } |
||||
void setHighlightedTimestampColor(QColor &color) { highlightedTimestampColor_ = color; } |
||||
|
||||
void setTitleColor(QColor &color) { titleColor_ = color; } |
||||
void setSubtitleColor(QColor &color) { subtitleColor_ = color; } |
||||
|
||||
void setBtnColor(QColor &color) { btnColor_ = color; } |
||||
void setBtnTextColor(QColor &color) { btnTextColor_ = color; } |
||||
|
||||
void setBubbleFgColor(QColor &color) { bubbleFgColor_ = color; } |
||||
void setBubbleBgColor(QColor &color) { bubbleBgColor_ = color; } |
||||
void setMentionedColor(QColor &color) { mentionedFontColor_ = color; } |
||||
|
||||
signals: |
||||
void clicked(); |
||||
|
||||
public slots: |
||||
void setPressedState(bool state); |
||||
|
||||
protected: |
||||
void mousePressEvent(QMouseEvent *event) override; |
||||
void paintEvent(QPaintEvent *event) override; |
||||
void resizeEvent(QResizeEvent *event) override; |
||||
|
||||
private: |
||||
void init(QWidget *parent); |
||||
|
||||
RippleOverlay *ripple_overlay_; |
||||
|
||||
bool isPressed_ = false; |
||||
|
||||
bool hasUnreadMessages_ = true; |
||||
|
||||
int unreadMsgCount_ = 0; |
||||
|
||||
QHBoxLayout *topLayout_; |
||||
|
||||
QColor borderColor_; |
||||
QColor highlightedBackgroundColor_; |
||||
QColor hoverBackgroundColor_; |
||||
QColor backgroundColor_; |
||||
|
||||
QColor highlightedTitleColor_; |
||||
QColor highlightedSubtitleColor_; |
||||
|
||||
QColor titleColor_; |
||||
QColor subtitleColor_; |
||||
|
||||
QColor hoverTitleColor_; |
||||
QColor hoverSubtitleColor_; |
||||
|
||||
QColor btnColor_; |
||||
QColor btnTextColor_; |
||||
|
||||
QRectF acceptBtnRegion_; |
||||
QRectF declineBtnRegion_; |
||||
|
||||
// Fonts
|
||||
QColor mentionedFontColor_; |
||||
QFont unreadCountFont_; |
||||
int bubbleDiameter_; |
||||
|
||||
QColor timestampColor_; |
||||
QColor highlightedTimestampColor_; |
||||
QColor hoverTimestampColor_; |
||||
|
||||
QColor avatarBgColor_; |
||||
QColor avatarFgColor_; |
||||
|
||||
QColor bubbleBgColor_; |
||||
QColor bubbleFgColor_; |
||||
}; |
@ -1,58 +0,0 @@ |
||||
#include <QTimer> |
||||
|
||||
#include "UserMentions.h" |
||||
#include "timeline/TimelineItem.h" |
||||
|
||||
using namespace dialogs; |
||||
|
||||
UserMentions::UserMentions(QWidget *parent) |
||||
: QWidget{parent} |
||||
{ |
||||
top_layout_ = new QVBoxLayout(this); |
||||
top_layout_->setSpacing(0); |
||||
top_layout_->setMargin(0); |
||||
|
||||
scroll_area_ = new QScrollArea(this); |
||||
scroll_area_->setWidgetResizable(true); |
||||
scroll_area_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
||||
|
||||
scroll_widget_ = new QWidget(this); |
||||
scroll_widget_->setObjectName("scroll_widget"); |
||||
|
||||
// Height of the typing display.
|
||||
QFont f; |
||||
f.setPointSizeF(f.pointSizeF() * 0.9); |
||||
const int bottomMargin = QFontMetrics(f).height() + 6; |
||||
|
||||
scroll_layout_ = new QVBoxLayout(scroll_widget_); |
||||
scroll_layout_->setContentsMargins(4, 0, 15, bottomMargin); |
||||
scroll_layout_->setSpacing(0); |
||||
scroll_layout_->setObjectName("timelinescrollarea"); |
||||
|
||||
scroll_area_->setWidget(scroll_widget_); |
||||
scroll_area_->setAlignment(Qt::AlignBottom); |
||||
|
||||
top_layout_->addWidget(scroll_area_); |
||||
|
||||
setLayout(top_layout_); |
||||
} |
||||
|
||||
void |
||||
UserMentions::pushItem(const QString &event_id, |
||||
const QString &user_id, |
||||
const QString &body, |
||||
const QString &room_id) |
||||
{ |
||||
TimelineItem *view_item = new TimelineItem( |
||||
mtx::events::MessageType::Text, user_id, body, true, room_id, scroll_widget_); |
||||
view_item->setEventId(event_id); |
||||
setUpdatesEnabled(false); |
||||
view_item->hide(); |
||||
|
||||
scroll_layout_->addWidget(view_item); |
||||
QTimer::singleShot(0, this, [view_item, this]() { |
||||
view_item->show(); |
||||
view_item->adjustSize(); |
||||
setUpdatesEnabled(true); |
||||
}); |
||||
} |
@ -1,28 +0,0 @@ |
||||
#pragma once |
||||
|
||||
#include <QScrollArea> |
||||
#include <QScrollBar> |
||||
#include <QVBoxLayout> |
||||
#include <QWidget> |
||||
|
||||
namespace dialogs { |
||||
|
||||
class UserMentions : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
UserMentions(QWidget *parent = nullptr); |
||||
void pushItem(const QString &event_id, |
||||
const QString &user_id, |
||||
const QString &body, |
||||
const QString &room_id); |
||||
|
||||
private: |
||||
QVBoxLayout *top_layout_; |
||||
QVBoxLayout *scroll_layout_; |
||||
|
||||
QScrollArea *scroll_area_; |
||||
QWidget *scroll_widget_; |
||||
}; |
||||
|
||||
} |
@ -0,0 +1,161 @@ |
||||
#include <QPainter> |
||||
#include <QStyleOption> |
||||
#include <QTabWidget> |
||||
#include <QTimer> |
||||
|
||||
#include "Cache.h" |
||||
#include "ChatPage.h" |
||||
#include "Logging.h" |
||||
#include "UserMentions.h" |
||||
#include "timeline/TimelineItem.h" |
||||
|
||||
using namespace popups; |
||||
|
||||
UserMentions::UserMentions(QWidget *parent) |
||||
: QWidget{parent} |
||||
{ |
||||
setAttribute(Qt::WA_ShowWithoutActivating, true); |
||||
setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); |
||||
|
||||
tab_layout_ = new QTabWidget(this); |
||||
|
||||
top_layout_ = new QVBoxLayout(this); |
||||
top_layout_->setSpacing(0); |
||||
top_layout_->setMargin(0); |
||||
|
||||
local_scroll_area_ = new QScrollArea(this); |
||||
local_scroll_area_->setWidgetResizable(true); |
||||
local_scroll_area_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
||||
|
||||
local_scroll_widget_ = new QWidget(this); |
||||
local_scroll_widget_->setObjectName("local_scroll_widget"); |
||||
|
||||
all_scroll_area_ = new QScrollArea(this); |
||||
all_scroll_area_->setWidgetResizable(true); |
||||
all_scroll_area_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
||||
|
||||
all_scroll_widget_ = new QWidget(this); |
||||
all_scroll_widget_->setObjectName("all_scroll_widget"); |
||||
|
||||
// Height of the typing display.
|
||||
QFont f; |
||||
f.setPointSizeF(f.pointSizeF() * 0.9); |
||||
const int bottomMargin = QFontMetrics(f).height() + 6; |
||||
|
||||
local_scroll_layout_ = new QVBoxLayout(local_scroll_widget_); |
||||
local_scroll_layout_->setContentsMargins(4, 0, 15, bottomMargin); |
||||
local_scroll_layout_->setSpacing(0); |
||||
local_scroll_layout_->setObjectName("localscrollarea"); |
||||
|
||||
all_scroll_layout_ = new QVBoxLayout(all_scroll_widget_); |
||||
all_scroll_layout_->setContentsMargins(4, 0, 15, bottomMargin); |
||||
all_scroll_layout_->setSpacing(0); |
||||
all_scroll_layout_->setObjectName("allscrollarea"); |
||||
|
||||
local_scroll_area_->setWidget(local_scroll_widget_); |
||||
local_scroll_area_->setAlignment(Qt::AlignBottom); |
||||
|
||||
all_scroll_area_->setWidget(all_scroll_widget_); |
||||
all_scroll_area_->setAlignment(Qt::AlignBottom); |
||||
|
||||
tab_layout_->addTab(local_scroll_area_, tr("This Room")); |
||||
tab_layout_->addTab(all_scroll_area_, tr("All Rooms")); |
||||
top_layout_->addWidget(tab_layout_); |
||||
|
||||
setLayout(top_layout_); |
||||
} |
||||
|
||||
void |
||||
UserMentions::initializeMentions(const QMap<QString, mtx::responses::Notifications> ¬ifs) |
||||
{ |
||||
nhlog::ui()->debug("Initializing " + std::to_string(notifs.size()) + " notifications."); |
||||
|
||||
for (const auto &item : notifs) { |
||||
for (const auto notif : item.notifications) { |
||||
const auto event_id = QString::fromStdString(utils::event_id(notif.event)); |
||||
|
||||
try { |
||||
const auto room_id = QString::fromStdString(notif.room_id); |
||||
const auto user_id = utils::event_sender(notif.event); |
||||
const auto body = utils::event_body(notif.event); |
||||
|
||||
pushItem(event_id, |
||||
user_id, |
||||
body, |
||||
room_id, |
||||
ChatPage::instance()->currentRoom()); |
||||
|
||||
} catch (const lmdb::error &e) { |
||||
nhlog::db()->warn("error while sending desktop notification: {}", |
||||
e.what()); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
void |
||||
UserMentions::showPopup() |
||||
{ |
||||
for (auto widget : all_scroll_layout_->findChildren<QWidget *>()) { |
||||
delete widget; |
||||
} |
||||
for (auto widget : local_scroll_layout_->findChildren<QWidget *>()) { |
||||
delete widget; |
||||
} |
||||
|
||||
auto notifs = cache::client()->getTimelineMentions(); |
||||
|
||||
initializeMentions(notifs); |
||||
show(); |
||||
} |
||||
|
||||
void |
||||
UserMentions::pushItem(const QString &event_id, |
||||
const QString &user_id, |
||||
const QString &body, |
||||
const QString &room_id, |
||||
const QString ¤t_room_id) |
||||
{ |
||||
setUpdatesEnabled(false); |
||||
|
||||
// Add to the 'all' section
|
||||
TimelineItem *view_item = new TimelineItem( |
||||
mtx::events::MessageType::Text, user_id, body, true, room_id, all_scroll_widget_); |
||||
view_item->setEventId(event_id); |
||||
view_item->hide(); |
||||
|
||||
all_scroll_layout_->addWidget(view_item); |
||||
QTimer::singleShot(0, this, [view_item, this]() { |
||||
view_item->show(); |
||||
view_item->adjustSize(); |
||||
setUpdatesEnabled(true); |
||||
}); |
||||
|
||||
// if it matches the current room... add it to the current room as well.
|
||||
if (QString::compare(room_id, current_room_id, Qt::CaseInsensitive) == 0) { |
||||
// Add to the 'local' section
|
||||
TimelineItem *local_view_item = new TimelineItem(mtx::events::MessageType::Text, |
||||
user_id, |
||||
body, |
||||
true, |
||||
room_id, |
||||
local_scroll_widget_); |
||||
local_view_item->setEventId(event_id); |
||||
local_view_item->hide(); |
||||
local_scroll_layout_->addWidget(local_view_item); |
||||
|
||||
QTimer::singleShot(0, this, [local_view_item]() { |
||||
local_view_item->show(); |
||||
local_view_item->adjustSize(); |
||||
}); |
||||
} |
||||
} |
||||
|
||||
void |
||||
UserMentions::paintEvent(QPaintEvent *) |
||||
{ |
||||
QStyleOption opt; |
||||
opt.init(this); |
||||
QPainter p(this); |
||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); |
||||
} |
@ -0,0 +1,51 @@ |
||||
#pragma once |
||||
|
||||
#include <mtx/responses.hpp> |
||||
|
||||
#include <QApplication> |
||||
#include <QEvent> |
||||
#include <QMap> |
||||
#include <QPaintEvent> |
||||
#include <QScrollArea> |
||||
#include <QScrollBar> |
||||
#include <QString> |
||||
#include <QTabWidget> |
||||
#include <QVBoxLayout> |
||||
#include <QWidget> |
||||
#include <Qt> |
||||
|
||||
#include "Logging.h" |
||||
|
||||
namespace popups { |
||||
|
||||
class UserMentions : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
UserMentions(QWidget *parent = nullptr); |
||||
|
||||
void initializeMentions(const QMap<QString, mtx::responses::Notifications> ¬ifs); |
||||
void showPopup(); |
||||
|
||||
protected: |
||||
void paintEvent(QPaintEvent *) override; |
||||
|
||||
private: |
||||
void pushItem(const QString &event_id, |
||||
const QString &user_id, |
||||
const QString &body, |
||||
const QString &room_id, |
||||
const QString ¤t_room_id); |
||||
QTabWidget *tab_layout_; |
||||
QVBoxLayout *top_layout_; |
||||
QVBoxLayout *local_scroll_layout_; |
||||
QVBoxLayout *all_scroll_layout_; |
||||
|
||||
QScrollArea *local_scroll_area_; |
||||
QWidget *local_scroll_widget_; |
||||
|
||||
QScrollArea *all_scroll_area_; |
||||
QWidget *all_scroll_widget_; |
||||
}; |
||||
|
||||
} |
Binary file not shown.
Loading…
Reference in new issue