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"