210 lines
6.9 KiB
C++
210 lines
6.9 KiB
C++
/*
|
||
* ComplexInputDataParser.cpp
|
||
*
|
||
* Created on: 2012-7-26
|
||
* Author: limengzhuo
|
||
*/
|
||
#include <QAbstractItemModel>
|
||
#include <QtDebug>
|
||
#include "ComplexInputDataParser.h"
|
||
|
||
using namespace pai::graphics2d;
|
||
|
||
ItemData::ItemData(QModelIndex parentIndex, QString destItemIDs, QString destCategorys, QString property, QString value, QString parentID)
|
||
{
|
||
m_parentIndex = parentIndex;
|
||
m_property = property;
|
||
m_value = value;
|
||
m_parentID = parentID;
|
||
if (destItemIDs == "" && destCategorys != "")
|
||
m_destCategoryList = destCategorys.split(':');
|
||
|
||
if (destItemIDs != "" && destCategorys == "")
|
||
m_destItemIDList = destItemIDs.split(':');
|
||
}
|
||
|
||
QStringList ItemData::GetDestItemIDList()
|
||
{
|
||
return m_destItemIDList;
|
||
}
|
||
|
||
QStringList ItemData::GetDestCategoryList()
|
||
{
|
||
return m_destCategoryList;
|
||
}
|
||
|
||
QModelIndex ItemData::GetParentIndex()
|
||
{
|
||
return m_parentIndex;
|
||
}
|
||
|
||
QString ItemData::GetParentID()
|
||
{
|
||
return m_parentID;
|
||
}
|
||
|
||
QString ItemData::GetValue()
|
||
{
|
||
return m_value;
|
||
}
|
||
|
||
QString ItemData::GetProperty()
|
||
{
|
||
return m_property;
|
||
}
|
||
|
||
ComplexInputDataParser::ComplexInputDataParser(QModelIndex inputIndex, QString inputData, QString inputValue, std::string inputID)
|
||
{
|
||
|
||
m_inputValue = inputValue;
|
||
m_inputIndex = inputIndex;
|
||
|
||
QString strOnClick("onclick=");
|
||
int nPos0 = inputData.indexOf(strOnClick);
|
||
int nLengthOfOnClick = strOnClick.length();
|
||
QString strScriptContents = inputData.mid(nPos0 + nLengthOfOnClick);//这里截取到onclick=之后的内容
|
||
|
||
QStringList strScriptSentences = strScriptContents.split(';');//用;进行分割
|
||
foreach(QString strScriptFunction, strScriptSentences)
|
||
{
|
||
QStringList lstFunction = strScriptFunction.split('=');//用=进行分
|
||
|
||
if (lstFunction.size() < 2)
|
||
continue;
|
||
|
||
QString strParentID;
|
||
size_t nLastPointPos = inputID.rfind('.');
|
||
//获得parentID.
|
||
if (nLastPointPos != std::string::npos)
|
||
{
|
||
strParentID = QString::fromStdString(inputID.substr(0, nLastPointPos + 1));//把.也包括进去。
|
||
}
|
||
|
||
QStringList lstItemsAndProperties = lstFunction[0].split('.');//用.进行分
|
||
|
||
QString destItemIDs;
|
||
QString destCategoryIDs;
|
||
QModelIndex parentIndex;
|
||
QString strPropertyName;
|
||
|
||
//解析等于号的左边,获得被控制控件的parentIndex, 控制属性名称strPropertyName,被控制控件的ID列表字符串destItemIDs。
|
||
for (int i = 0; i < lstItemsAndProperties.size(); i++)
|
||
{
|
||
if (lstItemsAndProperties[i].trimmed() == "this")
|
||
{
|
||
parentIndex = m_inputIndex;
|
||
}
|
||
else if (lstItemsAndProperties[i].trimmed() == "parentNode")
|
||
{
|
||
parentIndex = parentIndex.parent();
|
||
}
|
||
else if (lstItemsAndProperties[i].contains("category["))
|
||
{
|
||
int nIDStartPos = lstItemsAndProperties[i].indexOf("category[") + 9;
|
||
int nIDLastPos = lstItemsAndProperties[i].indexOf(']');
|
||
destCategoryIDs = lstItemsAndProperties[i].mid(nIDStartPos, nIDLastPos - nIDStartPos);
|
||
}
|
||
else if (lstItemsAndProperties[i].contains("item["))
|
||
{
|
||
int nIDStartPos = lstItemsAndProperties[i].indexOf("item[") + 5;
|
||
int nIDLastPos = lstItemsAndProperties[i].indexOf(']');
|
||
destItemIDs = lstItemsAndProperties[i].mid(nIDStartPos, nIDLastPos - nIDStartPos);
|
||
}
|
||
else if (lstItemsAndProperties[i].trimmed() == "display")
|
||
{
|
||
strPropertyName = "Visible";
|
||
}
|
||
else if (lstItemsAndProperties[i].trimmed() == "ability")
|
||
{
|
||
strPropertyName = "Ability";
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
}//end of for
|
||
|
||
QString strItemValue;
|
||
QStringList lstFindItemValue = lstFunction[1].split('.');
|
||
|
||
//解析等于号的右边,获得控制属性的值。
|
||
for (int i = 0; i < lstFindItemValue.size(); i++)
|
||
{
|
||
if (lstFindItemValue[i].contains("item["))
|
||
{
|
||
int nIDStartPos = lstFindItemValue[i].indexOf("item[") + 5;
|
||
int nIDLastPos = lstFindItemValue[i].indexOf(']');
|
||
strItemValue = lstFindItemValue[i].mid(nIDStartPos, nIDLastPos - nIDStartPos);
|
||
}
|
||
else if (lstFindItemValue[i].contains("checked?"))
|
||
{
|
||
int nStartPos = lstFindItemValue[i].indexOf("checked?") + 8;
|
||
QString checkString = lstFindItemValue[i].mid(nStartPos);
|
||
QStringList lstCheckValue = checkString.split(':');
|
||
strItemValue = lstCheckValue[0] == "true" || lstCheckValue[0] == "enable" ? "1" : "0";
|
||
}
|
||
}//end of for
|
||
|
||
//使用上面获得的值,构造ItemData并添加到列表中。
|
||
if (strPropertyName.isEmpty() == false)
|
||
{
|
||
if (destItemIDs.size() <= 0)
|
||
{
|
||
ItemData itemData(parentIndex, "", destCategoryIDs, strPropertyName, strItemValue, strParentID);
|
||
m_itemDataList.append(itemData);
|
||
}
|
||
else
|
||
{
|
||
ItemData itemData(parentIndex, destItemIDs, "", strPropertyName, strItemValue, strParentID);
|
||
m_itemDataList.append(itemData);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
QList<ItemData> ComplexInputDataParser::GetItemDataList()
|
||
{
|
||
return m_itemDataList;
|
||
}
|
||
|
||
std::string ComplexInputDataParser::ResetInputDataString(std::string inputdata, QString property, QString itemValue)
|
||
{
|
||
if (property == "Visible")
|
||
{
|
||
std::string strVisibleInputData = inputdata;
|
||
std::string strInvisible("Invisible;");
|
||
size_t nKeyPos = strVisibleInputData.find(strInvisible);
|
||
if (itemValue == m_inputValue && nKeyPos != std::string::npos)
|
||
{
|
||
strVisibleInputData = strVisibleInputData.replace(nKeyPos, strInvisible.length(), "");
|
||
}
|
||
else if (nKeyPos == std::string::npos)
|
||
{
|
||
strVisibleInputData = strInvisible + strVisibleInputData;
|
||
}
|
||
return strVisibleInputData;
|
||
}
|
||
|
||
if (property == "Ability")
|
||
{
|
||
std::string strAbilityInputData = inputdata;
|
||
std::string strDisable("Disable;");
|
||
size_t nKeyPos = strAbilityInputData.find(strDisable);
|
||
if (itemValue == m_inputValue && nKeyPos != std::string::npos)
|
||
{
|
||
strAbilityInputData = strAbilityInputData.replace(nKeyPos, strDisable.length(), "Enable;");
|
||
}
|
||
else if (nKeyPos == std::string::npos)
|
||
{
|
||
std::string strEnable("Enable;");
|
||
size_t nKey = strAbilityInputData.find(strEnable);
|
||
if (nKey != std::string::npos)
|
||
{
|
||
strAbilityInputData = strAbilityInputData.replace(nKey, strEnable.length(), "Disable;");
|
||
}
|
||
}
|
||
return strAbilityInputData;
|
||
}
|
||
return std::string();
|
||
}
|