File indexing completed on 2024-04-14 05:44:23
0001 /* 0002 * SPDX-FileCopyrightText: 2002-2003 Jesper K. Pedersen <Qt::blackie@kde.org> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-only 0005 **/ 0006 0007 #include "dragaccepter.h" 0008 0009 #include <QMimeData> 0010 #include <QMouseEvent> 0011 #include <QPainter> 0012 0013 #include "concwidget.h" 0014 0015 DragAccepter::DragAccepter(RegExpEditorWindow *editorWindow, RegExpWidget *parent) 0016 : RegExpWidget(editorWindow, parent) 0017 , _drawLine(false) 0018 { 0019 setAcceptDrops(true); 0020 } 0021 0022 QSize DragAccepter::sizeHint() const 0023 { 0024 return QSize(10, 10); 0025 } 0026 0027 void DragAccepter::paintEvent(QPaintEvent *e) 0028 { 0029 QPainter painter(this); 0030 drawPossibleSelection(painter, size()); 0031 0032 if (_drawLine) { 0033 painter.drawLine(0, height() / 2, width(), height() / 2); 0034 } 0035 0036 RegExpWidget::paintEvent(e); 0037 } 0038 0039 void DragAccepter::mousePressEvent(QMouseEvent *event) 0040 { 0041 if (event->button() == Qt::RightButton) { 0042 _editorWindow->showRMBMenu(_editorWindow->hasSelection()); 0043 } else { 0044 RegExpWidget::mousePressEvent(event); 0045 } 0046 } 0047 0048 void DragAccepter::mouseReleaseEvent(QMouseEvent *event) 0049 { 0050 if (_editorWindow->isPasteing() && event->button() == Qt::LeftButton) { 0051 RegExp *regexp = _editorWindow->pasteData(); 0052 0053 RegExpWidget *newElm = WidgetFactory::createWidget(regexp, _editorWindow, nullptr); 0054 if (newElm) { 0055 ConcWidget *elm; 0056 if (!(elm = dynamic_cast<ConcWidget *>(newElm))) { 0057 elm = new ConcWidget(_editorWindow, newElm, nullptr); 0058 } 0059 0060 Q_ASSERT(elm); 0061 0062 RegExpWidget *w = dynamic_cast<RegExpWidget *>(parent()); 0063 if (w) { 0064 w->addNewConcChild(this, elm); 0065 } 0066 _editorWindow->updateContent(this); 0067 _editorWindow->clearSelection(true); 0068 } 0069 } else if (_editorWindow->isInserting() && event->button() == Qt::LeftButton) { 0070 if (WidgetFactory::isContainer(_editorWindow->insertType()) && _editorWindow->pointSelected(mapToGlobal(event->pos()))) { 0071 RegExpWidget::mouseReleaseEvent(event); 0072 } else { 0073 RegExpWidget *child = WidgetFactory::createWidget(_editorWindow, dynamic_cast<QWidget *>(parent()), _editorWindow->insertType()); 0074 if (child) { 0075 RegExpWidget *w = dynamic_cast<RegExpWidget *>(parent()); 0076 if (w) { 0077 w->addNewChild(this, child); 0078 } 0079 _editorWindow->updateContent(child); 0080 child->setFocus(); 0081 _editorWindow->clearSelection(true); 0082 } 0083 } 0084 } 0085 _editorWindow->slotEndActions(); 0086 } 0087 0088 void DragAccepter::dragEnterEvent(QDragEnterEvent *event) 0089 { 0090 bool selfDrag = (event->source() && _isSelected); 0091 if (!selfDrag && event->mimeData()->hasFormat(QStringLiteral("KRegExpEditor/widgetdrag"))) { 0092 event->setDropAction(Qt::MoveAction); 0093 event->accept(); 0094 } 0095 } 0096 0097 void DragAccepter::dropEvent(QDropEvent *event) 0098 { 0099 // The widget will be reparent afterward or part of it will, so no need to give 0100 // it a parent here. 0101 QString name = QString::fromLatin1(event->mimeData()->data(QStringLiteral("KRegExpEditor/widgetdrag"))); 0102 RegExp *regexp = WidgetFactory::createRegExp(name); 0103 RegExpWidget *newElm = WidgetFactory::createWidget(regexp, _editorWindow, nullptr); 0104 ConcWidget *elm; 0105 if (!(elm = dynamic_cast<ConcWidget *>(newElm))) { 0106 elm = new ConcWidget(_editorWindow, newElm, nullptr); 0107 } 0108 0109 Q_ASSERT(elm); 0110 0111 RegExpWidget *rew = dynamic_cast<RegExpWidget *>(parent()); 0112 if (rew) { 0113 rew->addNewConcChild(this, elm); 0114 } 0115 0116 QWidget *w = dynamic_cast<QWidget *>(parent()); 0117 if (w) { 0118 w->update(); 0119 } 0120 _editorWindow->updateContent(this); 0121 0122 bool selfDrag = (event->source()); 0123 if (!selfDrag) { 0124 _editorWindow->clearSelection(true); 0125 } else { 0126 // selection should not be cleared here, since we might want to delete it. 0127 } 0128 event->setDropAction(Qt::MoveAction); 0129 event->accept(); 0130 } 0131 0132 RegExp *DragAccepter::regExp() const 0133 { 0134 return nullptr; 0135 }