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"