X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Ftopiclabel.cpp;h=87031424b91f792a5a4f190fcbe1c7c51c7c597e;hp=ea84b1e0cf5c2314bb4a53fce58e53e82fddba85;hb=01ed2953cbad3f2de3df262dc1601e82d903b4a8;hpb=487625a3efd8659de77c54a2c1a70e08d22b00e7 diff --git a/src/qtui/topiclabel.cpp b/src/qtui/topiclabel.cpp index ea84b1e0..87031424 100644 --- a/src/qtui/topiclabel.cpp +++ b/src/qtui/topiclabel.cpp @@ -31,31 +31,35 @@ #include #include "qtui.h" +#include "qtuistyle.h" #include "message.h" TopicLabel::TopicLabel(QWidget *parent) : QFrame(parent), offset(0), dragStartX(0), + textWidth(0), dragMode(false) { + setToolTip(tr("Drag to scroll the topic!")); + setCursor(Qt::OpenHandCursor); } void TopicLabel::paintEvent(QPaintEvent *event) { Q_UNUSED(event); textPartOffset.clear(); - + QPainter painter(this); painter.setBackgroundMode(Qt::OpaqueMode); - // FIXME re-enable topic painting -#ifndef SPUTDEV + // FIXME use QTextLayout instead + QRect drawRect = rect().adjusted(offset, 0, 0, 0); QRect brect; QString textPart; - foreach(QTextLayout::FormatRange fr, styledContents.formatList) { - textPart = styledContents.plainText.mid(fr.start, fr.length); + foreach(QTextLayout::FormatRange fr, formatList) { + textPart = plainText.mid(fr.start, fr.length); textPartOffset << drawRect.left(); painter.setFont(fr.format.font()); painter.setPen(QPen(fr.format.foreground(), 0)); @@ -63,7 +67,7 @@ void TopicLabel::paintEvent(QPaintEvent *event) { painter.drawText(drawRect, Qt::AlignLeft|Qt::AlignVCenter, textPart, &brect); drawRect.setLeft(brect.right()); } -#endif + textWidth = brect.right(); } void TopicLabel::setText(const QString &text) { @@ -74,21 +78,20 @@ void TopicLabel::setText(const QString &text) { offset = 0; update(); -#ifndef SPUTDEV - styledContents = QtUi::style()->styleString(Message::mircToInternal(text)); + UiStyle::StyledString styledContents = QtUi::style()->styleString("%D0" + QtUi::style()->mircToInternal(text)); + plainText = styledContents.plainText; + formatList = QtUi::style()->toTextLayoutList(styledContents.formatList, plainText.length()); int height = 1; - foreach(QTextLayout::FormatRange fr, styledContents.formatList) { + foreach(QTextLayout::FormatRange fr, formatList) { height = qMax(height, QFontMetrics(fr.format.font()).height()); } // ensure the label is editable (height != 1) if there is no text to show if(text.isEmpty()) height = QFontMetrics(qApp->font()).height(); - + // setFixedHeight(height); -#endif // show topic in tooltip - setToolTip(_text); } @@ -97,7 +100,12 @@ void TopicLabel::mouseMoveEvent(QMouseEvent *event) { return; event->accept(); - offset = event->pos().x() - dragStartX; + int newOffset = event->pos().x() - dragStartX; + if(newOffset > 0) + offset = 0; + else if(width() + 1 < textWidth || offset < newOffset) + offset = newOffset; + update(); } @@ -105,6 +113,7 @@ void TopicLabel::mousePressEvent(QMouseEvent *event) { event->accept(); dragMode = true; dragStartX = event->pos().x() - offset; + setCursor(Qt::ClosedHandCursor); } void TopicLabel::mouseReleaseEvent(QMouseEvent *event) { @@ -114,36 +123,34 @@ void TopicLabel::mouseReleaseEvent(QMouseEvent *event) { offset = 0; update(); } + setCursor(Qt::OpenHandCursor); } void TopicLabel::mouseDoubleClickEvent(QMouseEvent *event) { -#ifndef SPUTDEV event->accept(); - int textPart = 0; - int textOffset = 0; - if(textPartOffset.isEmpty()) return; // find the text part that contains the url. We don't expect color codes in urls so we expect only full parts (yet?) - int x = event->pos().x(); + int textPart = 0; + int x = event->pos().x() + offset; while(textPart + 1 < textPartOffset.count()) { - if(textPartOffset[textPart + 1] < x) { + if(textPartOffset[textPart + 1] < x) textPart++; - textOffset = textPartOffset[textPart]; - } else { + else break; - } } + int textOffset = textPartOffset[textPart]; // we've Identified the needed text part \o/ - QString text = styledContents.plainText.mid(styledContents.formatList[textPart].start, styledContents.formatList[textPart].length); + QString text = plainText.mid(formatList[textPart].start, formatList[textPart].length); // now we have to find the the left and right word delimiters of the clicked word - QFontMetrics fontMetric(styledContents.formatList[textPart].format.font()); - + QFontMetrics fontMetric(formatList[textPart].format.font()); + int start = 0; int spacePos = text.indexOf(" "); + x -= offset; // offset needs to go here as it's already in the textOffset while(spacePos != -1) { if(fontMetric.width(text.left(spacePos + 1)) + textOffset < x) { start = spacePos + 1; @@ -159,11 +166,8 @@ void TopicLabel::mouseDoubleClickEvent(QMouseEvent *event) { len = end - start; } QString word = text.mid(start, len); - qDebug() << word; QRegExp regex("^(h|f)t{1,2}ps?:\\/\\/"); if(regex.indexIn(word) != -1) { QDesktopServices::openUrl(QUrl(word)); } -#endif - }