📄 widgetselection.cpp
字号:
LayoutInfo::Type layoutType = widget->parentWidget() ? LayoutInfo::layoutType(formWindow->core(), widget->parentWidget()) : LayoutInfo::NoLayout; if (layoutType == LayoutInfo::Grid) { QSize size = widget->parentWidget()->size(); QGridLayout *grid = static_cast<QGridLayout*>(widget->parentWidget()->layout()); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), widget->parentWidget()); int index = deco->indexOf(widget); QRect info = deco->itemInfo(index); int top = deco->findItemAt(info.top() - 1, info.left()); int left = deco->findItemAt(info.top(), info.left() - 1); int bottom = deco->findItemAt(info.bottom() + 1, info.left()); int right = deco->findItemAt(info.top(), info.right() + 1); QPoint pt = origGeom.center() - widget->geometry().center(); ChangeLayoutItemGeometry *cmd = 0; switch (type) { default: break; case WidgetHandle::Top: { if (pt.y() < 0 && info.height() > 1) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y() + 1, info.x(), info.height() - 1, info.width()); } else if (pt.y() > 0 && top != -1 && grid->itemAt(top)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y() - 1, info.x(), info.height() + 1, info.width()); } } break; case WidgetHandle::Left: { if (pt.x() < 0 && info.width() > 1) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x() + 1, info.height(), info.width() - 1); } else if (pt.x() > 0 && left != -1 && grid->itemAt(left)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x() - 1, info.height(), info.width() + 1); } } break; case WidgetHandle::Right: { if (pt.x() > 0 && info.width() > 1) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x(), info.height(), info.width() - 1); } else if (pt.x() < 0 && right != -1 && grid->itemAt(right)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x(), info.height(), info.width() + 1); } } break; case WidgetHandle::Bottom: { if (pt.y() > 0 && info.width() > 1) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x(), info.height() - 1, info.width()); } else if (pt.y() < 0 && bottom != -1 && grid->itemAt(bottom)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(formWindow); cmd->init(widget, info.y(), info.x(), info.height() + 1, info.width()); } } break; } if (cmd != 0) { formWindow->commandHistory()->push(cmd); } else { grid->invalidate(); grid->activate(); formWindow->clearSelection(false); formWindow->selectWidget(widget); } } else if (geom != widget->geometry()) { SetPropertyCommand *cmd = new SetPropertyCommand(formWindow); cmd->init(widget, QLatin1String("geometry"), widget->geometry()); cmd->setOldValue(origGeom); formWindow->commandHistory()->push(cmd); formWindow->emitSelectionChanged(); }}void WidgetHandle::trySetGeometry(QWidget *w, int x, int y, int width, int height){ if (!formWindow->hasFeature(FormWindow::EditFeature)) return; int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width()); minw = qMax(minw, 2 * formWindow->grid().x()); int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height()); minh = qMax(minh, 2 * formWindow->grid().y()); if (qMax(minw, width) > w->maximumWidth() || qMax(minh, height) > w->maximumHeight()) return; if (width < minw && x != w->x()) x -= minw - width; if (height < minh && y != w->y()) y -= minh - height; w->setGeometry(x, y, qMax(minw, width), qMax(minh, height));}void WidgetHandle::tryResize(QWidget *w, int width, int height){ int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width()); minw = qMax(minw, 16); int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height()); minh = qMax(minh, 16); w->resize(qMax(minw, width), qMax(minh, height));}// ------------------------------------------------------------------------WidgetSelection::WidgetSelection(FormWindow *parent, QHash<QWidget *, WidgetSelection *> *selDict) : selectionDict(selDict){ wid = 0; taskMenu = 0; formWindow = parent; for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { handles.insert(i, new WidgetHandle(formWindow, (WidgetHandle::Type)i, this)); } m_topWidget = 0; hide();}void WidgetSelection::setWidget(QWidget *w, bool updateDict){ taskMenu = 0; // ### qt_extension<QDesignerTaskMenuExtension*>(core()->extensionManager(), w);#ifndef NO_TOPWIDGET if (m_topWidget) { Q_ASSERT(m_topWidget->parentWidget() != 0); m_topWidget->parentWidget()->setAttribute(Qt::WA_ContentsPropagated, false); } delete m_topWidget; m_topWidget = 0;#endif if (wid != 0) wid->removeEventFilter(this); if (w == 0) { hide(); if (updateDict) selectionDict->remove(wid); wid = 0; return; } wid = w; wid->installEventFilter(this); bool active = LayoutInfo::isWidgetLaidout(formWindow->core(), wid) == false; for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { if (WidgetHandle *h = handles[i]) { h->setWidget(wid); h->setActive(active); } } QLayout *layout = LayoutInfo::managedLayout(formWindow->core(), formWindow->designerWidget(wid->parentWidget())); if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) { int index = grid->indexOf(wid); if (index == -1) {#if defined(QD_DEBUG) qWarning() << "unexpected call to WidgetSelection::setWidget()" << "widget:" << wid << "grid:"<< grid;#endif return; } Q_ASSERT(index != -1); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), wid->parentWidget()); if (deco == 0) { // try with the actual layout deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), layout); } if (deco != 0) { // bottom cell handles[WidgetHandle::Bottom]->setActive(true); // top cell handles[WidgetHandle::Top]->setActive(true); // left cell handles[WidgetHandle::Left]->setActive(true); // right cell handles[WidgetHandle::Right]->setActive(true); } else { qWarning() << "no QDesignerLayoutDecorationExtension for widget:" << wid; } }#ifndef NO_TOPWIDGET wid->setAttribute(Qt::WA_ContentsPropagated, true); m_topWidget = new TopWidget(wid); QPalette p = m_topWidget->palette(); p.setColor(m_topWidget->backgroundRole(), QColor(255, 0, 0, 32)); m_topWidget->setPalette(p);#endif updateGeometry(); show(); if (updateDict) selectionDict->insert(w, this);}bool WidgetSelection::isUsed() const{ return wid != 0;}void WidgetSelection::updateGeometry(){ if (!wid || !wid->parentWidget()) return; QPoint p = wid->parentWidget()->mapToGlobal(wid->pos()); p = formWindow->mapFromGlobal(p); QRect r(p, wid->size()); int w = 6; int h = 6; for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { WidgetHandle *hndl = handles[ i ]; if (!hndl) continue; switch (i) { case WidgetHandle::LeftTop: hndl->move(r.x() - w / 2, r.y() - h / 2); break; case WidgetHandle::Top: hndl->move(r.x() + r.width() / 2 - w / 2, r.y() - h / 2); break; case WidgetHandle::RightTop: hndl->move(r.x() + r.width() - w / 2, r.y() - h / 2); break; case WidgetHandle::Right: hndl->move(r.x() + r.width() - w / 2, r.y() + r.height() / 2 - h / 2); break; case WidgetHandle::RightBottom: hndl->move(r.x() + r.width() - w / 2, r.y() + r.height() - h / 2); break; case WidgetHandle::Bottom: hndl->move(r.x() + r.width() / 2 - w / 2, r.y() + r.height() - h / 2); break; case WidgetHandle::LeftBottom: hndl->move(r.x() - w / 2, r.y() + r.height() - h / 2); break; case WidgetHandle::Left: hndl->move(r.x() - w / 2, r.y() + r.height() / 2 - h / 2); break; case WidgetHandle::TaskMenu: hndl->move(r.x() + r.width() - w / 2, r.y() + h - h / 2); break; default: break; } }#ifndef NO_TOPWIDGET if (m_topWidget) { m_topWidget->setGeometry(wid->rect()); }#endif}void WidgetSelection::hide(){ for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { WidgetHandle *h = handles[ i ]; if (h) h->hide(); }#ifndef NO_TOPWIDGET if (m_topWidget) m_topWidget->hide();#endif}void WidgetSelection::show(){ for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { WidgetHandle *h = handles[ i ]; if (h) { if (i == WidgetHandle::TaskMenu) { h->setVisible(taskMenuExtension() != 0); h->raise(); } else { h->show(); h->raise(); } } }#ifndef NO_TOPWIDGET if (m_topWidget) { m_topWidget->show(); m_topWidget->raise(); }#endif}void WidgetSelection::update(){ for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { WidgetHandle *h = handles[ i ]; if (h) h->update(); }#ifndef NO_TOPWIDGET if (m_topWidget) m_topWidget->update();#endif}QWidget *WidgetSelection::widget() const{ return wid;}QDesignerFormEditorInterface *WidgetSelection::core() const{ if (formWindow) return formWindow->core(); return 0;}bool WidgetSelection::eventFilter(QObject *object, QEvent *event){ if (object != widget()) return false; switch (event->type()) { default: break; case QEvent::Move: case QEvent::Resize: updateGeometry(); break; } // end switch return false;}#include "widgetselection.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -