File indexing completed on 2024-04-28 15:51:46

0001 /*
0002     SPDX-FileCopyrightText: 2006 Pino Toscano <pino@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "pageitemdelegate.h"
0008 
0009 // qt/kde includes
0010 #include <QApplication>
0011 #include <QModelIndex>
0012 #include <QTextDocument>
0013 #include <QVariant>
0014 
0015 // local includes
0016 #include "gui/tocmodel.h"
0017 #include "settings.h"
0018 
0019 #define PAGEITEMDELEGATE_INTERNALMARGIN 3
0020 
0021 class PageItemDelegate::Private
0022 {
0023 public:
0024     Private()
0025     {
0026     }
0027 
0028     QModelIndex index;
0029 };
0030 
0031 PageItemDelegate::PageItemDelegate(QObject *parent)
0032     : QItemDelegate(parent)
0033     , d(new Private)
0034 {
0035 }
0036 
0037 PageItemDelegate::~PageItemDelegate()
0038 {
0039     delete d;
0040 }
0041 
0042 void PageItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
0043 {
0044     d->index = index;
0045     QItemDelegate::paint(painter, option, index);
0046 }
0047 
0048 void PageItemDelegate::drawDisplay(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QString &text) const
0049 {
0050     QVariant pageVariant = d->index.data(TOCModel::PageRole);
0051     QVariant labelVariant = d->index.data(TOCModel::PageLabelRole);
0052     if ((labelVariant.metaType().id() != QMetaType::QString && !pageVariant.canConvert(QMetaType {QMetaType::QString})) || !Okular::Settings::tocPageColumn()) {
0053         QItemDelegate::drawDisplay(painter, option, rect, text);
0054         return;
0055     }
0056     QString label = labelVariant.toString();
0057     QString page = label.isEmpty() ? pageVariant.toString() : label;
0058     QTextDocument document;
0059     document.setPlainText(page);
0060     document.setDefaultFont(option.font);
0061     int margindelta = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
0062     int pageRectWidth = (int)document.size().width();
0063     QRect newRect(rect);
0064     QRect pageRect(rect);
0065     pageRect.setWidth(pageRectWidth + 2 * margindelta);
0066     newRect.setWidth(newRect.width() - pageRectWidth - PAGEITEMDELEGATE_INTERNALMARGIN);
0067     if (option.direction == Qt::RightToLeft) {
0068         newRect.translate(pageRectWidth + PAGEITEMDELEGATE_INTERNALMARGIN, 0);
0069     } else {
0070         pageRect.translate(newRect.width() + PAGEITEMDELEGATE_INTERNALMARGIN - 2 * margindelta, 0);
0071     }
0072     QItemDelegate::drawDisplay(painter, option, newRect, text);
0073     QStyleOptionViewItem newoption(option);
0074     newoption.displayAlignment = (option.displayAlignment & ~Qt::AlignHorizontal_Mask) | Qt::AlignRight;
0075     QItemDelegate::drawDisplay(painter, newoption, pageRect, page);
0076 }
0077 
0078 #include "moc_pageitemdelegate.cpp"