1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "detailswidget.h"
35 #include "detailsbutton.h"
37 #include <QtCore/QStack>
38 #include <QtCore/QPropertyAnimation>
40 #include <QtGui/QGridLayout>
41 #include <QtGui/QLabel>
42 #include <QtGui/QPainter>
43 #include <QtGui/QScrollArea>
44 #include <QtGui/QApplication>
48 static const int MARGIN=8;
50 // This widget is using a grid layout and places the items
51 // in the following way:
53 // +------------+-------------------------+---------------+
54 // +summaryLabel| toolwidget | detailsButton |
55 // +------------+-------------------------+---------------+
57 // +------------+-------------------------+---------------+
59 struct DetailsWidgetPrivate {
60 DetailsWidgetPrivate();
62 DetailsButton *m_detailsButton;
64 QLabel *m_summaryLabel;
65 Utils::FadingPanel *m_toolWidget;
68 QPixmap m_collapsedPixmap;
69 QPixmap m_expandedPixmap;
71 DetailsWidget::State m_state;
75 DetailsWidgetPrivate::DetailsWidgetPrivate() :
76 m_detailsButton(new DetailsButton),
77 m_grid(new QGridLayout),
78 m_summaryLabel(new QLabel),
81 m_state(DetailsWidget::Collapsed),
86 DetailsWidget::DetailsWidget(QWidget *parent) :
88 d(new DetailsWidgetPrivate)
90 d->m_summaryLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
91 d->m_summaryLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
92 d->m_summaryLabel->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN);
94 d->m_grid->setContentsMargins(0, 0, 0, 0);
95 d->m_grid->setSpacing(0);
96 d->m_grid->addWidget(d->m_summaryLabel, 0, 0);
97 d->m_grid->addWidget(d->m_detailsButton, 0, 2);
100 connect(d->m_detailsButton, SIGNAL(toggled(bool)),
101 this, SLOT(setExpanded(bool)));
105 DetailsWidget::~DetailsWidget()
110 void DetailsWidget::paintEvent(QPaintEvent *paintEvent)
112 QWidget::paintEvent(paintEvent);
116 QPoint topLeft(d->m_summaryLabel->geometry().left(), contentsRect().top());
117 const QRect paintArea(topLeft, contentsRect().bottomRight());
119 if (d->m_state != Expanded) {
120 if (d->m_collapsedPixmap.isNull() ||
121 d->m_collapsedPixmap.size() != size())
122 d->m_collapsedPixmap = cacheBackground(paintArea.size(), false);
123 p.drawPixmap(paintArea, d->m_collapsedPixmap);
125 if (d->m_expandedPixmap.isNull() ||
126 d->m_expandedPixmap.size() != size())
127 d->m_expandedPixmap = cacheBackground(paintArea.size(), true);
128 p.drawPixmap(paintArea, d->m_expandedPixmap);
132 void DetailsWidget::enterEvent(QEvent * event)
134 QWidget::enterEvent(event);
135 changeHoverState(true);
138 void DetailsWidget::leaveEvent(QEvent * event)
140 QWidget::leaveEvent(event);
141 changeHoverState(false);
144 void DetailsWidget::setSummaryText(const QString &text)
146 d->m_summaryLabel->setText(text);
149 QString DetailsWidget::summaryText() const
151 return d->m_summaryLabel->text();
154 DetailsWidget::State DetailsWidget::state() const
159 void DetailsWidget::setState(State state)
161 if (state == d->m_state)
167 void DetailsWidget::setExpanded(bool expanded)
169 setState(expanded ? Expanded : Collapsed);
172 void DetailsWidget::updateControls()
175 d->m_widget->setVisible(d->m_state == Expanded || d->m_state == NoSummary);
176 d->m_detailsButton->setChecked(d->m_state == Expanded && d->m_widget);
177 //d->m_summaryLabel->setEnabled(d->m_state == Collapsed && d->m_widget);
178 d->m_detailsButton->setVisible(d->m_state != NoSummary);
179 d->m_summaryLabel->setVisible(d->m_state != NoSummary);
184 w->layout()->activate();
185 if (QScrollArea *area = qobject_cast<QScrollArea*>(w)) {
186 QEvent e(QEvent::LayoutRequest);
187 QCoreApplication::sendEvent(area, &e);
189 w = w->parentWidget();
194 QWidget *DetailsWidget::widget() const
199 void DetailsWidget::setWidget(QWidget *widget)
201 if (d->m_widget == widget)
205 d->m_grid->removeWidget(d->m_widget);
209 d->m_widget = widget;
212 d->m_widget->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN);
213 d->m_grid->addWidget(d->m_widget, 1, 0, 1, 3);
218 void DetailsWidget::setToolWidget(Utils::FadingPanel *widget)
220 if (d->m_toolWidget == widget)
223 d->m_toolWidget = widget;
225 if (!d->m_toolWidget)
228 d->m_toolWidget->adjustSize();
229 d->m_grid->addWidget(d->m_toolWidget, 0, 1, 1, 1, Qt::AlignRight);
232 d->m_toolWidget->setOpacity(1.0);
234 changeHoverState(d->m_hovered);
237 QWidget *DetailsWidget::toolWidget() const
239 return d->m_toolWidget;
242 QPixmap DetailsWidget::cacheBackground(const QSize &size, bool expanded)
244 QPixmap pixmap(size);
245 pixmap.fill(Qt::transparent);
248 QRect topRect(0, 0, size.width(), d->m_summaryLabel->height());
249 QRect fullRect(0, 0, size.width(), size.height());
250 p.fillRect(fullRect, QColor(255, 255, 255, 40));
252 QColor highlight = palette().highlight().color();
253 highlight.setAlpha(0.5);
255 p.fillRect(topRect, highlight);
258 QLinearGradient lg(topRect.topLeft(), topRect.bottomLeft());
259 lg.setColorAt(0, QColor(255, 255, 255, 130));
260 lg.setColorAt(1, QColor(255, 255, 255, 0));
261 p.fillRect(topRect, lg);
262 p.setRenderHint(QPainter::Antialiasing, true);
263 p.translate(0.5, 0.5);
264 p.setPen(QColor(0, 0, 0, 40));
265 p.setBrush(Qt::NoBrush);
266 p.drawRoundedRect(fullRect.adjusted(0, 0, -1, -1), 2, 2);
267 p.setBrush(Qt::NoBrush);
268 p.setPen(QColor(255,255,255,140));
269 p.drawRoundedRect(fullRect.adjusted(1, 1, -2, -2), 2, 2);
270 p.setPen(QPen(palette().color(QPalette::Mid)));
275 void DetailsWidget::changeHoverState(bool hovered)
277 if (!d->m_toolWidget)
280 d->m_toolWidget->setVisible(hovered);
282 d->m_toolWidget->fadeTo(hovered ? 1.0 : 0);
284 d->m_hovered = hovered;