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