378 lines
10 KiB
C++
378 lines
10 KiB
C++
/*
|
||
* ParameterProperty.cpp
|
||
*
|
||
* Created on: 2011-9-19
|
||
* Author: dev
|
||
*/
|
||
#include <cassert>
|
||
#include <QtDebug>
|
||
#include "ParameterProperty.h"
|
||
#include "ModuleParameter.h"
|
||
// #include "ModuleParameterUtil.h"
|
||
#include "GeometryUtils.h"
|
||
using namespace std;
|
||
using namespace pai::module;
|
||
using namespace pai::graphics2d;
|
||
|
||
ParameterProperty::ParameterProperty(pai::module::CParameterItem *parameterItem,const QString &categoryname)
|
||
:m_parameterItem(parameterItem), m_categoryName(categoryname), m_strError(""),m_parent(NULL)
|
||
{
|
||
|
||
}
|
||
void ParameterProperty::SetCategoryName(QString categoryName)
|
||
{
|
||
m_categoryName=categoryName;
|
||
}
|
||
ParameterProperty::~ParameterProperty()
|
||
{
|
||
qDeleteAll(m_child.begin(),m_child.end());
|
||
m_child.clear();
|
||
}
|
||
|
||
void ParameterProperty::SetWorkflowID(QUuid workflowID)
|
||
{
|
||
m_workflowID = workflowID;
|
||
}
|
||
|
||
QUuid ParameterProperty::GetWorkflowID()
|
||
{
|
||
return m_workflowID;
|
||
}
|
||
|
||
bool ParameterProperty::IsRoot() const
|
||
{
|
||
return (m_categoryName=="") && (m_parameterItem==NULL);
|
||
}
|
||
|
||
bool ParameterProperty::IsCategory() const
|
||
{
|
||
return (m_categoryName!=""); //&& (m_parameterItem==NULL);
|
||
}
|
||
|
||
bool ParameterProperty::IsParameterItem() const
|
||
{
|
||
return (m_categoryName=="") && (m_parameterItem!=NULL);
|
||
}
|
||
|
||
void ParameterProperty::AddChild(ParameterProperty *parameterItem,int pos)
|
||
{
|
||
if(parameterItem == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
parameterItem->m_parent=this;
|
||
parameterItem->SetWorkflowID(GetWorkflowID());
|
||
if(pos>-1) {
|
||
m_child.insert(pos,parameterItem);
|
||
}
|
||
else m_child.append(parameterItem);
|
||
}
|
||
|
||
ParameterProperty* ParameterProperty::AddChild(pai::module::CParameterItem *paramItem,const QString & categoryname,int pos)
|
||
{
|
||
if(!Contains(ParameterProperty(paramItem,categoryname)))
|
||
{
|
||
ParameterProperty *param = new ParameterProperty(paramItem,categoryname);
|
||
this->AddChild(param,pos);
|
||
return param;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
ParameterProperty* ParameterProperty::GetChild(int index)
|
||
{
|
||
if(index<0 || index >m_child.count())
|
||
{
|
||
return NULL;
|
||
}
|
||
return m_child.at(index);
|
||
}
|
||
|
||
int ParameterProperty::GetRow() const
|
||
{
|
||
if(m_parent==NULL)
|
||
{
|
||
return -1;
|
||
}
|
||
return m_parent->m_child.indexOf(const_cast<ParameterProperty*>(this));
|
||
}
|
||
std::string ParameterProperty::GetParameterItemID() const
|
||
{
|
||
if(IsParameterItem() && m_parameterItem)
|
||
{
|
||
return m_parameterItem->GetId();
|
||
}
|
||
return "";
|
||
}
|
||
QString ParameterProperty::GetDisplayName() const
|
||
{
|
||
QString cs;
|
||
if(this->IsCategory())
|
||
return m_categoryName;
|
||
if(this->IsParameterItem())
|
||
{
|
||
cs=m_parameterItem->GetName();
|
||
}
|
||
return cs;
|
||
}
|
||
QString ParameterProperty::GetDisplayValue() const
|
||
{
|
||
QString cs;
|
||
if(this->IsParameterItem() && m_parameterItem)
|
||
{
|
||
if(m_parameterItem->GetInputType()==HDFSFILEBROWSER || m_parameterItem->GetInputType() == HDFSFILEEDITOR)
|
||
{
|
||
cs=QString::fromStdString(m_parameterItem->GetDefault());
|
||
}
|
||
cs=QString::fromStdString(m_parameterItem->GetStringValue());
|
||
}
|
||
return cs;
|
||
}
|
||
pai::module::ParameterType ParameterProperty::GetType() const
|
||
{
|
||
if(this->IsParameterItem() && m_parameterItem)
|
||
{
|
||
return m_parameterItem->GetType();
|
||
}
|
||
return pai::module::ParmType_STRING;
|
||
|
||
}
|
||
|
||
pai::module::ParameterInputType ParameterProperty::GetInputType() const
|
||
{
|
||
if(this->IsParameterItem())
|
||
{
|
||
return m_parameterItem->GetInputType();
|
||
}
|
||
return pai::module::NONEINPUT;
|
||
|
||
}
|
||
|
||
QList<QUuid> ParameterProperty::GetAcceptDropTypes() const
|
||
{
|
||
// if(IsParameterItem())
|
||
// {
|
||
// return pai::ModuleParameterUtil::GetAcceptDropTypes(m_parameterItem);
|
||
// }
|
||
QList<QUuid> lstEmpty;
|
||
return lstEmpty;
|
||
}
|
||
|
||
pai::module::CParameterItem *ParameterProperty::GetParamItem() const
|
||
{
|
||
return m_parameterItem;
|
||
}
|
||
void ParameterProperty::SetParameterItem(pai::module::CParameterItem * pParameterItem)
|
||
{
|
||
assert(pParameterItem!=NULL && pParameterItem->GetType() == pai::module::ParmType_ARRAY);
|
||
m_parameterItem = pParameterItem;
|
||
}
|
||
|
||
QString ParameterProperty::GetErrorMessage() const
|
||
{
|
||
return m_strError;
|
||
}
|
||
|
||
void ParameterProperty::SetErrorMessage(const QString& strErrMsg)
|
||
{
|
||
if (IsParameterItem())
|
||
{
|
||
//前台对于空的必填项的错误信息做一个过滤ToDo
|
||
//如果是必填项但值是空,则忽略错误;或者如果设置错误信息为空,则需要更新界面,常见于ClearAllErrorMessage。
|
||
ParameterType paramType = m_parameterItem->GetType();
|
||
if (!(m_parameterItem->IsNessary() && m_parameterItem->GetStringValue().empty()
|
||
&& (ParmType_ARRAY != paramType && ParmType_CUSTOM != paramType)) || strErrMsg.isEmpty())
|
||
{
|
||
m_strError = strErrMsg;
|
||
emit signalSetErrorMessage(m_strError);
|
||
}
|
||
}
|
||
}
|
||
|
||
bool ParameterProperty::IsError() const
|
||
{
|
||
return m_strError!="";
|
||
}
|
||
|
||
ParameterProperty * ParameterProperty::GetParameterPropertyWithValidInputType(const std::string& strParameterItemID)
|
||
{
|
||
ParameterProperty *pDefaultParameterProperty = GetParameterProperty(strParameterItemID);
|
||
if(pDefaultParameterProperty != NULL )
|
||
{
|
||
return pDefaultParameterProperty;
|
||
}
|
||
std::string strID(strParameterItemID);
|
||
if((strID.rfind(".")!=std::string::npos) || (']' == *strID.rbegin()))
|
||
{
|
||
size_t nPos;
|
||
if(']' == *strID.rbegin())//说明是数组的数组子项
|
||
{
|
||
nPos = strID.rfind('[');
|
||
}
|
||
else
|
||
{
|
||
nPos = strID.rfind('.');
|
||
}
|
||
strID.replace(nPos,strID.length()-nPos,"");//取得父参数项的ID
|
||
return GetParameterPropertyWithValidInputType(strID);
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
ParameterProperty * ParameterProperty::GetParameterProperty(const std::string& strParameterItemID)
|
||
{
|
||
if((m_parameterItem!=NULL && m_parameterItem->GetId() == strParameterItemID) || (m_categoryName.toStdString() == strParameterItemID))
|
||
{
|
||
return this;
|
||
}
|
||
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
ParameterProperty * pResult=pChild->GetParameterProperty(strParameterItemID);
|
||
if(pResult!=NULL)
|
||
{
|
||
return pResult;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
ParameterProperty * ParameterProperty::GetParameterPropertyByInputData(const std::string& strParameterItemInputData)
|
||
{
|
||
if(m_parameterItem!=NULL && m_parameterItem->GetInputData().find(strParameterItemInputData)!=string::npos)
|
||
{
|
||
return this;
|
||
}
|
||
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
if(pChild == NULL)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
ParameterProperty * pResult=pChild->GetParameterPropertyByInputData(strParameterItemInputData);
|
||
if(pResult!=NULL)
|
||
{
|
||
return pResult;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void ParameterProperty::ClearAllErrorMessage()
|
||
{
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
if(pChild)
|
||
{
|
||
pChild->ClearAllErrorMessage();
|
||
}
|
||
}
|
||
SetErrorMessage("");
|
||
emit signalFinishValidation();
|
||
}
|
||
|
||
bool ParameterProperty::operator ==(const ParameterProperty& srcParameterProperty) const
|
||
{
|
||
return (m_parameterItem == srcParameterProperty.m_parameterItem) && (m_categoryName == srcParameterProperty.m_categoryName);
|
||
}
|
||
bool ParameterProperty::operator !=(const ParameterProperty& srcParameterProperty) const
|
||
{
|
||
return !(*this == srcParameterProperty);
|
||
}
|
||
bool ParameterProperty::ContainFILEBROWSERItem()
|
||
{
|
||
if(this->GetInputType() == HDFSFILEBROWSER)
|
||
{
|
||
return true;
|
||
}
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
if((pChild != NULL) && (pChild->ContainFILEBROWSERItem()))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
bool ParameterProperty::ContainsOverWriteItem()
|
||
{
|
||
if(this->GetInputType() == CHECKBOX)
|
||
{
|
||
if (std::string::npos != m_parameterItem->GetId().find(".outputoverwrite"))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
if((pChild != NULL) && (pChild->ContainsOverWriteItem()))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
bool ParameterProperty::Contains(const ParameterProperty& parameterProperty) const
|
||
{
|
||
if(*this == parameterProperty)
|
||
{
|
||
return true;
|
||
}
|
||
foreach(ParameterProperty * pChild,m_child)
|
||
{
|
||
if((pChild != NULL) && (pChild->Contains(parameterProperty)))
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
int ParameterProperty::RemoveChild(const std::string& strParameterItemID)
|
||
{
|
||
if(strParameterItemID == "")
|
||
{
|
||
return -1;
|
||
}
|
||
ParameterProperty* pParameterProperty = GetParameterProperty(strParameterItemID);
|
||
if(pParameterProperty != NULL)
|
||
{
|
||
//TODO 这里没有递归,所以本函数仅适用于叶子节点
|
||
ParameterProperty* pParent = pParameterProperty->GetParent();
|
||
int nIndex = pParent->m_child.indexOf(pParameterProperty);
|
||
pParent->m_child.removeAt(nIndex);
|
||
delete pParameterProperty;
|
||
pParameterProperty = NULL;
|
||
return nIndex;
|
||
}
|
||
return -1;
|
||
}
|
||
void ParameterProperty::HideShowItemsIcon(bool hide)
|
||
{
|
||
emit signalHideShowItemsIcon(hide);
|
||
}
|
||
void ParameterProperty::HandleDeleteButton()
|
||
{
|
||
//对于含有"KeepOneRow"属性的Array节点处理删除按钮的出现与消失,如果Array孩子只剩一个就让相关节点隐藏删除按钮,如果Array孩子变为两个则使第一个孩子的相关节点出现删除按钮
|
||
if(m_parameterItem != NULL
|
||
&& m_parameterItem->GetType() == pai::module::ParmType_ARRAY
|
||
&& m_parameterItem->GetInputData().find("KeepOneRow")!=std::string::npos)
|
||
{
|
||
CCompositeParameterItem* pArrayParameterItem = dynamic_cast<CCompositeParameterItem*>(m_parameterItem);
|
||
if(pArrayParameterItem != NULL)
|
||
{
|
||
int nArrayChildCount = pArrayParameterItem->GetChildCount();
|
||
if(nArrayChildCount==1 || nArrayChildCount==2)
|
||
{
|
||
ParameterProperty* pChildHasDeleteButton = GetParameterPropertyByInputData("HasDeleteButton");
|
||
if(pChildHasDeleteButton != NULL)
|
||
{
|
||
emit pChildHasDeleteButton->signalShouldShowDeleteButton((nArrayChildCount == 1)?false:true);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|