Esempio n. 1
0
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);
    }