objectinspector.cpp

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

CPP
655
字号
            }        } else {            QList<QObject*> children = object->children();            qSort(children.begin(), children.end(), ObjectInspector::sortEntry);            foreach (QObject *child, children) {                QWidget *widget = qobject_cast<QWidget*>(child);                if (!widget || !fw->isManaged(widget))                    continue;                QTreeWidgetItem *childItem = new QTreeWidgetItem(item);                workingList.append(qMakePair(childItem, child));            }            if (QWidget *widget = qobject_cast<QWidget*>(object)) {                QList<QAction*> actions = widget->actions();                foreach (QAction *action, actions) {                    if (!fw->core()->metaDataBase()->item(action))                        continue;                    QObject *obj = action;                    if (action->menu())                        obj = action->menu();                    QTreeWidgetItem *childItem = new QTreeWidgetItem(item);                    workingList.append(qMakePair(childItem, obj));                }            }        }        m_treeWidget->expandItem(item);    }    m_treeWidget->horizontalScrollBar()->setValue(xoffset);    m_treeWidget->verticalScrollBar()->setValue(yoffset);    switch (selectionList.size()) {    case 0:        break;    case 1:        m_treeWidget->scrollToItem(selectionList[0]);        m_treeWidget->setCurrentItem(selectionList[0]);        break;    default:        foreach (QTreeWidgetItem* item, selectionList) {            item->setSelected(true);        }        m_treeWidget->scrollToItem(selectionList[0]);        break;    }    m_treeWidget->setUpdatesEnabled(true);    m_treeWidget->update();    if (resizeToColumn) {        m_treeWidget->resizeColumnToContents(0);    } else {        m_treeWidget->setColumnWidth(0, oldWidth);    }    m_treeWidget->selectionModel()->blockSignals(selectionBlocked);}void ObjectInspector::showContainersCurrentPage(QWidget *widget){    if (!widget)        return;    FormWindow *fw = FormWindow::findFormWindow(widget);    if (!fw)        return;    QWidget *w = widget->parentWidget();    while (1) {        if (fw->isMainContainer(w))            return;        if (!w)            return;        QDesignerContainerExtension *c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), w);        if (c && !c->widget(c->currentIndex())->isAncestorOf(widget)) {            for (int i = 0; i < c->count(); i++)                if (c->widget(i)->isAncestorOf(widget)) {                    c->setCurrentIndex(i);                    break;                }        }        w = w->parentWidget();    }}void ObjectInspector::slotSelectionChanged(const QItemSelection & /*selected*/, const QItemSelection &/*deselected*/){    if (!m_formWindow)        return;    Selection selection;    getSelection(selection);    if (!selection.m_cursorSelection.isEmpty())        showContainersCurrentPage(selection.m_cursorSelection.last());    if (!selection.m_selectedObjects.isEmpty())        showContainersCurrentPage(qobject_cast<QWidget *>(selection.m_selectedObjects[0]));    m_formWindow->clearSelection(false);    if (!selection.m_cursorSelection.empty()) {        // This will trigger an update        foreach (QWidget* widget, selection.m_cursorSelection) {            m_formWindow->selectWidget(widget);        }    } else {        if (!selection.m_selectedObjects.empty()) {            // refresh at least the property editor            core()->propertyEditor()->setObject(selection.m_selectedObjects[0]);            core()->propertyEditor()->setEnabled(selection.m_selectedObjects.size());        }    }    QMetaObject::invokeMethod(m_formWindow->core()->formWindowManager(), "slotUpdateActions");}void ObjectInspector::getSelection(Selection &s) const{    s.clear();    if (!m_formWindow)        return;    const QList<QTreeWidgetItem*> items = m_treeWidget->selectedItems();    if (items.empty())        return;    // sort objects    foreach (QTreeWidgetItem *item, items)        if (QObject *object = objectOfItem(item))            switch (selectionType(m_formWindow, object)) {            case NoSelection:                break;            case QObjectSelection:            case UnmanagedWidgetSelection:                // It is actually possible to select an action                // twice if it is in a menu bar and in a tool bar.                if (!s.m_selectedObjects.contains(object))                    s.m_selectedObjects.push_back(object);                break;            case ManagedWidgetSelection:                s.m_cursorSelection.push_back(qobject_cast<QWidget *>(object));                break;            }}void ObjectInspector::findRecursion(QTreeWidgetItem *item, QObject *o,  ItemList &matchList){    if (objectOfItem(item) == o)        matchList += item;    if (const int cc = item->childCount())        for (int i = 0;i < cc; i++)            findRecursion(item->child(i), o, matchList);}ObjectInspector::ItemList ObjectInspector::findItemsOfObject(QObject *o) const{    ItemList rc;    if (const int tlc = m_treeWidget->topLevelItemCount())        for (int i = 0;i < tlc; i++)            findRecursion(m_treeWidget->topLevelItem (i), o, rc);    return rc;}bool ObjectInspector::selectObject(QObject *o){    if (!core()->metaDataBase()->item(o))        return false;    const ItemList items = findItemsOfObject(o);    if (items.empty())        return false;    // Change in selection?    const  ItemList currentSelectedItems = m_treeWidget->selectedItems();    if (!currentSelectedItems.empty() && currentSelectedItems.toSet() == items.toSet()) {        return true;    }    // do select and update    m_treeWidget->clearSelection();    const ItemList::const_iterator cend = items.constEnd();    for (ItemList::const_iterator it = items.constBegin(); it != cend; ++it )  {        (*it)->setSelected(true);    }    m_treeWidget->scrollToItem(items.first());    return true;}void ObjectInspector::clearSelection(){    m_treeWidget->clearSelection();}void ObjectInspector::slotHeaderDoubleClicked(int column){    m_treeWidget->resizeColumnToContents(column);}QWidget *ObjectInspector::managedWidgetAt(const QPoint &global_mouse_pos){    if (!m_formWindow)        return 0;    const  QPoint pos = m_treeWidget->viewport()->mapFromGlobal(global_mouse_pos);    QTreeWidgetItem *item = m_treeWidget->itemAt(pos);    if (!item)        return 0;    QObject *o = objectOfItem(item);    if (!o->isWidgetType())        return 0;    QWidget *rc = qobject_cast<QWidget *>(o);    if (!m_formWindow->isManaged(rc))        return 0;    return rc;}void ObjectInspector::mainContainerChanged(){    // Invalidate references to objects kept in items    if (sender() == m_formWindow)        setFormWindow(0);}void  ObjectInspector::dragEnterEvent (QDragEnterEvent * event){    handleDragEnterMoveEvent(event, true);}void  ObjectInspector::dragMoveEvent(QDragMoveEvent * event){    handleDragEnterMoveEvent(event, false);}void  ObjectInspector::dragLeaveEvent(QDragLeaveEvent * /* event*/){    restoreDropHighlighting();}// Return an offset for dropping.// Position the dropped widget with form grid offset to avoid overlapping unless we// drop on a layout. Position doesn't matter there// and it enables us to drop on a squeezed layout widgetstatic inline QPoint dropPointOffset(const FormWindowBase *fw, const QWidget *dropTarget){    if (!dropTarget || dropTarget->layout())        return QPoint(0, 0);    return QPoint(fw->designerGrid().deltaX(), fw->designerGrid().deltaY());}void  ObjectInspector::dropEvent (QDropEvent * event){    if (!m_formWindow || !m_formFakeDropTarget) {        event->ignore();        return;    }    const QDesignerMimeData *mimeData =  qobject_cast<const QDesignerMimeData *>(event->mimeData());    if (!mimeData) {        event->ignore();        return;    }    const QPoint fakeGlobalDropFormPos = m_formFakeDropTarget->mapToGlobal(dropPointOffset(m_formWindow , m_formFakeDropTarget));    mimeData->moveDecoration(fakeGlobalDropFormPos + mimeData->hotSpot());    if (!m_formWindow->dropWidgets(mimeData->items(), m_formFakeDropTarget, fakeGlobalDropFormPos)) {        event->ignore();        return;    }    mimeData->acceptEvent(event);}void ObjectInspector::handleDragEnterMoveEvent(QDragMoveEvent * event, bool isDragEnter){    if (!m_formWindow) {        event->ignore();        return;    }    const QDesignerMimeData *mimeData =  qobject_cast<const QDesignerMimeData *>(event->mimeData());    if (!mimeData) {        event->ignore();        return;    }    QWidget *dropTarget = 0;    QPoint fakeDropTargetOffset = QPoint(0, 0);    if (QWidget *managedWidget = managedWidgetAt(mapToGlobal(event->pos()))) {        fakeDropTargetOffset = dropPointOffset(m_formWindow, managedWidget);        // pretend we drag over the managed widget on the form        const QPoint fakeFormPos = m_formWindow->mapFromGlobal(managedWidget->mapToGlobal(fakeDropTargetOffset));        const FormWindowBase::WidgetUnderMouseMode wum = mimeData->items().size() == 1 ? FormWindowBase::FindSingleSelectionDropTarget : FormWindowBase::FindMultiSelectionDropTarget;        dropTarget = m_formWindow->widgetUnderMouse(fakeFormPos, wum);    }    if (m_formFakeDropTarget && dropTarget != m_formFakeDropTarget)        m_formWindow->highlightWidget(m_formFakeDropTarget, fakeDropTargetOffset, FormWindow::Restore);    m_formFakeDropTarget =  dropTarget;    if (m_formFakeDropTarget)        m_formWindow->highlightWidget(m_formFakeDropTarget, fakeDropTargetOffset, FormWindow::Highlight);    // Do not refuse enter even if the area is not droppable    if (isDragEnter || m_formFakeDropTarget)        mimeData->acceptEvent(event);    else        event->ignore();}void ObjectInspector::restoreDropHighlighting(){    if (m_formFakeDropTarget) {        if (m_formWindow) {            m_formWindow->highlightWidget(m_formFakeDropTarget, QPoint(5, 5), FormWindow::Restore);        }        m_formFakeDropTarget = 0;    }}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?