File indexing completed on 2024-05-12 17:11:42
0001 /*************************************************************************** 0002 * Copyright (C) 2022 by Renaud Guezennec * 0003 * http://www.rolisteam.org/contact * 0004 * * 0005 * This software is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 * * 0010 * This program is distributed in the hope that it will be useful, * 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0013 * GNU General Public License for more details. * 0014 * * 0015 * You should have received a copy of the GNU General Public License * 0016 * along with this program; if not, write to the * 0017 * Free Software Foundation, Inc., * 0018 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 0019 ***************************************************************************/ 0020 #include "serializerhelper.h" 0021 0022 #include "controllers/maincontroller.h" 0023 #include "controllers/qmlgeneratorcontroller.h" 0024 0025 #include "charactersheet/worker/ioworker.h" 0026 0027 #include <QFontDatabase> 0028 0029 namespace SerializerHelper 0030 { 0031 0032 QByteArray buildData(rcse::MainController* ctrl) 0033 { 0034 QJsonDocument json; 0035 QJsonObject obj= saveGeneratorController(ctrl->generatorCtrl()); 0036 0037 obj[keys::pageCount]= static_cast<int>(ctrl->editCtrl()->pageCount()); 0038 obj[keys::uuid]= ctrl->imageCtrl()->uuid(); 0039 0040 // background 0041 auto img= IOWorker::saveImageModel(ctrl->imageCtrl()->model()); 0042 obj[keys::background]= img; 0043 0044 ctrl->characterCtrl()->save(obj); 0045 json.setObject(obj); 0046 0047 return json.toJson(); 0048 } 0049 QJsonObject saveFieldModel(FieldModel* model) 0050 { 0051 QJsonObject obj; 0052 auto root= model->getRootSection(); 0053 root->save(obj, false); 0054 return obj; 0055 } 0056 0057 void fetchGeneratorController(QmlGeneratorController* ctrl, const QJsonObject& obj) 0058 { 0059 ctrl->setHeadCode(obj["additionnalHeadCode"].toString("")); 0060 if(ctrl->headCode().isEmpty()) 0061 ctrl->setHeadCode(obj["additionnalCode"].toString("")); 0062 ctrl->setImportCode(obj["additionnalImport"].toString("")); 0063 ctrl->setFixedScale(obj["fixedScale"].toDouble(1.0)); 0064 ctrl->setBottomCode(obj["additionnalBottomCode"].toString("")); 0065 QString qml= obj[keys::qml].toString(); 0066 ctrl->setQmlCode(qml); 0067 0068 const auto fonts= obj["fonts"].toArray(); 0069 QStringList fontNames; 0070 for(const auto obj : fonts) 0071 { 0072 const auto font= obj.toObject(); 0073 const auto fontData= QByteArray::fromBase64(font["data"].toString("").toLatin1()); 0074 QFontDatabase::addApplicationFontFromData(fontData); 0075 0076 fontNames << font["name"].toString(); 0077 } 0078 ctrl->setFonts(fontNames); 0079 auto model= ctrl->fieldModel(); 0080 0081 model->load(obj["data"].toObject()); 0082 } 0083 0084 void fetchMainController(rcse::MainController* ctrl, const QJsonObject& jsonObj) 0085 { 0086 ctrl->cleanUpData(false); 0087 QJsonObject data= jsonObj[keys::data].toObject(); 0088 0089 int pageCount= jsonObj[keys::pageCount].toInt(); 0090 ctrl->imageCtrl()->setUuid(jsonObj[keys::uuid].toString(QUuid::createUuid().toString(QUuid::WithoutBraces))); 0091 0092 // ui->m_codeEdit->setPlainText(qml); 0093 0094 QJsonArray images= jsonObj["background"].toArray(); 0095 0096 QJsonArray backGround; 0097 std::copy_if(images.begin(), images.end(), std::back_inserter(backGround), [](const QJsonValue& val) { 0098 auto obj= val.toObject(); 0099 return obj["isBg"].toBool(); 0100 }); 0101 0102 QJsonArray regularImage; 0103 std::copy_if(images.begin(), images.end(), std::back_inserter(regularImage), [](const QJsonValue& val) { 0104 auto obj= val.toObject(); 0105 return !obj["isBg"].toBool(); 0106 }); 0107 0108 for(auto img : qAsConst(regularImage)) 0109 { 0110 auto oj= img.toObject(); 0111 QPixmap pix; 0112 QString str= oj["bin"].toString(); 0113 QString path= oj["filename"].toString(); 0114 QByteArray array= QByteArray::fromBase64(str.toUtf8()); 0115 0116 pix.loadFromData(array); 0117 ctrl->imageCtrl()->addImage(pix, path); 0118 } 0119 0120 QPixmap refBgImage; 0121 for(int i= 0; i < pageCount; ++i) 0122 { 0123 QString path; 0124 QString id; 0125 QPixmap pix; 0126 if(i < backGround.size()) 0127 { 0128 auto oj= backGround[i].toObject(); 0129 QString str= oj["bin"].toString(); 0130 id= oj["key"].toString(); 0131 if(oj.contains("filename")) 0132 path= oj["filename"].toString(); 0133 QByteArray array= QByteArray::fromBase64(str.toUtf8()); 0134 0135 pix.loadFromData(array); 0136 if(refBgImage.isNull()) 0137 refBgImage= pix; 0138 } 0139 else 0140 { 0141 if(refBgImage.isNull()) 0142 refBgImage= QPixmap(800, 600); 0143 pix= refBgImage; 0144 } 0145 auto idx= ctrl->editCtrl()->addPage(); 0146 if(!backGround.isEmpty()) 0147 { 0148 auto model= ctrl->imageCtrl()->model(); 0149 model->insertImage(pix, id, path, false); //->addBackgroundImage(idx, pix, path, id); 0150 ctrl->editCtrl()->setImageBackground(idx, pix, path); 0151 } 0152 } 0153 0154 fetchGeneratorController(ctrl->generatorCtrl(), jsonObj); 0155 ctrl->characterCtrl()->setRootSection(ctrl->generatorCtrl()->fieldModel()->getRootSection()); 0156 ctrl->characterCtrl()->load(jsonObj, false); 0157 0158 auto model= ctrl->generatorCtrl()->fieldModel(); 0159 auto const& allChildren= model->allChildren(); 0160 for(auto child : allChildren) 0161 { 0162 ctrl->editCtrl()->addFieldItem(child); 0163 } 0164 } 0165 0166 QJsonObject saveGeneratorController(QmlGeneratorController* ctrl) 0167 { 0168 QJsonObject obj; 0169 obj[keys::data]= saveFieldModel(ctrl->fieldModel()); 0170 0171 // qml file 0172 obj[keys::qml]= ctrl->qmlCode(); 0173 obj[keys::headCode]= ctrl->headCode(); 0174 obj[keys::imports]= ctrl->importCode(); 0175 obj[keys::fixedScale]= ctrl->fixedScale(); 0176 obj[keys::bottomCode]= ctrl->bottomCode(); 0177 0178 QJsonArray fonts; 0179 auto embeddedFont= ctrl->fonts(); 0180 for(const QString& fontUri : embeddedFont) 0181 { 0182 QFile file(fontUri); 0183 if(file.open(QIODevice::ReadOnly)) 0184 { 0185 QJsonObject font; 0186 font[keys::name]= fontUri; 0187 QByteArray array= file.readAll(); 0188 font[keys::data]= QString(array.toBase64()); 0189 fonts.append(font); 0190 } 0191 } 0192 obj[keys::fonts]= fonts; 0193 return obj; 0194 } 0195 0196 } // namespace SerializerHelper