/***************************************************************************
- * Copyright (C) 2005-2014 by the Quassel Project *
+ * Copyright (C) 2005-2020 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
+#include "styledlabel.h"
+
#include <QPainter>
#include <QTextDocument>
#include <QTextLayout>
#include "graphicalui.h"
-#include "styledlabel.h"
#include "uistyle.h"
-StyledLabel::StyledLabel(QWidget *parent)
- : QFrame(parent),
- _wrapMode(QTextOption::NoWrap),
- _alignment(Qt::AlignVCenter|Qt::AlignLeft),
- _toolTipEnabled(true),
- _resizeMode(NoResize)
+StyledLabel::StyledLabel(QWidget* parent)
+ : QFrame(parent)
+ , _alignment(Qt::AlignVCenter | Qt::AlignLeft)
{
setMouseTracking(true);
_layout.setTextOption(opt);
}
-
-void StyledLabel::setCustomFont(const QFont &font)
+void StyledLabel::setCustomFont(const QFont& font)
{
setFont(font);
_layout.setFont(font);
setText(_layout.text());
}
-
void StyledLabel::setWrapMode(QTextOption::WrapMode mode)
{
if (_wrapMode == mode)
layout();
}
-
void StyledLabel::setAlignment(Qt::Alignment alignment)
{
if (_alignment == alignment)
layout();
}
-
void StyledLabel::setResizeMode(ResizeMode mode)
{
if (_resizeMode == mode)
setWrapMode(QTextOption::NoWrap);
}
-
-void StyledLabel::resizeEvent(QResizeEvent *event)
+void StyledLabel::resizeEvent(QResizeEvent* event)
{
QFrame::resizeEvent(event);
layout();
}
-
QSize StyledLabel::sizeHint() const
{
return _sizeHint;
}
-
void StyledLabel::updateSizeHint()
{
QSize sh;
}
}
-
-void StyledLabel::setText(const QString &text)
+void StyledLabel::setText(const QString& text)
{
- UiStyle *style = GraphicalUi::uiStyle();
-
- UiStyle::StyledString sstr = style->styleString(style->mircToInternal(text), UiStyle::PlainMsg);
- QList<QTextLayout::FormatRange> layoutList = style->toTextLayoutList(sstr.formatList, sstr.plainText.length(), 0);
+ UiStyle::StyledString sstr = UiStyle::styleString(UiStyle::mircToInternal(text), UiStyle::FormatType::PlainMsg);
+ UiStyle::FormatContainer layoutList = GraphicalUi::uiStyle()->toTextLayoutList(sstr.formatList, sstr.plainText.length(), UiStyle::MessageLabel::None);
// Use default font rather than the style's
QTextLayout::FormatRange fmtRange;
// Mark URLs
_clickables = ClickableList::fromString(sstr.plainText);
- foreach(Clickable click, _clickables) {
+ foreach (Clickable click, _clickables) {
if (click.type() == Clickable::Url) {
QTextLayout::FormatRange range;
range.start = click.start();
}
_layout.setText(sstr.plainText);
- _layout.setAdditionalFormats(layoutList);
+ UiStyle::setTextLayoutFormats(_layout, layoutList);
layout();
endHoverMode();
}
-
void StyledLabel::updateToolTip()
{
- if (frameRect().width() - 2*frameWidth() < _layout.minimumWidth())
-#if QT_VERSION < 0x050000
- setToolTip(QString("<qt>%1</qt>").arg(Qt::escape(_layout.text()))); // only rich text gets wordwrapped!
-#else
+ if (frameRect().width() - 2 * frameWidth() < _layout.minimumWidth())
setToolTip(QString("<qt>%1</qt>").arg(_layout.text().toHtmlEscaped())); // only rich text gets wordwrapped!
-#endif
else
setToolTip(QString());
}
-
void StyledLabel::layout()
{
qreal h = 0;
qreal w = contentsRect().width();
_layout.beginLayout();
- forever {
+ forever
+ {
QTextLine line = _layout.createLine();
if (!line.isValid())
break;
update();
}
-
-void StyledLabel::paintEvent(QPaintEvent *e)
+void StyledLabel::paintEvent(QPaintEvent* e)
{
QFrame::paintEvent(e);
QPainter painter(this);
_layout.draw(&painter, QPointF(contentsRect().x(), y), _extraLayoutList);
}
-
-int StyledLabel::posToCursor(const QPointF &pos)
+int StyledLabel::posToCursor(const QPointF& pos)
{
if (pos.y() < 0 || pos.y() > height())
return -1;
return -1;
}
-
-void StyledLabel::mouseMoveEvent(QMouseEvent *event)
+void StyledLabel::mouseMoveEvent(QMouseEvent* event)
{
if (event->buttons() == Qt::NoButton) {
- Clickable click = _clickables.atCursorPos(posToCursor(event->posF()));
+ Clickable click = _clickables.atCursorPos(posToCursor(event->localPos()));
if (click.isValid())
setHoverMode(click.start(), click.length());
else
}
}
-
-void StyledLabel::enterEvent(QEvent *)
+void StyledLabel::enterEvent(QEvent*)
{
if (resizeMode() == ResizeOnHover)
setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
}
-
-void StyledLabel::leaveEvent(QEvent *)
+void StyledLabel::leaveEvent(QEvent*)
{
endHoverMode();
if (resizeMode() == ResizeOnHover)
setWrapMode(QTextOption::NoWrap);
}
-
-void StyledLabel::mousePressEvent(QMouseEvent *event)
+void StyledLabel::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) {
- Clickable click = _clickables.atCursorPos(posToCursor(event->posF()));
+ Clickable click = _clickables.atCursorPos(posToCursor(event->localPos()));
if (click.isValid())
emit clickableActivated(click);
}
}
-
void StyledLabel::setHoverMode(int start, int length)
{
if (_extraLayoutList.count() >= 1 && _extraLayoutList.first().start == start && _extraLayoutList.first().length == length)
update();
}
-
void StyledLabel::endHoverMode()
{
_extraLayoutList.clear();