void RelatedPacketDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) QStyleOptionViewItemV4 option_vi = option; #else QStyleOptionViewItem option_vi = option; #endif QStyledItemDelegate::initStyleOption(&option_vi, index); int em_w = option_vi.fontMetrics.height(); int en_w = (em_w + 1) / 2; int line_w = (option_vi.fontMetrics.lineWidth()); #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) option_vi.features |= QStyleOptionViewItemV4::HasDecoration; #else option_vi.features |= QStyleOptionViewItem::HasDecoration; #endif option_vi.decorationSize.setHeight(1); option_vi.decorationSize.setWidth(em_w); QStyledItemDelegate::paint(painter, option_vi, index); guint32 setup_frame = 0, last_frame = 0; if (conv_) { setup_frame = (int) conv_->setup_frame; last_frame = (int) conv_->last_frame; } const frame_data *fd; PacketListRecord *record = static_cast<PacketListRecord*>(index.internalPointer()); if (!record || (fd = record->frameData()) == NULL) { return; } painter->save(); if (QApplication::style()->objectName().contains("vista")) { // QWindowsVistaStyle::drawControl does this internally. Unfortunately there // doesn't appear to be a more general way to do this. option_vi.palette.setColor(QPalette::All, QPalette::HighlightedText, option_vi.palette.color(QPalette::Active, QPalette::Text)); } QPalette::ColorGroup cg = option_vi.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; QColor fg; if (cg == QPalette::Normal && !(option_vi.state & QStyle::State_Active)) cg = QPalette::Inactive; if (option_vi.state & QStyle::State_Selected) { fg = option_vi.palette.color(cg, QPalette::HighlightedText); } else { fg = option_vi.palette.color(cg, QPalette::Text); } fg = ColorUtils::alphaBlend(fg, option_vi.palette.color(cg, QPalette::Base), 0.5); QPen line_pen(fg); line_pen.setWidth(line_w); line_pen.setJoinStyle(Qt::RoundJoin); painter->setPen(line_pen); painter->translate(option_vi.rect.x(), option_vi.rect.y()); painter->translate(en_w + 0.5, 0.5); painter->setRenderHint(QPainter::Antialiasing, true); int height = option_vi.rect.height(); // Uncomment to make the boundary visible. // painter->save(); // painter->setPen(Qt::darkRed); // painter->drawRect(QRectF(0.5, 0.5, en_w - 1, height - 1)); // painter->restore(); // The current decorations are based on what looked good and were easy // to code. // It might be useful to have a JACKPOT_MODE define that shows each // decoration in sequence in order to make it easier to create // screenshots for the User's Guide. // Vertical line. Lower and upper half for the start and end of the // conversation respectively, solid for conversation member, dashed // for other packets in the start-end range. if (setup_frame > 0 && last_frame > 0 && setup_frame != last_frame) { if (fd->num == setup_frame) { QPoint start_line[] = { QPoint(en_w - 1, height / 2), QPoint(0, height / 2), QPoint(0, height) }; painter->drawPolyline(start_line, 3); } else if (fd->num > setup_frame && fd->num < last_frame) { painter->save(); if (conv_ != record->conversation()) { QPen other_pen(line_pen); other_pen.setStyle(Qt::DashLine); painter->setPen(other_pen); } painter->drawLine(0, 0, 0, height); painter->restore(); } else if (fd->num == last_frame) { QPoint end_line[] = { QPoint(en_w - 1, height / 2), QPoint(0, height / 2), QPoint(0, 0) }; painter->drawPolyline(end_line, 3); } } // Related packet indicator. Rightward arrow for requests, leftward // arrow for responses, circle for others. // XXX These are comically oversized when we have multi-line rows. if (related_frames_.contains(fd->num)) { painter->setBrush(fg); switch (related_frames_[fd->num]) { // Request and response arrows are moved forward one pixel in order to // maximize white space between the heads and the conversation line. case FT_FRAMENUM_REQUEST: { int hh = height / 2; QPoint tail(2 - en_w, hh); QPoint head(en_w, hh); drawArrow(painter, tail, head, hh / 2); break; } case FT_FRAMENUM_RESPONSE: { int hh = height / 2; QPoint tail(en_w - 1, hh); QPoint head(1 - en_w, hh); drawArrow(painter, tail, head, hh / 2); break; } case FT_FRAMENUM_ACK: { QRect bbox (2 - en_w, height / 3, em_w - 2, height / 2); drawCheckMark(painter, bbox); break; } case FT_FRAMENUM_DUP_ACK: { QRect bbox (2 - en_w, (height / 3) - (line_w * 2), em_w - 2, height / 2); drawCheckMark(painter, bbox); bbox.moveTop(bbox.top() + (line_w * 3)); drawCheckMark(painter, bbox); break; } case FT_FRAMENUM_NONE: default: painter->drawEllipse(QPointF(0.0, option_vi.rect.height() / 2), 2, 2); } } painter->restore(); }
void FreshStyle::drawPopupMenuItem( QPainter* p, bool checkable, int maxpmw, int tab, QMenuItem* mi, const QPalette& pal, bool act, bool enabled, int x, int y, int w, int h) { #ifndef QT_NO_MENUDATA const QColorGroup & g = pal.active(); bool dis = !enabled; QColorGroup itemg = dis ? pal.disabled() : pal.active(); if ( checkable ) maxpmw = QMAX( maxpmw, 8 ); // space for the checkmarks int checkcol = maxpmw; if ( mi && mi->isSeparator() ) { // draw separator p->setPen( g.dark() ); p->drawLine( x, y, x+w, y ); p->setPen( g.light() ); p->drawLine( x, y+1, x+w, y+1 ); return; } QBrush fill = act? g.brush( QColorGroup::Highlight ) : g.brush( QColorGroup::Button ); p->fillRect( x, y, w, h, fill); if ( !mi ) return; if ( mi->isChecked() ) { if ( act && !dis ) { qDrawShadePanel( p, x, y, checkcol, h, g, TRUE, 1, &g.brush( QColorGroup::Button ) ); } else { qDrawShadePanel( p, x, y, checkcol, h, g, TRUE, 1, &g.brush( QColorGroup::Midlight ) ); } } else if ( !act ) { p->fillRect(x, y, checkcol , h, g.brush( QColorGroup::Button )); } if ( mi->iconSet() ) { // draw iconset QIconSet::Mode mode = dis ? QIconSet::Disabled : QIconSet::Normal; if (act && !dis ) mode = QIconSet::Active; QPixmap pixmap; if ( mode == QIconSet::Disabled ) pixmap = mi->iconSet()->pixmap( QIconSet::Automatic, mode ); else pixmap = mi->iconSet()->pixmap(); int pixw = pixmap.width(); int pixh = pixmap.height(); if ( act && !dis ) { if ( !mi->isChecked() ) qDrawShadePanel( p, x, y, checkcol, h, g, FALSE, 1, &g.brush( QColorGroup::Button ) ); } QRect cr( x, y, checkcol, h ); QRect pmr( 0, 0, pixw, pixh ); pmr.moveCenter( cr.center() ); p->setPen( itemg.text() ); p->drawPixmap( pmr.topLeft(), pixmap ); QBrush fill = act? g.brush( QColorGroup::Highlight ) : g.brush( QColorGroup::Button ); p->fillRect( x+checkcol + 1, y, w - checkcol - 1, h, fill); } else if ( checkable ) { // just "checking"... int mw = checkcol + motifItemFrame; int mh = h - 2*motifItemFrame; if ( mi->isChecked() ) { drawCheckMark( p, x + motifItemFrame + 2, y+motifItemFrame, mw, mh, itemg, act, dis ); } } p->setPen( act ? g.highlightedText() : g.buttonText() ); QColor discol; if ( dis ) { discol = itemg.text(); p->setPen( discol ); } int xm = motifItemFrame + checkcol + motifItemHMargin; if ( mi->custom() ) { int m = motifItemVMargin; p->save(); if ( dis && !act ) { p->setPen( g.light() ); mi->custom()->paint( p, itemg, act, enabled, x+xm+1, y+m+1, w-xm-tab+1, h-2*m ); p->setPen( discol ); } mi->custom()->paint( p, itemg, act, enabled, x+xm, y+m, w-xm-tab+1, h-2*m ); p->restore(); } QString s = mi->text(); if ( !s.isNull() ) { // draw text int t = s.find( '\t' ); int m = motifItemVMargin; const int text_flags = AlignVCenter|ShowPrefix | DontClip | SingleLine; if ( t >= 0 ) { // draw tab text if ( dis && !act ) { p->setPen( g.light() ); p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame+1, y+m+1, tab, h-2*m, text_flags, s.mid( t+1 )); p->setPen( discol ); } p->drawText( x+w-tab-windowsRightBorder-motifItemHMargin-motifItemFrame, y+m, tab, h-2*m, text_flags, s.mid( t+1 ) ); } if ( dis && !act ) { p->setPen( g.light() ); p->drawText( x+xm+1, y+m+1, w-xm+1, h-2*m, text_flags, s, t ); p->setPen( discol ); } p->drawText( x+xm, y+m, w-xm-tab+1, h-2*m, text_flags, s, t ); } else if ( mi->pixmap() ) { // draw pixmap QPixmap *pixmap = mi->pixmap(); if ( pixmap->depth() == 1 ) p->setBackgroundMode( OpaqueMode ); p->drawPixmap( x+xm, y+motifItemFrame, *pixmap ); if ( pixmap->depth() == 1 ) p->setBackgroundMode( TransparentMode ); } if ( mi->popup() ) { // draw sub menu arrow int dim = (h-2*motifItemFrame) / 2; if ( act ) { if ( !dis ) discol = white; QColorGroup g2( discol, g.highlight(), white, white, dis ? discol : white, discol, white ); drawArrow( p, RightArrow, FALSE, x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2, dim, dim, g2, TRUE ); } else { drawArrow( p, RightArrow, FALSE, x+w - motifArrowHMargin - motifItemFrame - dim, y+h/2-dim/2, dim, dim, g, mi->isEnabled() ); } } #endif }