logplus/ModuleConsole/src/ComplexInputDataParser.cpp
2026-01-16 17:18:41 +08:00

210 lines
6.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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();
}