• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kde-runtime API Reference
  • KDE Home
  • Contact Us
 

DragAndDrop

  • sources
  • kde-4.14
  • kde-runtime
  • plasma
  • declarativeimports
  • draganddrop
DeclarativeDragArea.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
3  Original author: Gregory Schlomoff <greg@betterinbox.com>
4 
5  Permission is hereby granted, free of charge, to any person obtaining a copy
6  of this software and associated documentation files (the "Software"), to deal
7  in the Software without restriction, including without limitation the rights
8  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  copies of the Software, and to permit persons to whom the Software is
10  furnished to do so, subject to the following conditions:
11 
12  The above copyright notice and this permission notice shall be included in
13  all copies or substantial portions of the Software.
14 
15  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21  THE SOFTWARE.
22 */
23 
24 #include "DeclarativeDragArea.h"
25 #include "DeclarativeMimeData.h"
26 
27 #include <QDrag>
28 #include <QMimeData>
29 #include <QGraphicsSceneMouseEvent>
30 #include <QApplication>
31 #include <QGraphicsScene>
32 #include <QGraphicsView>
33 #include <QDeclarativeContext>
34 
39 DeclarativeDragArea::DeclarativeDragArea(QDeclarativeItem *parent)
40  : QDeclarativeItem(parent),
41  m_delegate(0),
42  m_source(0),
43  m_target(0),
44  m_enabled(true),
45  m_supportedActions(Qt::MoveAction),
46  m_defaultAction(Qt::MoveAction),
47  m_data(new DeclarativeMimeData()) // m_data is owned by us, and we shouldn't pass it to Qt directly as it will automatically delete it after the drag and drop.
48 {
49  m_startDragDistance = QApplication::startDragDistance();
50  setAcceptedMouseButtons(Qt::LeftButton);
51  setFiltersChildEvents(true);
52 }
53 
54 DeclarativeDragArea::~DeclarativeDragArea()
55 {
56  if (m_data) {
57  delete m_data;
58  }
59 }
60 
65 QDeclarativeComponent* DeclarativeDragArea::delegate() const
66 {
67  return m_delegate;
68 }
69 
70 void DeclarativeDragArea::setDelegate(QDeclarativeComponent *delegate)
71 {
72  if (m_delegate != delegate) {
73  m_delegate = delegate;
74  emit delegateChanged();
75  }
76 }
77 void DeclarativeDragArea::resetDelegate()
78 {
79  setDelegate(0);
80 }
81 
86 QDeclarativeItem* DeclarativeDragArea::source() const
87 {
88  return m_source;
89 }
90 
91 void DeclarativeDragArea::setSource(QDeclarativeItem* source)
92 {
93  if (m_source != source) {
94  m_source = source;
95  emit sourceChanged();
96  }
97 }
98 
99 void DeclarativeDragArea::resetSource()
100 {
101  setSource(0);
102 }
103 
104 // target
105 QDeclarativeItem* DeclarativeDragArea::target() const
106 {
107  //TODO: implement me
108  return 0;
109 }
110 
111 // data
112 DeclarativeMimeData* DeclarativeDragArea::mimeData() const
113 {
114  return m_data;
115 }
116 
117 // startDragDistance
118 int DeclarativeDragArea::startDragDistance() const
119 {
120  return m_startDragDistance;
121 }
122 
123 void DeclarativeDragArea::setStartDragDistance(int distance)
124 {
125  if (distance == m_startDragDistance) {
126  return;
127  }
128 
129  m_startDragDistance = distance;
130  emit startDragDistanceChanged();
131 }
132 
133 // delegateImage
134 QVariant DeclarativeDragArea::delegateImage() const
135 {
136  return m_delegateImage;
137 }
138 
139 void DeclarativeDragArea::setDelegateImage(const QVariant &image)
140 {
141  if (image.canConvert<QImage>() && image.value<QImage>() == m_delegateImage) {
142  return;
143  }
144 
145  if (image.canConvert<QImage>()) {
146  m_delegateImage = image.value<QImage>();
147  } else {
148  m_delegateImage = image.value<QIcon>().pixmap(QSize(48, 48)).toImage();
149  }
150 
151  emit delegateImageChanged();
152 }
153 
154 // enabled
155 bool DeclarativeDragArea::isEnabled() const
156 {
157  return m_enabled;
158 }
159 void DeclarativeDragArea::setEnabled(bool enabled)
160 {
161  if (enabled != m_enabled) {
162  m_enabled = enabled;
163  emit enabledChanged();
164  }
165 }
166 
167 // supported actions
168 Qt::DropActions DeclarativeDragArea::supportedActions() const
169 {
170  return m_supportedActions;
171 }
172 void DeclarativeDragArea::setSupportedActions(Qt::DropActions actions)
173 {
174  if (actions != m_supportedActions) {
175  m_supportedActions = actions;
176  emit supportedActionsChanged();
177  }
178 }
179 
180 // default action
181 Qt::DropAction DeclarativeDragArea::defaultAction() const
182 {
183  return m_defaultAction;
184 }
185 void DeclarativeDragArea::setDefaultAction(Qt::DropAction action)
186 {
187  if (action != m_defaultAction) {
188  m_defaultAction = action;
189  emit defaultActionChanged();
190  }
191 }
192 
193 void DeclarativeDragArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
194 {
195  if ( !m_enabled
196  || QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton)).length()
197  < m_startDragDistance) {
198  return;
199  }
200 
201  emit dragStarted();
202 
203  QDrag *drag = new QDrag(event->widget());
204  DeclarativeMimeData* dataCopy = new DeclarativeMimeData(m_data); //Qt will take ownership of this copy and delete it.
205  drag->setMimeData(dataCopy);
206 
207  if (!m_delegateImage.isNull()) {
208  drag->setPixmap(QPixmap::fromImage(m_delegateImage));
209  } else if (m_delegate) {
210  // Render the delegate to a Pixmap
211  QDeclarativeItem* item = qobject_cast<QDeclarativeItem *>(m_delegate->create(m_delegate->creationContext()));
212 
213  QGraphicsScene scene;
214  scene.addItem(item);
215 
216  QPixmap pixmap(scene.sceneRect().width(), scene.sceneRect().height());
217  pixmap.fill(Qt::transparent);
218 
219  QPainter painter(&pixmap);
220  painter.setRenderHint(QPainter::Antialiasing);
221  painter.setRenderHint(QPainter::SmoothPixmapTransform);
222  scene.render(&painter);
223  painter.end();
224  delete item;
225 
226  drag->setPixmap(pixmap);
227  }
228 
229  drag->setHotSpot(QPoint(drag->pixmap().width()/2, drag->pixmap().height()/2)); // TODO: Make a property for that
230 
231  //setCursor(Qt::OpenHandCursor); //TODO? Make a property for the cursor
232 
233  Qt::DropAction action = drag->exec(m_supportedActions, m_defaultAction);
234  emit drop(action);
235 }
236 
237 bool DeclarativeDragArea::sceneEventFilter(QGraphicsItem *item, QEvent *event)
238 {
239  if (!isEnabled()) {
240  return false;
241  }
242 
243  if (event->type() == QEvent::GraphicsSceneMouseMove) {
244  QGraphicsSceneMouseEvent *me = static_cast<QGraphicsSceneMouseEvent *>(event);
245  mouseMoveEvent(me);
246  }
247 
248  return QDeclarativeItem::sceneEventFilter(item, event);
249 }
DeclarativeDragArea::~DeclarativeDragArea
~DeclarativeDragArea()
Definition: DeclarativeDragArea.cpp:54
QVariant::canConvert
bool canConvert(Type t) const
QDrag::setHotSpot
void setHotSpot(const QPoint &hotspot)
QEvent
QEvent::type
Type type() const
DeclarativeDragArea::resetDelegate
void resetDelegate()
Definition: DeclarativeDragArea.cpp:77
QGraphicsScene
QDrag::pixmap
QPixmap pixmap() const
QPixmap::width
int width() const
QPainter::end
bool end()
QGraphicsScene::render
void render(QPainter *painter, const QRectF &target, const QRectF &source, Qt::AspectRatioMode aspectRatioMode)
QPainter::setRenderHint
void setRenderHint(RenderHint hint, bool on)
QPixmap::fill
void fill(const QColor &color)
QDrag::setMimeData
void setMimeData(QMimeData *data)
DeclarativeDragArea::supportedActionsChanged
void supportedActionsChanged()
DeclarativeDragArea::resetSource
void resetSource()
Definition: DeclarativeDragArea.cpp:99
DeclarativeDragArea::delegateImage
QVariant delegateImage() const
DeclarativeDragArea::mimeData
DeclarativeMimeData * mimeData() const
DeclarativeDragArea::source
QDeclarativeItem * source() const
QDrag::setPixmap
void setPixmap(const QPixmap &pixmap)
QGraphicsItem::setFiltersChildEvents
void setFiltersChildEvents(bool enabled)
QGraphicsScene::sceneRect
sceneRect
QGraphicsSceneMouseEvent::screenPos
QPoint screenPos() const
QVariant::value
T value() const
QPixmap::fromImage
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
QGraphicsItem
QGraphicsItem::setAcceptedMouseButtons
void setAcceptedMouseButtons(QFlags< Qt::MouseButton > buttons)
QPoint
QGraphicsSceneEvent::widget
QWidget * widget() const
QImage::isNull
bool isNull() const
QGraphicsItem::scene
QGraphicsScene * scene() const
DeclarativeDragArea::setSource
void setSource(QDeclarativeItem *source)
Definition: DeclarativeDragArea.cpp:91
QObject::event
virtual bool event(QEvent *e)
QDrag::exec
Qt::DropAction exec(QFlags< Qt::DropAction > supportedActions)
DeclarativeDragArea::sourceChanged
void sourceChanged()
DeclarativeDragArea::startDragDistanceChanged
void startDragDistanceChanged()
DeclarativeDragArea::enabledChanged
void enabledChanged()
DeclarativeMimeData.h
QDeclarativeComponent::create
virtual QObject * create(QDeclarativeContext *context)
QGraphicsSceneMouseEvent
DeclarativeDragArea::drop
void drop(int action)
DeclarativeDragArea::defaultAction
Qt::DropAction defaultAction() const
QPainter
QDrag
DeclarativeDragArea::defaultActionChanged
void defaultActionChanged()
QGraphicsItem::sceneEventFilter
virtual bool sceneEventFilter(QGraphicsItem *watched, QEvent *event)
DeclarativeDragArea::setEnabled
void setEnabled(bool enabled)
Definition: DeclarativeDragArea.cpp:159
DeclarativeDragArea::target
QDeclarativeItem * target() const
DeclarativeDragArea::startDragDistance
int startDragDistance() const
QLineF
DeclarativeDragArea::delegateImageChanged
void delegateImageChanged()
QPixmap
QDeclarativeComponent
QSize
QPixmap::height
int height() const
DeclarativeDragArea::delegate
QDeclarativeComponent * delegate() const
DeclarativeDragArea::setSupportedActions
void setSupportedActions(Qt::DropActions actions)
Definition: DeclarativeDragArea.cpp:172
QImage
DeclarativeDragArea.h
DeclarativeMimeData
Definition: DeclarativeMimeData.h:32
DeclarativeDragArea::supportedActions
Qt::DropActions supportedActions() const
DeclarativeDragArea::setDelegate
void setDelegate(QDeclarativeComponent *delegate)
Definition: DeclarativeDragArea.cpp:70
Qt::DropActions
typedef DropActions
DeclarativeDragArea::dragStarted
void dragStarted()
DeclarativeDragArea::DeclarativeDragArea
DeclarativeDragArea(QDeclarativeItem *parent=0)
Definition: DeclarativeDragArea.cpp:39
DeclarativeDragArea::setStartDragDistance
void setStartDragDistance(int distance)
Definition: DeclarativeDragArea.cpp:123
DeclarativeDragArea::enabled
bool enabled
If false no drag operation will be generate.
Definition: DeclarativeDragArea.h:60
QDeclarativeItem
DeclarativeDragArea::isEnabled
bool isEnabled() const
Definition: DeclarativeDragArea.cpp:155
DeclarativeDragArea::mouseMoveEvent
void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Definition: DeclarativeDragArea.cpp:193
QGraphicsScene::addItem
void addItem(QGraphicsItem *item)
DeclarativeDragArea::setDefaultAction
void setDefaultAction(Qt::DropAction action)
Definition: DeclarativeDragArea.cpp:185
DeclarativeDragArea::setDelegateImage
void setDelegateImage(const QVariant &image)
Definition: DeclarativeDragArea.cpp:139
DeclarativeDragArea::delegateChanged
void delegateChanged()
QDeclarativeComponent::creationContext
QDeclarativeContext * creationContext() const
QIcon
DeclarativeDragArea::sceneEventFilter
bool sceneEventFilter(QGraphicsItem *item, QEvent *event)
Definition: DeclarativeDragArea.cpp:237
QApplication::startDragDistance
int startDragDistance()
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:08:31 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

DragAndDrop

Skip menu "DragAndDrop"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List

kde-runtime API Reference

Skip menu "kde-runtime API Reference"
  • KCMShell
  • KNotify
  • Plasma Runtime
  •     PlasmaCore
  •     DragAndDrop
  •     PlasmaComponents
  •     PlasmaExtraComponents
  •     QtExtraComponents

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal