-void SenderChatItem::initLayout(QTextLayout *layout) const {
- initLayoutHelper(layout, QTextOption::ManualWrap, Qt::AlignRight);
- doLayout(layout);
-}
-
-void SenderChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
- Q_UNUSED(option); Q_UNUSED(widget);
- painter->save();
- painter->setClipRect(boundingRect());
- paintBackground(painter);
-
- 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);
-
- 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(layout()->boundingRect().toRect().size());
- pixmap.fill(Qt::transparent);
- QPainter pixPainter(&pixmap);
- layout()->draw(&pixPainter, QPointF(qMax(offset, (qreal)0), 0), additionalFormats());
- 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(0, 0, pixmap.width(), pixmap.height(), gradient);
- pixmap.setAlphaChannel(mask);
- painter->drawPixmap(pos(), pixmap);
- } else {
- layout()->draw(painter, pos(), additionalFormats(), boundingRect());
- }
- painter->restore();
-}
-
-void SenderChatItem::handleClick(const QPointF &pos, ChatScene::ClickMode clickMode) {
- if(clickMode == ChatScene::DoubleClick) {
- BufferInfo curBufInfo = Client::networkModel()->bufferInfo(data(MessageModel::BufferIdRole).value<BufferId>());
- QString nick = data(MessageModel::EditRole).toString();
- // check if the nick is a valid ircUser
- if(!nick.isEmpty() && Client::network(curBufInfo.networkId())->ircUser(nick))
- Client::bufferModel()->switchToOrStartQuery(curBufInfo.networkId(), nick);
- }
- else
- ChatItem::handleClick(pos, clickMode);
+void SenderChatItem::initLayout(QTextLayout *layout) const
+{
+ initLayoutHelper(layout, QTextOption::ManualWrap, Qt::AlignRight);
+ doLayout(layout);
+}
+
+
+void SenderChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option); Q_UNUSED(widget);
+ painter->save();
+ painter->setClipRect(boundingRect());
+ paintBackground(painter);
+
+ 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);
+
+ if (layoutWidth > width()) {
+ // Draw a nice gradient for longer items
+ // Qt's text drawing with a gradient brush sucks, so we use compositing instead
+ QPixmap pixmap(layout()->boundingRect().toRect().size());
+ pixmap.fill(Qt::transparent);
+
+ QPainter pixPainter(&pixmap);
+ layout()->draw(&pixPainter, QPointF(qMax(offset, (qreal)0), 0), additionalFormats());
+
+ // Create alpha channel mask
+ QLinearGradient gradient;
+ if (offset < 0) {
+ gradient.setStart(0, 0);
+ gradient.setFinalStop(12, 0);
+ gradient.setColorAt(0, Qt::transparent);
+ gradient.setColorAt(1, Qt::white);
+ }
+ else {
+ gradient.setStart(width()-10, 0);
+ gradient.setFinalStop(width(), 0);
+ gradient.setColorAt(0, Qt::white);
+ gradient.setColorAt(1, Qt::transparent);
+ }
+ pixPainter.setCompositionMode(QPainter::CompositionMode_DestinationIn); // gradient's alpha gets applied to the pixmap
+ pixPainter.fillRect(pixmap.rect(), gradient);
+ painter->drawPixmap(pos(), pixmap);
+ }
+ else {
+ layout()->draw(painter, pos(), additionalFormats(), boundingRect());
+ }
+ painter->restore();