-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathListDelegate.h
More file actions
103 lines (83 loc) · 3.82 KB
/
ListDelegate.h
File metadata and controls
103 lines (83 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#ifndef LIST_DELEGATE_H
#define LIST_DELEGATE_H
#include <QWidget>
#include <QStyledItemDelegate>
#include "ConceptClient.h"
#include "GTKControl.h"
class ListDelegate : public QStyledItemDelegate {
private:
GTKControl *control;
public:
ListDelegate(GTKControl *control) : QStyledItemDelegate() {
this->control = control;
}
protected:
void paint(QPainter *painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
QStyleOptionViewItem opt(option);
if (!((TreeData *)control->ptr3)->orientation)
opt.decorationPosition = QStyleOptionViewItem::Left;
else
opt.decorationPosition = QStyleOptionViewItem::Top;
if (((TreeData *)control->ptr3)->markup < 0) {
QStyledItemDelegate::paint(painter, opt, index);
return;
}
painter->save();
painter->setRenderHint(QPainter::Antialiasing);
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
else
if (option.state & QStyle::State_MouseOver)
painter->fillRect(option.rect, option.palette.midlight());
if (((TreeData *)control->ptr3)->orientation) {
// vertical
QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
QSize size = icon.actualSize(QSize(opt.rect.width() - 2, opt.rect.height() - 18));
int x = (opt.rect.width() - size.width()) / 2 - 1;
icon.paint(painter, QRect(opt.rect.x() + x + 1, opt.rect.y() + 1, size.width(), size.height()), Qt::AlignTop | Qt::AlignHCenter);
QTextDocument doc;
doc.setHtml(index.model()->data(index).toString().replace("\n", "<br/>"));
QSize dsize = doc.size().toSize();
x = (opt.rect.width() - dsize.width()) / 2;
painter->translate(opt.rect.left() + x, opt.rect.top() + size.height() + 1);
QRect clip(0, 0, dsize.width(), dsize.height());
doc.drawContents(painter, clip);
} else {
// horizontal
QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
QSize size = icon.actualSize(QSize(opt.rect.width() - 2, opt.rect.height() - 2));
icon.paint(painter, QRect(opt.rect.x() + 1, opt.rect.y() + 1, opt.rect.width() - 2, opt.rect.height() - 2), Qt::AlignLeft | Qt::AlignVCenter);
QTextDocument doc;
doc.setHtml(index.model()->data(index).toString().replace("\n", "<br/>"));
painter->translate(opt.rect.left() + size.width(), opt.rect.top());
QRect clip(0, 0, opt.rect.width(), opt.rect.height());
doc.drawContents(painter, clip);
}
painter->restore();
}
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const {
int width = ((TreeData *)control->ptr3)->extra;
QSize result;
if (((TreeData *)control->ptr3)->markup < 0)
result = QStyledItemDelegate::sizeHint(option, index);
else {
QTextDocument doc;
doc.setHtml(index.model()->data(index).toString().replace("\n", "<br/>"));
result = doc.size().toSize();
QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
QList<QSize> sizes = icon.availableSizes();
if (sizes.size()) {
QSize size = sizes[0];
if (((TreeData *)control->ptr3)->orientation)
result.setHeight(result.height() + size.height());
else
result.setWidth(result.width() + size.width());
}
}
if (width > 0)
result.setWidth(width);
return result;
//return QStyledItemDelegate::sizeHint(option,index);
}
};
#endif