source: trunk/examples/graphicsview/padnavigator/roundrectitem.cpp@ 651

Last change on this file since 651 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 5.2 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "roundrectitem.h"
43
44#include <QtGui/QtGui>
45
46RoundRectItem::RoundRectItem(const QRectF &rect, const QBrush &brush, QWidget *embeddedWidget)
47 : QGraphicsRectItem(rect),
48 brush(brush),
49 timeLine(75),
50 lastVal(0),
51 opa(1),
52 proxyWidget(0)
53{
54 connect(&timeLine, SIGNAL(valueChanged(qreal)),
55 this, SLOT(updateValue(qreal)));
56
57 if (embeddedWidget) {
58 proxyWidget = new QGraphicsProxyWidget(this);
59 proxyWidget->setFocusPolicy(Qt::StrongFocus);
60 proxyWidget->setWidget(embeddedWidget);
61 proxyWidget->setGeometry(boundingRect().adjusted(25, 25, -25, -25));
62 }
63}
64
65void RoundRectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
66{
67 QTransform x = painter->worldTransform();
68
69 QLineF unit = x.map(QLineF(0, 0, 1, 1));
70 if (unit.p1().x() > unit.p2().x() || unit.p1().y() > unit.p2().y()) {
71 if (proxyWidget && proxyWidget->isVisible()) {
72 proxyWidget->hide();
73 proxyWidget->setGeometry(rect());
74 }
75 return;
76 }
77
78 if (proxyWidget && !proxyWidget->isVisible()) {
79 proxyWidget->show();
80 proxyWidget->setFocus();
81 }
82 if (proxyWidget && proxyWidget->pos() != QPoint())
83 proxyWidget->setGeometry(boundingRect().adjusted(25, 25, -25, -25));
84
85 painter->setOpacity(opacity());
86 painter->setPen(Qt::NoPen);
87 painter->setBrush(QColor(0, 0, 0, 64));
88 painter->drawRoundRect(rect().translated(2, 2));
89
90 if (!proxyWidget) {
91 QLinearGradient gradient(rect().topLeft(), rect().bottomRight());
92 const QColor col = brush.color();
93 gradient.setColorAt(0, col);
94 gradient.setColorAt(1, col.dark(int(200 + lastVal * 50)));
95 painter->setBrush(gradient);
96 } else {
97 painter->setBrush(brush);
98 }
99
100 painter->setPen(QPen(Qt::black, 1));
101 painter->drawRoundRect(rect());
102 if (!pix.isNull()) {
103 painter->scale(1.95, 1.95);
104 painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);;
105 }
106}
107
108QRectF RoundRectItem::boundingRect() const
109{
110 qreal penW = 0.5;
111 qreal shadowW = 2.0;
112 return rect().adjusted(-penW, -penW, penW + shadowW, penW + shadowW);
113}
114
115void RoundRectItem::setPixmap(const QPixmap &pixmap)
116{
117 pix = pixmap;
118 if (scene() && isVisible())
119 update();
120}
121
122qreal RoundRectItem::opacity() const
123{
124 RoundRectItem *parent = parentItem() ? (RoundRectItem *)parentItem() : 0;
125 return opa + (parent ? parent->opacity() : 0);
126}
127
128void RoundRectItem::setOpacity(qreal opacity)
129{
130 opa = opacity;
131 update();
132}
133
134void RoundRectItem::keyPressEvent(QKeyEvent *event)
135{
136 if (event->isAutoRepeat() || event->key() != Qt::Key_Return
137 || (timeLine.state() == QTimeLine::Running && timeLine.direction() == QTimeLine::Forward)) {
138 QGraphicsRectItem::keyPressEvent(event);
139 return;
140 }
141
142 timeLine.stop();
143 timeLine.setDirection(QTimeLine::Forward);
144 timeLine.start();
145 emit activated();
146}
147
148void RoundRectItem::keyReleaseEvent(QKeyEvent *event)
149{
150 if (event->key() != Qt::Key_Return) {
151 QGraphicsRectItem::keyReleaseEvent(event);
152 return;
153 }
154 timeLine.stop();
155 timeLine.setDirection(QTimeLine::Backward);
156 timeLine.start();
157}
158
159void RoundRectItem::updateValue(qreal value)
160{
161 lastVal = value;
162 if (!proxyWidget)
163 setTransform(QTransform().scale(1 - value / 10.0, 1 - value / 10.0));
164}
Note: See TracBrowser for help on using the repository browser.