File indexing completed on 2024-04-14 03:47:49
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2004-2007 Torsten Rahn <tackat@kde.org> 0004 // SPDX-FileCopyrightText: 2007 Inge Wallin <ingwa@kde.org> 0005 // SPDX-FileCopyrightText: 2007 Thomas Zander <zander@kde.org> 0006 // SPDX-FileCopyrightText: 2010 Bastian Holst <bastianholst@gmx.de> 0007 // SPDX-FileCopyrightText: 2011-2013 Bernhard Beschow <bbeschow@cs.tu-berlin.de> 0008 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <illya.kovalevskyy@gmail.com> 0009 // 0010 0011 //Self 0012 #include "MapViewItemDelegate.h" 0013 0014 //Qt 0015 #include <QListView> 0016 #include <QModelIndex> 0017 #include <QTextDocument> 0018 #include <QPainter> 0019 #include <QApplication> 0020 #include <QAbstractTextDocumentLayout> 0021 #include <QSettings> 0022 0023 0024 namespace Marble { 0025 MapViewItemDelegate::MapViewItemDelegate( QListView *view ) : 0026 m_view(view), 0027 m_bookmarkIcon(QStringLiteral(":/icons/bookmarks.png")) 0028 { 0029 // nothing to do 0030 } 0031 0032 0033 void MapViewItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const 0034 { 0035 QStyleOptionViewItem styleOption = option; 0036 initStyleOption( &styleOption, index ); 0037 styleOption.text = QString(); 0038 styleOption.icon = QIcon(); 0039 0040 bool const selected = styleOption.state & QStyle::State_Selected; 0041 bool const active = styleOption.state & QStyle::State_Active; 0042 bool const hover = styleOption.state & QStyle::State_MouseOver; 0043 QPalette::ColorGroup const colorGroup = active ? QPalette::Active : QPalette::Inactive; 0044 if ( selected || hover ) { 0045 styleOption.features &= ~QStyleOptionViewItem::Alternate; 0046 QPalette::ColorRole colorRole = selected ? QPalette::Highlight : QPalette::Midlight; 0047 painter->fillRect( styleOption.rect, styleOption.palette.color( colorGroup, colorRole ) ); 0048 } 0049 QStyle* style = styleOption.widget ? styleOption.widget->style() : QApplication::style(); 0050 style->drawControl( QStyle::CE_ItemViewItem, &styleOption, painter, styleOption.widget ); 0051 0052 QRect const rect = styleOption.rect; 0053 QSize const iconSize = styleOption.decorationSize; 0054 QRect const iconRect( rect.topLeft(), iconSize ); 0055 QIcon const icon = index.data( Qt::DecorationRole ).value<QIcon>(); 0056 painter->drawPixmap( iconRect, icon.pixmap( iconSize ) ); 0057 0058 int const padding = 5; 0059 QString const name = index.data().toString(); 0060 const bool isFavorite = QSettings().contains(QLatin1String("Favorites/") + name); 0061 QSize const bookmarkSize( 16, 16 ); 0062 QRect bookmarkRect( iconRect.bottomRight(), bookmarkSize ); 0063 bookmarkRect.translate( QPoint( -bookmarkSize.width() - padding, -bookmarkSize.height() - padding ) ); 0064 QIcon::Mode mode = isFavorite ? QIcon::Normal : QIcon::Disabled; 0065 painter->drawPixmap( bookmarkRect, m_bookmarkIcon.pixmap( bookmarkSize, mode ) ); 0066 0067 QTextDocument document; 0068 document.setTextWidth( rect.width() - iconSize.width() - padding ); 0069 document.setDefaultFont( styleOption.font ); 0070 document.setHtml( text( index ) ); 0071 0072 QRect textRect = QRect( iconRect.topRight(), QSize( document.textWidth() - padding, rect.height() - padding ) ); 0073 painter->save(); 0074 painter->translate( textRect.topLeft() ); 0075 painter->setClipRect( textRect.translated( -textRect.topLeft() ) ); 0076 QAbstractTextDocumentLayout::PaintContext paintContext; 0077 paintContext.palette = styleOption.palette; 0078 QPalette::ColorRole const role = selected && active ? QPalette::HighlightedText : QPalette::Text; 0079 paintContext.palette.setColor( QPalette::Text, styleOption.palette.color( colorGroup, role ) ); 0080 document.documentLayout()->draw( painter, paintContext ); 0081 painter->restore(); 0082 } 0083 0084 QSize MapViewItemDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const 0085 { 0086 if ( index.column() == 0 ) { 0087 QSize const iconSize = option.decorationSize; 0088 QTextDocument doc; 0089 doc.setDefaultFont( option.font ); 0090 doc.setTextWidth( m_view->width() - iconSize.width() - 10 ); 0091 doc.setHtml( text( index ) ); 0092 return QSize( iconSize.width() + doc.size().width(), iconSize.height() ); 0093 } 0094 0095 return QSize(); 0096 } 0097 0098 QString MapViewItemDelegate::text( const QModelIndex &index ) 0099 { 0100 QString const title = index.data().toString(); 0101 QString const description = index.data( Qt::UserRole+2 ).toString(); 0102 return QString("<p><b>%1</b></p>%2").arg( title, description ); 0103 } 0104 0105 } 0106 0107 #include "moc_MapViewItemDelegate.cpp"