~ubuntu-branches/ubuntu/lucid/kdebase/lucid

« back to all changes in this revision

Viewing changes to apps/plasma/applets/folderview/abstractitemview.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Thomas
  • Date: 2009-12-02 13:28:20 UTC
  • mto: This revision was merged to the branch mainline in revision 258.
  • Revision ID: james.westby@ubuntu.com-20091202132820-tpxn348l9frx5zd5
Tags: upstream-4.3.80
Import upstream version 4.3.80

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
 
 *   Copyright © 2008 Fredrik Höglund <fredrik@kde.org>
 
2
 *   Copyright © 2008, 2009 Fredrik Höglund <fredrik@kde.org>
3
3
 *
4
4
 *   The smooth scrolling code is based on the code in KHTMLView,
5
5
 *   Copyright © 2006-2008 Germain Garand <germain@ebooksfrance.org>
30
30
#include <KDirModel>
31
31
#include <KFileItemDelegate>
32
32
 
 
33
#include <Plasma/PaintUtils>
 
34
 
 
35
#include <limits.h>
 
36
 
33
37
#ifdef Q_WS_X11
34
38
#  include <QX11Info>
35
39
#  include <X11/Xlib.h>
54
58
      m_dddy(0),
55
59
      m_rdy(0),
56
60
      m_smoothScrolling(false),
57
 
      m_autoScrollSpeed(0)
 
61
      m_autoScrollSpeed(0),
 
62
      m_drawShadows(true)
58
63
{
59
64
    m_scrollBar = new Plasma::ScrollBar(this);
60
65
    connect(m_scrollBar, SIGNAL(valueChanged(int)), SLOT(scrollBarValueChanged(int)));
129
134
    return m_iconSize;
130
135
}
131
136
 
 
137
void AbstractItemView::setDrawShadows(bool on)
 
138
{
 
139
    if (m_drawShadows != on) {
 
140
        m_drawShadows = on;
 
141
        markAreaDirty(visibleArea());
 
142
        update();
 
143
    }
 
144
}
 
145
 
 
146
bool AbstractItemView::drawShadows() const
 
147
{
 
148
    return m_drawShadows;
 
149
}
 
150
 
132
151
QScrollBar *AbstractItemView::verticalScrollBar() const
133
152
{
134
153
    return m_scrollBar->nativeWidget();
301
320
    }
302
321
}
303
322
 
 
323
QSize AbstractItemView::doTextLayout(QTextLayout &layout, const QSize &constraints, Qt::Alignment alignment,
 
324
                                     QTextOption::WrapMode wrapMode) const
 
325
{
 
326
    QTextOption to;
 
327
    to.setAlignment(alignment);
 
328
    to.setTextDirection(layoutDirection());
 
329
    to.setWrapMode(wrapMode);
 
330
    layout.setTextOption(to);
 
331
 
 
332
    QFontMetricsF fm = QFontMetricsF(layout.font());
 
333
 
 
334
    QTextLine line;
 
335
    qreal leading = fm.leading();
 
336
    qreal widthUsed = 0;
 
337
    qreal height = 0;
 
338
 
 
339
    layout.beginLayout();
 
340
    while ((line = layout.createLine()).isValid()) {
 
341
        // Make the last line that will fit infinitely long.
 
342
        // drawTextLayout() will handle this by fading the line out
 
343
        // if it won't fit inside the constraints.
 
344
        if (height + 2 * fm.lineSpacing() > constraints.height()) {
 
345
            line.setLineWidth(INT_MAX);
 
346
            if (line.naturalTextWidth() < constraints.width()) {
 
347
                line.setLineWidth(constraints.width());
 
348
                widthUsed = qMax(widthUsed, line.naturalTextWidth());
 
349
            } else {
 
350
                widthUsed = constraints.width();
 
351
            }
 
352
        } else {
 
353
            line.setLineWidth(constraints.width());
 
354
            widthUsed = qMax(widthUsed, line.naturalTextWidth());
 
355
        }
 
356
        line.setPosition(QPointF(0, height));
 
357
        height += line.height() + leading;
 
358
    }
 
359
    layout.endLayout();
 
360
 
 
361
    return QSize(widthUsed, height);    
 
362
}
 
363
 
 
364
void AbstractItemView::drawTextLayout(QPainter *painter, const QTextLayout &layout, const QRect &rect) const
 
365
{
 
366
    // Create the alpha gradient for the fade out effect
 
367
    QLinearGradient alphaGradient(0, 0, 1, 0);
 
368
    alphaGradient.setCoordinateMode(QGradient::ObjectBoundingMode);
 
369
    if (layout.textOption().textDirection() == Qt::LeftToRight) {
 
370
        alphaGradient.setColorAt(0, QColor(0, 0, 0, 255));
 
371
        alphaGradient.setColorAt(1, QColor(0, 0, 0, 0));
 
372
    } else {
 
373
        alphaGradient.setColorAt(0, QColor(0, 0, 0, 0));
 
374
        alphaGradient.setColorAt(1, QColor(0, 0, 0, 255));
 
375
    }
 
376
 
 
377
    QFontMetrics fm(layout.font());
 
378
 
 
379
    QList<QRect> fadeRects;
 
380
    QList<QRect> haloRects;
 
381
    int fadeWidth = 30;
 
382
 
 
383
    // Compute halo and fade rects
 
384
    for (int i = 0; i < layout.lineCount(); i++) {
 
385
        const QTextLine line = layout.lineAt(i);
 
386
        const QRectF lr = line.naturalTextRect();
 
387
 
 
388
        // Add a fade out rect to the list if the line is too long
 
389
        if (lr.width() > rect.width()) {
 
390
            int x = rect.width() - fadeWidth;
 
391
            int y = lr.y();
 
392
            QRect r = QStyle::visualRect(layout.textOption().textDirection(), QRect(QPoint(), rect.size()),
 
393
                                         QRect(x, y, fadeWidth, int(lr.height())));
 
394
            fadeRects.append(r);
 
395
        }
 
396
 
 
397
        haloRects.append((lr & rect.translated(-rect.topLeft())).toAlignedRect());
 
398
    }
 
399
 
 
400
    // Create a pixmap for the text
 
401
    QPixmap pixmap(rect.size());
 
402
    pixmap.fill(Qt::transparent);
 
403
 
 
404
    QPainter p(&pixmap);
 
405
    p.setPen(painter->pen());
 
406
 
 
407
    // Draw each line in the layout
 
408
    for (int i = 0; i < layout.lineCount(); i++)
 
409
    {
 
410
        const QTextLine line = layout.lineAt(i);
 
411
        const QRectF tr = line.naturalTextRect();
 
412
 
 
413
        if (tr.width() > rect.width()) {
 
414
            if (layoutDirection() == Qt::LeftToRight) {
 
415
                line.draw(&p, QPointF(-tr.x(), 0));
 
416
            } else {
 
417
                line.draw(&p, QPointF(rect.width() - tr.right(), 0));
 
418
            }
 
419
        } else {
 
420
            line.draw(&p, QPointF());
 
421
        }
 
422
    }
 
423
 
 
424
    // Reduce the alpha in each fade out rect using the alpha gradient
 
425
    if (!fadeRects.isEmpty()) {
 
426
        p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
 
427
        foreach (const QRect &rect, fadeRects) {
 
428
            p.fillRect(rect, alphaGradient);
 
429
        }
 
430
    }
 
431
    p.end();
 
432
 
 
433
    if (drawShadows()) {
 
434
        const QColor color = painter->pen().color();
 
435
        if (qGray(color.rgb()) < 192) {
 
436
            // Draw halos
 
437
            foreach (const QRect &haloRect, haloRects) {
 
438
                Plasma::PaintUtils::drawHalo(painter, haloRect.translated(rect.topLeft()));
 
439
            }
 
440
        } else {
 
441
            // Draw shadow
 
442
            QImage shadow = pixmap.toImage();
 
443
            Plasma::PaintUtils::shadowBlur(shadow, 2, Qt::black);
 
444
            painter->drawImage(rect.topLeft() + QPoint(1, 1), shadow);
 
445
        }
 
446
    }
 
447
 
 
448
    // Draw the text pixmap
 
449
    painter->drawPixmap(rect.topLeft(), pixmap);
 
450
}
 
451
 
304
452
void AbstractItemView::rowsInserted(const QModelIndex &parent, int first, int last)
305
453
{
306
454
    Q_UNUSED(parent)