X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatitem.cpp;h=585c958edb5a5f28edb4412ab55710865eacc97b;hp=21829c2f956888f2e72b4668dd3ebd865e892597;hb=6e277a228833579b9295d45ca7bd6c6f51aa1152;hpb=060eed53b2da720c717e43a1b92dba2a6a7ab13e diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 21829c2f..585c958e 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -101,25 +101,9 @@ ChatItemPrivate *ChatItem::privateData() const { void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setClipRect(boundingRect()); // no idea why QGraphicsItem clipping won't work - //if(_selectionMode == FullSelection) { - //painter->save(); - //painter->fillRect(boundingRect(), QApplication::palette().brush(QPalette::Highlight)); - //painter->restore(); - //} QVector formats = additionalFormats(); - if(_selectionMode != NoSelection) { - QTextLayout::FormatRange selectFmt; - selectFmt.format.setForeground(QApplication::palette().brush(QPalette::HighlightedText)); - selectFmt.format.setBackground(QApplication::palette().brush(QPalette::Highlight)); - if(_selectionMode == PartialSelection) { - selectFmt.start = qMin(_selectionStart, _selectionEnd); - selectFmt.length = qAbs(_selectionStart - _selectionEnd); - } else { // FullSelection - selectFmt.start = 0; - selectFmt.length = data(MessageModel::DisplayRole).toString().length(); - } - formats.append(selectFmt); - } + QTextLayout::FormatRange selectFmt = selectionFormat(); + if(selectFmt.format.isValid()) formats.append(selectFmt); layout()->draw(painter, QPointF(0,0), formats, boundingRect()); // Debuging Stuff @@ -180,6 +164,25 @@ void ChatItem::continueSelecting(const QPointF &pos) { update(); } +QTextLayout::FormatRange ChatItem::selectionFormat() const { + QTextLayout::FormatRange selectFmt; + if(_selectionMode != NoSelection) { + selectFmt.format.setForeground(QApplication::palette().brush(QPalette::HighlightedText)); + selectFmt.format.setBackground(QApplication::palette().brush(QPalette::Highlight)); + if(_selectionMode == PartialSelection) { + selectFmt.start = qMin(_selectionStart, _selectionEnd); + selectFmt.length = qAbs(_selectionStart - _selectionEnd); + } else { // FullSelection + selectFmt.start = 0; + selectFmt.length = data(MessageModel::DisplayRole).toString().length(); + } + } else { + selectFmt.start = -1; + selectFmt.length = 0; + } + return selectFmt; +} + QList ChatItem::findWords(const QString &searchWord, Qt::CaseSensitivity caseSensitive) { QList resultList; const QAbstractItemModel *model_ = model(); @@ -257,6 +260,51 @@ void ChatItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { // SenderChatItem // ************************************************************ +void SenderChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + Q_UNUSED(option); Q_UNUSED(widget); + + //painter->setClipRect(boundingRect()); // no idea why QGraphicsItem clipping won't work + qreal layoutWidth = layout()->minimumWidth(); + qreal offset = 0; + if(chatScene()->senderCutoffMode() == ChatScene::CutoffLeft) + offset = qMin(width() - layoutWidth, (qreal)0); + else + offset = qMax(layoutWidth - width(), (qreal)0); + + QTextLayout::FormatRange selectFmt = selectionFormat(); + + if(layoutWidth > width()) { + // Draw a nice gradient for longer items + // Qt's text drawing with a gradient brush sucks, so we use an alpha-channeled pixmap instead + QPixmap pixmap(QSize(layout()->boundingRect().width(), layout()->boundingRect().height())); + pixmap.fill(QApplication::palette().brush(QPalette::Base).color()); + QPainter pixPainter(&pixmap); + layout()->draw(&pixPainter, QPointF(qMax(offset, (qreal)0), 0), QVector() << selectFmt); + pixPainter.end(); + + // Create alpha channel mask + QPixmap mask(pixmap.size()); + QPainter maskPainter(&mask); + QLinearGradient gradient; + if(offset < 0) { + gradient.setStart(0, 0); + gradient.setFinalStop(12, 0); + gradient.setColorAt(0, Qt::black); + gradient.setColorAt(1, Qt::white); + } else { + gradient.setStart(width()-10, 0); + gradient.setFinalStop(width(), 0); + gradient.setColorAt(0, Qt::white); + gradient.setColorAt(1, Qt::black); + } + maskPainter.fillRect(boundingRect(), gradient); + pixmap.setAlphaChannel(mask); + painter->drawPixmap(0, 0, pixmap); + } else { + layout()->draw(painter, QPointF(0,0), QVector() << selectFmt, boundingRect()); + } +} + // ************************************************************ // ContentsChatItem // ************************************************************