Marble

MapViewItemDelegate.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2004-2007 Torsten Rahn <[email protected]>
4 // SPDX-FileCopyrightText: 2007 Inge Wallin <[email protected]>
5 // SPDX-FileCopyrightText: 2007 Thomas Zander <[email protected]>
6 // SPDX-FileCopyrightText: 2010 Bastian Holst <[email protected]>
7 // SPDX-FileCopyrightText: 2011-2013 Bernhard Beschow <[email protected]>
8 // SPDX-FileCopyrightText: 2012 Illya Kovalevskyy <[email protected]>
9 //
10 
11 //Self
12 #include "MapViewItemDelegate.h"
13 
14 //Qt
15 #include <QListView>
16 #include <QModelIndex>
17 #include <QTextDocument>
18 #include <QPainter>
19 #include <QApplication>
20 #include <QAbstractTextDocumentLayout>
21 #include <QSettings>
22 
23 
24 namespace Marble {
25 MapViewItemDelegate::MapViewItemDelegate( QListView *view ) :
26  m_view(view),
27  m_bookmarkIcon(QStringLiteral(":/icons/bookmarks.png"))
28 {
29  // nothing to do
30 }
31 
32 
33 void MapViewItemDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
34 {
35  QStyleOptionViewItem styleOption = option;
36  initStyleOption( &styleOption, index );
37  styleOption.text = QString();
38  styleOption.icon = QIcon();
39 
40  bool const selected = styleOption.state & QStyle::State_Selected;
41  bool const active = styleOption.state & QStyle::State_Active;
42  bool const hover = styleOption.state & QStyle::State_MouseOver;
43  QPalette::ColorGroup const colorGroup = active ? QPalette::Active : QPalette::Inactive;
44  if ( selected || hover ) {
45  styleOption.features &= ~QStyleOptionViewItem::Alternate;
47  painter->fillRect( styleOption.rect, styleOption.palette.color( colorGroup, colorRole ) );
48  }
49  QStyle* style = styleOption.widget ? styleOption.widget->style() : QApplication::style();
50  style->drawControl( QStyle::CE_ItemViewItem, &styleOption, painter, styleOption.widget );
51 
52  QRect const rect = styleOption.rect;
53  QSize const iconSize = styleOption.decorationSize;
54  QRect const iconRect( rect.topLeft(), iconSize );
55  QIcon const icon = index.data( Qt::DecorationRole ).value<QIcon>();
56  painter->drawPixmap( iconRect, icon.pixmap( iconSize ) );
57 
58  int const padding = 5;
59  QString const name = index.data().toString();
60  const bool isFavorite = QSettings().contains(QLatin1String("Favorites/") + name);
61  QSize const bookmarkSize( 16, 16 );
62  QRect bookmarkRect( iconRect.bottomRight(), bookmarkSize );
63  bookmarkRect.translate( QPoint( -bookmarkSize.width() - padding, -bookmarkSize.height() - padding ) );
64  QIcon::Mode mode = isFavorite ? QIcon::Normal : QIcon::Disabled;
65  painter->drawPixmap( bookmarkRect, m_bookmarkIcon.pixmap( bookmarkSize, mode ) );
66 
67  QTextDocument document;
68  document.setTextWidth( rect.width() - iconSize.width() - padding );
69  document.setDefaultFont( styleOption.font );
70  document.setHtml( text( index ) );
71 
72  QRect textRect = QRect( iconRect.topRight(), QSize( document.textWidth() - padding, rect.height() - padding ) );
73  painter->save();
74  painter->translate( textRect.topLeft() );
75  painter->setClipRect( textRect.translated( -textRect.topLeft() ) );
77  paintContext.palette = styleOption.palette;
78  QPalette::ColorRole const role = selected && active ? QPalette::HighlightedText : QPalette::Text;
79  paintContext.palette.setColor( QPalette::Text, styleOption.palette.color( colorGroup, role ) );
80  document.documentLayout()->draw( painter, paintContext );
81  painter->restore();
82 }
83 
84 QSize MapViewItemDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
85 {
86  if ( index.column() == 0 ) {
87  QSize const iconSize = option.decorationSize;
88  QTextDocument doc;
89  doc.setDefaultFont( option.font );
90  doc.setTextWidth( m_view->width() - iconSize.width() - 10 );
91  doc.setHtml( text( index ) );
92  return QSize( iconSize.width() + doc.size().width(), iconSize.height() );
93  }
94 
95  return QSize();
96 }
97 
98 QString MapViewItemDelegate::text( const QModelIndex &index )
99 {
100  QString const title = index.data().toString();
101  QString const description = index.data( Qt::UserRole+2 ).toString();
102  return QString("<p><b>%1</b></p>%2").arg( title, description );
103 }
104 
105 }
106 
107 #include "moc_MapViewItemDelegate.cpp"
QRect translated(int dx, int dy) const const
virtual void drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const const=0
DecorationRole
QPoint topLeft() const const
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
int column() const const
T value() const const
void setClipRect(const QRectF &rectangle, Qt::ClipOperation operation)
QAbstractTextDocumentLayout * documentLayout() const const
int width() const const
int width() const const
void fillRect(const QRectF &rectangle, const QBrush &brush)
QVariant data(int role) const const
void setTextWidth(qreal width)
int height() const const
void setDefaultFont(const QFont &font)
bool contains(const QString &key) const const
Binds a QML item to a specific geodetic location in screen coordinates.
virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const const
int height() const const
QPixmap pixmap(const QSize &size, QIcon::Mode mode, QIcon::State state) const const
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
void setHtml(const QString &html)
const char * name(StandardAction id)
void translate(const QPointF &offset)
void restore()
void save()
virtual void draw(QPainter *painter, const QAbstractTextDocumentLayout::PaintContext &context)=0
QStyle * style()
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Thu Sep 21 2023 04:12:27 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.