| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | /**************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-03-05 11:25:49 +01:00
										 |  |  | ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** No Commercial Usage | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** This file contains pre-release code and may not be distributed. | 
					
						
							|  |  |  | ** You may use this file in accordance with the terms and conditions | 
					
						
							|  |  |  | ** contained in the Technology Preview License Agreement accompanying | 
					
						
							|  |  |  | ** this package. | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Alternatively, 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.
 | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-12-17 16:01:08 +01:00
										 |  |  | ** In addition, as a special exception, Nokia gives you certain additional | 
					
						
							|  |  |  | ** rights.  These rights are described in the Nokia Qt LGPL Exception | 
					
						
							|  |  |  | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** If you have questions regarding the use of this file, please contact | 
					
						
							|  |  |  | ** Nokia at qt-info@nokia.com. | 
					
						
							| 
									
										
										
										
											2009-12-07 15:15:55 +01:00
										 |  |  | ** | 
					
						
							|  |  |  | **************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | #include "detailsbutton.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 16:42:34 +02:00
										 |  |  | #include <utils/stylehelper.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-01 17:44:16 +01:00
										 |  |  | #include <QtGui/QPaintEvent>
 | 
					
						
							|  |  |  | #include <QtGui/QPainter>
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:19:46 +01:00
										 |  |  | #include <QtGui/QStyleOption>
 | 
					
						
							| 
									
										
										
										
											2010-07-02 16:42:34 +02:00
										 |  |  | #include <QtGui/QGraphicsOpacityEffect>
 | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | #include <QtCore/QPropertyAnimation>
 | 
					
						
							| 
									
										
										
										
											2010-03-10 19:19:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-17 13:59:10 +02:00
										 |  |  | using namespace Utils; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-02 16:42:34 +02:00
										 |  |  | FadingPanel::FadingPanel(QWidget *parent) : | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     QWidget(parent), | 
					
						
							|  |  |  |     m_opacityEffect(new QGraphicsOpacityEffect) | 
					
						
							| 
									
										
										
										
											2010-05-07 12:26:01 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     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); | 
					
						
							| 
									
										
										
										
											2010-11-16 12:30:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FadingPanel::setOpacity(qreal value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     m_opacityEffect->setOpacity(value); | 
					
						
							| 
									
										
										
										
											2010-05-07 12:26:01 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void FadingPanel::fadeTo(float value) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity"); | 
					
						
							|  |  |  |     animation->setDuration(200); | 
					
						
							|  |  |  |     animation->setEndValue(value); | 
					
						
							|  |  |  |     animation->start(QAbstractAnimation::DeleteWhenStopped); | 
					
						
							| 
									
										
										
										
											2010-05-07 12:26:01 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |     setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); | 
					
						
							|  |  |  |     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!
 | 
					
						
							|  |  |  |     return QSize(80, 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); | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | #ifndef Q_WS_MAC
 | 
					
						
							| 
									
										
										
										
											2010-11-16 12:33:04 +01:00
										 |  |  |     // draw hover animation
 | 
					
						
							|  |  |  |     if(!isDown() && m_fader>0) | 
					
						
							|  |  |  |         p.fillRect(rect().adjusted(1, 1, -2, -2), QColor(255, 255, 255, int(m_fader*180))); | 
					
						
							| 
									
										
										
										
											2010-03-11 10:56:03 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |     if(!checked) { | 
					
						
							|  |  |  |         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); | 
					
						
							|  |  |  |     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
										 |  |  | } |