/* * RenameModuleCmd.cpp * * Created on: 2012-10-10 * Author: limengzhuo */ #include #include "RenameModuleCmd.h" #include "ModuleGraphicsItem.h" #include "ModuleConnectGraphicsItem.h" #include "PaiWorkflowDataModel.h" #include "GlobalModuleBackup.h" #include "ModuleConnection.h" #include "ModuleInformation.h" #include "GlobalWorkflowItems.h" #include "WorkflowSceneManager.h" #include "WorkFlowFile.h" using namespace pai; using namespace pai::graphics2d; using namespace pai::workflow; namespace pai { RenameModuleCmd::RenameModuleCmd(pai::graphics2d::WorkflowSceneManager *pSceneManager, pai::objectmodel::PaiWorkflowDataModel *pWorkflow, QList /*list*/, QGraphicsItem* pItem, QString newName, QUndoCommand *parent) : QUndoCommand(parent) { m_pSceneManager = pSceneManager; m_pWorkflow = pWorkflow; m_sNewName = newName; ModuleGraphicsItem *pModuleItem = dynamic_cast(pItem); if (pModuleItem) { m_stepId = pModuleItem->GetModule()->GetStepID(); if (pModuleItem->GetModule()->IsBlankModule()) { m_originalName = ""; } else { m_originalName = QString::fromStdString(pModuleItem->GetModule()->GetClassName()); } m_connectionList = GetRemovedModuleConnections(m_stepId); } else { m_stepId = 0; } } RenameModuleCmd::~RenameModuleCmd() { qDeleteAll(m_connectionList); m_connectionList.clear(); } void RenameModuleCmd::undo() { if(!m_pSceneManager) { return; } rename(m_sNewName, m_originalName); } void RenameModuleCmd::redo() { if(!m_pSceneManager) { return; } rename(m_originalName, m_sNewName); } void RenameModuleCmd::rename(QString originalName, QString newName) { m_pSceneManager->SetFocusViewport(); if (m_stepId > 0) { //在做重命名之前先清理掉模块相关所有连线 foreach(CModuleConnection *pConnection,m_connectionList) { CModuleConnection* pConnectNeedRemove = m_pWorkflow->GetConnection(pConnection); if(pConnectNeedRemove) { m_pSceneManager->DeleteConnection(pConnectNeedRemove); m_pWorkflow->RemoveConnection(pConnectNeedRemove); } } ModuleGraphicsItem *pModuleItem = GlobalWorkflowItems::GetInstance()->FindModule(m_pSceneManager, m_stepId); GlobalModuleBackup *moduleBackup = ::GetGlobalModuleBackup(); moduleBackup->RemoveBackupModule(m_pWorkflow->GetID(),pModuleItem->GetModule()); workflow::CModuleInformation* pNewModule = m_pWorkflow->ReplaceModule(pModuleItem->GetModule(), newName.toStdString()); pModuleItem->SetModule(pNewModule); moduleBackup->InsertBackupModule(m_pWorkflow->GetID(),pNewModule); //更新模块名称以后,根据模块输入端口决定是否添加连线 if(pModuleItem->GetInputPortCount() > 0) { foreach(CModuleConnection *pConnection,m_connectionList) { if(pConnection->GetDestId() == m_stepId) { CModuleConnection* pNewConnection = new CModuleConnection(); pConnection->CopyTo(*pNewConnection); m_pWorkflow->AddConnection(pNewConnection); m_pSceneManager->AddConnection(pNewConnection); } } } //更新模块名称以后,根据模块输出端口决定是否添加连线 if(pModuleItem->GetOutputPortCount() > 0) { foreach(CModuleConnection *pConnection,m_connectionList) { if(pConnection->GetSourceId() == m_stepId) { CModuleConnection* pNewConnection = new CModuleConnection(); pConnection->CopyTo(*pNewConnection); m_pWorkflow->AddConnection(pNewConnection); m_pSceneManager->AddConnection(pNewConnection); } } } //保证改名后进行一次模块验证的结果能进行模块颜色和submit按钮的状态的设置 if (pNewModule->IsBlankModule()) { pai::graphics2d::PaiModuleStyle* pStyle = new PaiModuleStyle(); pModuleItem->SetStyle(pStyle); pModuleItem->SetInitialValidated(false); } if (originalName != newName) { pModuleItem->SetDisable(false); } pModuleItem->update(); if(pModuleItem && pModuleItem->GetModule()) { m_pSceneManager->SelectModuleItem(pModuleItem->GetModule()->GetStepID()); } if (pNewModule->IsBlankModule()) { pai::graphics2d::ModuleGraphicsItem::m_EventAgent.ItemSetName(pModuleItem); } } } QList RenameModuleCmd::GetRemovedModuleConnections(int stepId) { QList connectionList; connectionList.clear(); for (unsigned int i = 0; i < m_pWorkflow->GetWorkflowFile()->GetModuleConnections()->size(); i++) { workflow::CModuleConnection* pConnection = m_pWorkflow->GetWorkflowFile()->GetModuleConnections()->at(i); if (pConnection->GetDestId() == stepId || pConnection->GetSourceId() == stepId) { workflow::CModuleConnection* pConnectionBackup = new workflow::CModuleConnection(); pConnection->CopyTo(*pConnectionBackup); connectionList << pConnectionBackup; } } return connectionList; } }