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 );
73 if ( index.data( Qt::UserRole ).userType() == qMetaTypeId<QgsDetailedItemData>() )
78 return QSize( 378, mpWidget->height() );
83 return QSize( 50, height( option, myData ) );
89 return QSize( 50, 50 );
93void QgsDetailedItemDelegate::paintManually( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
99 mpCheckBox->setChecked( data.
isChecked() );
100 mpCheckBox->setEnabled( data.
isEnabled() );
101 QPixmap myCbxPixmap( mpCheckBox->size() );
102 mpCheckBox->render( &myCbxPixmap );
108 const QFontMetrics myTitleMetrics( titleFont( option ) );
109 const QFontMetrics myDetailMetrics( detailFont( option ) );
117 if ( option.state & QStyle::State_Selected )
119 drawHighlight( option, thepPainter, height( option, data ) );
120 thepPainter->setPen( option.palette.highlightedText().color() );
124 thepPainter->setPen( option.palette.text().color() );
133 thepPainter->drawPixmap( option.rect.x(), option.rect.y() + mpCheckBox->height(), myCbxPixmap );
139 bool myIconFlag =
false;
140 const QPixmap myDecoPixmap = data.
icon();
141 if ( !myDecoPixmap.isNull() )
144 int iconWidth = 32, iconHeight = 32;
146 if ( myDecoPixmap.width() <= iconWidth && myDecoPixmap.height() <= iconHeight )
149 int offsetX = 0, offsetY = 0;
150 if ( myDecoPixmap.width() < iconWidth )
151 offsetX = ( iconWidth - myDecoPixmap.width() ) / 2;
152 if ( myDecoPixmap.height() < iconHeight )
153 offsetY = ( iconHeight - myDecoPixmap.height() ) / 2;
155 thepPainter->drawPixmap( myTextStartX + offsetX, myTextStartY + offsetY, myDecoPixmap );
160 thepPainter->drawPixmap( myTextStartX, myTextStartY, iconWidth, iconHeight, myDecoPixmap );
168 myTextStartY += myHeight / 2;
169 thepPainter->setFont( titleFont( option ) );
170 thepPainter->drawText( myTextStartX, myTextStartY, data.
title() );
174 thepPainter->setFont( detailFont( option ) );
183 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - myTextStartX );
184 QStringListIterator myLineWrapIterator( myList );
185 while ( myLineWrapIterator.hasNext() )
187 const QString myLine = myLineWrapIterator.next();
188 thepPainter->drawText( myTextStartX, myTextStartY, myLine );
195 thepPainter->setFont( categoryFont( option ) );
196 thepPainter->drawText( myTextStartX, myTextStartY, data.
category() );
226void QgsDetailedItemDelegate::paintAsWidget( QPainter *thepPainter,
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
228 mpWidget->setChecked( data.
isChecked() );
229 mpWidget->setData( data );
230 mpWidget->resize( option.rect.width(), mpWidget->height() );
231 mpWidget->setAutoFillBackground(
true );
234 if ( option.state & QStyle::State_Selected )
236 drawHighlight( option, thepPainter, height( option, data ) );
238 const QPixmap myPixmap = mpWidget->grab();
239 thepPainter->drawPixmap( option.rect.x(), option.rect.y(), myPixmap );
242void QgsDetailedItemDelegate::drawHighlight(
const QStyleOptionViewItem &option, QPainter *thepPainter,
int height )
const
244 const QColor myColor1 = option.palette.highlight().color();
245 QColor myColor2 = myColor1;
246 myColor2 = myColor2.lighter( 110 );
247 QLinearGradient myGradient( QPointF( 0, option.rect.y() ), QPointF( 0, option.rect.y() + height ) );
248 myGradient.setColorAt( 0, myColor1 );
249 myGradient.setColorAt( 0.1, myColor2 );
250 myGradient.setColorAt( 0.5, myColor1 );
251 myGradient.setColorAt( 0.9, myColor2 );
252 myGradient.setColorAt( 1, myColor2 );
253 thepPainter->fillRect( option.rect, QBrush( myGradient ) );
256int QgsDetailedItemDelegate::height(
const QStyleOptionViewItem &option,
const QgsDetailedItemData &data )
const
258 const QFontMetrics myTitleMetrics( titleFont( option ) );
259 const QFontMetrics myDetailMetrics( detailFont( option ) );
260 const QFontMetrics myCategoryMetrics( categoryFont( option ) );
264 const QStringList myList = wordWrap( data.
detail(), myDetailMetrics, option.rect.width() - ( mpCheckBox->width() +
horizontalSpacing() ) );
265 myHeight += ( myList.count() + 1 ) * ( myDetailMetrics.height() -
verticalSpacing() );
273 myHeight += ( myList.count() + 1 ) * ( myCategoryMetrics.height() -
verticalSpacing() );
279QFont QgsDetailedItemDelegate::detailFont(
const QStyleOptionViewItem &option )
const
281 const QFont myFont = option.font;
285QFont QgsDetailedItemDelegate::categoryFont(
const QStyleOptionViewItem &option )
const
287 QFont myFont = option.font;
288 myFont.setBold(
true );
292QFont QgsDetailedItemDelegate::titleFont(
const QStyleOptionViewItem &option )
const
294 QFont myTitleFont = detailFont( option );
295 myTitleFont.setBold(
true );
296 myTitleFont.setPointSize( myTitleFont.pointSize() );
301QStringList QgsDetailedItemDelegate::wordWrap(
const QString &
string,
const QFontMetrics &metrics,
int width )
const
303 if (
string.isEmpty() )
304 return QStringList();
306 return QStringList() << string;
311 QString myCumulativeLine;
312 QString myStringToPreviousSpace;
313 int myPreviousSpacePos = 0;
314 for (
int i = 0; i <
string.count(); ++i )
316 const QChar myChar =
string.at( i );
317 if ( myChar == QChar(
' ' ) )
319 myStringToPreviousSpace = myCumulativeLine;
320 myPreviousSpacePos = i;
322 myCumulativeLine += myChar;
323 if ( metrics.boundingRect( myCumulativeLine ).width() >= width )
328 myList << myStringToPreviousSpace.trimmed();
329 i = myPreviousSpacePos;
330 myStringToPreviousSpace.clear();
331 myCumulativeLine.clear();
335 if ( !myCumulativeLine.trimmed().isEmpty() )
337 myList << myCumulativeLine.trimmed();
349 return mVerticalSpacing;
355 mVerticalSpacing = value;
361 return mHorizontalSpacing;
367 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.