📄 formwindow.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "formwindow.h"#include "formwindow_dnditem.h"#include "formwindow_widgetstack.h"#include "formwindowcursor.h"#include "formwindowmanager.h"#include "tool_widgeteditor.h"#include "widgetselection.h"// shared#include <qdesigner_promotedwidget_p.h>#include <qdesigner_tabwidget_p.h>#include <qdesigner_toolbox_p.h>#include <qdesigner_stackedbox_p.h>#include "qdesigner_resource.h"#include <qdesigner_command_p.h>#include <qdesigner_widget_p.h>#include <qdesigner_utils_p.h>#include <qlayout_widget_p.h>#include <spacer_widget_p.h>#include <invisible_widget_p.h>#include <layoutinfo_p.h>#include <connectionedit_p.h>#include <actionprovider_p.h>// sdk#include <QtDesigner/QtDesigner>#include <QtGui>#include <QtDebug>namespace qdesigner_internal {class FriendlyWidget: public QWidget{public: FriendlyWidget() { Q_ASSERT(0); } friend class FormWindow;};class BlockSelection{public: BlockSelection(FormWindow *fw) : m_formWindow(fw) { if (m_formWindow) m_blocked = m_formWindow->blockSelectionChanged(true); } ~BlockSelection() { if (m_formWindow) m_formWindow->blockSelectionChanged(m_blocked); }private: QPointer<FormWindow> m_formWindow; bool m_blocked;};FormWindow::FormWindow(FormEditor *core, QWidget *parent, Qt::WindowFlags flags) : QDesignerFormWindowInterface(parent, flags), m_core(core), m_widgetStack(0){ init(); m_cursor = new FormWindowCursor(this, this); core->formWindowManager()->addFormWindow(this); setDirty(false);}FormWindow::~FormWindow(){ Q_ASSERT(core() != 0); Q_ASSERT(core()->metaDataBase() != 0); Q_ASSERT(core()->formWindowManager() != 0); core()->formWindowManager()->removeFormWindow(this); core()->metaDataBase()->remove(this); QList<QWidget*> l = widgets(); foreach (QWidget *w, l) core()->metaDataBase()->remove(w); m_widgetStack = 0; m_rubberBand = 0; qDeleteAll(selections);}QDesignerFormEditorInterface *FormWindow::core() const{ return m_core;}QDesignerFormWindowCursorInterface *FormWindow::cursor() const{ return m_cursor;}bool FormWindow::hasFeature(Feature f) const{ return f & m_feature;}void FormWindow::updateWidgets(){ if (!m_mainContainer) return;}int FormWindow::widgetDepth(QWidget *w){ int d = -1; while (w && !w->isWindow()) { d++; w = w->parentWidget(); } return d;}bool FormWindow::isChildOf(QWidget *c, const QWidget *p){ while (c /*&& !c->isWindow()*/) { if (c == p) return true; c = c->parentWidget(); } return false;}FormWindow::Feature FormWindow::features() const{ return m_feature;}static void recursiveUpdate(QWidget *w){ w->update(); const QObjectList &l = w->children(); QObjectList::const_iterator it = l.begin(); for (; it != l.end(); ++it) { if (QWidget *w = qobject_cast<QWidget*>(*it)) recursiveUpdate(w); }}void FormWindow::setFeatures(Feature f){ m_feature = f; emit featureChanged(f); recursiveUpdate(this);}void FormWindow::setCursorToAll(const QCursor &c, QWidget *start){ start->setCursor(c); QList<QWidget*> widgets = qFindChildren<QWidget*>(start); foreach (QWidget *widget, widgets) { if (!qobject_cast<WidgetHandle*>(widget)) { widget->setCursor(c); } }}void FormWindow::init(){ m_blockSelectionChanged = false; m_defaultMargin = INT_MIN; m_defaultSpacing = INT_MIN; QHBoxLayout *layout = new QHBoxLayout(this); layout->setMargin(0); m_widgetStack = new FormWindowWidgetStack(this); connect(m_widgetStack, SIGNAL(currentToolChanged(int)), this, SIGNAL(toolChanged(int))); layout->addWidget(m_widgetStack); m_feature = DefaultFeature; m_selectionChangedTimer = new QTimer(this); m_selectionChangedTimer->setSingleShot(true); connect(m_selectionChangedTimer, SIGNAL(timeout()), this, SLOT(selectionChangedTimerDone())); m_checkSelectionTimer = new QTimer(this); m_checkSelectionTimer->setSingleShot(true); connect(m_checkSelectionTimer, SIGNAL(timeout()), this, SLOT(checkSelectionNow())); m_geometryChangedTimer = new QTimer(this); m_geometryChangedTimer->setSingleShot(true); connect(m_geometryChangedTimer, SIGNAL(timeout()), this, SIGNAL(geometryChanged())); m_rubberBand = 0; setGrid(QPoint(10,10)); setFocusPolicy(Qt::StrongFocus); m_mainContainer = 0; m_currentWidget = 0; oldRectValid = false; drawRubber = false; targetContainer = 0; hadOwnPalette = false; startWidget = 0; endWidget = 0; m_commandHistory = new QtUndoStack(this); connect(m_commandHistory, SIGNAL(commandExecuted()), this, SLOT(updateDirty())); connect(m_commandHistory, SIGNAL(commandExecuted()), this, SIGNAL(changed())); connect(commandHistory(), SIGNAL(commandExecuted()), this, SLOT(checkSelection())); core()->metaDataBase()->add(this); initializeCoreTools(); QAction *a = new QAction(this); a->setText(tr("Edit contents")); a->setShortcut(tr("F2")); connect(a, SIGNAL(triggered()), this, SLOT(editContents())); addAction(a);}QWidget *FormWindow::mainContainer() const{ return m_mainContainer;}void FormWindow::setMainContainer(QWidget *w){ if (w == m_mainContainer) { // nothing to do return; } if (m_mainContainer) { unmanageWidget(m_mainContainer); delete m_mainContainer; m_mainContainer = 0; } m_mainContainer = w; w->setAutoFillBackground(true); QSize sz = m_mainContainer->size(); m_mainContainer->setParent(m_widgetStack, 0); m_mainContainer->raise(); m_mainContainer->show(); m_widgetStack->setCurrentTool(m_widgetEditor); setCurrentWidget(m_mainContainer); manageWidget(m_mainContainer); if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core()->extensionManager(), m_mainContainer)) { sheet->setVisible(sheet->indexOf(QLatin1String("windowTitle")), true); sheet->setVisible(sheet->indexOf(QLatin1String("windowIcon")), true); // ### generalize } m_mainContainer->setFocusPolicy(Qt::StrongFocus); m_mainContainer->resize(sz); emit mainContainerChanged(m_mainContainer);}QWidget *FormWindow::findTargetContainer(QWidget *widget) const{ Q_ASSERT(widget); while (QWidget *parentWidget = widget->parentWidget()) { if (LayoutInfo::layoutType(m_core, parentWidget) == LayoutInfo::NoLayout && isManaged(widget)) return widget; widget = parentWidget; } return mainContainer();}bool FormWindow::handleMousePressEvent(QWidget * /*widget*/, QWidget *managedWidget, QMouseEvent *e){ startPos = QPoint(); e->accept(); BlockSelection blocker(this); if (core()->formWindowManager()->activeFormWindow() != this) core()->formWindowManager()->setActiveFormWindow(this); if (e->buttons() != Qt::LeftButton) return true; startPos = mapFromGlobal(e->globalPos()); bool inLayout = LayoutInfo::isWidgetLaidout(m_core, managedWidget); // if the dragged widget is not in a layout, raise it if (inLayout == false) managedWidget->raise(); if (isMainContainer(managedWidget) == true) { // press was on the formwindow clearSelection(false); drawRubber = true; currRect = QRect(); startRectDraw(mapFromGlobal(e->globalPos()), this, Rubber); return true; } bool selected = isWidgetSelected(managedWidget); if (e->modifiers() & Qt::ShiftModifier) { // shift-click - toggle selection state of widget selectWidget(managedWidget, !selected); return true; } QWidget *current = managedWidget; if (!selected) clearSelection(false); bool curLaidOut = false; bool curSelected = false; for (;;) { curLaidOut = current ? LayoutInfo::isWidgetLaidout(core(), current) : false; curSelected = current ? isWidgetSelected(current) : false; if (!current || !curLaidOut || !curSelected) break; current = designerWidget(current->parentWidget()); } if (!(current == 0 || !curLaidOut && curSelected)) { selectWidget(current); raiseChildSelections(current); } return true;}bool FormWindow::isPageOfContainerWidget(QWidget *widget) const{ QDesignerContainerExtension *c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), widget->parentWidget()); if (c != 0) { for (int i = 0; i<c->count(); ++i) { if (widget == c->widget(i)) return true; } } return false;}bool FormWindow::handleMouseMoveEvent(QWidget *, QWidget *, QMouseEvent *e){ e->accept(); if (e->buttons() != Qt::LeftButton || startPos.isNull()) return true; QPoint pos = mapFromGlobal(e->globalPos()); if (drawRubber == true) { continueRectDraw(pos, this, Rubber); return true; } bool canStartDrag = (startPos - pos).manhattanLength() > QApplication::startDragDistance(); if (canStartDrag == false) { // nothing to do return true; } bool blocked = blockSelectionChanged(true); QList<QWidget*> sel = selectedWidgets(); simplifySelection(&sel); QSet<QWidget*> widget_set; foreach (QWidget *child, sel) { QWidget *current = child; bool done = false; while (!isMainContainer(current) && !done) { QDesignerContainerExtension *c = 0; c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), current->parentWidget()); if (!isManaged(current)) { current = current->parentWidget(); continue; } else if (LayoutInfo::isWidgetLaidout(core(), current)) { current = current->parentWidget(); continue; } else if (isPageOfContainerWidget(current)) { current = current->parentWidget(); continue; } else if (current->parentWidget()) { QScrollArea *area = qobject_cast<QScrollArea*>(current->parentWidget()->parentWidget()); if (area && area->widget() == current) { current = area; continue; } } done = true; } if (current == mainContainer()) continue; widget_set.insert(current); } sel = widget_set.toList(); QDesignerResource builder(this); QList<QDesignerDnDItemInterface*> item_list; foreach (QWidget *widget, sel) { if (e->modifiers()#ifndef Q_WS_MAC & Qt::ControlModifier#else & Qt::AltModifier#endif ) { item_list.append(new FormWindowDnDItem(QDesignerDnDItemInterface::CopyDrop, this, widget, mapToGlobal(startPos))); } else { item_list.append(new FormWindowDnDItem(QDesignerDnDItemInterface::MoveDrop, this, widget, mapToGlobal(startPos))); widget->hide(); } } blockSelectionChanged(blocked); if (sel.count()) core()->formWindowManager()->dragItems(item_list); startPos = QPoint(); return true;}bool FormWindow::handleMouseReleaseEvent(QWidget *, QWidget *, QMouseEvent *e){ e->accept(); if (drawRubber) { // we were drawing a rubber selection endRectDraw(); // get rid of the rectangle bool blocked = blockSelectionChanged(true); selectWidgets(); // select widgets which intersect the rect blockSelectionChanged(blocked); drawRubber = false; } startPos = QPoint(); emitSelectionChanged(); // inform about selection changes return true;}void FormWindow::checkPreviewGeometry(QRect &r){ if (!rect().contains(r)) { if (r.left() < rect().left()) r.moveTopLeft(QPoint(0, r.top())); if (r.right() > rect().right()) r.moveBottomRight(QPoint(rect().right(), r.bottom())); if (r.top() < rect().top()) r.moveTopLeft(QPoint(r.left(), rect().top())); if (r.bottom() > rect().bottom()) r.moveBottomRight(QPoint(r.right(), rect().bottom())); }}void FormWindow::startRectDraw(const QPoint &pos, QWidget *, RectType t){ oldRectValid = false; rectAnchor = (t == Insert) ? gridPoint(pos) : pos; currRect = QRect(rectAnchor, QSize(0, 0)); if (!m_rubberBand) m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); m_rubberBand->setGeometry(currRect); m_rubberBand->show();}void FormWindow::continueRectDraw(const QPoint &pos, QWidget *, RectType t){ QPoint p2 = (t == Insert) ? gridPoint(pos) : pos; QRect r(rectAnchor, p2); r = r.normalized(); if (currRect == r) return; if (r.width() > 1 || r.height() > 1) { oldRectValid = true; currRect = r; if (m_rubberBand) m_rubberBand->setGeometry(currRect); } else { oldRectValid = false; }}void FormWindow::endRectDraw(){ if (m_rubberBand) { delete m_rubberBand; m_rubberBand = 0; }}QPoint FormWindow::gridPoint(const QPoint &p) const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -