26#include <QFontMetrics>
27#include <QLinearGradient>
30#include <QStyleOptionViewItem>
32#include "moc_qgsdetaileditemdelegate.cpp"
35 : QAbstractItemDelegate( parent )
37 , mpCheckBox( std::make_unique<QCheckBox>() )
41 mpCheckBox->resize( mpCheckBox->sizeHint().height(), mpCheckBox->sizeHint().height() );
53 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
58 paintAsWidget( thepPainter, option, myData );
62 paintManually( thepPainter, option, myData );
70 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
75 return QSize( 378, mpWidget->height() );
80 return QSize( 50, height( option, myData ) );
86 return QSize( 50, 50 );
90void QgsDetailedItemDelegate::paintManually( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
96 mpCheckBox->setChecked( data.
isChecked() );
97 mpCheckBox->setEnabled( data.
isEnabled() );
98 QPixmap myCbxPixmap( mpCheckBox->size() );
99 mpCheckBox->render( &myCbxPixmap );
105 const QFontMetrics myTitleMetrics( titleFont( option ) );
106 const QFontMetrics myDetailMetrics( detailFont( option ) );
114 if ( option.state & QStyle::State_Selected )
116 drawHighlight( option, thepPainter, height( option, data ) );
117 thepPainter->setPen( option.palette.highlightedText().color() );
121 thepPainter->setPen( option.palette.text().color() );
130 thepPainter->drawPixmap( option.rect.x(), option.rect.y() + mpCheckBox->height(), myCbxPixmap );
136 bool myIconFlag =
false;
137 const QPixmap myDecoPixmap = data.
icon();
138 if ( !myDecoPixmap.isNull() )
141 int iconWidth = 32, iconHeight = 32;
143 if ( myDecoPixmap.width() <= iconWidth && myDecoPixmap.height() <= iconHeight )
146 int offsetX = 0, offsetY = 0;
147 if ( myDecoPixmap.width() < iconWidth )
148 offsetX = ( iconWidth - myDecoPixmap.width() ) / 2;
149 if ( myDecoPixmap.height() < iconHeight )
150 offsetY = ( iconHeight - myDecoPixmap.height() ) / 2;
152 thepPainter->drawPixmap( myTextStartX + offsetX, myTextStartY + offsetY, myDecoPixmap );
157 thepPainter->drawPixmap( myTextStartX, myTextStartY, iconWidth, iconHeight, myDecoPixmap );
165 myTextStartY += myHeight / 2;
166 thepPainter->setFont( titleFont( option ) );
167 thepPainter->drawText( myTextStartX, myTextStartY, data.
title() );
171 thepPainter->setFont( detailFont( option ) );
180 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - myTextStartX );
181 QStringListIterator myLineWrapIterator( myList );
182 while ( myLineWrapIterator.hasNext() )
184 const QString myLine = myLineWrapIterator.next();
185 thepPainter->drawText( myTextStartX, myTextStartY, myLine );
192 thepPainter->setFont( categoryFont( option ) );
193 thepPainter->drawText( myTextStartX, myTextStartY, data.
category() );
223void QgsDetailedItemDelegate::paintAsWidget( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
225 mpWidget->setChecked( data.
isChecked() );
226 mpWidget->setData( data );
227 mpWidget->resize( option.rect.width(), mpWidget->height() );
228 mpWidget->setAutoFillBackground(
true );
231 if ( option.state & QStyle::State_Selected )
233 drawHighlight( option, thepPainter, height( option, data ) );
235 const QPixmap myPixmap = mpWidget->grab();
236 thepPainter->drawPixmap( option.rect.x(), option.rect.y(), myPixmap );
239void QgsDetailedItemDelegate::drawHighlight(
const QStyleOptionViewItem &option, QPainter *thepPainter,
int height )
const
241 const QColor myColor1 = option.palette.highlight().color();
242 QColor myColor2 = myColor1;
243 myColor2 = myColor2.lighter( 110 );
244 QLinearGradient myGradient( QPointF( 0, option.rect.y() ), QPointF( 0, option.rect.y() + height ) );
245 myGradient.setColorAt( 0, myColor1 );
246 myGradient.setColorAt( 0.1, myColor2 );
247 myGradient.setColorAt( 0.5, myColor1 );
248 myGradient.setColorAt( 0.9, myColor2 );
249 myGradient.setColorAt( 1, myColor2 );
250 thepPainter->fillRect( option.rect, QBrush( myGradient ) );
253int QgsDetailedItemDelegate::height(
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
255 const QFontMetrics myTitleMetrics( titleFont( option ) );
256 const QFontMetrics myDetailMetrics( detailFont( option ) );
257 const QFontMetrics myCategoryMetrics( categoryFont( option ) );
261 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - ( mpCheckBox->width() +
horizontalSpacing() ) );
262 myHeight += ( myList.count() + 1 ) * ( myDetailMetrics.height() -
verticalSpacing() );
270 myHeight += ( myList.count() + 1 ) * ( myCategoryMetrics.height() -
verticalSpacing() );
276QFont QgsDetailedItemDelegate::detailFont(
const QStyleOptionViewItem &option )
const
278 const QFont myFont = option.font;
282QFont QgsDetailedItemDelegate::categoryFont(
const QStyleOptionViewItem &option )
const
284 QFont myFont = option.font;
285 myFont.setBold(
true );
289QFont QgsDetailedItemDelegate::titleFont(
const QStyleOptionViewItem &option )
const
291 QFont myTitleFont = detailFont( option );
292 myTitleFont.setBold(
true );
293 myTitleFont.setPointSize( myTitleFont.pointSize() );
298QStringList QgsDetailedItemDelegate::wordWrap(
const QString &
string,
const QFontMetrics &metrics,
int width )
const
300 if (
string.isEmpty() )
301 return QStringList();
303 return QStringList() << string;
308 QString myCumulativeLine;
309 QString myStringToPreviousSpace;
310 int myPreviousSpacePos = 0;
311 for (
int i = 0; i <
string.count(); ++i )
313 const QChar myChar =
string.at( i );
314 if ( myChar == QChar(
' ' ) )
316 myStringToPreviousSpace = myCumulativeLine;
317 myPreviousSpacePos = i;
319 myCumulativeLine += myChar;
320 if ( metrics.boundingRect( myCumulativeLine ).width() >= width )
325 myList << myStringToPreviousSpace.trimmed();
326 i = myPreviousSpacePos;
327 myStringToPreviousSpace.clear();
328 myCumulativeLine.clear();
332 if ( !myCumulativeLine.trimmed().isEmpty() )
334 myList << myCumulativeLine.trimmed();
346 return mVerticalSpacing;
352 mVerticalSpacing = value;
358 return mHorizontalSpacing;
364 mHorizontalSpacing = value;
The data only representation of a QgsDetailedItemWidget, designed to be used in custom views.
QString category() const
Returns the item's category.
bool isCheckable() const
Returns true if the item is checkable.
bool isEnabled() const
Returns true if the item is enabled.
QString title() const
Returns the item's title.
bool isRenderedAsWidget() const
Returns true if the item will be rendered using a widget.
QPixmap icon() const
Returns the item's icon.
QString detail() const
Returns the detailed description for the item.
bool isChecked() const
Returns true if the item is checked.
int verticalSpacing() const
void setHorizontalSpacing(int value)
void setVerticalSpacing(int value)
~QgsDetailedItemDelegate() override
QgsDetailedItemDelegate(QObject *parent=nullptr)
Constructor for QgsDetailedItemDelegate.
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
Reimplement for parent class.
int horizontalSpacing() const
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
Reimplement for parent class.
Scoped object for saving and restoring a QPainter object's state.