308 lines
9.0 KiB
C++
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);
|
|
}
|