8 #include "DeclarativeDragArea.h" 9 #include "DeclarativeMimeData.h" 13 #include <QGuiApplication> 15 #include <QMouseEvent> 17 #include <QQuickItemGrabResult> 18 #include <QQuickWindow> 19 #include <QStyleHints> 27 DeclarativeDragArea::DeclarativeDragArea(
QQuickItem *parent)
33 m_draggingJustStarted(false),
38 m_pressAndHoldTimerId(0)
43 setFlag(ItemAcceptsDrops, m_enabled);
44 setFiltersChildMouseEvents(
true);
47 DeclarativeDragArea::~DeclarativeDragArea()
58 QQuickItem* DeclarativeDragArea::delegate()
const 63 void DeclarativeDragArea::setDelegate(
QQuickItem *delegate)
65 if (m_delegate != delegate) {
67 m_delegate = delegate;
71 void DeclarativeDragArea::resetDelegate()
80 QQuickItem* DeclarativeDragArea::source()
const 85 void DeclarativeDragArea::setSource(
QQuickItem* source)
87 if (m_source != source) {
93 void DeclarativeDragArea::resetSource()
98 bool DeclarativeDragArea::dragActive()
const 104 QQuickItem* DeclarativeDragArea::target()
const 117 int DeclarativeDragArea::startDragDistance()
const 119 return m_startDragDistance;
122 void DeclarativeDragArea::setStartDragDistance(
int distance)
124 if (distance == m_startDragDistance) {
128 m_startDragDistance = distance;
129 Q_EMIT startDragDistanceChanged();
133 QVariant DeclarativeDragArea::delegateImage()
const 135 return m_delegateImage;
138 void DeclarativeDragArea::setDelegateImage(
const QVariant &image)
149 m_delegateImage = image.
value<
QIcon>().pixmap(
QSize(48, 48)).toImage();
152 Q_EMIT delegateImageChanged();
156 bool DeclarativeDragArea::isEnabled()
const 160 void DeclarativeDragArea::setEnabled(
bool enabled)
162 if (enabled != m_enabled) {
171 return m_supportedActions;
175 if (actions != m_supportedActions) {
176 m_supportedActions = actions;
177 Q_EMIT supportedActionsChanged();
184 return m_defaultAction;
188 if (action != m_defaultAction) {
189 m_defaultAction = action;
190 Q_EMIT defaultActionChanged();
197 m_buttonDownPos =
event->screenPos();
198 m_draggingJustStarted =
true;
199 setKeepMouseGrab(
true);
202 void DeclarativeDragArea::mouseReleaseEvent(
QMouseEvent* event)
206 m_pressAndHoldTimerId = 0;
207 m_draggingJustStarted =
false;
208 setKeepMouseGrab(
false);
212 void DeclarativeDragArea::timerEvent(
QTimerEvent *event)
214 if (event->
timerId() == m_pressAndHoldTimerId && m_draggingJustStarted && m_enabled) {
221 m_grabResult = m_delegate->grabToImage();
224 startDrag(m_grabResult->image());
225 m_grabResult.reset();
232 startDrag(m_delegateImage);
236 void DeclarativeDragArea::mouseMoveEvent(
QMouseEvent *event)
240 < m_startDragDistance) {
248 m_pressAndHoldTimerId = 0;
252 if (m_draggingJustStarted) {
259 m_grabResult = m_delegate->grabToImage();
262 startDrag(m_grabResult->image());
263 m_grabResult.reset();
270 startDrag(m_delegateImage);
274 bool DeclarativeDragArea::childMouseEventFilter(
QQuickItem *item,
QEvent *event)
280 switch (event->
type()) {
296 mouseReleaseEvent(me);
306 void DeclarativeDragArea::startDrag(
const QImage &image)
309 m_draggingJustStarted =
false;
316 const int imageSize = 48 * devicePixelRatio;
320 }
else if (mimeData()->hasImage()) {
321 const QImage im = qvariant_cast<
QImage>(mimeData()->imageData());
323 }
else if (mimeData()->hasColor()) {
324 QPixmap px(imageSize, imageSize);
325 px.fill(mimeData()->color());
330 if (mimeData()->hasText()) {
331 icons << QStringLiteral(
"text-plain");
333 if (mimeData()->hasHtml()) {
334 icons << QStringLiteral(
"text-html");
336 if (mimeData()->hasUrls()) {
337 for (
int i = 0; i < std::min(4, mimeData()->urls().
size()); ++i) {
338 icons << QStringLiteral(
"text-html");
346 for (
const QString &ic : qAsConst(icons)) {
359 Q_EMIT dragActiveChanged();
363 setKeepMouseGrab(
false);
365 m_dragActive =
false;
366 Q_EMIT dragActiveChanged();
bool canConvert(int targetTypeId) const const
Qt::MouseEventSource source() const const
QEvent::Type type() const const
void fill(const QColor &color)
void setMimeData(QMimeData *data)
int devicePixelRatio() const const
void setPixmap(const QPixmap &pixmap)
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
bool isNull() const const
virtual bool event(QEvent *e)
Qt::DropAction exec(Qt::DropActions supportedActions)
int count(const T &value) const const
QStyleHints * styleHints()
const QPointF & screenPos() const const
bool isEmpty() const const
virtual bool childMouseEventFilter(QQuickItem *item, QEvent *event)
int startTimer(int interval, Qt::TimerType timerType)
MouseEventSynthesizedByQt
int timerId() const const
QIcon fromTheme(const QString &name)
KIOWIDGETS_EXPORT DropJob * drop(const QDropEvent *dropEvent, const QUrl &destUrl, JobFlags flags=DefaultFlags)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
QString toString() const const