2
* Copyright 2009 by Marco Martin <notmart@gmail.com>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU Library General Public License version 2,
7
* or (at your option) any later version.
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details
14
* You should have received a copy of the GNU Library General Public
15
* License along with this program; if not, write to the
16
* Free Software Foundation, Inc.,
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
#include "itemcontainer.h"
22
#include "resultwidget.h"
24
#include <QGraphicsSceneResizeEvent>
25
#include <QGraphicsScene>
29
ItemView::ItemView(QGraphicsWidget *parent)
30
: Plasma::ScrollWidget(parent)
32
setFocusPolicy(Qt::StrongFocus);
33
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
34
m_itemContainer = new ItemContainer(this);
35
setAlignment(Qt::AlignCenter);
36
setWidget(m_itemContainer);
37
m_noActivateTimer = new QTimer(this);
38
m_noActivateTimer->setSingleShot(true);
39
m_itemContainer->installEventFilter(this);
41
connect(m_itemContainer, SIGNAL(itemSelected(ResultWidget *)), this, SIGNAL(itemSelected(ResultWidget *)));
42
connect(m_itemContainer, SIGNAL(itemActivated(const QModelIndex &)), this, SIGNAL(itemActivated(const QModelIndex &)));
43
connect(m_itemContainer, SIGNAL(resetRequested()), this, SIGNAL(resetRequested()));
44
connect(m_itemContainer, SIGNAL(itemSelected(ResultWidget *)), this, SLOT(selectItem(ResultWidget *)));
45
connect(m_itemContainer, SIGNAL(itemAskedReorder(const QModelIndex &, const QPointF &)), this, SIGNAL(itemAskedReorder(const QModelIndex &, const QPointF &)));
46
connect(m_itemContainer, SIGNAL(dragStartRequested(const QModelIndex &)), this, SIGNAL(dragStartRequested(const QModelIndex&)));
48
connect(m_itemContainer, SIGNAL(addActionTriggered(const QModelIndex &)), this, SIGNAL(addActionTriggered(const QModelIndex &)));
54
void ItemView::selectItem(ResultWidget *icon)
56
if (!m_noActivateTimer->isActive()) {
57
ensureItemVisible(icon);
61
void ItemView::setCurrentItem(ResultWidget *currentIcon)
63
m_itemContainer->setCurrentItem(currentIcon);
66
ResultWidget *ItemView::currentItem() const
68
return m_itemContainer->currentItem();
71
void ItemView::focusInEvent(QFocusEvent *event)
73
m_itemContainer->setFocus();
74
Plasma::ScrollWidget::focusInEvent(event);
78
void ItemView::setOrientation(Qt::Orientation orientation)
80
m_itemContainer->setOrientation(orientation);
83
Qt::Orientation ItemView::orientation() const
85
return m_itemContainer->orientation();
88
void ItemView::setIconSize(int size)
90
m_itemContainer->setIconSize(size);
93
QList<ResultWidget *> ItemView::items() const
95
return m_itemContainer->items();
98
int ItemView::iconSize() const
100
return m_itemContainer->iconSize();
103
void ItemView::setDragAndDropMode(ItemContainer::DragAndDropMode mode)
105
m_itemContainer->setDragAndDropMode(mode);
108
ItemContainer::DragAndDropMode ItemView::dragAndDropMode() const
110
return m_itemContainer->dragAndDropMode();
113
void ItemView::setScrollPositionFromDragPosition(const QPointF &point)
115
const qreal xRatio = point.x() / size().width();
116
const qreal yRatio = point.y() / size().height();
118
QPointF newPos(scrollPosition());
120
if (size().width() < contentsSize().width()) {
121
qreal newXPos = xRatio * (size().width() - contentsSize().width());
122
newPos.setX(qBound(qreal(0.0), -newXPos, contentsSize().width() - viewportGeometry().width()));
124
if (size().height() < contentsSize().height()) {
125
newPos.setY(-(yRatio * (size().height() - contentsSize().height())));
128
setScrollPosition(newPos);
131
void ItemView::resizeEvent(QGraphicsSceneResizeEvent *event)
133
QRectF rect = boundingRect();
134
QPointF newPos(m_itemContainer->pos());
135
if (m_itemContainer->size().width() < rect.size().width()) {
136
newPos.setX(rect.center().x() - m_itemContainer->size().width()/2);
138
newPos.setX(qMin(m_itemContainer->pos().x(), (qreal)0.0));
140
if (m_itemContainer->size().height() < rect.size().height()) {
141
newPos.setY(rect.center().y() - m_itemContainer->size().height()/2);
143
newPos.setY(qMin(m_itemContainer->pos().y(), (qreal)0.0));
145
m_itemContainer->setPos(newPos.toPoint());
146
m_itemContainer->askRelayout();
148
Plasma::ScrollWidget::resizeEvent(event);
151
bool ItemView::eventFilter(QObject *watched, QEvent *event)
153
ResultWidget *icon = qobject_cast<ResultWidget *>(watched);
154
if (icon && event->type() == QEvent::GraphicsSceneHoverEnter) {
156
m_itemContainer->setCurrentItem(icon);
158
} else if (watched == m_itemContainer && event->type() == QEvent::GraphicsSceneResize) {
160
ScrollBarFlags scrollBars = NoScrollBar;
161
if (m_itemContainer->pos().x() < 0 || m_itemContainer->geometry().right() > size().width()) {
162
scrollBars |= HorizontalScrollBar;
164
if (m_itemContainer->pos().y() < 0 || m_itemContainer->geometry().bottom() > size().height()) {
165
scrollBars |= VerticalScrollBar;
167
emit scrollBarsNeededChanged(scrollBars);
168
} else if (watched == m_itemContainer && event->type() == QEvent::GraphicsSceneMove) {
169
m_noActivateTimer->start(300);
170
ScrollBarFlags scrollBars = NoScrollBar;
171
if (m_itemContainer->pos().x() < 0 || m_itemContainer->geometry().right() > size().width()) {
172
scrollBars |= HorizontalScrollBar;
174
if (m_itemContainer->pos().y() < 0 || m_itemContainer->geometry().bottom() > size().height()) {
175
scrollBars |= VerticalScrollBar;
177
emit scrollBarsNeededChanged(scrollBars);
180
return Plasma::ScrollWidget::eventFilter(watched, event);
183
void ItemView::showSpacer(const QPointF &pos)
185
m_itemContainer->showSpacer(pos);
188
void ItemView::setModel(QAbstractItemModel *model)
190
m_itemContainer->setModel(model);
193
QAbstractItemModel *ItemView::model() const
195
return m_itemContainer->model();
198
void ItemView::setRootIndex(QModelIndex index)
200
m_itemContainer->setRootIndex(index);
203
QModelIndex ItemView::rootIndex() const
205
return m_itemContainer->rootIndex();
208
int ItemView::rowForPosition(const QPointF &point)
210
return m_itemContainer->rowForPosition(point);
213
#include <itemview.moc>