QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsfeaturelistviewdelegate.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsfeaturelistviewdelegate.cpp
3 ---------------------
4 begin : February 2013
5 copyright : (C) 2013 by Matthias Kuhn
6 email : matthias at opengis dot ch
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
16#include "qgsvectorlayer.h"
18#include "qgsfeaturelistmodel.h"
19#include "qgsapplication.h"
22
23#include <QHBoxLayout>
24#include <QPushButton>
25#include <QLabel>
26#include <QApplication>
27#include <QMouseEvent>
28#include <QObject>
29
31 : QItemDelegate( parent )
32 , mListModel( listModel )
33 , mCurrentFeatureEdited( false )
34{
35}
36
38{
39 if ( pos.x() > ICON_SIZE )
40 {
41 return EditElement;
42 }
43 else
44 {
45 return SelectionElement;
46 }
47}
48
50{
51 mFeatureSelectionModel = featureSelectionModel;
52}
53
55{
56 mCurrentFeatureEdited = state;
57}
58
59void QgsFeatureListViewDelegate::setEditSelectionModel( QItemSelectionModel *editSelectionModel )
60{
61 mEditSelectionModel = editSelectionModel;
62}
63
64QSize QgsFeatureListViewDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
65{
66 Q_UNUSED( index )
67 const int height = ICON_SIZE;
68 return QSize( option.rect.width(), std::max( height, option.fontMetrics.height() ) );
69}
70
71void QgsFeatureListViewDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
72{
73 const bool isEditSelection = mEditSelectionModel && mEditSelectionModel->isSelected( mListModel->mapToMaster( index ) );
74
75 QStyleOptionViewItem textOption = option;
76 textOption.state |= QStyle::State_Enabled;
77 if ( isEditSelection )
78 {
79 textOption.state |= QStyle::State_Selected;
80 }
81 drawBackground( painter, textOption, index );
82
83
84 static QPixmap sSelectedIcon;
85 if ( sSelectedIcon.isNull() )
86 sSelectedIcon = QgsApplication::getThemePixmap( QStringLiteral( "/mIconSelected.svg" ) );
87 static QPixmap sDeselectedIcon;
88 if ( sDeselectedIcon.isNull() )
89 sDeselectedIcon = QgsApplication::getThemePixmap( QStringLiteral( "/mIconDeselected.svg" ) );
90
91 const QString text = index.model()->data( index, Qt::EditRole ).toString();
92 const QgsFeatureListModel::FeatureInfo featInfo = index.model()->data( index, QgsFeatureListModel::Role::FeatureInfoRole ).value<QgsFeatureListModel::FeatureInfo>();
93
94 // Icon layout options
95 const QStyleOptionViewItem iconOption;
96
97 QRect iconLayoutBounds( option.rect.x(), option.rect.y(), option.rect.height(), option.rect.height() );
98
99 QPixmap icon = mFeatureSelectionModel->isSelected( index ) ? sSelectedIcon : sDeselectedIcon;
100
101 // Scale up the icon if needed
102 if ( option.rect.height() > ICON_SIZE )
103 {
104 icon = icon.scaledToHeight( option.rect.height(), Qt::SmoothTransformation );
105 }
106
107 drawDecoration( painter, iconOption, iconLayoutBounds, icon );
108
109 // if conditional style also has an icon, draw that too
110 const QVariant conditionalIcon = index.model()->data( index, Qt::DecorationRole );
111 if ( conditionalIcon.isValid() )
112 {
113 const QPixmap pixmap = conditionalIcon.value< QPixmap >();
114 iconLayoutBounds.moveLeft( iconLayoutBounds.x() + icon.width() + QFontMetrics( textOption.font ).horizontalAdvance( 'X' ) );
115 iconLayoutBounds.setTop( option.rect.y() + ( option.rect.height() - pixmap.height() ) / 2.0 );
116 iconLayoutBounds.setHeight( pixmap.height() );
117 drawDecoration( painter, iconOption, iconLayoutBounds, pixmap );
118 }
119
120 // Text layout options
121 const QRect textLayoutBounds( iconLayoutBounds.x() + iconLayoutBounds.width(), option.rect.y(), option.rect.width() - ( iconLayoutBounds.x() + iconLayoutBounds.width() ), option.rect.height() );
122
123 // start with font and foreground color from model's FontRole
124 const QVariant font = index.model()->data( index, Qt::FontRole );
125 if ( font.isValid() )
126 {
127 textOption.font = font.value< QFont >();
128 }
129 const QVariant textColor = index.model()->data( index, Qt::ForegroundRole );
130 if ( textColor.isValid() )
131 {
132 textOption.palette.setColor( QPalette::Text, textColor.value< QColor >() );
133 }
134
135 if ( featInfo.isNew )
136 {
137 textOption.font.setStyle( QFont::StyleItalic );
138 textOption.palette.setColor( QPalette::Text, Qt::darkGreen );
139 textOption.palette.setColor( QPalette::HighlightedText, Qt::darkGreen );
140 }
141 else if ( featInfo.isEdited || ( mCurrentFeatureEdited && isEditSelection ) )
142 {
143 textOption.font.setStyle( QFont::StyleItalic );
144 textOption.palette.setColor( QPalette::Text, Qt::red );
145 textOption.palette.setColor( QPalette::HighlightedText, Qt::red );
146 }
147
148 drawDisplay( painter, textOption, textLayoutBounds, text );
149}
static QPixmap getThemePixmap(const QString &name, const QColor &foreColor=QColor(), const QColor &backColor=QColor(), int size=16)
Helper to get a theme icon as a pixmap.
virtual QModelIndex mapToMaster(const QModelIndex &proxyIndex) const
QgsFeatureListViewDelegate(QgsFeatureListModel *listModel, QObject *parent=nullptr)
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setEditSelectionModel(QItemSelectionModel *editSelectionModel)
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
void setFeatureSelectionModel(QgsFeatureSelectionModel *featureSelectionModel)
virtual bool isSelected(QgsFeatureId fid)
Returns the selection status of a given feature id.
bool isEdited
True if feature has been edited.
bool isNew
True if feature is a newly added feature.