void DX11Widget::paintEvent(QPaintEvent */*e*/) { D_D(DX11Widget); int glowRadius = d->m_ShadowWidth; int radius = d->m_Radius; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); QRect rect = this->rect().marginsRemoved(QMargins(glowRadius, glowRadius, glowRadius, glowRadius)); if (! d->m_Background.isNull()) { painter.drawPixmap(rect, d->m_Background); } else { QPoint topLeft(rect.x(), rect.y()); QPoint bottomRight(rect.x() + rect.width(), rect.y() + rect.height()); QPainterPath border; border.addRoundedRect(rect, radius, radius); QLinearGradient linearGradient(topLeft, QPoint(topLeft.x(), bottomRight.y())); linearGradient.setColorAt(0.0, BackgroundTopColor); linearGradient.setColorAt(0.2, BackgroundBottonColor); linearGradient.setColorAt(1.0, BackgroundBottonColor); QPen borderPen(BorderColor); painter.setBrush(QBrush(linearGradient)); painter.strokePath(border, borderPen); painter.fillPath(border, palette().background()); } }
QPixmap StylePainterMobile::findLineEdit(const QSize & size, bool focused) const { QPixmap result; KeyIdentifier id; id.type = KeyIdentifier::LineEdit; id.width = size.width(); id.height = size.height(); id.trait1 = focused; if (!findCachedControl(id, &result)) { const int focusFrame = painterScale(painter); result = QPixmap(size + QSize(2 * focusFrame, 2 * focusFrame)); result.fill(Qt::transparent); const QRect rect = result.rect().adjusted(focusFrame, focusFrame, -focusFrame, -focusFrame); QPainter cachePainter(&result); drawControlBackground(&cachePainter, borderPen(painter), rect, Qt::white); if (focused) { QPen focusPen(highlightColor, focusFrame, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); drawControlBackground(&cachePainter, focusPen, rect, Qt::NoBrush); } insertIntoCache(id, result); } return result; }
bool RenderThemeQtMobile::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& r) { StylePainterMobile p(this, i); if (!p.isValid()) return true; ControlPart appearance = o->style()->appearance(); if (appearance != TextFieldPart && appearance != SearchFieldPart && appearance != TextAreaPart) return true; // Now paint the text field. if (appearance == TextAreaPart) { const bool previousAntialiasing = p.painter->testRenderHint(QPainter::Antialiasing); p.painter->setRenderHint(QPainter::Antialiasing); p.painter->setPen(borderPen()); p.painter->setBrush(Qt::white); const int radius = checkBoxWidth * radiusFactor; p.painter->drawRoundedRect(r, radius, radius); if (isFocused(o)) { QPen focusPen(highlightColor, 1.0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); p.painter->setPen(focusPen); p.painter->setBrush(Qt::NoBrush); p.painter->drawRoundedRect(r, radius, radius); } p.painter->setRenderHint(QPainter::Antialiasing, previousAntialiasing); } else p.drawLineEdit(r, isFocused(o), isEnabled(o)); return false; }
void StylePainterMobile::drawProgress(const QRect& rect, double progress, bool leftToRight, bool animated, bool vertical) const { const int horizontalBorder = (vertical ? rect.width() / 4 : 0); const int verticalBorder = (vertical ? 0 : rect.height() / 4); const QRect targetRect = rect.adjusted(horizontalBorder, verticalBorder, -horizontalBorder, -verticalBorder); QPixmap result; QSize imageSize = sizeForPainterScale(targetRect); if (vertical) qSwap(imageSize.rheight(), imageSize.rwidth()); KeyIdentifier id; id.type = KeyIdentifier::Progress; id.width = imageSize.width(); id.height = imageSize.height(); id.trait1 = animated; id.trait2 = (!animated && !leftToRight); id.trait3 = progress * 100; if (!findCachedControl(id, &result)) { if (imageSize.isNull()) return; result = QPixmap(imageSize); result.fill(Qt::transparent); QPainter painter(&result); painter.setRenderHint(QPainter::Antialiasing); QRect progressRect(QPoint(0, 0), imageSize); qreal radius = radiusFactor * progressRect.height(); painter.setBrush(Qt::NoBrush); painter.setPen(borderPen()); progressRect.adjust(1, 1, -1, -1); painter.drawRoundedRect(progressRect, radius, radius); progressRect.adjust(1, 1, -1, -1); if (animated) { const int right = progressRect.right(); const int startPos = right * (1 - progressBarChunkPercentage) * 2 * fabs(progress - 0.5); progressRect.setWidth(progressBarChunkPercentage * right); progressRect.moveLeft(startPos); } else { progressRect.setWidth(progress * progressRect.width()); if (!leftToRight) progressRect.moveRight(imageSize.width() - 2); } if (progressRect.width() > 0) { QLinearGradient gradient; gradient.setStart(progressRect.bottomLeft()); gradient.setFinalStop(progressRect.topLeft()); gradient.setColorAt(0.0, highlightColor); gradient.setColorAt(1.0, highlightColor.lighter()); painter.setBrush(gradient); painter.setPen(Qt::NoPen); radius = radiusFactor * progressRect.height(); painter.drawRoundedRect(progressRect, radius, radius); } insertIntoCache(id, result); } QTransform transform; transform.rotate(-90); painter->drawPixmap(targetRect, vertical ? result.transformed(transform) : result); }
void StylePainterMobile::drawRadio(QPainter* painter, const QSize& size, bool checked, bool enabled) const { QRect rect(QPoint(0, 0), size); drawCheckableBackground(painter, rect, checked, enabled); const int border = size.width() / 4; rect.adjust(border, border, -border, -border); drawControlBackground(painter, borderPen(), rect, enabled ? Qt::white : Qt::gray); }
void StylePainterMobile::drawCheckableBackground(QPainter* painter, const QRect& rect, bool checked, bool enabled) const { QBrush brush; QColor color = Qt::gray; if (checked && enabled) color = highlightColor; QLinearGradient gradient; gradient.setStart(rect.topLeft()); gradient.setFinalStop(rect.bottomLeft()); gradient.setColorAt(0.0, color); gradient.setColorAt(1.0, color.lighter(130)); brush = gradient; drawControlBackground(painter, borderPen(painter), rect, brush); }
void StylePainterMobile::drawSliderThumb(const QRect & rect, bool pressed) const { QPixmap result; const QSize size = sizeForPainterScale(rect); KeyIdentifier id; id.type = KeyIdentifier::SliderThumb; id.width = size.width(); id.height = size.height(); id.trait1 = pressed; if (!findCachedControl(id, &result)) { if (size.isNull()) return; result = QPixmap(size); result.fill(Qt::transparent); QPainter cachePainter(&result); drawControlBackground(&cachePainter, borderPen(painter), QRect(QPoint(0, 0), size), pressed? Qt::lightGray : buttonGradientBottom); insertIntoCache(id, result); } painter->drawPixmap(rect, result); }
void Cover::paintEvent(QPaintEvent *e) { Q_D(const Cover); auto radius = d->m_radius; QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::HighQualityAntialiasing); QRect windowRect = QWidget::rect(); painter.drawPixmap(0, 0, d->m_Background); QPainterPath border; border.addRoundedRect(windowRect, radius, radius); QPen borderPen(d->m_borderColor, 1); painter.strokePath(border, borderPen); QWidget::paintEvent(e); }
QPixmap StylePainterMobile::findPushButton(const QSize& size, bool sunken, bool enabled) const { QPixmap result; KeyIdentifier id; id.type = KeyIdentifier::PushButton; id.width = size.width(); id.height = size.height(); id.trait1 = sunken; id.trait2 = enabled; if (!findCachedControl(id, &result)) { const qreal dropShadowSize = painterScale(painter); result = QPixmap(size); result.fill(Qt::transparent); const QRect rect = QRect(0, 0, size.width(), size.height() - dropShadowSize); QPainter cachePainter(&result); drawControlBackground(&cachePainter, Qt::NoPen, rect.adjusted(0, dropShadowSize, 0, dropShadowSize), shadowColor); QBrush brush; if (enabled && !sunken) { QLinearGradient linearGradient; linearGradient.setStart(rect.bottomLeft()); linearGradient.setFinalStop(rect.topLeft()); linearGradient.setColorAt(0.0, buttonGradientBottom); linearGradient.setColorAt(1.0, Qt::white); brush = linearGradient; } else if (!enabled) brush = QColor(241, 242, 243); else { // sunken QLinearGradient linearGradient; linearGradient.setStart(rect.bottomLeft()); linearGradient.setFinalStop(rect.topLeft()); linearGradient.setColorAt(0.0, highlightColor); linearGradient.setColorAt(1.0, highlightColor.lighter()); brush = linearGradient; } drawControlBackground(&cachePainter, borderPen(painter), rect, brush); insertIntoCache(id, result); } return result; }
/* * Reimplemented paint from QStyledItemDelegate * Very much a work in progress */ void NodeItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // Save painter state (according to docs.. purpose in this case?) painter->save(); QString itemTitleText = index.data(Qt::DisplayRole).toString(); // QList<QVariant> children = index.data(NodeItem::ChildrenRole).toList(); // QPoint nodePoint = qvariant_cast<QPoint>(index.data(NodeItem::PositionRole)); QPen oriPen = painter->pen(); // for (int child = 0; child < children.size(); ++child) { // painter->drawLine(nodePoint, children.at(child).toPoint()); // } // Draw a rectangle around the item QRect borderRect = option.rect; borderRect.adjust(-BORDER_PADDING, -BORDER_PADDING, BORDER_PADDING, BORDER_PADDING); QColor bgColor = index.data(NodeItem::ColorRole).value<QColor>(); if (!bgColor.isValid()) bgColor.setRgb(255,255,255); QPen borderPen(Qt::darkGreen, BORDER_WIDTH, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); QBrush borderBrush(bgColor); painter->setPen(borderPen); painter->setBrush(borderBrush); painter->drawRoundedRect(borderRect, BORDER_CORNER_ROUNDING, BORDER_CORNER_ROUNDING); // Draw the title text painter->setPen(oriPen); painter->drawText(option.rect, itemTitleText, QTextOption(Qt::AlignCenter)); // Restore painter state (according to docs.. purpose in this case?) painter->restore(); // TODO Lines to other nodes - here or in the view? }
void Canvas::setSceneRect(qreal x, qreal y, qreal w, qreal h) { currentScene->setSceneRect(x, y, w, h); qreal borderWidth = 0.5; QPen borderPen(QBrush(Qt::black), borderWidth); borderPen.setCapStyle(Qt::SquareCap); borderPen.setJoinStyle(Qt::MiterJoin); qreal shadowWidth = 5; QPen shadowPen(QBrush(Qt::lightGray), shadowWidth); shadowPen.setCapStyle(Qt::SquareCap); shadowPen.setJoinStyle(Qt::MiterJoin); QGraphicsItemGroup * group = new QGraphicsItemGroup; QGraphicsLineItem * shadowRight = new QGraphicsLineItem(x + w + (shadowWidth - borderWidth) / 2, y + shadowWidth, x + w + (shadowWidth - borderWidth) / 2, y + h + shadowWidth / 2); shadowRight->setPen(shadowPen); QGraphicsLineItem * shadowBottom = new QGraphicsLineItem(x + shadowWidth, y + h + (shadowWidth - borderWidth) / 2, x + w + shadowWidth / 2, y + h + (shadowWidth - borderWidth) / 2); shadowBottom->setPen(shadowPen); QGraphicsRectItem * rect = new QGraphicsRectItem(x, y, w, h); rect->setPen(borderPen); group->addToGroup(shadowRight); group->addToGroup(shadowBottom); group->addToGroup(rect); currentScene->addItem(group); }
void ColorGridItem::paintEvent(QPaintEvent *) { QPalette pal = this->palette(); QPen borderPen(pal.color(QPalette::WindowText)); QPainter painter(this); painter.save(); painter.setPen(Qt::NoPen); painter.fillRect(0,0,gridWidth, gridWidth, QBrush(Qt::white)); painter.restore(); if(color_ == QColor(Qt::transparent)){ painter.drawPixmap(0,0,backgroundImg); }else{ painter.save(); painter.setBrush(color_); painter.setPen(Qt::NoPen); painter.drawRect(0,0,gridWidth, gridWidth); painter.restore(); } if(hovered_){ painter.setPen(borderPen); painter.drawRect(0, 0, gridWidth-1, gridWidth-1); } }
void AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { AlbumItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) ); if ( !item ) return; QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, QModelIndex() ); qApp->style()->drawControl( QStyle::CE_ItemViewItem, &opt, painter ); painter->save(); painter->setRenderHint( QPainter::Antialiasing ); if ( !( option.state & QStyle::State_Selected ) ) { QRect shadowRect = option.rect.adjusted( 5, 4, -5, -40 ); painter->setPen( QColor( 90, 90, 90 ) ); painter->drawRoundedRect( shadowRect, 0.5, 0.5 ); QPen shadowPen( QColor( 30, 30, 30 ) ); shadowPen.setWidth( 0.4 ); painter->drawLine( shadowRect.bottomLeft() + QPoint( -1, 2 ), shadowRect.bottomRight() + QPoint( 1, 2 ) ); shadowPen.setColor( QColor( 160, 160, 160 ) ); painter->setPen( shadowPen ); painter->drawLine( shadowRect.topLeft() + QPoint( -1, 2 ), shadowRect.bottomLeft() + QPoint( -1, 2 ) ); painter->drawLine( shadowRect.topRight() + QPoint( 2, 2 ), shadowRect.bottomRight() + QPoint( 2, 2 ) ); painter->drawLine( shadowRect.bottomLeft() + QPoint( 0, 3 ), shadowRect.bottomRight() + QPoint( 0, 3 ) ); shadowPen.setColor( QColor( 180, 180, 180 ) ); painter->setPen( shadowPen ); painter->drawLine( shadowRect.topLeft() + QPoint( -2, 3 ), shadowRect.bottomLeft() + QPoint( -2, 1 ) ); painter->drawLine( shadowRect.topRight() + QPoint( 3, 3 ), shadowRect.bottomRight() + QPoint( 3, 1 ) ); painter->drawLine( shadowRect.bottomLeft() + QPoint( 0, 4 ), shadowRect.bottomRight() + QPoint( 0, 4 ) ); } QPixmap cover; if ( !item->album().isNull() ) { cover.loadFromData( item->album()->cover() ); } else if ( !item->artist().isNull() ) { cover.loadFromData( item->artist()->cover() ); } if ( cover.isNull() ) cover = m_defaultCover; QRect r = option.rect.adjusted( 6, 5, -6, -41 ); if ( option.state & QStyle::State_Selected ) { #if defined(Q_WS_MAC) || defined(Q_WS_WIN) painter->save(); painter->setRenderHint( QPainter::Antialiasing ); QPainterPath border; border.addRoundedRect( r.adjusted( -2, -2, 2, 2 ), 3, 3 ); QPen borderPen( QColor( 86, 170, 243 ) ); borderPen.setWidth( 5 ); painter->setPen( borderPen ); painter->drawPath( border ); painter->restore(); #else opt.palette.setColor( QPalette::Text, opt.palette.color( QPalette::HighlightedText ) ); #endif } QPixmap scover; if ( m_cache.contains( cover.cacheKey() ) ) { scover = m_cache.value( cover.cacheKey() ); } else { scover = cover.scaled( r.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ); m_cache.insert( cover.cacheKey(), scover ); } painter->drawPixmap( r, scover ); painter->setPen( opt.palette.color( QPalette::Text ) ); QTextOption to; to.setWrapMode( QTextOption::NoWrap ); QString text; QFont font = opt.font; font.setPixelSize( 11 ); QFont boldFont = font; boldFont.setBold( true ); QRect textRect = option.rect.adjusted( 0, option.rect.height() - 32, 0, -2 ); QString name; if ( !item->album().isNull() ) name = item->album()->name(); else if ( !item->artist().isNull() ) name = item->artist()->name(); painter->setFont( boldFont ); bool oneLiner = false; if ( item->album().isNull() || item->album()->artist().isNull() ) oneLiner = true; else oneLiner = ( textRect.height() / 2 < painter->fontMetrics().boundingRect( item->album()->name() ).height() || textRect.height() / 2 < painter->fontMetrics().boundingRect( item->album()->artist()->name() ).height() ); if ( oneLiner ) { to.setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); text = painter->fontMetrics().elidedText( name, Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); } else { to.setAlignment( Qt::AlignHCenter | Qt::AlignTop ); text = painter->fontMetrics().elidedText( item->album()->name(), Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); // If the user is hovering over an artist rect, draw a background so she knows it's clickable QRect r = textRect; r.setTop( r.bottom() - painter->fontMetrics().height() ); r.adjust( 4, 0, -4, -1 ); if ( m_hoveringOver == index ) { TomahawkUtils::drawQueryBackground( painter, opt.palette, r, 1.1 ); painter->setPen( opt.palette.color( QPalette::HighlightedText ) ); } else { if ( !( option.state & QStyle::State_Selected ) ) #ifdef Q_WS_MAC painter->setPen( opt.palette.color( QPalette::Dark ).darker( 200 ) ); #else painter->setPen( opt.palette.color( QPalette::Dark ) ); #endif } to.setAlignment( Qt::AlignHCenter | Qt::AlignBottom ); text = painter->fontMetrics().elidedText( item->album()->artist()->name(), Qt::ElideRight, textRect.width() - 10 ); painter->drawText( textRect.adjusted( 5, -1, -5, -1 ), text, to ); // Calculate rect of artist on-hover button click area m_artistNameRects[ index ] = r; } painter->restore(); }
void CTTCheckBtnGroup::OnPaint() { CPaintDC dc(this); CRect clientRect; GetClientRect(clientRect); if (clientRect.Width() <= 0 || clientRect.Height() <= 0) return; CMemDC memDC(dc, clientRect); CDC* pDC = &memDC.GetDC(); DrawThemeParentBackground(GetSafeHwnd(), memDC.GetDC().GetSafeHdc(), clientRect); Graphics graphics(pDC->GetSafeHdc()); graphics.SetSmoothingMode(SmoothingModeAntiAlias); graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel); // clear background CRgn bkgndRgn; CRect bkgndRect(clientRect); bkgndRect.left += 1; bkgndRect.top += 1; CreateRectRgnInDevicePoints(pDC, &bkgndRgn, bkgndRect, m_CornerRadius); pDC->SelectClipRgn(&bkgndRgn); pDC->FillSolidRect(&clientRect, RGB(255, 255, 255)); CRgn clientRgn; CreateRectRgnInDevicePoints(pDC, &clientRgn, clientRect); pDC->SelectClipRgn(&clientRgn); // Whole border Gdiplus::Rect borderRect(clientRect.left, clientRect.top, clientRect.Width(), clientRect.Height()); borderRect.Inflate(-1, -1); if (m_Buttons.size() == 0) { COLORREF borderColor = m_ColorMap.GetColor(Normal, Border); DrawRectArea(borderRect, graphics, borderColor, m_CornerRadius, m_BorderPenWidth); } for (int btnId = 0; btnId < m_Buttons.size(); ++btnId) { BtnInfo* pBtnInfo = &m_Buttons[btnId]; CRgn btnRgn; CRect t(pBtnInfo->m_rect); t.right += 1; t.bottom += 1; CreateRectRgnInDevicePoints(pDC, &btnRgn, t); btnRgn.CombineRgn(&btnRgn, &bkgndRgn, RGN_AND); pDC->SelectClipRgn(&btnRgn); ControlState buttonState = GetButtonState(pBtnInfo); // Highlight if (buttonState != Press) pDC->FillSolidRect(pBtnInfo->m_rect, m_ColorMap.GetColor(buttonState, BorderLight)); // Border graphics.SetClip(btnRgn); COLORREF borderColor = m_ColorMap.GetColor(buttonState, Border); DrawRectArea(borderRect, graphics, borderColor, m_CornerRadius, m_BorderPenWidth); graphics.ResetClip(); CRgn offsetRgn1; offsetRgn1.CreateRectRgn(0, 0, 0, 0); offsetRgn1.CopyRgn(&btnRgn); offsetRgn1.OffsetRgn(m_BorderPenWidth + 1, m_BorderPenWidth + 1); CRgn offsetRgn2; offsetRgn2.CreateRectRgn(0, 0, 0, 0); offsetRgn2.CopyRgn(&btnRgn); offsetRgn2.OffsetRgn(-(m_BorderPenWidth + 1), -(m_BorderPenWidth + 1)); CRgn backRgn; backRgn.CreateRectRgn(0, 0, 0, 0); backRgn.CombineRgn(&offsetRgn1, &offsetRgn2, RGN_AND); pDC->SelectClipRgn(&backRgn); if (buttonState != Mouseover) { DrawGradient(pDC, t); /*Draw4ColorsGradientRect(t, *pDC, m_ColorMap.GetColor(buttonState, BackgroundTopGradientStart), m_ColorMap.GetColor(buttonState, BackgroundTopGradientFinish), m_ColorMap.GetColor(buttonState, BackgroundBottomGradientStart), m_ColorMap.GetColor(buttonState, BackgroundBottomGradientFinish), m_CornerRadius, TRUE);*/ } COLORREF textColor = RGB(80,80,80);//COLOR_GRAYTEXT;//COLOR_BTNTEXT; /*if (buttonState == Press) textColor = RGB(0, 122, 224);*/ pDC->SelectClipRgn(&btnRgn); CFont* pFont = GetFont(); int nFormat = DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS; CTTButton::DrawCaptionText(pDC, &pBtnInfo->m_rect, &pBtnInfo->m_rect, pBtnInfo->m_text, nFormat, pFont, textColor); } pDC->SelectClipRgn(&clientRgn); for (int btnId = 1; btnId < m_Buttons.size(); ++btnId) { BtnInfo* pPrevBtnInfo = &m_Buttons[btnId - 1]; BtnInfo* pCurBtnInfo = &m_Buttons[btnId]; ControlState prevBtnState = GetButtonState(pPrevBtnInfo); ControlState curBtnState = GetButtonState(pCurBtnInfo); ControlState state = Normal; if (prevBtnState == Press || curBtnState == Press) state = Press; else if (prevBtnState == Mouseover || curBtnState == Mouseover) state = Mouseover; COLORREF borderColor = m_ColorMap.GetColor(state, Border); CPen borderPen(PS_SOLID, m_BorderPenWidth, borderColor); pDC->SelectObject(borderPen); pDC->MoveTo(pPrevBtnInfo->m_rect.right, pPrevBtnInfo->m_rect.top); pDC->LineTo(pPrevBtnInfo->m_rect.right, pPrevBtnInfo->m_rect.bottom); } }
//This function is called when the item is drawn void CColorBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CClientDC dc(this); // device context for painting CRect rect, ignoreRect; GetClientRect(&rect); //First, fill with background. Don't overwrite the button ignoreRect = rect; ignoreRect.DeflateRect(2, 2); dc.SaveDC(); dc.ExcludeClipRect(&ignoreRect); dc.FillSolidRect(&rect, ::GetSysColor(COLOR_BTNFACE)); //Is in focus? if(::GetFocus() == m_hWnd) { //Draw focus rect two times. This is necessary to make the focus //rect visible when using a high contrast color scheme in windows COLORREF old = dc.SetBkColor(::GetSysColor(COLOR_BTNFACE)); dc.DrawFocusRect(&rect); dc.SetBkColor(::GetSysColor(COLOR_BTNTEXT)); dc.DrawFocusRect(&rect); dc.SetBkColor(old); } dc.RestoreDC(-1); rect.DeflateRect(2, 2); ignoreRect.DeflateRect(1, 1); //Draw selection rect, or background color if no selection { COLORREF rgbBorder = GetSysColor (COLOR_3DDKSHADOW); if(!m_selected) rgbBorder = GetSysColor (COLOR_BTNFACE); CPen borderPen(PS_SOLID, 1, rgbBorder); CPen* pold = dc.SelectObject(&borderPen); dc.MoveTo(rect.TopLeft()); dc.LineTo(rect.right-1, rect.top); dc.LineTo(rect.right-1, rect.bottom-1); dc.LineTo(rect.left, rect.bottom-1); dc.LineTo(rect.left, rect.top); dc.SelectObject(pold); } //Shrink the rect, 1 pixel on all sides. rect.DeflateRect(1,1); //We want to ignore the area inside the border... ignoreRect = rect; ignoreRect.DeflateRect(2, 2); //Draw border UINT uFrameCtrl = DFCS_BUTTONPUSH; //Is button pushed? if ((lpDrawItemStruct->itemState & ODS_SELECTED) == ODS_SELECTED) uFrameCtrl |= DFCS_PUSHED; //Disabled? if ((lpDrawItemStruct->itemState & ODS_DISABLED) == ODS_DISABLED) uFrameCtrl |= DFCS_INACTIVE; //Draw the frame, but ignore the area inside dc.SaveDC(); dc.ExcludeClipRect(&ignoreRect); dc.DrawFrameControl(&rect, DFC_BUTTON, uFrameCtrl); dc.RestoreDC(-1); //Draw color rect.DeflateRect(2,2); dc.FillSolidRect(&rect, m_color); //Draw pattern if disabled if(!IsWindowEnabled()) { COLORREF but = ::GetSysColor(COLOR_BTNFACE); for(int x=rect.left; x<rect.right; x++) for(int y=rect.top; y<rect.bottom; y++) if( (x+y)%2 == 0) dc.SetPixel(x, y, but); } //Draw text // Get caption text CString strCaption; GetWindowText (strCaption); //Any text to draw? if(!strCaption.IsEmpty()) { int oldTextColor = dc.SetTextColor(COLOR_BTNTEXT); // Determine drawing format DWORD dwFormat = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_CENTER; // Determine dimensions of caption CRect rectCaption = rect; //Make push effect by shrinking the rect if ((lpDrawItemStruct->itemState & ODS_SELECTED) == ODS_SELECTED) rectCaption.DeflateRect(0, 0, -2, -2); //Draw text transparent... int oldMode = dc.SetBkMode(TRANSPARENT); //...with the original font CFont* oldFont = dc.SelectObject(GetFont()); BYTE r = GetRValue( m_color ); BYTE g = GetGValue( m_color ); BYTE b = GetBValue( m_color ); COLORREF cTextColor = RGB( Invert(r), Invert(g), Invert(b) ); dc.SetTextColor( cTextColor ); //OK, draw the text... if ((lpDrawItemStruct->itemState & ODS_DISABLED) == ODS_DISABLED) { //Draw like this if disabled. rectCaption.OffsetRect(1, 1); dc.SetTextColor(GetSysColor (COLOR_3DHILIGHT)); dc.DrawText(strCaption, &rectCaption, dwFormat); rectCaption.OffsetRect(-1,-1); dc.SetTextColor(GetSysColor (COLOR_GRAYTEXT)); dc.DrawText(strCaption, &rectCaption, dwFormat); } else dc.DrawText( strCaption, &rectCaption, dwFormat ); //Set some stuff back dc.SelectObject(oldFont); dc.SetBkMode(oldMode); dc.SetTextColor(oldTextColor); } }
void AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { AlbumItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) ); if ( !item ) return; QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, QModelIndex() ); qApp->style()->drawControl( QStyle::CE_ItemViewItem, &opt, painter ); painter->save(); // painter->setRenderHint( QPainter::Antialiasing ); // painter->drawPixmap( option.rect.adjusted( 4, 4, -4, -38 ), m_shadowPixmap ); QPixmap cover = item->cover.isNull() ? m_defaultCover : item->cover; QRect r = option.rect.adjusted( 6, 5, -6, -41 ); if ( option.state & QStyle::State_Selected ) { #if defined(Q_WS_MAC) || defined(Q_WS_WIN) painter->save(); painter->setRenderHint( QPainter::Antialiasing ); QPainterPath border; border.addRoundedRect( r.adjusted( -2, -2, 2, 2 ), 3, 3 ); QPen borderPen( QColor( 86, 170, 243 ) ); borderPen.setWidth( 5 ); painter->setPen( borderPen ); painter->drawPath( border ); painter->restore(); #else opt.palette.setColor( QPalette::Text, opt.palette.color( QPalette::HighlightedText ) ); #endif } QPixmap scover; if ( m_cache.contains( cover.cacheKey() ) ) { scover = m_cache.value( cover.cacheKey() ); } else { scover = cover.scaled( r.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation ); m_cache.insert( cover.cacheKey(), scover ); } painter->drawPixmap( r, scover ); painter->setPen( opt.palette.color( QPalette::Text ) ); QTextOption to; to.setWrapMode( QTextOption::NoWrap ); QString text; QFont font = opt.font; QFont boldFont = opt.font; boldFont.setBold( true ); QRect textRect = option.rect.adjusted( 0, option.rect.height() - 32, 0, -2 ); bool oneLiner = ( textRect.height() / 2 < painter->fontMetrics().boundingRect( item->album()->name() ).height() || textRect.height() / 2 < painter->fontMetrics().boundingRect( item->album()->artist()->name() ).height() ); if ( oneLiner ) { to.setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); text = painter->fontMetrics().elidedText( item->album()->name(), Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); } else { to.setAlignment( Qt::AlignHCenter | Qt::AlignTop ); text = painter->fontMetrics().elidedText( item->album()->name(), Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); painter->setFont( boldFont ); to.setAlignment( Qt::AlignHCenter | Qt::AlignBottom ); text = painter->fontMetrics().elidedText( item->album()->artist()->name(), Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); } painter->restore(); }
void AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { AlbumItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) ); if ( !item ) return; QStyleOptionViewItemV4 opt = option; initStyleOption( &opt, QModelIndex() ); qApp->style()->drawControl( QStyle::CE_ItemViewItem, &opt, painter ); painter->save(); painter->setRenderHint( QPainter::Antialiasing ); /* if ( !( option.state & QStyle::State_Selected ) ) { QRect shadowRect = option.rect.adjusted( 5, 4, -5, -40 ); painter->setPen( QColor( 90, 90, 90 ) ); painter->drawRoundedRect( shadowRect, 0.5, 0.5 ); QPen shadowPen( QColor( 30, 30, 30 ) ); shadowPen.setWidth( 0.4 ); painter->drawLine( shadowRect.bottomLeft() + QPoint( -1, 2 ), shadowRect.bottomRight() + QPoint( 1, 2 ) ); shadowPen.setColor( QColor( 160, 160, 160 ) ); painter->setPen( shadowPen ); painter->drawLine( shadowRect.topLeft() + QPoint( -1, 2 ), shadowRect.bottomLeft() + QPoint( -1, 2 ) ); painter->drawLine( shadowRect.topRight() + QPoint( 2, 2 ), shadowRect.bottomRight() + QPoint( 2, 2 ) ); painter->drawLine( shadowRect.bottomLeft() + QPoint( 0, 3 ), shadowRect.bottomRight() + QPoint( 0, 3 ) ); shadowPen.setColor( QColor( 180, 180, 180 ) ); painter->setPen( shadowPen ); painter->drawLine( shadowRect.topLeft() + QPoint( -2, 3 ), shadowRect.bottomLeft() + QPoint( -2, 1 ) ); painter->drawLine( shadowRect.topRight() + QPoint( 3, 3 ), shadowRect.bottomRight() + QPoint( 3, 1 ) ); painter->drawLine( shadowRect.bottomLeft() + QPoint( 0, 4 ), shadowRect.bottomRight() + QPoint( 0, 4 ) ); }*/ // QRect r = option.rect.adjusted( 6, 5, -6, -41 ); QRect r = option.rect; QString top, bottom; if ( !item->album().isNull() ) { top = item->album()->name(); if ( !item->album()->artist().isNull() ) bottom = item->album()->artist()->name(); } else if ( !item->artist().isNull() ) { top = item->artist()->name(); } else { top = item->query()->track(); bottom = item->query()->artist(); } if ( !m_covers.contains( index ) ) { if ( !item->album().isNull() ) { m_covers.insert( index, QSharedPointer< Tomahawk::PixmapDelegateFader >( new Tomahawk::PixmapDelegateFader( item->album(), r.size(), TomahawkUtils::Grid ) ) ); } else if ( !item->artist().isNull() ) { m_covers.insert( index, QSharedPointer< Tomahawk::PixmapDelegateFader >( new Tomahawk::PixmapDelegateFader( item->artist(), r.size(), TomahawkUtils::Grid ) ) ); } else { m_covers.insert( index, QSharedPointer< Tomahawk::PixmapDelegateFader >( new Tomahawk::PixmapDelegateFader( item->query(), r.size(), TomahawkUtils::Grid ) ) ); } _detail::Closure* closure = NewClosure( m_covers[ index ], SIGNAL( repaintRequest() ), const_cast<AlbumItemDelegate*>(this), SLOT( doUpdateIndex( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); closure->setAutoDelete( false ); } const QPixmap cover = m_covers[ index ]->currentPixmap(); if ( false && option.state & QStyle::State_Selected ) { #if defined(Q_WS_MAC) || defined(Q_WS_WIN) painter->save(); QPainterPath border; border.addRoundedRect( r.adjusted( -2, -2, 2, 2 ), 3, 3 ); QPen borderPen( QColor( 86, 170, 243 ) ); borderPen.setWidth( 5 ); painter->setPen( borderPen ); painter->drawPath( border ); painter->restore(); #else opt.palette.setColor( QPalette::Text, opt.palette.color( QPalette::HighlightedText ) ); #endif } painter->drawPixmap( r, cover.scaled( r.size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ) ); if ( m_hoverIndex == index ) { painter->save(); painter->setPen( QColor( 33, 33, 33 ) ); painter->setBrush( QColor( 33, 33, 33 ) ); painter->setOpacity( 0.5 ); painter->drawRect( r ); painter->restore(); } painter->save(); painter->setPen( QColor( 33, 33, 33 ) ); painter->setBrush( QColor( 33, 33, 33 ) ); painter->setOpacity( 0.5 ); painter->drawRoundedRect( r.adjusted( 4, +r.height() - 36, -4, -4 ), 3, 3 ); painter->restore(); painter->setPen( opt.palette.color( QPalette::HighlightedText ) ); QTextOption to; to.setWrapMode( QTextOption::NoWrap ); QString text; QFont font = opt.font; font.setPixelSize( 10 ); QFont boldFont = font; boldFont.setBold( true ); boldFont.setPixelSize( 14 ); QRect textRect = option.rect.adjusted( 6, option.rect.height() - 36, -4, -6 ); painter->setFont( boldFont ); bool oneLiner = false; if ( bottom.isEmpty() ) oneLiner = true; else oneLiner = ( textRect.height() / 2 < painter->fontMetrics().boundingRect( top ).height() || textRect.height() / 2 < painter->fontMetrics().boundingRect( bottom ).height() ); if ( oneLiner ) { to.setAlignment( Qt::AlignHCenter | Qt::AlignVCenter ); text = painter->fontMetrics().elidedText( top, Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); } else { to.setAlignment( Qt::AlignHCenter | Qt::AlignTop ); text = painter->fontMetrics().elidedText( top, Qt::ElideRight, textRect.width() - 3 ); painter->drawText( textRect, text, to ); painter->setFont( font ); // If the user is hovering over an artist rect, draw a background so she knows it's clickable QRect r = textRect; r.setTop( r.bottom() - painter->fontMetrics().height() ); r.adjust( 4, 0, -4, -1 ); if ( m_hoveringOver == index ) { TomahawkUtils::drawQueryBackground( painter, opt.palette, r, 1.1 ); painter->setPen( opt.palette.color( QPalette::HighlightedText ) ); } else { /* if ( !( option.state & QStyle::State_Selected ) ) #ifdef Q_WS_MAC painter->setPen( opt.palette.color( QPalette::Dark ).darker( 200 ) ); #else painter->setPen( opt.palette.color( QPalette::Dark ) ); #endif*/ } to.setAlignment( Qt::AlignHCenter | Qt::AlignBottom ); text = painter->fontMetrics().elidedText( bottom, Qt::ElideRight, textRect.width() - 10 ); painter->drawText( textRect.adjusted( 5, -1, -5, -1 ), text, to ); // Calculate rect of artist on-hover button click area m_artistNameRects[ index ] = r; } painter->restore(); }
void BookmarksDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(!mViewPtr) return; painter->save(); QColor bkgrColor = QColor(0xAA,0xAA,0xAA); QColor folderColor = QColor(0x33, 0x33, 0x33); QPen borderPen(bkgrColor.darker()); if(!isFolder(index)) { QRadialGradient itemGradient(0.3*(qreal)option.rect.width()+option.rect.left(), -2*(qreal)option.rect.height()+option.rect.top(), 0.8*(qreal)option.rect.width(), 0.3*(qreal)option.rect.width()+option.rect.left(), -2*(qreal)option.rect.height()+option.rect.top()); itemGradient.setColorAt(0.0, Qt::white); itemGradient.setColorAt(1.0, bkgrColor); if(isLast(index)) { QPainterPath endPath; endPath.moveTo(option.rect.topLeft()); endPath.lineTo(option.rect.bottomLeft()-QPoint(0, RADIUS)); endPath.arcTo(option.rect.left(), option.rect.bottom()-2*RADIUS, 2*RADIUS, 2*RADIUS, 180, 90); endPath.lineTo(option.rect.bottomRight()-QPoint(RADIUS, 0)); endPath.arcTo(option.rect.right()-2*RADIUS, option.rect.bottom()-2*RADIUS, 2*RADIUS, 2*RADIUS, 270, 90); endPath.lineTo(option.rect.topRight()); //painter->setBrush( bkgrColor ); painter->setBrush(itemGradient); painter->setPen(borderPen); painter->drawPath(endPath); } else // middle elements { //painter->setBrush( bkgrColor ); painter->setBrush(itemGradient); painter->setPen(Qt::NoPen); painter->drawRect(option.rect); painter->setPen(borderPen); // vertical lines painter->drawLine(option.rect.topLeft(), option.rect.bottomLeft()); painter->drawLine(option.rect.topRight(), option.rect.bottomRight()); // horizontal lines painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight()); } QRectF brect = option.rect; brect.setLeft(brect.left()+SPACER); painter->setFont(option.font); painter->drawText(brect, Qt::AlignVCenter, qVariantValue<QString>(index.data())); } else // doesn't have parent { QRadialGradient itemGradient(0.3*(qreal)option.rect.width()+option.rect.left(), -2*(qreal)option.rect.height()+option.rect.top(), 0.8*(qreal)option.rect.width(), 0.3*(qreal)option.rect.width()+option.rect.left(), -2*(qreal)option.rect.height()+option.rect.top()); itemGradient.setColorAt(0.0, Qt::white); itemGradient.setColorAt(1.0, folderColor); QPainterPath titlePath; if(isExpanded(index)) { titlePath.moveTo(option.rect.bottomLeft()); titlePath.lineTo(option.rect.topLeft()+QPoint(0, RADIUS)); titlePath.arcTo(option.rect.left(), option.rect.top(), 2*RADIUS, 2*RADIUS, 180, -90); titlePath.lineTo(option.rect.topRight()-QPoint(RADIUS, 0)); titlePath.arcTo(option.rect.right()-2*RADIUS, option.rect.top(), 2*RADIUS, 2*RADIUS, 90, -90); titlePath.lineTo(option.rect.bottomRight()); titlePath.closeSubpath(); } else { titlePath.lineTo(option.rect.topLeft()+QPoint(0, RADIUS)); titlePath.arcTo(option.rect.left(), option.rect.top(), 2*RADIUS, 2*RADIUS, 180, -90); titlePath.lineTo(option.rect.topRight()-QPoint(RADIUS, 0)); titlePath.arcTo(option.rect.right()-2*RADIUS, option.rect.top(), 2*RADIUS, 2*RADIUS, 90, -90); titlePath.lineTo(option.rect.bottomRight()-QPoint(0, RADIUS)); titlePath.arcTo(option.rect.right()-2*RADIUS, option.rect.bottom()-2*RADIUS, 2*RADIUS, 2*RADIUS, 0, -90); titlePath.lineTo(option.rect.bottomLeft()+QPoint(RADIUS, 0)); titlePath.arcTo(option.rect.left(), option.rect.bottom()-2*RADIUS, 2*RADIUS, 2*RADIUS, 270, -90); titlePath.closeSubpath(); } painter->setBrush(itemGradient); painter->setPen(borderPen); painter->drawPath(titlePath); QRectF brect = option.rect; brect.setLeft(brect.left()+SPACER); painter->setFont(option.font); painter->drawText(brect, Qt::AlignVCenter, qVariantValue<QString>(index.data())); } //// HIGHLIGHTING SELECTED ITEM //if (option.state & QStyle::State_Selected) //painter->fillRect(option.rect, option.palette.highlight()); painter->restore(); }