1 /***************************************************************************
2 * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
4 * Based on the Itemviews NG project from Trolltech Labs: *
5 * http://qt.gitorious.org/qt-labs/itemviews-ng *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
21 ***************************************************************************/
23 #include "kitemlistwidget.h"
25 #include "kitemlistview.h"
26 #include "kitemmodelbase.h"
31 #include <QPropertyAnimation>
34 KItemListWidget::KItemListWidget(QGraphicsItem
* parent
) :
35 QGraphicsWidget(parent
, 0),
39 m_visibleRolesSizes(),
47 KItemListWidget::~KItemListWidget()
52 void KItemListWidget::setIndex(int index
)
54 if (m_index
!= index
) {
55 if (m_hoverAnimation
) {
56 m_hoverAnimation
->stop();
65 int KItemListWidget::index() const
70 void KItemListWidget::setData(const QHash
<QByteArray
, QVariant
>& data
,
71 const QSet
<QByteArray
>& roles
)
74 if (roles
.isEmpty()) {
78 foreach (const QByteArray
& role
, roles
) {
79 m_data
[role
] = data
[role
];
81 dataChanged(m_data
, roles
);
85 QHash
<QByteArray
, QVariant
> KItemListWidget::data() const
90 void KItemListWidget::paint(QPainter
* painter
, const QStyleOptionGraphicsItem
* option
, QWidget
* widget
)
93 if (m_hoverOpacity
<= 0.0) {
97 const QRect hoverBounds
= hoverBoundingRect().toRect();
99 m_hoverCache
= new QPixmap(hoverBounds
.size());
100 m_hoverCache
->fill(Qt::transparent
);
102 QPainter
pixmapPainter(m_hoverCache
);
104 QStyleOptionViewItemV4 viewItemOption
;
105 viewItemOption
.initFrom(widget
);
106 viewItemOption
.rect
= QRect(0, 0, hoverBounds
.width(), hoverBounds
.height());
107 viewItemOption
.state
= QStyle::State_Enabled
| QStyle::State_MouseOver
;
108 viewItemOption
.viewItemPosition
= QStyleOptionViewItemV4::OnlyOne
;
110 widget
->style()->drawPrimitive(QStyle::PE_PanelItemViewItem
, &viewItemOption
, &pixmapPainter
, widget
);
113 const qreal opacity
= painter
->opacity();
114 painter
->setOpacity(m_hoverOpacity
* opacity
);
115 painter
->drawPixmap(hoverBounds
.topLeft(), *m_hoverCache
);
116 painter
->setOpacity(opacity
);
119 void KItemListWidget::setVisibleRoles(const QHash
<QByteArray
, int>& roles
)
121 const QHash
<QByteArray
, int> previousRoles
= m_visibleRoles
;
122 m_visibleRoles
= roles
;
123 visibleRolesChanged(roles
, previousRoles
);
126 QHash
<QByteArray
, int> KItemListWidget::visibleRoles() const
128 return m_visibleRoles
;
131 void KItemListWidget::setVisibleRolesSizes(const QHash
<QByteArray
, QSizeF
> rolesSizes
)
133 const QHash
<QByteArray
, QSizeF
> previousRolesSizes
= m_visibleRolesSizes
;
134 m_visibleRolesSizes
= rolesSizes
;
135 visibleRolesSizesChanged(rolesSizes
, previousRolesSizes
);
138 QHash
<QByteArray
, QSizeF
> KItemListWidget::visibleRolesSizes() const
140 return m_visibleRolesSizes
;
143 void KItemListWidget::setStyleOption(const KItemListStyleOption
& option
)
145 const KItemListStyleOption previous
= m_styleOption
;
149 const bool wasHovered
= (previous
.state
& QStyle::State_MouseOver
);
150 m_styleOption
= option
;
151 const bool isHovered
= (m_styleOption
.state
& QStyle::State_MouseOver
);
153 if (wasHovered
!= isHovered
) {
154 // The hovering state has been changed. Assure that a fade-animation
155 // is done to the new state.
156 if (!m_hoverAnimation
) {
157 m_hoverAnimation
= new QPropertyAnimation(this, "hoverOpacity", this);
158 m_hoverAnimation
->setDuration(200);
160 m_hoverAnimation
->stop();
162 if (!wasHovered
&& isHovered
) {
163 m_hoverAnimation
->setEndValue(1.0);
165 Q_ASSERT(wasHovered
&& !isHovered
);
166 m_hoverAnimation
->setEndValue(0.0);
169 m_hoverAnimation
->start();
172 m_styleOption
= option
;
175 styleOptionChanged(option
, previous
);
178 const KItemListStyleOption
& KItemListWidget::styleOption() const
180 return m_styleOption
;
183 bool KItemListWidget::contains(const QPointF
& point
) const
185 return hoverBoundingRect().contains(point
) ||
186 expansionToggleRect().contains(point
) ||
187 selectionToggleRect().contains(point
);
190 QRectF
KItemListWidget::hoverBoundingRect() const
192 return QRectF(QPointF(0, 0), size());
195 QRectF
KItemListWidget::selectionToggleRect() const
200 QRectF
KItemListWidget::expansionToggleRect() const
205 void KItemListWidget::dataChanged(const QHash
<QByteArray
, QVariant
>& current
,
206 const QSet
<QByteArray
>& roles
)
213 void KItemListWidget::visibleRolesChanged(const QHash
<QByteArray
, int>& current
,
214 const QHash
<QByteArray
, int>& previous
)
221 void KItemListWidget::visibleRolesSizesChanged(const QHash
<QByteArray
, QSizeF
>& current
,
222 const QHash
<QByteArray
, QSizeF
>& previous
)
229 void KItemListWidget::styleOptionChanged(const KItemListStyleOption
& current
,
230 const KItemListStyleOption
& previous
)
237 void KItemListWidget::resizeEvent(QGraphicsSceneResizeEvent
* event
)
239 QGraphicsWidget::resizeEvent(event
);
243 qreal
KItemListWidget::hoverOpacity() const
245 return m_hoverOpacity
;
248 void KItemListWidget::setHoverOpacity(qreal opacity
)
250 m_hoverOpacity
= opacity
;
254 void KItemListWidget::clearCache()
260 #include "kitemlistwidget.moc"