forked from KDE/okular
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpageitemdelegate.cpp
78 lines (66 loc) · 2.38 KB
/
pageitemdelegate.cpp
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
/*
SPDX-FileCopyrightText: 2006 Pino Toscano <[email protected]>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "pageitemdelegate.h"
// qt/kde includes
#include <QApplication>
#include <QModelIndex>
#include <QTextDocument>
#include <QVariant>
// local includes
#include "gui/tocmodel.h"
#include "settings.h"
#define PAGEITEMDELEGATE_INTERNALMARGIN 3
class PageItemDelegate::Private
{
public:
Private()
{
}
QModelIndex index;
};
PageItemDelegate::PageItemDelegate(QObject *parent)
: QItemDelegate(parent)
, d(new Private)
{
}
PageItemDelegate::~PageItemDelegate()
{
delete d;
}
void PageItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
d->index = index;
QItemDelegate::paint(painter, option, index);
}
void PageItemDelegate::drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const
{
QVariant pageVariant = d->index.data(TOCModel::PageRole);
QVariant labelVariant = d->index.data(TOCModel::PageLabelRole);
if ((labelVariant.type() != QVariant::String && !pageVariant.canConvert(QVariant::String)) || !Okular::Settings::tocPageColumn()) {
QItemDelegate::drawDisplay(painter, option, rect, text);
return;
}
QString label = labelVariant.toString();
QString page = label.isEmpty() ? pageVariant.toString() : label;
QTextDocument document;
document.setPlainText(page);
document.setDefaultFont(option.font);
int margindelta = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
int pageRectWidth = (int)document.size().width();
QRect newRect(rect);
QRect pageRect(rect);
pageRect.setWidth(pageRectWidth + 2 * margindelta);
newRect.setWidth(newRect.width() - pageRectWidth - PAGEITEMDELEGATE_INTERNALMARGIN);
if (option.direction == Qt::RightToLeft) {
newRect.translate(pageRectWidth + PAGEITEMDELEGATE_INTERNALMARGIN, 0);
} else {
pageRect.translate(newRect.width() + PAGEITEMDELEGATE_INTERNALMARGIN - 2 * margindelta, 0);
}
QItemDelegate::drawDisplay(painter, option, newRect, text);
QStyleOptionViewItem newoption(option);
newoption.displayAlignment = (option.displayAlignment & ~Qt::AlignHorizontal_Mask) | Qt::AlignRight;
QItemDelegate::drawDisplay(painter, newoption, pageRect, page);
}
#include "moc_pageitemdelegate.cpp"