void EventDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &idx) const { QPixmap icon; QString text = idx.data(Qt::DisplayRole).toString(); QDateTime time = idx.data(QZeitgeist::LogModel::TimeRole).toDateTime(); QStyle *style = QApplication::style(); style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter); QRect baseRect = option.rect.adjusted(5, 5, -5, -5); QRect iconRect(baseRect); QRect descRect(baseRect); iconRect.setWidth(iconRect.width()/3); descRect.setX(iconRect.right()); QIcon::Mode mode = QIcon::Normal; if (option.state == QStyle::State_Active) mode = QIcon::Active; if (option.state == QStyle::State_Selected) mode = QIcon::Selected; painter->save(); painter->setOpacity(0.4); QString url(idx.data(QZeitgeist::LogModel::URLRole).toString()); QPixmap overlay; if (!m_iconCache.contains(url)) { icon = idx.data(QZeitgeist::LogModel::ThumbnailRole).value<QPixmap>(); if (icon.isNull()) { KIcon kicon = KIcon(QUrl(idx.data(QZeitgeist::LogModel::ActorRole).toString()).authority().section(".desktop", 0, 0)); icon = kicon.pixmap(iconRect.size()); } else { icon = icon.scaled(iconRect.size(), Qt::KeepAspectRatio); KIcon kicon = KIcon(QUrl(idx.data(QZeitgeist::LogModel::ActorRole).toString()).authority().section(".desktop", 0, 0)); QPainter overlayPainter(&icon); QRect overlayRect(QPoint(0, 0), iconRect.size()); int iconSize = qMin(overlayRect.width(), overlayRect.height()); overlayRect.setX(iconSize/2); overlayRect.setY(iconSize/2); kicon.paint(&overlayPainter, overlayRect, Qt::AlignCenter, QIcon::Active); } m_iconCache[url] = icon; } else { icon = m_iconCache[url]; } painter->drawPixmap(iconRect, icon); //icon.paint(painter, iconRect, Qt::AlignCenter, mode); painter->setOpacity(1); QFont font; font.setBold(true); font.setPixelSize(15); painter->setFont(font); painter->drawText(baseRect, Qt::AlignLeft | Qt::TextWordWrap, text); painter->restore(); painter->drawText(baseRect, Qt::AlignRight | Qt::AlignBottom, time.toString(Qt::SystemLocaleShortDate)); }
void ShimmerWidget::paintEvent(QPaintEvent * event) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setOpacity(0.4); painter.setPen(Qt::NoPen); QSize size = this->_svgRenderer.defaultSize(); size.scale(150, 150, Qt::KeepAspectRatio); QRect sRect(QPoint(0, 0), size); sRect.moveCenter(this->rect().center()); QPixmap overlay(sRect.size()); overlay.fill(QColor(0, 0, 0, 0)); QPainter overlayPainter(&overlay); this->_svgRenderer.render(&overlayPainter, QRect(QPoint(0, 0), sRect.size())); qreal offset = this->_shimmer.isValid() ? (this->_shimmer.elapsed() / 1000.0) : -1.0; if (this->_rippleOn) { float opacity = (sin(this->_ripple.elapsed()/800.0) + 1) / 2.0; overlayPainter.setBrush(QColor(255,255,255,opacity * 128)); overlayPainter.setCompositionMode(QPainter::CompositionMode_SourceAtop); overlayPainter.drawRect(overlay.rect()); QTimer::singleShot(80, this, SLOT(update())); } else { if (offset > 5.0) { this->_shimmer.restart(); QTimer::singleShot(40, this, SLOT(update())); } else if (offset > 1.0) { QTimer::singleShot(90000, this, SLOT(update())); } else if (offset >= 0.0) { QLinearGradient grad(QPointF(-0.5 * sRect.width(), 500), QPointF(sRect.width() * 1.5, 0)); grad.setColorAt(qBound(0.0, offset, 1.0), QColor(0, 0, 0)); grad.setColorAt(qBound(0.0, offset + 0.05, 1.0), QColor(200, 230, 255)); grad.setColorAt(qBound(0.0, offset + 0.1, 1.0), QColor(0, 0, 0)); overlayPainter.setBrush(grad); overlayPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); overlayPainter.drawRect(QRect(QPoint(0, 0), sRect.size())); QTimer::singleShot(40, this, SLOT(update())); } if (this->_pulse.isValid() && this->_pulse.elapsed() < 300) { // float opacity = cos((this->_pulse.elapsed()/500.0) * (3.141 / 2.0)); float opacity = 1.0 - (this->_pulse.elapsed()/300.0); // qDebug() << "opacity = " << opacity; overlayPainter.setBrush(QColor(255,0,0,opacity * 255)); overlayPainter.setCompositionMode(QPainter::CompositionMode_SourceAtop); overlayPainter.drawRect(overlay.rect()); QTimer::singleShot(40, this, SLOT(update())); } } painter.drawPixmap(sRect.topLeft(), overlay); }