Exemplo n.º 1
0
void FadeMetro::paintEvent(QPaintEvent* /*event*/)
{
	QPainter painter(this);

	painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);

	QPainterPath clip;
	clip.addRoundedRect(m_MetroRect, ROUNDED, ROUNDED);
	painter.setClipPath(clip);

	const QPixmap &pixmap = m_Images[m_ImageIndex].pixmap;
	if( !pixmap.isNull() )
	{
		painter.drawPixmap(	m_MetroRect.x() + qRound((m_MetroRect.width()-pixmap.width())*0.5),
							m_MetroRect.y() + qRound((m_MetroRect.height()-pixmap.height())*0.5),
							pixmap );
	}

	painter.setClipping(false);
	
	float brightness = m_Click;
	if(m_Hover > 0)
		brightness += (m_Hover*0.2f);

	QColor color( palette().color(QPalette::Button) );
	if(brightness > 0)
	{
		qreal t = (brightness * BUTTON_BRIGHTESS);
		color.setRedF( qMin(color.redF()+t,1.0) );
		color.setGreenF( qMin(color.greenF()+t,1.0) );
		color.setBlueF( qMin(color.blueF()+t,1.0) );
	}

	float t = sinf(m_Pos);
	const float TRAVEL_45_DEGREES_IN_RADIANS = 0.785398163f;
	float radians = (t * TRAVEL_45_DEGREES_IN_RADIANS);
	float armPenWidth = (BORDER * 2);

	QPointF base(m_MetroRect.x()+m_MetroRect.width()*0.5, m_MetroRect.bottom());

	QColor axisColor(color);
	axisColor.setAlpha(180);
	painter.setPen( QPen(axisColor,HALF_BORDER) );
	painter.drawLine(base.x(), base.y(), base.x(), m_MetroRect.y());

	painter.setPen( QPen(color,BORDER,Qt::SolidLine,Qt::SquareCap,Qt::RoundJoin) );
	painter.setBrush(Qt::NoBrush);
	painter.drawRoundedRect(m_MetroRect, ROUNDED, ROUNDED);	
	
	QPointF tip(base.x() + m_ArmLength*sinf(radians), m_MetroRect.height() - m_ArmLength*cosf(radians));
	painter.setPen( QPen(color,armPenWidth,Qt::SolidLine,Qt::RoundCap) );
	painter.drawLine(base, tip);

	if( !text().isEmpty() )
	{
		int hoverRaise = qRound(m_Hover * BUTTON_RAISE);

		painter.setFont( font() );
		painter.setPen( palette().color(QPalette::ButtonText) );
		painter.drawText(QRect(0,0,width(),m_MetroRect.y()-hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, text());

		if( !m_Label.isEmpty() )
			painter.drawText(QRect(0,m_MetroRect.bottom(),width(),height()-m_MetroRect.bottom()+hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, m_Label);
	}
	else if( !m_Label.isEmpty() )
	{
		int hoverRaise = qRound(m_Hover * BUTTON_RAISE);
		painter.setFont( font() );
		painter.setPen( palette().color(QPalette::ButtonText) );
		painter.drawText(QRect(0,m_MetroRect.bottom(),width(),height()-m_MetroRect.bottom()+hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, m_Label);
	}

	if( m_Paused )
	{
		painter.setOpacity(0.8);
		color = color.lighter(250);
		painter.setPen(color);
		painter.setBrush(BG_COLOR);
		int pauseSize = qRound(0.6 * qMin(m_MetroRect.width(),m_MetroRect.height()));
		QRect pauseRect(	m_MetroRect.x() + qRound((m_MetroRect.width()-pauseSize)*0.5),
							m_MetroRect.y() + qRound((m_MetroRect.height()-pauseSize)*0.5),
							pauseSize,
							pauseSize );
		painter.drawRoundedRect(pauseRect, ROUNDED, ROUNDED);

		int w = qRound(pauseSize * 0.35);
		int h = qRound(pauseSize * 0.7);
		pauseRect.adjust(w, h, -w, -h);
		painter.setPen( QPen(color,pauseSize*0.1,Qt::SolidLine,Qt::RoundCap) );
		painter.drawLine(pauseRect.left(), pauseRect.top(), pauseRect.left(), pauseRect.bottom());
		painter.drawLine(pauseRect.right(), pauseRect.top(), pauseRect.right(), pauseRect.bottom());
	}
}
void FadeFlicker::paintEvent(QPaintEvent* /*event*/)
{
	QPainter painter(this);

	painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);

	QPainterPath clip;
	clip.addRoundedRect(m_FlickerRect, ROUNDED, ROUNDED);
	painter.setClipPath(clip);

	const QPixmap &pixmap = m_Images[m_ImageIndex].pixmap;
	if( !pixmap.isNull() )
	{
		painter.drawPixmap(	m_FlickerRect.x() + qRound((m_FlickerRect.width()-pixmap.width())*0.5),
							m_FlickerRect.y() + qRound((m_FlickerRect.height()-pixmap.height())*0.5),
							pixmap );
	}

	painter.setClipping(false);
	
	float brightness = m_Click;
	if(m_Hover > 0)
		brightness += (m_Hover*0.2f);

	QColor color( palette().color(QPalette::Button) );
	if(brightness > 0)
	{
		qreal t = (brightness * BUTTON_BRIGHTESS);
		color.setRedF( qMin(color.redF()+t,1.0) );
		color.setGreenF( qMin(color.greenF()+t,1.0) );
		color.setBlueF( qMin(color.blueF()+t,1.0) );
	}

	painter.setPen( QPen(color,BORDER,Qt::SolidLine,Qt::SquareCap,Qt::RoundJoin) );
	painter.setBrush(Qt::NoBrush);
	painter.drawRoundedRect(m_FlickerRect, ROUNDED, ROUNDED);

	painter.setClipPath(clip);
	int h = qRound(m_FlickerRect.height() * m_Value);
	painter.fillRect(m_FlickerRect.x(), m_FlickerRect.bottom()-h, m_FlickerRect.width(), h, color);
	painter.setClipping(false);

	if( !text().isEmpty() )
	{
		int hoverRaise = qRound(m_Hover * BUTTON_RAISE);

		painter.setFont( font() );
		painter.setPen( palette().color(QPalette::ButtonText) );
		painter.drawText(QRect(0,0,width(),m_FlickerRect.y()-hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, text());

		if( !m_Label.isEmpty() )
			painter.drawText(QRect(0,m_FlickerRect.bottom(),width(),height()-m_FlickerRect.bottom()+hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, m_Label);
	}
	else if( !m_Label.isEmpty() )
	{
		int hoverRaise = qRound(m_Hover * BUTTON_RAISE);
		painter.setFont( font() );
		painter.setPen( palette().color(QPalette::ButtonText) );
		painter.drawText(QRect(0,m_FlickerRect.bottom(),width(),height()-m_FlickerRect.bottom()+hoverRaise), Qt::AlignCenter|Qt::TextWordWrap|Qt::TextDontClip, m_Label);
	}

	if( m_Paused )
	{
		painter.setOpacity(0.8);
		color = color.lighter(250);
		painter.setPen(color);
		painter.setBrush(BG_COLOR);
		int pauseSize = qRound(0.6 * qMin(m_FlickerRect.width(),m_FlickerRect.height()));
		QRect pauseRect(	m_FlickerRect.x() + qRound((m_FlickerRect.width()-pauseSize)*0.5),
							m_FlickerRect.y() + qRound((m_FlickerRect.height()-pauseSize)*0.5),
							pauseSize,
							pauseSize );
		painter.drawRoundedRect(pauseRect, ROUNDED, ROUNDED);

		int pw = qRound(pauseSize * 0.35);
		int ph = qRound(pauseSize * 0.7);
		pauseRect.adjust(pw, ph, -pw, -ph);
		painter.setPen( QPen(color,pauseSize*0.1,Qt::SolidLine,Qt::RoundCap) );
		painter.drawLine(pauseRect.left(), pauseRect.top(), pauseRect.left(), pauseRect.bottom());
		painter.drawLine(pauseRect.right(), pauseRect.top(), pauseRect.right(), pauseRect.bottom());
	}
}