void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QFont fontBigger = qApp->font(); QFont fontSmaller = qApp->font(); QFontMetrics fmBigger(fontBigger); QStyleOptionViewItemV4 opt = option; QStyledItemDelegate::initStyleOption(&opt, index); QBrush bg; QString diveSiteName = index.data().toString(); struct dive_site *ds = get_dive_site_by_uuid( index.model()->data(index.model()->index(index.row(),0)).toInt() ); if (!ds) return; QString bottomText; for (int i = 0; i < ds->taxonomy.nr; i++) { if(ds->taxonomy.category[i].category == TC_NONE) continue; if(!bottomText.isEmpty()) bottomText += " "; bottomText += QString(ds->taxonomy.category[i].value) + " "; } if (bottomText.isEmpty()) { const char *gpsCoords = printGPSCoords(ds->latitude.udeg, ds->longitude.udeg); bottomText = QString(gpsCoords); free( (void*) gpsCoords); } fontBigger.setPointSize(fontBigger.pointSize() + 1); fontBigger.setBold(true); initStyleOption(&opt, index); opt.text = QString(); qApp->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, NULL); painter->save(); painter->setRenderHint(QPainter::Antialiasing); painter->setPen(QPen(Qt::NoPen)); painter->setBrush(bg); painter->drawRect(option.rect); painter->restore(); painter->save(); painter->setBrush(option.palette.text()); painter->setFont(fontBigger); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height(), diveSiteName); painter->setFont(fontSmaller); painter->setBrush(option.palette.brightText()); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText); painter->restore(); }
QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QFont fontBigger = qApp->font(); fontBigger.setPointSize(fontBigger.pointSize() + 2); fontBigger.setBold(true); QFontMetrics fmBigger(fontBigger); QFont fontSmaller = qApp->font(); QFontMetrics fmSmaller(fontSmaller); QSize retSize = QStyledItemDelegate::sizeHint(option, index); retSize.setHeight(fmBigger.boundingRect("Yellow House").height() + 5 /*spacing*/ + fmSmaller.boundingRect("Yellow House").height()); return retSize; }
void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QFont fontBigger = qApp->font(); QFont fontSmaller = qApp->font(); QFontMetrics fmBigger(fontBigger); QStyleOptionViewItemV4 opt = option; QStyledItemDelegate::initStyleOption(&opt, index); QBrush bg; QString diveSiteName = index.data().toString(); struct dive_site *ds = get_dive_site_by_uuid( index.model()->data(index.model()->index(index.row(),0)).toInt() ); if (!ds) return; const char *gpsCoords = printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg); QString diveSiteCoords(gpsCoords); free( (void*) gpsCoords); fontBigger.setPointSize(fontBigger.pointSize() + 2); fontBigger.setBold(true); painter->save(); painter->setRenderHint(QPainter::Antialiasing); if( ( option.state & QStyle::State_Selected ) || ( option.state & QStyle::State_MouseOver ) ) bg = option.palette.highlight(); else bg = option.palette.window(); painter->setPen(QPen(Qt::NoPen)); painter->setBrush(bg); painter->drawRect(option.rect); painter->restore(); painter->save(); painter->setBrush(option.palette.text()); painter->setFont(fontBigger); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height(), diveSiteName); painter->setFont(fontSmaller); painter->setBrush(option.palette.brightText()); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, diveSiteCoords); painter->restore(); }
void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &origIdx) const { QFont fontBigger = qApp->font(); QFont fontSmaller = qApp->font(); QFontMetrics fmBigger(fontBigger); QStyleOptionViewItemV4 opt = option; const QAbstractProxyModel *proxyModel = dynamic_cast<const QAbstractProxyModel*>(origIdx.model()); QModelIndex index = proxyModel->mapToSource(origIdx); QStyledItemDelegate::initStyleOption(&opt, index); QString diveSiteName = index.data().toString(); QString bottomText; QIcon icon = index.data(Qt::DecorationRole).value<QIcon>(); struct dive_site *ds = get_dive_site_by_uuid( index.model()->data(index.model()->index(index.row(),0)).toInt() ); //Special case: do not show name, but instead, show if (index.row() < 2) { diveSiteName = index.data().toString(); bottomText = index.data(Qt::ToolTipRole).toString(); goto print_part; } if (!ds) return; for (int i = 0; i < 3; i++) { if (prefs.geocoding.category[i] == TC_NONE) continue; int idx = taxonomy_index_for_category(&ds->taxonomy, prefs.geocoding.category[i]); if (idx == -1) continue; if(!bottomText.isEmpty()) bottomText += " / "; bottomText += QString(ds->taxonomy.category[idx].value); } if (bottomText.isEmpty()) { const char *gpsCoords = printGPSCoords(ds->latitude.udeg, ds->longitude.udeg); bottomText = QString(gpsCoords); free( (void*) gpsCoords); } if (dive_site_has_gps_location(ds) && dive_site_has_gps_location(&displayed_dive_site)) { // so we are showing a completion and both the current dive site and the completion // have a GPS fix... so let's show the distance if (ds->latitude.udeg == displayed_dive_site.latitude.udeg && ds->longitude.udeg == displayed_dive_site.longitude.udeg) { bottomText += tr(" (same GPS fix)"); } else { int distanceMeters = get_distance(ds->latitude, ds->longitude, displayed_dive_site.latitude, displayed_dive_site.longitude); QString distance = distance_string(distanceMeters); int nr = nr_of_dives_at_dive_site(ds->uuid, false); bottomText += tr(" (~%1 away").arg(distance); bottomText += tr(", %1 dive(s) here)").arg(nr); } } if (bottomText.isEmpty()) { if (dive_site_has_gps_location(&displayed_dive_site)) bottomText = tr("(no existing GPS data, add GPS fix from this dive)"); else bottomText = tr("(no GPS data)"); } bottomText = tr("Pick site: ") + bottomText; print_part: fontBigger.setPointSize(fontBigger.pointSize() + 1); fontBigger.setBold(true); QPen textPen = QPen(option.state & QStyle::State_Selected ? option.palette.highlightedText().color() : option.palette.text().color(), 1); initStyleOption(&opt, index); opt.text = QString(); opt.icon = QIcon(); painter->setClipRect(option.rect); painter->save(); if (option.state & QStyle::State_Selected) { painter->setPen(QPen(opt.palette.highlight().color().darker())); painter->setBrush(opt.palette.highlight()); const qreal pad = 1.0; const qreal pad2 = pad * 2.0; const qreal rounding = 5.0; painter->drawRoundedRect(option.rect.x() + pad, option.rect.y() + pad, option.rect.width() - pad2, option.rect.height() - pad2, rounding, rounding); } painter->setPen(textPen); painter->setFont(fontBigger); const qreal textPad = 5.0; painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height(), diveSiteName); double pointSize = fontSmaller.pointSizeF(); fontSmaller.setPointSizeF(0.9 * pointSize); painter->setFont(fontSmaller); painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText); painter->restore(); if (!icon.isNull()) { painter->save(); painter->drawPixmap( option.rect.x() + option.rect.width() - 24, option.rect.y() + option.rect.height() - 24, icon.pixmap(20,20)); painter->restore(); } }