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