| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-01-26 18:33:46 +01:00
										 |  |  | ** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2012-07-19 12:26:56 +02:00
										 |  |  | ** Contact: http://www.qt-project.org/
 | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** This file may be used under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  | ** License version 2.1 as published by the Free Software Foundation and | 
					
						
							|  |  |  | ** appearing in the file LICENSE.LGPL included in the packaging of this file. | 
					
						
							|  |  |  | ** Please review the following information to ensure the GNU Lesser General | 
					
						
							|  |  |  | ** Public License version 2.1 requirements will be met: | 
					
						
							|  |  |  | ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** rights. These rights are described in the Nokia Qt LGPL Exception | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2011-04-13 08:42:33 +02:00
										 |  |  | ** Other Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, this file may be used in accordance with the terms and | 
					
						
							|  |  |  | ** conditions contained in a signed written agreement between you and Nokia. | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | #include "detailsbutton.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-23 15:53:58 +02:00
										 |  |  | #include <utils/hostosinfo.h>
 | 
					
						
							| 
									
										
										
										
											2010-07-02 16:42:34 +02:00
										 |  |  | #include <utils/stylehelper.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-15 10:42:41 +01:00
										 |  |  | #include <QPropertyAnimation>
 | 
					
						
							|  |  |  | #include <QPaintEvent>
 | 
					
						
							|  |  |  | #include <QPainter>
 | 
					
						
							|  |  |  | #include <QStyleOption>
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:19:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | using namespace Utils; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 15:49:09 +02:00
										 |  |  | FadingWidget::FadingWidget(QWidget *parent) : | 
					
						
							|  |  |  |     FadingPanel(parent), | 
					
						
							|  |  |  |     m_opacityEffect(new QGraphicsOpacityEffect) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_opacityEffect->setOpacity(0); | 
					
						
							|  |  |  |     setGraphicsEffect(m_opacityEffect); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Workaround for issue with QGraphicsEffect. GraphicsEffect
 | 
					
						
							|  |  |  |     // currently clears with Window color. Remove if flickering
 | 
					
						
							|  |  |  |     // no longer occurs on fade-in
 | 
					
						
							|  |  |  |     QPalette pal; | 
					
						
							|  |  |  |     pal.setBrush(QPalette::All, QPalette::Window, Qt::transparent); | 
					
						
							|  |  |  |     setPalette(pal); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FadingWidget::setOpacity(qreal value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_opacityEffect->setOpacity(value); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FadingWidget::fadeTo(qreal value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity"); | 
					
						
							|  |  |  |     animation->setDuration(200); | 
					
						
							|  |  |  |     animation->setEndValue(value); | 
					
						
							|  |  |  |     animation->start(QAbstractAnimation::DeleteWhenStopped); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | qreal FadingWidget::opacity() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return m_opacityEffect->opacity(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent), m_fader(0) | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     setCheckable(true); | 
					
						
							| 
									
										
										
										
											2011-04-12 12:56:09 +02:00
										 |  |  |     setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     setText(tr("Details")); | 
					
						
							| 
									
										
										
										
											2009-09-29 18:06:13 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 17:44:16 +01:00
										 |  |  | QSize DetailsButton::sizeHint() const | 
					
						
							| 
									
										
										
										
											2009-09-29 18:06:13 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     // TODO: Adjust this when icons become available!
 | 
					
						
							| 
									
										
										
										
											2011-07-06 12:57:47 +02:00
										 |  |  |     const int w = fontMetrics().width(text()) + 32; | 
					
						
							| 
									
										
										
										
											2012-08-23 15:53:58 +02:00
										 |  |  |     if (HostOsInfo::isMacHost()) | 
					
						
							|  |  |  |         return QSize(w, 34); | 
					
						
							| 
									
										
										
										
											2011-07-06 12:57:47 +02:00
										 |  |  |     return QSize(w, 22); | 
					
						
							| 
									
										
										
										
											2009-10-01 14:24:44 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | bool DetailsButton::event(QEvent *e) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     switch(e->type()) { | 
					
						
							|  |  |  |     case QEvent::Enter: | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); | 
					
						
							|  |  |  |             animation->setDuration(200); | 
					
						
							|  |  |  |             animation->setEndValue(1.0); | 
					
						
							|  |  |  |             animation->start(QAbstractAnimation::DeleteWhenStopped); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case QEvent::Leave: | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); | 
					
						
							|  |  |  |             animation->setDuration(200); | 
					
						
							|  |  |  |             animation->setEndValue(0.0); | 
					
						
							|  |  |  |             animation->start(QAbstractAnimation::DeleteWhenStopped); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         return QAbstractButton::event(e); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-01 17:44:16 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void DetailsButton::paintEvent(QPaintEvent *e) | 
					
						
							| 
									
										
										
										
											2009-10-01 14:24:44 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     QWidget::paintEvent(e); | 
					
						
							| 
									
										
										
										
											2009-12-01 17:44:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     QPainter p(this); | 
					
						
							| 
									
										
										
										
											2012-08-23 15:53:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     // draw hover animation
 | 
					
						
							| 
									
										
										
										
											2012-08-23 15:53:58 +02:00
										 |  |  |     if (!HostOsInfo::isMacHost() && !isDown() && m_fader > 0) | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |         p.fillRect(rect().adjusted(1, 1, -2, -2), QColor(255, 255, 255, int(m_fader*180))); | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     if (isChecked()) { | 
					
						
							|  |  |  |         if (m_checkedPixmap.isNull() || m_checkedPixmap.size() != contentsRect().size()) | 
					
						
							|  |  |  |             m_checkedPixmap = cacheRendering(contentsRect().size(), true); | 
					
						
							|  |  |  |         p.drawPixmap(contentsRect(), m_checkedPixmap); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         if (m_uncheckedPixmap.isNull() || m_uncheckedPixmap.size() != contentsRect().size()) | 
					
						
							|  |  |  |             m_uncheckedPixmap = cacheRendering(contentsRect().size(), false); | 
					
						
							|  |  |  |         p.drawPixmap(contentsRect(), m_uncheckedPixmap); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (isDown()) { | 
					
						
							|  |  |  |         p.setPen(Qt::NoPen); | 
					
						
							|  |  |  |         p.setBrush(QColor(0, 0, 0, 20)); | 
					
						
							|  |  |  |         p.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 1, 1); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-01 17:44:16 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QPixmap DetailsButton::cacheRendering(const QSize &size, bool checked) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     QLinearGradient lg; | 
					
						
							|  |  |  |     lg.setCoordinateMode(QGradient::ObjectBoundingMode); | 
					
						
							|  |  |  |     lg.setFinalStop(0, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPixmap pixmap(size); | 
					
						
							|  |  |  |     pixmap.fill(Qt::transparent); | 
					
						
							|  |  |  |     QPainter p(&pixmap); | 
					
						
							|  |  |  |     p.setRenderHint(QPainter::Antialiasing, true); | 
					
						
							|  |  |  |     p.translate(0.5, 0.5); | 
					
						
							|  |  |  |     p.setPen(Qt::NoPen); | 
					
						
							| 
									
										
										
										
											2011-09-19 10:02:45 +02:00
										 |  |  |     if (!checked) { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |         lg.setColorAt(0, QColor(0, 0, 0, 10)); | 
					
						
							|  |  |  |         lg.setColorAt(1, QColor(0, 0, 0, 16)); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         lg.setColorAt(0, QColor(255, 255, 255, 0)); | 
					
						
							|  |  |  |         lg.setColorAt(1, QColor(255, 255, 255, 50)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p.setBrush(lg); | 
					
						
							|  |  |  |     p.setPen(QColor(255,255,255,140)); | 
					
						
							|  |  |  |     p.drawRoundedRect(1, 1, size.width()-3, size.height()-3, 1, 1); | 
					
						
							|  |  |  |     p.setPen(QPen(QColor(0, 0, 0, 40))); | 
					
						
							|  |  |  |     p.drawLine(0, 1, 0, size.height() - 2); | 
					
						
							|  |  |  |     if(checked) | 
					
						
							|  |  |  |         p.drawLine(1, size.height() - 1, size.width() - 1, size.height() - 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p.setPen(palette().color(QPalette::Text)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QRect textRect = p.fontMetrics().boundingRect(text()); | 
					
						
							|  |  |  |     textRect.setWidth(textRect.width() + 15); | 
					
						
							| 
									
										
										
										
											2011-07-06 12:57:47 +02:00
										 |  |  |     textRect.setHeight(textRect.height() + 4); | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     textRect.moveCenter(rect().center()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p.drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, text()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int arrowsize = 15; | 
					
						
							|  |  |  |     QStyleOption arrowOpt; | 
					
						
							|  |  |  |     arrowOpt.initFrom(this); | 
					
						
							|  |  |  |     QPalette pal = arrowOpt.palette; | 
					
						
							|  |  |  |     pal.setBrush(QPalette::All, QPalette::Text, QColor(0, 0, 0)); | 
					
						
							|  |  |  |     arrowOpt.rect = QRect(size.width() - arrowsize - 6, height()/2-arrowsize/2, arrowsize, arrowsize); | 
					
						
							|  |  |  |     arrowOpt.palette = pal; | 
					
						
							|  |  |  |     style()->drawPrimitive(checked ? QStyle::PE_IndicatorArrowUp : QStyle::PE_IndicatorArrowDown, &arrowOpt, &p, this); | 
					
						
							|  |  |  |     return pixmap; | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | } |