26#include <QFontMetrics>
27#include <QLinearGradient>
30#include <QStyleOptionViewItem>
32#include "moc_qgsdetaileditemdelegate.cpp"
35 : QAbstractItemDelegate( parent )
37 , mpCheckBox( new QCheckBox() )
41 mpCheckBox->resize( mpCheckBox->sizeHint().height(), mpCheckBox->sizeHint().height() );
56 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
61 paintAsWidget( thepPainter, option, myData );
65 paintManually( thepPainter, option, myData );
72 const QStyleOptionViewItem &option,
73 const QModelIndex &index
76 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
81 return QSize( 378, mpWidget->height() );
86 return QSize( 50, height( option, myData ) );
92 return QSize( 50, 50 );
96void QgsDetailedItemDelegate::paintManually( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
102 mpCheckBox->setChecked( data.
isChecked() );
103 mpCheckBox->setEnabled( data.
isEnabled() );
104 QPixmap myCbxPixmap( mpCheckBox->size() );
105 mpCheckBox->render( &myCbxPixmap );
111 const QFontMetrics myTitleMetrics( titleFont( option ) );
112 const QFontMetrics myDetailMetrics( detailFont( option ) );
120 if ( option.state & QStyle::State_Selected )
122 drawHighlight( option, thepPainter, height( option, data ) );
123 thepPainter->setPen( option.palette.highlightedText().color() );
127 thepPainter->setPen( option.palette.text().color() );
136 thepPainter->drawPixmap( option.rect.x(), option.rect.y() + mpCheckBox->height(), myCbxPixmap );
142 bool myIconFlag =
false;
143 const QPixmap myDecoPixmap = data.
icon();
144 if ( !myDecoPixmap.isNull() )
147 int iconWidth = 32, iconHeight = 32;
149 if ( myDecoPixmap.width() <= iconWidth && myDecoPixmap.height() <= iconHeight )
152 int offsetX = 0, offsetY = 0;
153 if ( myDecoPixmap.width() < iconWidth )
154 offsetX = ( iconWidth - myDecoPixmap.width() ) / 2;
155 if ( myDecoPixmap.height() < iconHeight )
156 offsetY = ( iconHeight - myDecoPixmap.height() ) / 2;
158 thepPainter->drawPixmap( myTextStartX + offsetX, myTextStartY + offsetY, myDecoPixmap );
163 thepPainter->drawPixmap( myTextStartX, myTextStartY, iconWidth, iconHeight, myDecoPixmap );
171 myTextStartY += myHeight / 2;
172 thepPainter->setFont( titleFont( option ) );
173 thepPainter->drawText( myTextStartX, myTextStartY, data.
title() );
177 thepPainter->setFont( detailFont( option ) );
186 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - myTextStartX );
187 QStringListIterator myLineWrapIterator( myList );
188 while ( myLineWrapIterator.hasNext() )
190 const QString myLine = myLineWrapIterator.next();
191 thepPainter->drawText( myTextStartX, myTextStartY, myLine );
198 thepPainter->setFont( categoryFont( option ) );
199 thepPainter->drawText( myTextStartX, myTextStartY, data.
category() );
229void QgsDetailedItemDelegate::paintAsWidget( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
231 mpWidget->setChecked( data.
isChecked() );
232 mpWidget->setData( data );
233 mpWidget->resize( option.rect.width(), mpWidget->height() );
234 mpWidget->setAutoFillBackground(
true );
237 if ( option.state & QStyle::State_Selected )
239 drawHighlight( option, thepPainter, height( option, data ) );
241 const QPixmap myPixmap = mpWidget->grab();
242 thepPainter->drawPixmap( option.rect.x(), option.rect.y(), myPixmap );
245void QgsDetailedItemDelegate::drawHighlight(
const QStyleOptionViewItem &option, QPainter *thepPainter,
int height )
const
247 const QColor myColor1 = option.palette.highlight().color();
248 QColor myColor2 = myColor1;
249 myColor2 = myColor2.lighter( 110 );
250 QLinearGradient myGradient( QPointF( 0, option.rect.y() ), QPointF( 0, option.rect.y() + height ) );
251 myGradient.setColorAt( 0, myColor1 );
252 myGradient.setColorAt( 0.1, myColor2 );
253 myGradient.setColorAt( 0.5, myColor1 );
254 myGradient.setColorAt( 0.9, myColor2 );
255 myGradient.setColorAt( 1, myColor2 );
256 thepPainter->fillRect( option.rect, QBrush( myGradient ) );
259int QgsDetailedItemDelegate::height(
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
261 const QFontMetrics myTitleMetrics( titleFont( option ) );
262 const QFontMetrics myDetailMetrics( detailFont( option ) );
263 const QFontMetrics myCategoryMetrics( categoryFont( option ) );
267 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - ( mpCheckBox->width() +
horizontalSpacing() ) );
268 myHeight += ( myList.count() + 1 ) * ( myDetailMetrics.height() -
verticalSpacing() );
276 myHeight += ( myList.count() + 1 ) * ( myCategoryMetrics.height() -
verticalSpacing() );
282QFont QgsDetailedItemDelegate::detailFont(
const QStyleOptionViewItem &option )
const
284 const QFont myFont = option.font;
288QFont QgsDetailedItemDelegate::categoryFont(
const QStyleOptionViewItem &option )
const
290 QFont myFont = option.font;
291 myFont.setBold(
true );
295QFont QgsDetailedItemDelegate::titleFont(
const QStyleOptionViewItem &option )
const
297 QFont myTitleFont = detailFont( option );
298 myTitleFont.setBold(
true );
299 myTitleFont.setPointSize( myTitleFont.pointSize() );
304QStringList QgsDetailedItemDelegate::wordWrap(
const QString &
string,
const QFontMetrics &metrics,
int width )
const
306 if (
string.isEmpty() )
307 return QStringList();
309 return QStringList() << string;
314 QString myCumulativeLine;
315 QString myStringToPreviousSpace;
316 int myPreviousSpacePos = 0;
317 for (
int i = 0; i <
string.count(); ++i )
319 const QChar myChar =
string.at( i );
320 if ( myChar == QChar(
' ' ) )
322 myStringToPreviousSpace = myCumulativeLine;
323 myPreviousSpacePos = i;
325 myCumulativeLine += myChar;
326 if ( metrics.boundingRect( myCumulativeLine ).width() >= width )
331 myList << myStringToPreviousSpace.trimmed();
332 i = myPreviousSpacePos;
333 myStringToPreviousSpace.clear();
334 myCumulativeLine.clear();
338 if ( !myCumulativeLine.trimmed().isEmpty() )
340 myList << myCumulativeLine.trimmed();
352 return mVerticalSpacing;
358 mVerticalSpacing = value;
364 return mHorizontalSpacing;
370 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.