diff --git a/CMakeLists.txt b/CMakeLists.txt index 66d262f0..4a0bf50f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -270,7 +270,7 @@ find_package(Boost 1.66 REQUIRED thread) find_package(ZLIB REQUIRED) find_package(OpenSSL REQUIRED) -find_package(MatrixClient 0.1.0 REQUIRED) +find_package(MatrixClient 0.3.0 REQUIRED) find_package(Olm 2 REQUIRED) find_package(spdlog 1.0.0 CONFIG REQUIRED) find_package(cmark REQUIRED) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 9a6fd433..1df09cc9 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -46,17 +46,16 @@ set(BOOST_SHA256 set( MTXCLIENT_URL - https://github.com/Nheko-Reborn/mtxclient/archive/32065798a2efa205052fcd2f470c52326a46d0b9.tar.gz + https://github.com/Nheko-Reborn/mtxclient/archive/35b596a98d516e044a6a25803ba6b93b6c0a538b.tar.gz ) set(MTXCLIENT_HASH - 3ddc6a482b5f388533bbaa69c44f1621d65a4e38fcb6cafaff83330975ea7e2b) + ea770f52afaad45706b8050aa3d860fa98780c60f2d3f061f2c89dfd3b3bf9be) set( TWEENY_URL https://github.com/mobius3/tweeny/archive/b94ce07cfb02a0eb8ac8aaf66137dabdaea857cf.tar.gz ) set(TWEENY_HASH 9a632b9da84823fae002ad5d9ba02c8d77c0a3810479974c6b637c5504165475) - set( LMDBXX_HEADER_URL https://raw.githubusercontent.com/bendiken/lmdbxx/0b43ca87d8cfabba392dfe884eb1edb83874de02/lmdb%2B%2B.h diff --git a/nheko-backtrace.dump b/nheko-backtrace.dump new file mode 100644 index 00000000..11aeb9d2 Binary files /dev/null and b/nheko-backtrace.dump differ diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp index f17b383c..d6a4f78f 100644 --- a/src/RoomInfoListItem.cpp +++ b/src/RoomInfoListItem.cpp @@ -182,7 +182,7 @@ RoomInfoListItem::paintEvent(QPaintEvent *event) QFont tsFont; tsFont.setPointSizeF(tsFont.pointSizeF() * 0.9); - const int msgStampWidth = QFontMetrics(tsFont).width(lastMsgInfo_.timestamp) + 4; + const int msgStampWidth = QFontMetrics(tsFont).horizontalAdvance(lastMsgInfo_.timestamp) + 4; // We use the full width of the widget if there is no unread msg bubble. const int bottomLineWidthLimit = (unreadMsgCount_ > 0) ? msgStampWidth : 0; @@ -211,7 +211,7 @@ RoomInfoListItem::paintEvent(QPaintEvent *event) p.setFont(QFont{}); p.drawText(QPoint(2 * wm.padding + wm.iconSize, bottom_y), userName); - int nameWidth = QFontMetrics(QFont{}).width(userName); + int nameWidth = QFontMetrics(QFont{}).horizontalAdvance(userName); p.setFont(QFont{}); diff --git a/src/TypingDisplay.cpp b/src/TypingDisplay.cpp index 11313adc..97aeb268 100644 --- a/src/TypingDisplay.cpp +++ b/src/TypingDisplay.cpp @@ -69,7 +69,7 @@ TypingDisplay::paintEvent(QPaintEvent *) text_ = fm.elidedText(text_, Qt::ElideRight, (double)(width() * 0.75)); QPainterPath path; - path.addRoundedRect(QRectF(0, 0, fm.width(text_) + 2 * LEFT_PADDING, height()), 3, 3); + path.addRoundedRect(QRectF(0, 0, fm.horizontalAdvance(text_) + 2 * LEFT_PADDING, height()), 3, 3); p.fillPath(path, backgroundColor()); p.drawText(region, Qt::AlignVCenter, text_); diff --git a/src/Utils.cpp b/src/Utils.cpp index 3d304e7d..863de79e 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include @@ -229,8 +231,10 @@ utils::scaleImageToPixmap(const QImage &img, int size) if (img.isNull()) return QPixmap(); + // Deprecated in 5.13: const double sz = + // std::ceil(QApplication::desktop()->screen()->devicePixelRatioF() * (double)size); const double sz = - std::ceil(QApplication::desktop()->screen()->devicePixelRatioF() * (double)size); + std::ceil(QGuiApplication::primaryScreen()->devicePixelRatio() * (double)size); return QPixmap::fromImage( img.scaled(sz, sz, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); } @@ -318,16 +322,44 @@ QString utils::getFormattedQuoteBody(const RelatedInfo &related, const QString &html) { return QString("
In reply " - "to%3
%4
") - .arg(QString::fromStdString(related.related_event), + "href=\"https://matrix.to/#/%1/%2\">In reply " + "to* %4
%5") + .arg(related.room, + QString::fromStdString(related.related_event), related.quoted_user, related.quoted_user, - related.quoted_body) + + getQuoteBody(related)) + html; } +QString +utils::getQuoteBody(const RelatedInfo &related) +{ + using MsgType = mtx::events::MessageType; + + switch (related.type) { + case MsgType::Text: { + return markdownToHtml(related.quoted_body); + } + case MsgType::File: { + return QString("sent a file."); + } + case MsgType::Image: { + return QString("sent an image."); + } + case MsgType::Audio: { + return QString("sent an audio file."); + } + case MsgType::Video: { + return QString("sent a video"); + } + default: { + return related.quoted_body; + } + } +} + QString utils::linkColor() { @@ -475,7 +507,8 @@ utils::centerWidget(QWidget *widget, QWidget *parent) return; } - widget->move(findCenter(QApplication::desktop()->screenGeometry())); + // Deprecated in 5.13: widget->move(findCenter(QApplication::desktop()->screenGeometry())); + widget->move(findCenter(QGuiApplication::primaryScreen()->geometry())); } void diff --git a/src/Utils.h b/src/Utils.h index 0f022770..a840a187 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -22,6 +22,9 @@ class QComboBox; // outgoing messages struct RelatedInfo { + using MsgType = mtx::events::MessageType; + MsgType type; + QString room; QString quoted_body; std::string related_event; QString quoted_user; @@ -238,6 +241,10 @@ markdownToHtml(const QString &text); QString getFormattedQuoteBody(const RelatedInfo &related, const QString &html); +//! Get the body for the quote, depending on the event type. +QString +getQuoteBody(const RelatedInfo &related); + //! Retrieve the color of the links based on the current theme. QString linkColor(); diff --git a/src/dialogs/ImageOverlay.cpp b/src/dialogs/ImageOverlay.cpp index dbf5bbe4..dd9cd03a 100644 --- a/src/dialogs/ImageOverlay.cpp +++ b/src/dialogs/ImageOverlay.cpp @@ -17,7 +17,9 @@ #include #include +#include #include +#include #include "dialogs/ImageOverlay.h" @@ -39,7 +41,8 @@ ImageOverlay::ImageOverlay(QPixmap image, QWidget *parent) setAttribute(Qt::WA_DeleteOnClose, true); setWindowState(Qt::WindowFullScreen); - screen_ = QApplication::desktop()->availableGeometry(); + // Deprecated in 5.13: screen_ = QApplication::desktop()->availableGeometry(); + screen_ = QGuiApplication::primaryScreen()->availableGeometry(); move(QApplication::desktop()->mapToGlobal(screen_.topLeft())); resize(screen_.size()); diff --git a/src/main.cpp b/src/main.cpp index 0c196a33..bd7560da 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,10 +21,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -72,7 +74,8 @@ registerSignalHandlers() QPoint screenCenter(int width, int height) { - QRect screenGeometry = QApplication::desktop()->screenGeometry(); + // Deprecated in 5.13: QRect screenGeometry = QApplication::desktop()->screenGeometry(); + QRect screenGeometry = QGuiApplication::primaryScreen()->geometry(); int x = (screenGeometry.width() - width) / 2; int y = (screenGeometry.height() - height) / 2; diff --git a/src/notifications/ManagerLinux.cpp b/src/notifications/ManagerLinux.cpp index d3901c52..1d9f97d9 100644 --- a/src/notifications/ManagerLinux.cpp +++ b/src/notifications/ManagerLinux.cpp @@ -142,7 +142,7 @@ operator<<(QDBusArgument &arg, const QImage &image) int channels = i.isGrayscale() ? 1 : (i.hasAlphaChannel() ? 4 : 3); arg << i.depth() / channels; arg << channels; - arg << QByteArray(reinterpret_cast(i.bits()), i.byteCount()); + arg << QByteArray(reinterpret_cast(i.bits()), i.sizeInBytes()); arg.endStructure(); return arg; } diff --git a/src/timeline/TimelineItem.cpp b/src/timeline/TimelineItem.cpp index 1094bde5..80153026 100644 --- a/src/timeline/TimelineItem.cpp +++ b/src/timeline/TimelineItem.cpp @@ -731,7 +731,9 @@ TimelineItem::generateUserName(const QString &user_id, const QString &displaynam userName_->setToolTipDuration(1500); userName_->setAttribute(Qt::WA_Hover); userName_->setAlignment(Qt::AlignLeft | Qt::AlignTop); - userName_->setFixedWidth(QFontMetrics(userName_->font()).width(userName_->text())); + // width deprecated in 5.13: + // userName_->setFixedWidth(QFontMetrics(userName_->font()).width(userName_->text())); + userName_->setFixedWidth(QFontMetrics(userName_->font()).horizontalAdvance(userName_->text())); // Set the user color asynchronously if it hasn't been generated yet, // otherwise this will just set it. @@ -877,9 +879,11 @@ TimelineItem::replyAction() return; RelatedInfo related; + related.type = message_type_; related.quoted_body = body_->toPlainText(); related.quoted_user = descriptionMsg_.userid; related.related_event = eventId().toStdString(); + related.room = room_id_; emit ChatPage::instance()->messageReply(related); } diff --git a/src/timeline/TimelineItem.h b/src/timeline/TimelineItem.h index 6fe4a6f2..4db36c07 100644 --- a/src/timeline/TimelineItem.h +++ b/src/timeline/TimelineItem.h @@ -28,6 +28,8 @@ #include +#include "mtx/events.hpp" + #include "AvatarProvider.h" #include "RoomInfoListItem.h" #include "Utils.h" @@ -276,6 +278,7 @@ private: QString replaceEmoji(const QString &body); QString event_id_; + mtx::events::MessageType message_type_; QString room_id_; DescInfo descriptionMsg_; @@ -349,6 +352,11 @@ TimelineItem::setupWidgetLayout(Widget *widget, const Event &event, bool withSen { init(); + //if (event.type == mtx::events::EventType::RoomMessage) { + // message_type_ = mtx::events::getMessageType(event.content.msgtype); + //} + // TODO: Fix this. + message_type_ = mtx::events::MessageType::Unknown; event_id_ = QString::fromStdString(event.event_id); const auto sender = QString::fromStdString(event.sender); diff --git a/src/timeline/widgets/AudioItem.cpp b/src/timeline/widgets/AudioItem.cpp index 72332174..8cc2ba8f 100644 --- a/src/timeline/widgets/AudioItem.cpp +++ b/src/timeline/widgets/AudioItem.cpp @@ -163,7 +163,7 @@ AudioItem::resizeEvent(QResizeEvent *event) QFontMetrics fm(font); const int computedWidth = std::min( - fm.width(text_) + 2 * IconRadius + VerticalPadding * 2 + TextPadding, (double)MaxWidth); + fm.horizontalAdvance(text_) + 2 * IconRadius + VerticalPadding * 2 + TextPadding, (double)MaxWidth); resize(computedWidth, Height); diff --git a/src/timeline/widgets/FileItem.cpp b/src/timeline/widgets/FileItem.cpp index e97554e2..903fc4b2 100644 --- a/src/timeline/widgets/FileItem.cpp +++ b/src/timeline/widgets/FileItem.cpp @@ -154,7 +154,7 @@ FileItem::resizeEvent(QResizeEvent *event) QFontMetrics fm(font); const int computedWidth = std::min( - fm.width(text_) + 2 * IconRadius + VerticalPadding * 2 + TextPadding, (double)MaxWidth); + fm.horizontalAdvance(text_) + 2 * IconRadius + VerticalPadding * 2 + TextPadding, (double)MaxWidth); resize(computedWidth, Height); diff --git a/src/timeline/widgets/ImageItem.cpp b/src/timeline/widgets/ImageItem.cpp index 4ee9e42a..79a66c4d 100644 --- a/src/timeline/widgets/ImageItem.cpp +++ b/src/timeline/widgets/ImageItem.cpp @@ -192,7 +192,7 @@ ImageItem::paintEvent(QPaintEvent *event) if (image_.isNull()) { QString elidedText = metrics.elidedText(text_, Qt::ElideRight, max_width_ - 10); - setFixedSize(metrics.width(elidedText), fontHeight); + setFixedSize(metrics.horizontalAdvance(elidedText), fontHeight); painter.setFont(font); painter.setPen(QPen(QColor(66, 133, 244))); diff --git a/src/ui/DropShadow.h b/src/ui/DropShadow.h index b7ba1985..d322fb42 100644 --- a/src/ui/DropShadow.h +++ b/src/ui/DropShadow.h @@ -30,7 +30,11 @@ public: gradient.setStart(right0); gradient.setFinalStop(right1); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect( + // Deprecated in 5.13: painter.drawRoundRect( + // QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - margin)), + // 0.0, + // 0.0); + painter.drawRoundedRect( QRectF(QPointF(width - margin * radius, margin), QPointF(width, height - margin)), 0.0, 0.0); @@ -41,7 +45,7 @@ public: gradient.setStart(left0); gradient.setFinalStop(left1); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect( + painter.drawRoundedRect( QRectF(QPointF(margin * radius, margin), QPointF(0, height - margin)), 0.0, 0.0); // Top @@ -50,7 +54,7 @@ public: gradient.setStart(top0); gradient.setFinalStop(top1); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect( + painter.drawRoundedRect( QRectF(QPointF(width - margin, 0), QPointF(margin, margin)), 0.0, 0.0); // Bottom @@ -59,7 +63,7 @@ public: gradient.setStart(bottom0); gradient.setFinalStop(bottom1); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect( + painter.drawRoundedRect( QRectF(QPointF(margin, height - margin), QPointF(width - margin, height)), 0.0, 0.0); @@ -71,7 +75,7 @@ public: gradient.setFinalStop(bottomright1); gradient.setColorAt(endPosition1, end); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect(QRectF(bottomright0, bottomright1), 0.0, 0.0); + painter.drawRoundedRect(QRectF(bottomright0, bottomright1), 0.0, 0.0); // BottomLeft QPointF bottomleft0(margin, height - margin); @@ -80,7 +84,7 @@ public: gradient.setFinalStop(bottomleft1); gradient.setColorAt(endPosition1, end); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect(QRectF(bottomleft0, bottomleft1), 0.0, 0.0); + painter.drawRoundedRect(QRectF(bottomleft0, bottomleft1), 0.0, 0.0); // TopLeft QPointF topleft0(margin, margin); @@ -89,7 +93,7 @@ public: gradient.setFinalStop(topleft1); gradient.setColorAt(endPosition1, end); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect(QRectF(topleft0, topleft1), 0.0, 0.0); + painter.drawRoundedRect(QRectF(topleft0, topleft1), 0.0, 0.0); // TopRight QPointF topright0(width - margin, margin); @@ -98,12 +102,12 @@ public: gradient.setFinalStop(topright1); gradient.setColorAt(endPosition1, end); painter.setBrush(QBrush(gradient)); - painter.drawRoundRect(QRectF(topright0, topright1), 0.0, 0.0); + painter.drawRoundedRect(QRectF(topright0, topright1), 0.0, 0.0); // Widget painter.setBrush(QBrush("#FFFFFF")); painter.setRenderHint(QPainter::Antialiasing); - painter.drawRoundRect( + painter.drawRoundedRect( QRectF(QPointF(margin, margin), QPointF(width - margin, height - margin)), radius, radius); diff --git a/src/ui/InfoMessage.cpp b/src/ui/InfoMessage.cpp index e9de20cc..b18a80c4 100644 --- a/src/ui/InfoMessage.cpp +++ b/src/ui/InfoMessage.cpp @@ -22,7 +22,7 @@ InfoMessage::InfoMessage(QString msg, QWidget *parent) initFont(); QFontMetrics fm{font()}; - width_ = fm.width(msg_) + HPadding * 2; + width_ = fm.horizontalAdvance(msg_) + HPadding * 2; height_ = fm.ascent() + 2 * VPadding; setFixedHeight(height_ + 2 * HMargin); @@ -64,7 +64,7 @@ DateSeparator::DateSeparator(QDateTime datetime, QWidget *parent) msg_ = datetime.toString(fmt); QFontMetrics fm{font()}; - width_ = fm.width(msg_) + HPadding * 2; + width_ = fm.horizontalAdvance(msg_) + HPadding * 2; height_ = fm.ascent() + 2 * VPadding; setFixedHeight(height_ + 2 * HMargin); diff --git a/src/ui/Painter.h b/src/ui/Painter.h index 8de39651..8feed17b 100644 --- a/src/ui/Painter.h +++ b/src/ui/Painter.h @@ -20,8 +20,10 @@ public: void drawTextRight(int x, int y, int outerw, const QString &text, int textWidth = -1) { QFontMetrics m(fontMetrics()); - if (textWidth < 0) - textWidth = m.width(text); + if (textWidth < 0) { + // deprecated in 5.13: textWidth = m.width(text); + textWidth = m.horizontalAdvance(text); + } drawText((outerw - x - textWidth), y + m.ascent(), text); }