1 #include "iconview.h"
2
3 #include <QPainterPath>
4 #include <QPainterPath>
5
eventFilter(QObject * object,QEvent * event)6 bool IconViewDelegate::eventFilter(QObject *object,
7 QEvent *event)
8 {
9 QWidget *editor = qobject_cast<QWidget*>(object);
10 if(editor && event->type() == QEvent::KeyPress) {
11 if(static_cast<QKeyEvent *>(event)->key() == Qt::Key_Escape){
12 _isEditing = false;
13 _index = QModelIndex();
14 }
15 }
16 return QStyledItemDelegate::eventFilter(editor, event);
17 }
18
setEditorData(QWidget * editor,const QModelIndex & index) const19 void IconViewDelegate::setEditorData(QWidget *editor,
20 const QModelIndex &index) const
21 { // workaround for QTBUG
22 _isEditing = true;
23 _index = index;
24 QStyledItemDelegate::setEditorData(editor, index);
25 }
26
setModelData(QWidget * editor,QAbstractItemModel * model,const QModelIndex & index) const27 void IconViewDelegate::setModelData(QWidget *editor,
28 QAbstractItemModel *model,
29 const QModelIndex &index) const
30 { // workaround for QTBUG
31 QStyledItemDelegate::setModelData(editor, model, index);
32 _isEditing = false;
33 _index = QModelIndex();
34 }
35
sizeHint(const QStyleOptionViewItem & option,const QModelIndex & index) const36 QSize IconViewDelegate::sizeHint(const QStyleOptionViewItem &option,
37 const QModelIndex &index) const
38 {
39 QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
40 QSize iconsize = icon.actualSize(option.decorationSize);
41 int width = qMax(iconsize.width(), option.fontMetrics.averageCharWidth() * 14);
42 QRect txtRect(0, 0, width, option.rect.height());
43 QSize txtsize = option.fontMetrics.boundingRect(txtRect,
44 Qt::AlignTop|Qt::AlignHCenter|Qt::TextWordWrap|Qt::TextWrapAnywhere,
45 index.data().toString()).size();
46 if (txtsize.width()>width) { width = txtsize.width(); }
47 QSize size(width+8, txtsize.height()+iconsize.height()+8+8);
48 return size;
49 }
50
paint(QPainter * painter,const QStyleOptionViewItem & option,const QModelIndex & index) const51 void IconViewDelegate::paint(QPainter *painter,
52 const QStyleOptionViewItem &option,
53 const QModelIndex &index) const
54 {
55 QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
56 QSize iconsize = icon.actualSize(option.decorationSize);
57 QRect item = option.rect;
58 QRect iconRect(item.left()+(item.width()/2)-(iconsize.width()/2),
59 item.top()+4+4, iconsize.width(), iconsize.height());
60 QRect txtRect(item.left()+4, item.top()+iconsize.height()+4+4+4,
61 item.width()-8, item.height()-iconsize.height()-4);
62 QBrush txtBrush = qvariant_cast<QBrush>(index.data(Qt::ForegroundRole));
63 bool isSelected = option.state & QStyle::State_Selected;
64 bool isEditing = _isEditing && index==_index;
65
66 /*QStyleOptionViewItem opt = option;
67 initStyleOption(&opt,index);
68 opt.decorationAlignment |= Qt::AlignCenter;
69 opt.displayAlignment |= Qt::AlignCenter;
70 opt.decorationPosition = QStyleOptionViewItem::Top;
71 opt.features |= QStyleOptionViewItem::WrapText;
72 const QWidget *widget = opt.widget;
73 QStyle *style = widget ? widget->style() : QApplication::style();
74 style->drawControl(QStyle::CE_ItemViewItem,&opt,painter);*/
75
76 painter->setRenderHint(QPainter::Antialiasing);
77 painter->setRenderHint(QPainter::HighQualityAntialiasing);
78
79 if (isSelected && !isEditing) {
80 QPainterPath path;
81 QRect frame(item.left(),item.top()+4, item.width(), item.height()-4);
82 path.addRoundRect(frame, 15, 15);
83 // path.addRect(frame);
84 painter->setOpacity(0.7);
85 painter->fillPath(path, option.palette.highlight());
86 painter->setOpacity(1.0);
87 }
88
89 painter->drawPixmap(iconRect, icon.pixmap(iconsize.width(),iconsize.height()));
90
91 if (isEditing) { return; }
92 if (isSelected) { painter->setPen(option.palette.highlightedText().color()); }
93 else { painter->setPen(txtBrush.color()); }
94
95 painter->drawText(txtRect,
96 Qt::AlignTop|Qt::AlignHCenter|Qt::TextWordWrap|Qt::TextWrapAnywhere,
97 index.data().toString());
98 }
99