📄 formwindowmanager.cpp
字号:
m_activeFormWindow->raiseWidgets();}void FormWindowManager::slotActionHorizontalLayoutActivated(){ if (m_layoutChilds) layoutContainerHorizontal(); else m_activeFormWindow->layoutHorizontal();}void FormWindowManager::slotActionVerticalLayoutActivated(){ if (m_layoutChilds) layoutContainerVertical(); else m_activeFormWindow->layoutVertical();}void FormWindowManager::slotActionGridLayoutActivated(){ if (m_layoutChilds) layoutContainerGrid(); else m_activeFormWindow->layoutGrid();}void FormWindowManager::slotActionSplitHorizontalActivated(){ if (m_layoutChilds) ; // no way to do that else m_activeFormWindow->layoutHorizontalSplit();}void FormWindowManager::slotActionSplitVerticalActivated(){ if (m_layoutChilds) ; // no way to do that else m_activeFormWindow->layoutVerticalSplit();}void FormWindowManager::slotActionBreakLayoutActivated(){ QList<QWidget*> widgets = m_activeFormWindow->selectedWidgets(); if (widgets.isEmpty()) widgets.append(m_activeFormWindow->mainContainer()); m_activeFormWindow->simplifySelection(&widgets); QList<QWidget*> layoutBaseList; foreach (QWidget *widget, widgets) { QWidget *currentWidget = core()->widgetFactory()->containerOfWidget(widget); while (currentWidget && currentWidget != m_activeFormWindow) { if (QLayout *layout = LayoutInfo::managedLayout(core(), currentWidget)) { // ### generalize (put in function) if ((!layout->isEmpty() || qobject_cast<QSplitter*>(currentWidget)) && !layoutBaseList.contains(layout->parentWidget())) { layoutBaseList.prepend(layout->parentWidget()); } } currentWidget = currentWidget->parentWidget(); } } if (layoutBaseList.isEmpty()) { // nothing to do return; } m_activeFormWindow->beginCommand(tr("Break Layout")); foreach (QWidget *layoutBase, layoutBaseList) { m_activeFormWindow->breakLayout(layoutBase); } m_activeFormWindow->endCommand();}void FormWindowManager::slotActionAdjustSizeActivated(){ Q_ASSERT(m_activeFormWindow != 0); m_activeFormWindow->beginCommand(tr("Adjust Size")); QList<QWidget*> selectedWidgets = m_activeFormWindow->selectedWidgets(); m_activeFormWindow->simplifySelection(&selectedWidgets); if (selectedWidgets.isEmpty()) { Q_ASSERT(m_activeFormWindow->mainContainer() != 0); selectedWidgets.append(m_activeFormWindow->mainContainer()); } foreach (QWidget *widget, selectedWidgets) { bool unlaidout = LayoutInfo::layoutType(core(), widget->parentWidget()) == LayoutInfo::NoLayout; bool isMainContainer = m_activeFormWindow->isMainContainer(widget); if (unlaidout || isMainContainer) { AdjustWidgetSizeCommand *cmd = new AdjustWidgetSizeCommand(m_activeFormWindow); cmd->init(widget); m_activeFormWindow->commandHistory()->push(cmd); } } m_activeFormWindow->endCommand();}void FormWindowManager::slotActionSelectAllActivated(){ m_activeFormWindow->selectAll();}void FormWindowManager::slotUpdateActions(){ m_layoutChilds = false; int selectedWidgetCount = 0; int laidoutWidgetCount = 0; int unlaidoutWidgetCount = 0; bool pasteAvailable = false; bool layoutAvailable = false; bool breakAvailable = false; bool layoutContainer = false; if (m_activeFormWindow != 0 && m_activeFormWindow->currentTool() == 0) { QList<QWidget*> simplifiedSelection = m_activeFormWindow->selectedWidgets(); selectedWidgetCount = simplifiedSelection.count(); pasteAvailable = qApp->clipboard()->mimeData() && qApp->clipboard()->mimeData()->hasText(); m_activeFormWindow->simplifySelection(&simplifiedSelection); if (simplifiedSelection.isEmpty() && m_activeFormWindow->mainContainer()) simplifiedSelection.append(m_activeFormWindow->mainContainer()); foreach (QWidget *widget, simplifiedSelection) { if (LayoutInfo::isWidgetLaidout(m_core, widget)) ++laidoutWidgetCount; else ++unlaidoutWidgetCount; } if (simplifiedSelection.count() == 1) { m_layoutChilds = false; QWidget *widget = core()->widgetFactory()->containerOfWidget(simplifiedSelection.first()); QDesignerWidgetDataBaseInterface *db = m_core->widgetDataBase(); if (QDesignerWidgetDataBaseItemInterface *item = db->item(db->indexOfObject(widget))) { QLayout *layout = LayoutInfo::managedLayout(m_core, widget); layoutContainer = (item->isContainer() || m_activeFormWindow->isMainContainer(widget)); layoutAvailable = layoutContainer && m_activeFormWindow->hasInsertedChildren(widget) && layout == 0; m_layoutChilds = layoutAvailable; breakAvailable = LayoutInfo::isWidgetLaidout(m_core, widget); if (! breakAvailable && layout != 0) breakAvailable = ! layout->isEmpty(); if (! breakAvailable && qobject_cast<QSplitter*>(widget)) breakAvailable = qobject_cast<QSplitter*>(widget)->count() != 0; } } else { layoutAvailable = unlaidoutWidgetCount > 1; breakAvailable = false; } } m_actionCut->setEnabled(selectedWidgetCount > 0); m_actionCopy->setEnabled(selectedWidgetCount > 0); m_actionDelete->setEnabled(selectedWidgetCount > 0); m_actionLower->setEnabled(selectedWidgetCount > 0); m_actionRaise->setEnabled(selectedWidgetCount > 0); m_actionPaste->setEnabled(pasteAvailable); m_actionSelectAll->setEnabled(m_activeFormWindow != 0); m_actionAdjustSize->setEnabled(unlaidoutWidgetCount > 0); m_actionHorizontalLayout->setEnabled(layoutAvailable); m_actionVerticalLayout->setEnabled(layoutAvailable); m_actionSplitHorizontal->setEnabled(layoutAvailable && !layoutContainer); m_actionSplitVertical->setEnabled(layoutAvailable && !layoutContainer); m_actionGridLayout->setEnabled(layoutAvailable); m_actionBreakLayout->setEnabled(breakAvailable);}void FormWindowManager::layoutContainerHorizontal(){ QWidget *w = m_activeFormWindow->mainContainer(); QList<QWidget*> l(m_activeFormWindow->selectedWidgets()); if (l.count() == 1) w = l.first(); if (w != 0) m_activeFormWindow->layoutHorizontalContainer(w);}void FormWindowManager::layoutContainerVertical(){ QWidget *w = m_activeFormWindow->mainContainer(); QList<QWidget*> l(m_activeFormWindow->selectedWidgets()); if (l.count() == 1) w = l.first(); if (w) m_activeFormWindow->layoutVerticalContainer(w);}void FormWindowManager::layoutContainerGrid(){ QWidget *w = m_activeFormWindow->mainContainer(); QList<QWidget*> l(m_activeFormWindow->selectedWidgets()); if (l.count() == 1) w = l.first(); if (w) m_activeFormWindow->layoutGridContainer(w);}QDesignerFormWindowInterface *FormWindowManager::createFormWindow(QWidget *parentWidget, Qt::WindowFlags flags){ FormWindow *formWindow = new FormWindow(qobject_cast<FormEditor*>(core()), parentWidget, flags); addFormWindow(formWindow); return formWindow;}QAction *FormWindowManager::actionUndo() const{ return m_actionUndo;}QAction *FormWindowManager::actionRedo() const{ return m_actionRedo;}// DnD stuffvoid FormWindowManager::dragItems(const QList<QDesignerDnDItemInterface*> &item_list){ if (!m_drag_item_list.isEmpty()) { qWarning("FormWindowManager::dragItem(): called while already dragging"); return; } beginDrag(item_list, QCursor::pos());}void FormWindowManager::beginDrag(const QList<QDesignerDnDItemInterface*> &item_list, const QPoint &globalPos){ Q_ASSERT(m_drag_item_list.isEmpty()); m_drag_item_list = item_list; setItemsPos(globalPos); foreach(QDesignerDnDItemInterface *item, m_drag_item_list) { QWidget *deco = item->decoration(); deco->setAttribute(Qt::WA_TransparentForMouseEvents); QPoint pos = deco->pos(); QRect ag = qApp->desktop()->availableGeometry(deco); deco->move(qMin(qMax(pos.x(), ag.left()), ag.right()), qMin(qMax(pos.y(), ag.top()), ag.bottom())); deco->move(pos); deco->show(); deco->setWindowOpacity(0.8); }#ifdef Q_WS_X11 m_core->topLevel()->grabMouse(); m_savedContextMenuPolicy = m_core->topLevel()->contextMenuPolicy(); m_core->topLevel()->setContextMenuPolicy(Qt::NoContextMenu);#endif}static QDesignerWidgetBoxInterface *widgetBoxAt(const QPoint &global_pos){ QWidget *w = qApp->widgetAt(global_pos); while (w != 0) { QDesignerWidgetBoxInterface *wb = qobject_cast<QDesignerWidgetBoxInterface*>(w); if (wb != 0) return wb; w = w->parentWidget(); } return 0;}void FormWindowManager::setItemsPos(const QPoint &globalPos){ foreach(QDesignerDnDItemInterface *item, m_drag_item_list) item->decoration()->move(globalPos - item->hotSpot()); QWidget *widget_under_mouse = qApp->widgetAt(globalPos); int max_try = 3; while (max_try && widget_under_mouse && isDecoration(widget_under_mouse)) { --max_try; widget_under_mouse = qApp->widgetAt(widget_under_mouse->pos() - QPoint(1,1)); Q_ASSERT(!qobject_cast<ConnectionEdit*>(widget_under_mouse)); } FormWindow *form_under_mouse = qobject_cast<FormWindow*>(QDesignerFormWindowInterface::findFormWindow(widget_under_mouse)); if (form_under_mouse != 0 && !form_under_mouse->hasFeature(QDesignerFormWindowInterface::EditFeature)) form_under_mouse = 0; if (form_under_mouse != 0) { // widget_under_mouse might be some temporary thing like the dropLine. We need // the actual widget that's part of the edited GUI. widget_under_mouse = form_under_mouse->widgetAt(form_under_mouse->mapFromGlobal(globalPos)); Q_ASSERT(!qobject_cast<ConnectionEdit*>(widget_under_mouse)); } if (m_last_form_under_mouse != 0 && widget_under_mouse != m_last_widget_under_mouse) { m_last_form_under_mouse->highlightWidget(m_last_widget_under_mouse, m_last_widget_under_mouse->mapFromGlobal(globalPos), FormWindow::Restore); } FormWindow *source_form = qobject_cast<FormWindow*>(m_drag_item_list.first()->source()); if (form_under_mouse != 0 && (source_form == 0 || widget_under_mouse != source_form->mainContainer())) { form_under_mouse->highlightWidget(widget_under_mouse, widget_under_mouse->mapFromGlobal(globalPos), FormWindow::Highlight); } m_last_widget_under_mouse = widget_under_mouse; m_last_form_under_mouse = form_under_mouse; if (m_last_form_under_mouse == 0) m_widget_box_under_mouse = widgetBoxAt(globalPos); else m_widget_box_under_mouse = 0;}void FormWindowManager::endDrag(const QPoint &pos){#ifdef Q_WS_X11 m_core->topLevel()->releaseMouse(); m_core->topLevel()->setContextMenuPolicy(m_savedContextMenuPolicy);#endif Q_ASSERT(!m_drag_item_list.isEmpty()); foreach (QDesignerDnDItemInterface *item, m_drag_item_list) item->decoration()->hide(); // ugly, but you can't qobject_cast from interfaces if (m_last_form_under_mouse != 0 && m_last_form_under_mouse->hasFeature(QDesignerFormWindowInterface::EditFeature)) { m_last_form_under_mouse->dropWidgets(m_drag_item_list, m_last_widget_under_mouse, pos); } else if (m_widget_box_under_mouse != 0) { m_widget_box_under_mouse->dropWidgets(m_drag_item_list, pos); foreach (QDesignerDnDItemInterface *item, m_drag_item_list) { if (item->type() == QDesignerDnDItemInterface::CopyDrop) continue; FormWindow *source = qobject_cast<FormWindow*>(item->source()); if (source == 0) continue; QWidget *widget = item->widget(); if (widget == 0) continue; source->deleteWidgets(QList<QWidget*>() << widget); } } else { foreach (QDesignerDnDItemInterface *item, m_drag_item_list) { if (item->widget() != 0) item->widget()->show(); } } foreach (QDesignerDnDItemInterface *item, m_drag_item_list) delete item; m_drag_item_list.clear(); m_last_widget_under_mouse = 0; m_last_form_under_mouse = 0; m_widget_box_under_mouse = 0;}bool FormWindowManager::isDecoration(QWidget *widget) const{ foreach (QDesignerDnDItemInterface *item, m_drag_item_list) { if (item->decoration() == widget) return true; } return false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -