#include "TreeWidget.h" #include "OperatorsInterface/ParaWidgetInterfaceOperator.h" #include "OperatorsInterface/GraphEventOperator.h" #include "PostGraphAdaptor/PostGraphObjectManager.h" #include "PostGraphAdaptor/PostGraphObjectBase.h" #include "FITK_Kernel/FITKCore/FITKOperatorRepo.h" #include "FITK_Kernel/FITKCore/FITKActionOperator.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostEnum.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKAbstractCFDPostData.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPost3DManager.h" #include "FITK_Interface/FITKInterfaceCFDPost/FITKCFDPostData.h" #include #define TreeItemPostDataID Qt::UserRole+1 #define TreeItemType Qt::UserRole+2 Q_DECLARE_METATYPE(Interface::FITKPostDataType) namespace GUI { TreeWidget::TreeWidget(QWidget* parent) : QTreeWidget(parent) { _postDataManager = FITKAPP->getGlobalData()->getPostData()->getPostDataManager(); _postGraphManager = Interface::PostGraphObjectManager::getInstance(); //右键 不可少否则右键无反应 setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(slotItemClecked(QTreeWidgetItem*, int))); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onModelCustomContextMenu(QPoint))); //隐藏列标题 setHeaderHidden(true); updateTree(); } TreeWidget::~TreeWidget() { if (_rootItem != nullptr) _rootItem->takeChildren(); } void TreeWidget::updateTree() { this->clear(); _itemHash.clear(); _rootItem = new QTreeWidgetItem; _rootItem->setText(0, "Graph Object"); this->addTopLevelItem(_rootItem); QTreeWidgetItem* currentItem = nullptr; QTreeWidgetItem* firstItem = nullptr; for (int i = 0; i < _postDataManager->getDataCount(); i++) { Interface::FITKAbstractCFDPostData* postData = _postDataManager->getDataByIndex(i); if (postData == nullptr)continue; int dataID = postData->getDataObjectID(); int parentID = postData->getCFDPostParentID(); QString dataName = postData->getDataObjectName(); QTreeWidgetItem* parentItem = _itemHash.value(parentID); QTreeWidgetItem* item = nullptr; if (parentItem) { item = new QTreeWidgetItem(parentItem); } else { item = new QTreeWidgetItem(_rootItem); } _itemHash.insert(dataID, item); if (i == 0) { firstItem = item; } if (_currentObjID == dataID) { currentItem = item; } Qt::CheckState state = Qt::Checked; if (postData->isEnable() == false)state = Qt::Unchecked; item->setText(0,dataName); item->setData(0, TreeItemPostDataID, dataID); Interface::FITKPostDataType type = postData->getPostDataType(); item->setData(0, TreeItemType, QVariant::fromValue(type)); item->setCheckState(0, state); } //展开全部子集 setItemsExpandable(true); expandAll(); if (currentItem) { setCurrentItem(currentItem); slotItemClecked(currentItem, 0); } else { setCurrentItem(firstItem); slotItemClecked(firstItem, 0); } } int TreeWidget::getCurrentDataID() { return _currentObjID; } void TreeWidget::slotItemClecked(QTreeWidgetItem * item, int index) { Q_UNUSED(index); if (item == nullptr)return; int objID = item->data(0, TreeItemPostDataID).toInt(); _currentObjID = objID; Interface::FITKPostDataType type = item->data(0, TreeItemType).value(); QString actionName = ""; QMenu menu; if (!actionName.isEmpty()) { QObject sender; sender.setObjectName(actionName); auto acOper = Core::FITKOperatorRepo::getInstance()->getOperatorT(actionName); if (acOper == nullptr)return; acOper->setEmitter(&sender); acOper->setArgs("objID", objID); acOper->actionTriggered(); } //更新渲染窗口 bool show = (item->checkState(0) == Qt::Checked); EventOper::GraphEventOperator* graphOper = FITKOPERREPO->getOperatorT("OperGraphPreprocess"); if (graphOper == nullptr)return; graphOper->updateShow(objID, show); graphOper->reRender(); //更新信息界面 EventOper::ParaWidgetInterfaceOperator* infoOper = FITKOPERREPO->getOperatorT("OperatorsWidget"); if (infoOper) { infoOper->CurrentObjectChange(objID); } } void TreeWidget::onModelCustomContextMenu(QPoint point) { Q_UNUSED(point); QTreeWidgetItem* item = this->currentItem(); if (item == nullptr)return; int curItemChildNum = item->childCount(); int objID = item->data(0, TreeItemPostDataID).toInt(); Interface::FITKPostDataType type = item->data(0, TreeItemType).value(); QString actionName = ""; QMenu menu; //删除是否可用 bool deleteIsEnable = true; if (curItemChildNum > 0)deleteIsEnable = false; switch (type){ case Interface::FITKPostDataType::Post_None: break; case Interface::FITKPostDataType::Post_Steady: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); break; case Interface::FITKPostDataType::Post_UnSteady: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); break; case Interface::FITKPostDataType::Post_Isosurface: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionIsosurfEdit", "Edit"); break; case Interface::FITKPostDataType::Post_ClipPlane: case Interface::FITKPostDataType::Post_ClipSphere: case Interface::FITKPostDataType::Post_ClipCylinder: case Interface::FITKPostDataType::Post_ClipBox: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionClipEdit", "Edit"); break; case Interface::FITKPostDataType::Post_SlicePlane: case Interface::FITKPostDataType::Post_SliceSphere: case Interface::FITKPostDataType::Post_SliceCylinder: case Interface::FITKPostDataType::Post_SliceBox: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionSliceEdit", "Edit"); break; case Interface::FITKPostDataType::Post_StreamLine: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionStreamlineEdit", "Edit"); break; case Interface::FITKPostDataType::Post_Glyph: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionGlyphEdit", "Edit"); break; case Interface::FITKPostDataType::Post_Threshold: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionThresholdEdit", "Edit"); break; case Interface::FITKPostDataType::Post_Deform: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionDeformEdit", "Edit"); break; case Interface::FITKPostDataType::Post_Probe: addMenuActions(menu, "actionGraphDelete", "Delete", deleteIsEnable); addMenuActions(menu, "actionProbeEdit", "Edit"); break; } if (menu.actions().size() == 0) return; // 在鼠标点击位置执行上下文菜单 menu.exec(QCursor::pos()); } void TreeWidget::slotAcitonClicked() { QTreeWidgetItem* item = this->currentItem(); if (item == nullptr)return; int objID = item->data(0, TreeItemPostDataID).toInt(); QObject* senderObject = sender(); if (senderObject == nullptr)return; auto acOper = Core::FITKOperatorRepo::getInstance()->getOperatorT(senderObject->objectName()); if (acOper == nullptr)return; acOper->setEmitter(senderObject); acOper->setArgs("objID", objID); acOper->actionTriggered(); } void TreeWidget::addMenuActions(QMenu & menu, QString actions, QString objectName, bool isEnable) { QAction* act = menu.addAction(objectName); // 添加动作 act->setObjectName(actions); act->setEnabled(isEnable); connect(act, SIGNAL(triggered()), this, SLOT(slotAcitonClicked())); } }