9#include <QtDesigner/abstractformeditor.h>
10#include <QtDesigner/abstractwidgetfactory.h>
11#include <QtDesigner/abstractwidgetbox.h>
13#include <layoutinfo_p.h>
14#include <qdesigner_dnditem_p.h>
15#include <qdesigner_resource.h>
17#include <QtWidgets/qmainwindow.h>
19#include <QtGui/qaction.h>
20#include <QtGui/qcursor.h>
21#include <QtGui/qevent.h>
23#include <QtCore/qdebug.h>
30 : QDesignerFormWindowToolInterface(formWindow),
31 m_formWindow(formWindow),
32 m_action(
new QAction(tr(
"Edit Widgets"),
this)),
33 m_specialDockDrag(
false)
46 return m_formWindow->core();
57 QMainWindow *mw = qobject_cast<QMainWindow*>(widget);
61 if (event->type() != QEvent::MouseButtonPress
62 && event->type() != QEvent::MouseMove
63 && event->type() != QEvent::MouseButtonRelease)
66 QMouseEvent *e =
static_cast<QMouseEvent*>(event);
68 if (event->type() == QEvent::MouseButtonPress) {
69 if (mw->isSeparator(e->position().toPoint())) {
70 m_separator_drag_mw = mw;
76 if (event->type() == QEvent::MouseMove)
77 return m_separator_drag_mw == mw;
79 if (event->type() == QEvent::MouseButtonRelease) {
80 if (m_separator_drag_mw != mw)
82 m_separator_drag_mw =
nullptr;
91 auto *widgetFactory = core()->widgetFactory();
92 return widgetFactory->isPassiveInteractor(widget) || mainWindowSeparatorEvent(widget, event);
97 switch (event->type()) {
103 case QEvent::FocusOut:
104 case QEvent::FocusIn:
105 return widget != m_formWindow && widget != m_formWindow->mainContainer()
106 && !isPassiveInteractor(widget, event);
113 return !isPassiveInteractor(widget, event);
115 case QEvent::KeyPress:
116 return !isPassiveInteractor(widget, event)
117 && handleKeyPressEvent(widget, managedWidget,
static_cast<QKeyEvent*>(event));
119 case QEvent::KeyRelease:
120 return !isPassiveInteractor(widget, event)
121 && handleKeyReleaseEvent(widget, managedWidget,
static_cast<QKeyEvent*>(event));
123 case QEvent::MouseMove:
124 return !isPassiveInteractor(widget, event)
125 && handleMouseMoveEvent(widget, managedWidget,
static_cast<QMouseEvent*>(event));
127 case QEvent::MouseButtonPress:
128 return !isPassiveInteractor(widget, event)
129 && handleMousePressEvent(widget, managedWidget,
static_cast<QMouseEvent*>(event));
131 case QEvent::MouseButtonRelease:
132 return !isPassiveInteractor(widget, event)
133 && handleMouseReleaseEvent(widget, managedWidget,
static_cast<QMouseEvent*>(event));
135 case QEvent::MouseButtonDblClick:
136 return !isPassiveInteractor(widget, event)
137 && handleMouseButtonDblClickEvent(widget, managedWidget,
static_cast<QMouseEvent*>(event));
139 case QEvent::ContextMenu:
140 return !isPassiveInteractor(widget, event)
141 && handleContextMenu(widget, managedWidget,
static_cast<QContextMenuEvent*>(event));
143 case QEvent::DragEnter:
144 return handleDragEnterMoveEvent(widget, managedWidget,
static_cast<QDragEnterEvent *>(event),
true);
145 case QEvent::DragMove:
146 return handleDragEnterMoveEvent(widget, managedWidget,
static_cast<QDragMoveEvent *>(event),
false);
147 case QEvent::DragLeave:
148 return handleDragLeaveEvent(widget, managedWidget,
static_cast<QDragLeaveEvent *>(event));
150 return handleDropEvent(widget, managedWidget,
static_cast<QDropEvent *>(event));
163 return m_formWindow->handleContextMenu(widget, managedWidget, e);
168 return m_formWindow->handleMouseButtonDblClickEvent(widget, managedWidget, e);
173 return m_formWindow->handleMousePressEvent(widget, managedWidget, e);
178 return m_formWindow->handleMouseMoveEvent(widget, managedWidget, e);
183 return m_formWindow->handleMouseReleaseEvent(widget, managedWidget, e);
188 return m_formWindow->handleKeyPressEvent(widget, managedWidget, e);
193 return m_formWindow->handleKeyReleaseEvent(widget, managedWidget, e);
199 Q_UNUSED(managedWidget);
207 m_specialDockDrag =
false;
215 const auto item_list = mimeData->items();
217 for (QDesignerDnDItemInterface *item : item_list) {
218 if (item->decoration() && item->decoration()->property(
"_q_dockDrag").toBool())
219 m_specialDockDrag =
true;
226 const QDesignerMimeData *mimeData = qobject_cast<
const QDesignerMimeData *>(e->mimeData());
230 if (!m_formWindow->hasFeature(QDesignerFormWindowInterface::EditFeature)) {
236 detectDockDrag(mimeData);
239 QPoint globalPos = QPoint(0, 0);
240 if (m_specialDockDrag) {
241 m_lastDropTarget =
nullptr;
244 m_lastDropTarget = mw->centralWidget();
247 const QPoint formPos = widget != m_formWindow ? widget->mapTo(m_formWindow, e->position().toPoint()) : e->position().toPoint();
248 globalPos = m_formWindow->mapToGlobal(formPos);
249 const FormWindowBase::WidgetUnderMouseMode wum = mimeData->items().size() == 1 ? FormWindowBase::FindSingleSelectionDropTarget : FormWindowBase::FindMultiSelectionDropTarget;
250 QWidget *dropTarget = m_formWindow->widgetUnderMouse(formPos, wum);
251 if (m_lastDropTarget && dropTarget != m_lastDropTarget)
252 m_formWindow->highlightWidget(m_lastDropTarget, m_lastDropTarget->mapFromGlobal(globalPos), FormWindow::Restore);
253 m_lastDropTarget = dropTarget;
256 if (m_lastDropTarget)
257 m_formWindow->highlightWidget(m_lastDropTarget, m_lastDropTarget->mapFromGlobal(globalPos), FormWindow::Highlight);
259 if (isEnter || m_lastDropTarget)
260 mimeData->acceptEvent(e);
268 const QDesignerMimeData *mimeData = qobject_cast<
const QDesignerMimeData *>(e->mimeData());
272 if (!m_lastDropTarget ||
273 !m_formWindow->hasFeature(QDesignerFormWindowInterface::EditFeature)) {
278 const QPoint globalPos = widget->mapToGlobal(e->position().toPoint());
279 mimeData->moveDecoration(globalPos);
280 if (m_specialDockDrag) {
281 if (!m_formWindow->dropDockWidget(mimeData->items().at(0), globalPos)) {
285 }
else if (!m_formWindow->dropWidgets(mimeData->items(), m_lastDropTarget, globalPos)) {
289 mimeData->acceptEvent(e);
295 if (!m_lastDropTarget)
298 m_formWindow->highlightWidget(m_lastDropTarget, m_lastDropTarget->mapFromGlobal(QCursor::pos()), FormWindow::Restore);
299 m_lastDropTarget =
nullptr;
305 if (restoreDropHighlighting()) {
314 Q_ASSERT(formWindow() !=
nullptr);
315 return formWindow()->mainContainer();
320 if (core()->widgetBox())
321 core()->widgetBox()->setEnabled(
true);
323 if (m_formWindow ==
nullptr)
326 const QWidgetList &sel = m_formWindow->selectedWidgets();
327 for (QWidget *w : sel)
328 m_formWindow->raiseSelection(w);
333 if (core()->widgetBox())
334 core()->widgetBox()->setEnabled(
false);
336 if (m_formWindow ==
nullptr)
Combined button and popup list for selecting options.
Auxiliary methods to store/retrieve settings.