widgetselection.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 737 行 · 第 1/2 页

CPP
737
字号
    if (m_type == TaskMenu)        return;    e->accept();    if (!m_formWindow->hasFeature(FormWindow::EditFeature))        return;    QLayout *lt = 0; // Check for managed layout    LayoutInfo::Type layoutType = m_widget->parentWidget()            ? LayoutInfo::layoutType(m_formWindow->core(), m_widget->parentWidget(), lt)            : LayoutInfo::NoLayout;    if (layoutType == LayoutInfo::Grid) {        const QSize size = m_widget->parentWidget()->size();        QGridLayout *grid = static_cast<QGridLayout*>(m_widget->parentWidget()->layout());        QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), m_widget->parentWidget());        const int index = deco->indexOf(m_widget);        const QRect info = deco->itemInfo(index);        const int top = deco->findItemAt(info.top() - 1, info.left());        const int left = deco->findItemAt(info.top(), info.left() - 1);        const int bottom = deco->findItemAt(info.bottom() + 1, info.left());        const int right = deco->findItemAt(info.top(), info.right() + 1);        const QPoint pt = m_origGeom.center() - m_widget->geometry().center();        ChangeLayoutItemGeometry *cmd = 0;        switch (m_type) {            default: break;            case WidgetHandle::Top: {                if (pt.y() < 0 && info.height() > 1) {                    cmd = new ChangeLayoutItemGeometry(m_formWindow);                    cmd->init(m_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(m_formWindow);                    cmd->init(m_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(m_formWindow);                    cmd->init(m_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(m_formWindow);                    cmd->init(m_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(m_formWindow);                    cmd->init(m_widget, info.y(), info.x(), info.height(), info.width() - 1);                } else if (pt.x() < 0 && right != -1 && grid->itemAt(right)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(m_formWindow);                    cmd->init(m_widget, info.y(), info.x(), info.height(), info.width() + 1);                }            } break;            case WidgetHandle::Bottom: {                if (pt.y() > 0 && info.width() > 1) {                    cmd = new ChangeLayoutItemGeometry(m_formWindow);                    cmd->init(m_widget, info.y(), info.x(), info.height() - 1, info.width());                } else if (pt.y() < 0 && bottom != -1 && grid->itemAt(bottom)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(m_formWindow);                    cmd->init(m_widget, info.y(), info.x(), info.height() + 1, info.width());                }            } break;        }        if (cmd != 0) {            m_formWindow->commandHistory()->push(cmd);        } else {            grid->invalidate();            grid->activate();            m_formWindow->clearSelection(false);            m_formWindow->selectWidget(m_widget);        }    } else if (m_geom != m_widget->geometry()) {        SetPropertyCommand *cmd = new SetPropertyCommand(m_formWindow);        cmd->init(m_widget, QLatin1String("geometry"), m_widget->geometry());        cmd->setOldValue(m_origGeom);        m_formWindow->commandHistory()->push(cmd);        m_formWindow->emitSelectionChanged();    }}void WidgetHandle::trySetGeometry(QWidget *w, int x, int y, int width, int height){    if (!m_formWindow->hasFeature(FormWindow::EditFeature))        return;    int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width());    minw = qMax(minw, 2 * m_formWindow->grid().x());    int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height());    minh = qMax(minh, 2 * m_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)   :    m_topWidget(0),    m_wid(0),    m_formWindow(parent),    m_taskMenu(0){    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        m_handles.insert(i, new WidgetHandle(m_formWindow, static_cast<WidgetHandle::Type>(i), this));    }    hide();}void WidgetSelection::setWidget(QWidget *w){    m_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 (m_wid != 0)        m_wid->removeEventFilter(this);    if (w == 0) {        hide();        m_wid = 0;        return;    }    m_wid = w;    m_wid->installEventFilter(this);    const bool active = LayoutInfo::isWidgetLaidout(m_formWindow->core(), m_wid) == false;    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        if (WidgetHandle *h = m_handles[i]) {            h->setWidget(m_wid);            h->setActive(active);        }    }    QLayout *layout = LayoutInfo::managedLayout(m_formWindow->core(), m_formWindow->designerWidget(m_wid->parentWidget()));    if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) {        const int index = grid->indexOf(m_wid);        if (index == -1) {#if defined(QD_DEBUG)            qDebug() << "unexpected call to WidgetSelection::setWidget()" << "widget:" << m_wid << "grid:"<< grid;#endif            return;        }        Q_ASSERT(index != -1);        QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), m_wid->parentWidget());        if (deco == 0) {            // try with the actual layout            deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), layout);        }        if (deco != 0) {            // bottom cell            m_handles[WidgetHandle::Bottom]->setActive(true);            // top cell            m_handles[WidgetHandle::Top]->setActive(true);            // left cell            m_handles[WidgetHandle::Left]->setActive(true);            // right cellg59            m_handles[WidgetHandle::Right]->setActive(true);        } else {            qDebug() << "no QDesignerLayoutDecorationExtension for widget:" << m_wid;        }    }#ifndef NO_TOPWIDGET    m_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();}bool WidgetSelection::isUsed() const{    return m_wid != 0;}void WidgetSelection::updateGeometry(){    if (!m_wid || !m_wid->parentWidget())        return;    QPoint p = m_wid->parentWidget()->mapToGlobal(m_wid->pos());    p = m_formWindow->mapFromGlobal(p);    const QRect r(p, m_wid->size());    const int w = 6;    const int h = 6;    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        WidgetHandle *hndl = m_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 = m_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 = m_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 = m_handles[ i ];        if (h)            h->update();    }#ifndef NO_TOPWIDGET    if (m_topWidget)        m_topWidget->update();#endif}QWidget *WidgetSelection::widget() const{    return m_wid;}QDesignerFormEditorInterface *WidgetSelection::core() const{    if (m_formWindow)        return m_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 + =
减小字号Ctrl + -
显示快捷键?