[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdebase/apps/plasma/applets/folderview
From: Fredrik Höglund <fredrik () kde ! org>
Date: 2010-06-02 22:28:24
Message-ID: 20100602222824.BB856AC8C8 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1133942 by fredrik:
Update the listview to use the new painting code.
M +11 -0 abstractitemview.cpp
M +1 -0 folderview.cpp
M +153 -28 listview.cpp
M +14 -2 listview.h
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/abstractitemview.cpp \
#1133941:1133942 @@ -404,6 +404,15 @@
QPainter p(&pixmap);
p.setPen(painter->pen());
+ int y = 0;
+ if (layout.textOption().alignment() & Qt::AlignVCenter) {
+ const int h = fm.height() * layout.lineCount();
+ if (h < pixmap.height()) {
+ y = (pixmap.height() - h) / 2;
+ }
+ }
+ p.translate(0, y);
+
// Draw each line in the layout
for (int i = 0; i < layout.lineCount(); i++)
{
@@ -434,9 +443,11 @@
const QColor color = painter->pen().color();
if (qGray(color.rgb()) < 192) {
// Draw halos
+ painter->translate(0, y);
foreach (const QRect &haloRect, haloRects) {
Plasma::PaintUtils::drawHalo(painter, \
haloRect.translated(rect.topLeft())); }
+ painter->translate(0, -y);
} else {
// Draw shadow
QImage shadow = pixmap.toImage();
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/folderview.cpp #1133941:1133942
@@ -883,6 +883,7 @@
m_listView->setDrawShadows(m_drawShadows);
m_listView->setIconSize(iconSize());
m_listView->setWordWrap(m_numTextLines > 1);
+ m_iconView->setTextLineCount(m_numTextLines);
}
void FolderView::updateIconViewState()
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/listview.cpp #1133941:1133942
@@ -33,7 +33,9 @@
#include <KDirModel>
#include <KFileItemDelegate>
#include <KGlobalSettings>
+#include <KStringHandler>
+#include "animator.h"
#include "proxymodel.h"
#include "plasma/containment.h"
@@ -44,13 +46,22 @@
ListView::ListView(QGraphicsWidget *parent)
: AbstractItemView(parent),
+ m_itemFrame(0),
m_rowHeight(-1),
+ m_numTextLines(2),
m_dragInProgress(false),
m_wordWrap(true)
{
setAcceptHoverEvents(true);
setAcceptDrops(true);
setCacheMode(NoCache);
+
+ m_itemFrame = new Plasma::FrameSvg(this);
+ m_itemFrame->setImagePath("widgets/viewitem");
+ m_itemFrame->setCacheAllRenderedFrames(true);
+ m_itemFrame->setElementPrefix("normal");
+
+ m_animator = new Animator(this);
}
ListView::~ListView()
@@ -86,6 +97,20 @@
return m_wordWrap;
}
+void ListView::setTextLineCount(int count)
+{
+ if (count != m_numTextLines) {
+ m_numTextLines = count;
+ m_rowHeight = -1;
+ markAreaDirty(visibleArea());
+ }
+}
+
+int ListView::textLineCount() const
+{
+ return m_numTextLines;
+}
+
void ListView::rowsInserted(const QModelIndex &parent, int first, int last)
{
Q_UNUSED(parent)
@@ -135,7 +160,7 @@
if (m_rowHeight == -1 && m_model->rowCount() > 0) {
// Use the height of the first item for all items
- const QSize size = m_delegate->sizeHint(viewOptions(), m_model->index(0, \
0)); + const QSize size = itemSize(viewOptions(), m_model->index(0, 0));
m_rowHeight = size.height();
}
@@ -161,11 +186,33 @@
}
}
+QSize ListView::itemSize(const QStyleOptionViewItemV4 &option, const QModelIndex \
&index) const +{
+ qreal left, top, right, bottom;
+ m_itemFrame->getMargins(left, top, right, bottom);
+
+ QFont font = option.font;
+
+ KFileItem item = qvariant_cast<KFileItem>(index.data(KDirModel::FileItemRole));
+ if (item.isLink()) {
+ font.setItalic(true);
+ }
+
+ QFontMetrics fm(font);
+
+ QSize size;
+ size.rwidth() += contentsRect().width();
+ size.rheight() = qMax(option.decorationSize.height(), m_numTextLines * \
fm.height()); + size.rheight() += top + bottom;
+
+ return size;
+}
+
void ListView::updateSizeHint()
{
if (m_rowHeight == -1 && m_model->rowCount() > 0) {
// Use the height of the first item for all items
- const QSize size = m_delegate->sizeHint(viewOptions(), m_model->index(0, \
0)); + const QSize size = itemSize(viewOptions(), m_model->index(0, 0));
m_rowHeight = size.height();
}
@@ -183,32 +230,107 @@
return QRect(cr.left(), cr.top() + index.row() * m_rowHeight, cr.width(), \
m_rowHeight); }
-void ListView::updateTextShadows(const QColor &textColor)
+void ListView::paintItem(QPainter *painter, const QStyleOptionViewItemV4 &option, \
const QModelIndex &index) const {
- if (!drawShadows()) {
- m_delegate->setShadowColor(Qt::transparent);
- return;
+ // Draw the item background
+ // ========================
+ const bool selected = (option.state & QStyle::State_Selected);
+ const qreal hoverProgress = m_animator->hoverProgress(index);
+
+ QPixmap from(option.rect.size());
+ QPixmap to(option.rect.size());
+ from.fill(Qt::transparent);
+ to.fill(Qt::transparent);
+
+ if (selected) {
+ QPainter p(&from);
+ m_itemFrame->setElementPrefix("selected");
+ m_itemFrame->resizeFrame(option.rect.size());
+ m_itemFrame->paintFrame(&p, QPoint());
}
- QColor shadowColor;
+ if (hoverProgress > 0.0) {
+ QPainter p(&to);
+ m_itemFrame->setElementPrefix(selected ? "selected+hover" : "hover");
+ m_itemFrame->resizeFrame(option.rect.size());
+ m_itemFrame->paintFrame(&p, QPoint());
+ p.end();
- // Use black shadows with bright text, and white shadows with dark text.
- if (qGray(textColor.rgb()) > 192) {
- shadowColor = Qt::black;
- } else {
- shadowColor = Qt::white;
+ QPixmap result = Plasma::PaintUtils::transition(from, to, hoverProgress);
+ painter->drawPixmap(option.rect.topLeft(), result);
+ } else if (selected) {
+ painter->drawPixmap(option.rect.topLeft(), from);
}
- if (m_delegate->shadowColor() != shadowColor)
- {
- m_delegate->setShadowColor(shadowColor);
+ qreal left, top, right, bottom;
+ m_itemFrame->getMargins(left, top, right, bottom);
+ const QRect r = option.rect.adjusted(left, top, -right, -bottom);
- // Center white shadows to create a halo effect, and offset dark shadows \
slightly.
- if (shadowColor == Qt::white) {
- m_delegate->setShadowOffset(QPoint(0, 0));
- } else {
- m_delegate->setShadowOffset(QPoint(layoutDirection() == Qt::RightToLeft \
? -1 : 1, 1)); +
+ const QRect ir = QStyle::alignedRect(option.direction, Qt::AlignLeft | \
Qt::AlignVCenter, + option.decorationSize, \
r); +
+ const QRect tr = QStyle::alignedRect(option.direction, Qt::AlignRight | \
Qt::AlignVCenter, + QSize(r.width() - \
ir.width() - 4, r.height()), r); +
+
+ // Draw the text label
+ // ===================
+ QFont font = option.font;
+
+ KFileItem item = qvariant_cast<KFileItem>(index.data(KDirModel::FileItemRole));
+ if (item.isLink()) {
+ font.setItalic(true);
}
+
+ const QString text = index.data(Qt::DisplayRole).toString();
+
+ QTextLayout layout;
+ layout.setText(KStringHandler::preProcessWrap(text));
+ layout.setFont(font);
+ const QSize size = doTextLayout(layout, tr.size(), Qt::AlignLeft | \
Qt::AlignVCenter, + \
QTextOption::WrapAtWordBoundaryOrAnywhere); +
+ painter->setPen(option.palette.color(QPalette::Text));
+ drawTextLayout(painter, layout, tr);
+
+
+ // Draw the icon
+ // =============
+ const QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
+ icon.paint(painter, ir);
+
+
+ // Draw the focus rect
+ // ===================
+ if (option.state & QStyle::State_HasFocus) {
+ QRect fr = QStyle::alignedRect(layoutDirection(), Qt::AlignCenter, size, \
tr); + fr.adjust(-2, -2, 2, 2);
+
+ QColor color = Qt::white;
+ color.setAlphaF(.33);
+
+ QColor transparent = color;
+ transparent.setAlphaF(0);
+
+ QLinearGradient g1(0, fr.top(), 0, fr.bottom());
+ g1.setColorAt(0, color);
+ g1.setColorAt(1, transparent);
+
+ QLinearGradient g2(fr.left(), 0, fr.right(), 0);
+ g2.setColorAt(0, transparent);
+ g2.setColorAt(.5, color);
+ g2.setColorAt(1, transparent);
+
+ painter->save();
+ painter->setRenderHint(QPainter::Antialiasing);
+ painter->setPen(QPen(g1, 0));
+ painter->setBrush(Qt::NoBrush);
+ painter->drawRoundedRect(QRectF(fr).adjusted(.5, .5, -.5, -.5), 2, 2);
+ painter->setPen(QPen(g2, 0));
+ painter->drawLine(QLineF(fr.left() + 2, fr.bottom() + .5,
+ fr.right() - 2, fr.bottom() + .5));
+ painter->restore();
}
}
@@ -241,7 +363,7 @@
if (m_rowHeight == -1 && m_model->rowCount() > 0) {
// Use the height of the first item for all items
- const QSize size = m_delegate->sizeHint(opt, m_model->index(0, 0));
+ const QSize size = itemSize(opt, m_model->index(0, 0));
m_rowHeight = size.height();
}
@@ -268,17 +390,14 @@
if (m_dragInProgress) {
continue;
}
- updateTextShadows(palette().color(QPalette::HighlightedText));
opt.state |= QStyle::State_Selected | QStyle::State_MouseOver;
- } else {
- updateTextShadows(palette().color(QPalette::Text));
}
if (hasFocus() && index == m_selectionModel->currentIndex()) {
opt.state |= QStyle::State_HasFocus;
}
- m_delegate->paint(&p, opt, index);
+ paintItem(&p, opt, index);
}
m_dirtyRegion = QRegion();
@@ -303,6 +422,7 @@
}
if (index.isValid()) {
+ emit entered(index);
m_selectionModel->setCurrentIndex(index, \
QItemSelectionModel::ClearAndSelect); markAreaDirty(visualRect(index));
}
@@ -314,6 +434,12 @@
const QModelIndex index = indexAt(pos);
if (index != m_selectionModel->currentIndex()) {
+ if (m_selectionModel->currentIndex().isValid()) {
+ emit left(m_selectionModel->currentIndex());
+ }
+ if (index.isValid()) {
+ emit entered(index);
+ }
markAreaDirty(visualRect(index));
markAreaDirty(visualRect(m_selectionModel->currentIndex()));
m_selectionModel->setCurrentIndex(index, \
QItemSelectionModel::ClearAndSelect); @@ -325,6 +451,7 @@
Q_UNUSED(event)
if (!m_pressedIndex.isValid() && m_selectionModel->currentIndex().isValid()) {
+ emit left(m_selectionModel->currentIndex());
markAreaDirty(visualRect(m_selectionModel->currentIndex()));
m_selectionModel->clear();
}
@@ -473,13 +600,11 @@
//option.state |= QStyle::State_Selected | QStyle::State_MouseOver;
option.state &= ~(QStyle::State_Selected | QStyle::State_MouseOver);
- updateTextShadows(palette().color(QPalette::HighlightedText));
-
QPainter p(&pixmap);
foreach (const QModelIndex &index, indexes)
{
option.rect = visualRect(index).translated(-boundingRect.topLeft());
- m_delegate->paint(&p, option, index);
+ paintItem(&p, option, index);
}
p.end();
--- trunk/KDE/kdebase/apps/plasma/applets/folderview/listview.h #1133941:1133942
@@ -38,7 +38,11 @@
class ProxyModel;
class QStyleOptionViewItemV4;
class QScrollBar;
+class Animator;
+namespace Plasma {
+ class FrameSvg;
+}
class ListView : public AbstractItemView
{
@@ -50,21 +54,26 @@
void setModel(QAbstractItemModel *model);
- void setIconSize(const QSize &gridSize);
+ void setIconSize(const QSize &iconSize);
void setWordWrap(bool on);
bool wordWrap() const;
+ void setTextLineCount(int rows);
+ int textLineCount() const;
+
QModelIndex indexAt(const QPointF &point) const;
QRect visualRect(const QModelIndex &index) const;
protected:
void startDrag(const QPointF &pos, QWidget *widget);
- void updateTextShadows(const QColor &textColor);
void updateScrollBar();
void updateSizeHint();
QStyleOptionViewItemV4 viewOptions() const;
+ QSize itemSize(const QStyleOptionViewItemV4 &option, const QModelIndex &index) \
const; + void paintItem(QPainter *painter, const QStyleOptionViewItemV4 &option, \
const QModelIndex &index) const; +
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget \
*widget = 0);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
@@ -85,7 +94,10 @@
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
private:
+ Plasma::FrameSvg *m_itemFrame;
+ Animator *m_animator;
int m_rowHeight;
+ int m_numTextLines;
QPersistentModelIndex m_pressedIndex;
bool m_dragInProgress;
bool m_wordWrap;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic