2025-03-14 17:05:48 +08:00

308 lines
9.0 KiB
C++

#include "gui/GraphTool/NavigationApi/CJsonOpt.h"
#include "public/pub_utility_api/FileUtil.h"
#include "public/pub_logger_api/logger.h"
#include <QDir>
#include <QFile>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QObject>
CJsonOpt::CJsonOpt()
{
std::string currentPath = kbd_public::CFileUtil::getCurModuleDir();
QDir dir(QString::fromStdString(currentPath));
dir.cdUp();
dir.cdUp();
dir.cd("data");
dir.cd("model");
m_strButtonFile = dir.filePath("ButtonGroupWidget.json");
m_strNavFile = dir.filePath("NavigationWidget.json");
readBtnJson(m_strButtonFile);
readNavJson(m_strNavFile);
onFirst();
}
QString &CJsonOpt::getSeparatorPath()
{
return m_strSeparator;
}
QMap<QString, ST_NODE> &CJsonOpt::getButtonMap()
{
return m_mapButton;
}
ST_NODE CJsonOpt::getStButton(const QString &key)
{
return m_mapButton.value(key);
}
QMap<int, QList<QPair<int, ST_NODE> > > &CJsonOpt::getNavMap()
{
return m_mapNav;
}
bool CJsonOpt::saveJson(const QMap<QString, ST_NODE> &btMap,
const QMap<int, QList<QPair<int, ST_NODE> > > &navMap)
{
bool success = false;
success = saveButtonJson(btMap);
if(!success)
{
return false;
}
success = saveNavJson(navMap);
if(!success)
{
saveButtonJson(m_mapButton);
return false;
}
return true;
}
bool CJsonOpt::saveButtonJson(const QMap<QString, ST_NODE> &map)
{
QFile file(m_strButtonFile);
if(!file.exists())
{
file.setFileName(m_strButtonFile);
}
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
return false;
}
file.resize(0);
QJsonObject root;
root.insert("separator", m_strSeparator);
QMap<QString, ST_NODE>::const_iterator iter = map.constBegin();
for(; iter != map.constEnd(); iter++)
{
QJsonObject button;
button.insert("name", iter.value().name);
button.insert("used", iter.value().used);
button.insert("opt", iter.value().type);
button.insert("icon", iter.value().icon);
button.insert("web" , iter.value().web);
button.insert("data", iter.value().data);
button.insert("webData", iter.value().webData);
root.insert(iter.key(), button);
}
QJsonDocument doc;
doc.setObject(root);
if(-1 == file.write(doc.toJson()))
{
file.close();
return false;
}
file.close();
return true;
}
bool CJsonOpt::saveNavJson(const QMap<int, QList<QPair<int, ST_NODE> > > &map)
{
QFile file(m_strNavFile);
if(!file.exists())
{
file.setFileName(m_strNavFile);
}
if(!file.open(QIODevice::ReadWrite))
{
return false;
}
QByteArray readJson = file.readAll();
file.resize(0);
QJsonParseError readError;
QJsonDocument readJsonResponse = QJsonDocument::fromJson(readJson, &readError);
if(readError.error != QJsonParseError::NoError)
{
LOGERROR("CJsonReader error: %d, string: %s", readError.error, readError.errorString().toStdString().c_str());
return false;
}
QJsonObject root;
QJsonObject configure = readJsonResponse.object().value("configure").toObject();
root.insert("configure", configure);
root.insert("items", getSaveItems(map, -1));
QJsonDocument doc;
doc.setObject(root);
if(-1 == file.write(doc.toJson()))
{
file.close();
return false;
}
file.close();
return true;
}
void CJsonOpt::readBtnJson(const QString &path)
{
QFile file(path);
QByteArray readJson;
if(file.open(QIODevice::ReadOnly))
{
readJson = file.readAll();
file.close();
}
QJsonParseError readError;
QJsonDocument readJsonResponse = QJsonDocument::fromJson(readJson, &readError);
if(readError.error != QJsonParseError::NoError)
{
LOGERROR("CJsonReader error: %d, string: %s", readError.error, readError.errorString().toStdString().c_str());
return;
}
QJsonObject root = readJsonResponse.object();
QJsonObject::const_iterator rootIter = root.constBegin();
for(; rootIter != root.constEnd(); rootIter++)
{
if(rootIter.key() == "separator")
{
m_strSeparator = rootIter.value().toString();
continue;
}
QJsonObject item = rootIter.value().toObject();
ST_NODE st_Node;
makeStButton(st_Node, item);
m_mapButton.insert(rootIter.key(), st_Node);
}
}
void CJsonOpt::readNavJson(const QString &path)
{
QFile file(path);
QByteArray readJson;
if(file.open(QIODevice::ReadOnly))
{
readJson = file.readAll();
file.close();
}
QJsonParseError readError;
QJsonDocument readJsonResponse = QJsonDocument::fromJson(readJson, &readError);
if(readError.error != QJsonParseError::NoError)
{
LOGERROR("CJsonReader error: %d, string: %s", readError.error, readError.errorString().toStdString().c_str());
return;
}
QJsonObject root = readJsonResponse.object();
if(root.contains("items"))
{
QJsonArray itemArray = root.value("items").toArray();
int nItemNumber = 0;
for(int nIndex(0); nIndex< itemArray.size(); nIndex++)
{
ST_NODE st_Node_Top;
QJsonObject topLevelObject = itemArray[nIndex].toObject();
makeStButton(st_Node_Top, topLevelObject);
QPair<int, ST_NODE> topMap;
int nTopNumber = nItemNumber;
topMap.first = nItemNumber++;
topMap.second = st_Node_Top;
QJsonArray childArray = topLevelObject.value("items").toArray();
for(int nChildIndex(0); nChildIndex< childArray.size(); nChildIndex++)
{
ST_NODE st_Node_Child;
QJsonObject childLevelObject = childArray[nChildIndex].toObject();
makeStButton(st_Node_Child, childLevelObject);
QPair<int, ST_NODE> childMap;
int nChildNumber = nItemNumber;
childMap.first = nItemNumber++;
childMap.second = st_Node_Child;
QJsonArray leafArray = childLevelObject.value("items").toArray();
for(int nLeafIndex(0); nLeafIndex< leafArray.size(); nLeafIndex++)
{
ST_NODE st_Node_Leaf;
QJsonObject leafLevelObject = leafArray[nLeafIndex].toObject();
makeStButton(st_Node_Leaf, leafLevelObject);
QPair<int, ST_NODE> leafMap;
leafMap.first = nItemNumber++;
leafMap.second = st_Node_Leaf;
m_mapNav[nChildNumber].append(leafMap);
}
m_mapNav[nTopNumber].append(childMap);
}
m_mapNav[-1].append(topMap);
}
}
}
QJsonArray CJsonOpt::getSaveItems(const QMap<int, QList<QPair<int, ST_NODE> > > &map, int key)
{
QJsonArray root;
QList<QPair<int, ST_NODE>> rootList = map.value(key);
for(int n=0; n<rootList.length(); n++){
QJsonObject object;
object.insert("data", rootList[n].second.data);
object.insert("icon", rootList[n].second.icon);
object.insert("name", rootList[n].second.name);
object.insert("used", rootList[n].second.used);
object.insert("opt", rootList[n].second.type);
object.insert("web" , rootList[n].second.web);
object.insert("webType", rootList[n].second.webType);
object.insert("url", rootList[n].second.url);
object.insert("items", getSaveItems(map, rootList[n].first));
root.append(object);
}
return root;
}
void CJsonOpt::makeStButton(ST_NODE &st_Node, const QJsonObject &object)
{
if(!object.value("name").isUndefined())
{
st_Node.name = object.value("name").toString();
}
if(!object.value("icon").isUndefined())
{
st_Node.icon = object.value("icon").toString();
}
if(!object.value("data").isUndefined())
{
st_Node.data = object.value("data").toString();
}
if(!object.value("opt").isUndefined())
{
st_Node.type = object.value("opt").toInt();
}
if(!object.value("used").isUndefined())
{
st_Node.used = object.value("used").toInt();
}
if(!object.value("web").isUndefined())
{
st_Node.web = object.value("web").toInt();
}
if(!object.value("webData").isUndefined())
{
st_Node.webData = object.value("webData").toString();
}
if(!object.value("webType").isUndefined())
{
st_Node.webType = object.value("webType").toString();
}
if(!object.value("url").isUndefined())
{
st_Node.url = object.value("url").toString();
}
}
void CJsonOpt::onFirst()
{
if(!m_mapButton.isEmpty())
{
return;
}
QStringList navList;
for(int nIndex(0); nIndex<m_mapNav.value(-1).length(); nIndex++)
{
navList.append("1");
}
ST_NODE st_node;
st_node.name = QObject::tr("自定义项目");
st_node.type = SWITCH_NAV;
st_node.data = navList.join(",");
m_mapButton.insert("m_button1", st_node);
}