27#include <QFontMetrics>
28#include <QLinearGradient>
31#include <QStyleOptionViewItem>
33#include "moc_qgsdetaileditemdelegate.cpp"
36 : QAbstractItemDelegate( parent )
38 , mpCheckBox( std::make_unique<QCheckBox>() )
42 mpCheckBox->resize( mpCheckBox->sizeHint().height(), mpCheckBox->sizeHint().height() );
54 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
59 paintAsWidget( thepPainter, option, myData );
63 paintManually( thepPainter, option, myData );
71 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
76 return QSize( 378, mpWidget->height() );
81 return QSize( 50, height( option, myData ) );
87 return QSize( 50, 50 );
91void QgsDetailedItemDelegate::paintManually( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
97 mpCheckBox->setChecked( data.
isChecked() );
98 mpCheckBox->setEnabled( data.
isEnabled() );
99 QPixmap myCbxPixmap( mpCheckBox->size() );
100 mpCheckBox->render( &myCbxPixmap );
106 const QFontMetrics myTitleMetrics( titleFont( option ) );
107 const QFontMetrics myDetailMetrics( detailFont( option ) );
115 if ( option.state & QStyle::State_Selected )
117 drawHighlight( option, thepPainter, height( option, data ) );
118 thepPainter->setPen( option.palette.highlightedText().color() );
122 thepPainter->setPen( option.palette.text().color() );
131 thepPainter->drawPixmap( option.rect.x(), option.rect.y() + mpCheckBox->height(), myCbxPixmap );
137 bool myIconFlag =
false;
138 const QPixmap myDecoPixmap = data.
icon();
139 if ( !myDecoPixmap.isNull() )
142 int iconWidth = 32, iconHeight = 32;
144 if ( myDecoPixmap.width() <= iconWidth && myDecoPixmap.height() <= iconHeight )
147 int offsetX = 0, offsetY = 0;
148 if ( myDecoPixmap.width() < iconWidth )
149 offsetX = ( iconWidth - myDecoPixmap.width() ) / 2;
150 if ( myDecoPixmap.height() < iconHeight )
151 offsetY = ( iconHeight - myDecoPixmap.height() ) / 2;
153 thepPainter->drawPixmap( myTextStartX + offsetX, myTextStartY + offsetY, myDecoPixmap );
158 thepPainter->drawPixmap( myTextStartX, myTextStartY, iconWidth, iconHeight, myDecoPixmap );
166 myTextStartY += myHeight / 2;
167 thepPainter->setFont( titleFont( option ) );
168 thepPainter->drawText( myTextStartX, myTextStartY, data.
title() );
172 thepPainter->setFont( detailFont( option ) );
181 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - myTextStartX );
182 QStringListIterator myLineWrapIterator( myList );
183 while ( myLineWrapIterator.hasNext() )
185 const QString myLine = myLineWrapIterator.next();
186 thepPainter->drawText( myTextStartX, myTextStartY, myLine );
193 thepPainter->setFont( categoryFont( option ) );
194 thepPainter->drawText( myTextStartX, myTextStartY, data.
category() );
224void QgsDetailedItemDelegate::paintAsWidget( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
226 mpWidget->setChecked( data.
isChecked() );
227 mpWidget->setData( data );
228 mpWidget->resize( option.rect.width(), mpWidget->height() );
229 mpWidget->setAutoFillBackground(
true );
232 if ( option.state & QStyle::State_Selected )
234 drawHighlight( option, thepPainter, height( option, data ) );
236 const QPixmap myPixmap = mpWidget->grab();
237 thepPainter->drawPixmap( option.rect.x(), option.rect.y(), myPixmap );
240void QgsDetailedItemDelegate::drawHighlight(
const QStyleOptionViewItem &option, QPainter *thepPainter,
int height )
const
242 const QColor myColor1 = option.palette.highlight().color();
243 QColor myColor2 = myColor1;
244 myColor2 = myColor2.lighter( 110 );
245 QLinearGradient myGradient( QPointF( 0, option.rect.y() ), QPointF( 0, option.rect.y() + height ) );
246 myGradient.setColorAt( 0, myColor1 );
247 myGradient.setColorAt( 0.1, myColor2 );
248 myGradient.setColorAt( 0.5, myColor1 );
249 myGradient.setColorAt( 0.9, myColor2 );
250 myGradient.setColorAt( 1, myColor2 );
251 thepPainter->fillRect( option.rect, QBrush( myGradient ) );
254int QgsDetailedItemDelegate::height(
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
256 const QFontMetrics myTitleMetrics( titleFont( option ) );
257 const QFontMetrics myDetailMetrics( detailFont( option ) );
258 const QFontMetrics myCategoryMetrics( categoryFont( option ) );
262 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - ( mpCheckBox->width() +
horizontalSpacing() ) );
263 myHeight += ( myList.count() + 1 ) * ( myDetailMetrics.height() -
verticalSpacing() );
271 myHeight += ( myList.count() + 1 ) * ( myCategoryMetrics.height() -
verticalSpacing() );
277QFont QgsDetailedItemDelegate::detailFont(
const QStyleOptionViewItem &option )
const
279 const QFont myFont = option.font;
283QFont QgsDetailedItemDelegate::categoryFont(
const QStyleOptionViewItem &option )
const
285 QFont myFont = option.font;
286 myFont.setBold(
true );
290QFont QgsDetailedItemDelegate::titleFont(
const QStyleOptionViewItem &option )
const
292 QFont myTitleFont = detailFont( option );
293 myTitleFont.setBold(
true );
294 myTitleFont.setPointSize( myTitleFont.pointSize() );
299QStringList QgsDetailedItemDelegate::wordWrap(
const QString &
string,
const QFontMetrics &metrics,
int width )
const
301 if (
string.isEmpty() )
302 return QStringList();
304 return QStringList() << string;
309 QString myCumulativeLine;
310 QString myStringToPreviousSpace;
311 int myPreviousSpacePos = 0;
312 for (
int i = 0; i <
string.count(); ++i )
314 const QChar myChar =
string.at( i );
315 if ( myChar == QChar(
' ' ) )
317 myStringToPreviousSpace = myCumulativeLine;
318 myPreviousSpacePos = i;
320 myCumulativeLine += myChar;
321 if ( metrics.boundingRect( myCumulativeLine ).width() >= width )
326 myList << myStringToPreviousSpace.trimmed();
327 i = myPreviousSpacePos;
328 myStringToPreviousSpace.clear();
329 myCumulativeLine.clear();
333 if ( !myCumulativeLine.trimmed().isEmpty() )
335 myList << myCumulativeLine.trimmed();
347 return mVerticalSpacing;
353 mVerticalSpacing = value;
359 return mHorizontalSpacing;
365 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.