void QgsDetailedItemWidget::setData( QgsDetailedItemData theData ) { lblTitle->setText( theData.title() ); lblDetail->setText( theData.detail() ); lblCategory->setText( theData.category() ); cbx->setVisible( theData.isCheckable() ); cbx->setChecked( theData.isChecked() ); lblIcon->setPixmap( theData.icon() ); }
int QgsDetailedItemDelegate::height( const QStyleOptionViewItem &theOption, const QgsDetailedItemData &theData ) const { QFontMetrics myTitleMetrics( titleFont( theOption ) ); QFontMetrics myDetailMetrics( detailFont( theOption ) ); QFontMetrics myCategoryMetrics( categoryFont( theOption ) ); //we don't word wrap the title so its easy to measure int myHeight = myTitleMetrics.height() + verticalSpacing(); //the detail needs to be measured though QStringList myList = wordWrap( theData.detail(), myDetailMetrics, theOption.rect.width() - ( mpCheckBox->width() + horizontalSpacing() ) ); myHeight += ( myList.count() + 1 ) * ( myDetailMetrics.height() - verticalSpacing() ); //we don't word wrap the category so its easy to measure myHeight += myCategoryMetrics.height() + verticalSpacing(); #if 0 // if category should be wrapped use this code myList = wordWrap( theData.category(), myCategoryMetrics, theOption.rect.width() - ( mpCheckBox->width() + horizontalSpacing() ) ); myHeight += ( myList.count() + 1 ) * ( myCategoryMetrics.height() - verticalSpacing() ); #endif return myHeight; }
void QgsDetailedItemDelegate::paintManually( QPainter *thepPainter, const QStyleOptionViewItem &theOption, const QgsDetailedItemData &theData ) const { // // Get the strings and check box properties // //bool myCheckState = theIndex.model()->data(theIndex, Qt::CheckStateRole).toBool(); mpCheckBox->setChecked( theData.isChecked() ); mpCheckBox->setEnabled( theData.isEnabled() ); QPixmap myCbxPixmap( mpCheckBox->size() ); mpCheckBox->render( &myCbxPixmap ); //we will draw this onto the widget further down // // Calculate the widget height and other metrics // QFontMetrics myTitleMetrics( titleFont( theOption ) ); QFontMetrics myDetailMetrics( detailFont( theOption ) ); int myTextStartX = theOption.rect.x() + horizontalSpacing(); int myTextStartY = theOption.rect.y() + verticalSpacing(); int myHeight = myTitleMetrics.height() + verticalSpacing(); // // Draw the item background with a gradient if its highlighted // if ( theOption.state & QStyle::State_Selected ) { drawHighlight( theOption, thepPainter, height( theOption, theData ) ); thepPainter->setPen( theOption.palette.highlightedText().color() ); } else { thepPainter->setPen( theOption.palette.text().color() ); } // // Draw the checkbox // if ( theData.isCheckable() ) { thepPainter->drawPixmap( theOption.rect.x(), theOption.rect.y() + mpCheckBox->height(), myCbxPixmap ); myTextStartX = theOption.rect.x() + myCbxPixmap.width() + horizontalSpacing(); } // // Draw the decoration (pixmap) // bool myIconFlag = false; QPixmap myDecoPixmap = theData.icon(); if ( !myDecoPixmap.isNull() ) { myIconFlag = true; int iconWidth = 32, iconHeight = 32; if ( myDecoPixmap.width() <= iconWidth && myDecoPixmap.height() <= iconHeight ) { // the pixmap has reasonable size int offsetX = 0, offsetY = 0; if ( myDecoPixmap.width() < iconWidth ) offsetX = ( iconWidth - myDecoPixmap.width() ) / 2; if ( myDecoPixmap.height() < iconHeight ) offsetY = ( iconHeight - myDecoPixmap.height() ) / 2; thepPainter->drawPixmap( myTextStartX + offsetX, myTextStartY + offsetY, myDecoPixmap ); } else { // shrink the pixmap, it's too big thepPainter->drawPixmap( myTextStartX, myTextStartY, iconWidth, iconHeight, myDecoPixmap ); } myTextStartX += iconWidth + horizontalSpacing(); } // // Draw the title // myTextStartY += myHeight / 2; thepPainter->setFont( titleFont( theOption ) ); thepPainter->drawText( myTextStartX, myTextStartY, theData.title() ); // // Draw the description with word wrapping if needed // thepPainter->setFont( detailFont( theOption ) ); //return to original font set by client if ( myIconFlag ) { myTextStartY += verticalSpacing(); } else { myTextStartY += myDetailMetrics.height() + verticalSpacing(); } QStringList myList = wordWrap( theData.detail(), myDetailMetrics, theOption.rect.width() - myTextStartX ); QStringListIterator myLineWrapIterator( myList ); while ( myLineWrapIterator.hasNext() ) { QString myLine = myLineWrapIterator.next(); thepPainter->drawText( myTextStartX, myTextStartY, myLine ); myTextStartY += myDetailMetrics.height() - verticalSpacing(); } // // Draw the category. Not sure if we need word wrapping for it. // thepPainter->setFont( categoryFont( theOption ) ); //return to original font set by client thepPainter->drawText( myTextStartX, myTextStartY, theData.category() ); // // Draw the category with word wrapping if needed // /* myTextStartY += verticalSpacing(); if ( myIconFlag ) { myTextStartY += verticalSpacing(); } else { myTextStartY += myCategoryMetrics.height() + verticalSpacing(); } myList = wordWrap( theData.category(), myCategoryMetrics, theOption.rect.width() - myTextStartX ); QStringListIterator myLineWrapIter( myList ); while ( myLineWrapIter.hasNext() ) { QString myLine = myLineWrapIter.next(); thepPainter->drawText( myTextStartX, myTextStartY, myLine ); myTextStartY += myCategoryMetrics.height() - verticalSpacing(); } */ } //render by manual painting