From 3cf7ab9f042e50fc19748e1e09eb5af355f451ca Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Wed, 23 May 2018 16:33:30 +0300 Subject: Fix line break issue on timeline with long words fixes #193 --- include/timeline/TimelineItem.h | 47 ++++++++++++++++++++++++++++++++++++++++- src/timeline/TimelineItem.cc | 8 +------ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/include/timeline/TimelineItem.h b/include/timeline/TimelineItem.h index 064dead4..6011dd44 100644 --- a/include/timeline/TimelineItem.h +++ b/include/timeline/TimelineItem.h @@ -17,6 +17,7 @@ #pragma once +#include #include #include #include @@ -24,6 +25,8 @@ #include #include #include +#include +#include #include "AvatarProvider.h" #include "RoomInfoListItem.h" @@ -39,6 +42,48 @@ class VideoItem; class FileItem; class Avatar; +class TextLabel : public QTextBrowser +{ + Q_OBJECT + +public: + TextLabel(const QString &text, QWidget *parent = 0) + : QTextBrowser(parent) + { + setText(text); + setOpenExternalLinks(true); + + // Make it look and feel like an ordinary label. + setReadOnly(true); + setFrameStyle(QFrame::NoFrame); + QPalette pal = palette(); + pal.setColor(QPalette::Base, Qt::transparent); + setPalette(pal); + + // Wrap anywhere but prefer words, adjust minimum height on the fly. + setLineWrapMode(QTextEdit::WidgetWidth); + setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); + connect(document()->documentLayout(), + &QAbstractTextDocumentLayout::documentSizeChanged, + this, + &TextLabel::adjustHeight); + document()->setDocumentMargin(0); + + setFixedHeight(document()->size().height()); + } + + QSize sizeHint() const override + { + ensurePolished(); + return document()->size().toSize(); + } + + void wheelEvent(QWheelEvent *event) override { event->ignore(); } + +private slots: + void adjustHeight(const QSizeF &size) { setFixedHeight(size.height()); } +}; + class TimelineItem : public QWidget { Q_OBJECT @@ -174,7 +219,7 @@ private: QLabel *timestamp_; QLabel *checkmark_; QLabel *userName_; - QLabel *body_; + TextLabel *body_; }; template diff --git a/src/timeline/TimelineItem.cc b/src/timeline/TimelineItem.cc index 6f126d3d..166199cd 100644 --- a/src/timeline/TimelineItem.cc +++ b/src/timeline/TimelineItem.cc @@ -18,7 +18,6 @@ #include #include #include -#include #include #include "Avatar.h" @@ -426,14 +425,9 @@ TimelineItem::generateBody(const QString &body) { QString content("%1"); - body_ = new QLabel(this); + body_ = new TextLabel(content.arg(replaceEmoji(body)), this); body_->setFont(font_); - body_->setWordWrap(true); - body_->setText(content.arg(replaceEmoji(body))); - body_->setMargin(0); - body_->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextBrowserInteraction); - body_->setOpenExternalLinks(true); } // The username/timestamp is displayed along with the message body. -- cgit v1.2.3