File indexing completed on 2024-04-28 07:54:21

0001 /***************************************************************************
0002                           onu.cpp  -  description
0003                              -------------------
0004     begin                : Wed Jul 18 2001
0005     copyright            : (C) 2001-2006 by Gael de Chalendar (aka Kleag)
0006     email                : kleag@free.fr
0007  ***************************************************************************/
0008 
0009 /***************************************************************************
0010  *                                                                         *
0011  *   This program is free software; you can redistribute it and/or modify  *
0012  *   it under the terms of the GNU General Public License as published by  *
0013  *   the Free Software Foundation; either either version 2
0014    of the License, or (at your option) any later version.of the License, or     *
0015  *   (at your option) any later version.                                   *
0016  *                                                                         *
0017  *   You should have received a copy of the GNU General Public License
0018  *   along with this program; if not, write to the Free Software
0019  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
0020  *   02110-1301, USA
0021  ***************************************************************************/
0022 #include "onu.h"
0023 #include "skinSpritesData.h"
0024 #include "goal.h"
0025 #include "../ksirk/KsirkGlobalDefinitions.h"
0026 
0027 #include <QApplication>
0028 #include <QFile>
0029 // #include <QDom>
0030 #include <QPainter>
0031 #include <QGraphicsItem>
0032 #include <QGraphicsScene>
0033 #include <QXmlStreamReader>
0034 
0035 #include <KLocalizedString>
0036 #include "ksirkskineditor_debug.h"
0037 #include <KMessageBox>
0038 #include <KConfig>
0039 #include <KConfigGroup>
0040 #include <QRegExp>
0041 
0042 namespace KsirkSkinEditor
0043 {
0044 
0045 ONU::ONU(const QString& configDir, QObject *parent)
0046     : QObject(parent),
0047   m_configDir(configDir),
0048   m_configFileName(configDir + "/Data/world.desktop"),
0049   m_countries(),
0050   m_nationalities(),
0051   m_continents(),
0052   m_renderer(),
0053   m_itemsMap(),
0054   m_dirty(false)
0055 {
0056 
0057   qCDebug(KSIRKSKINEDITOR_LOG) << "ONU constructor: " << m_configFileName;
0058   m_font.family = QStringLiteral("URW Chancery L");
0059   m_font.size = 13;
0060   m_font.weight = QFont::Bold;
0061   m_font.italic = true;
0062   m_font.foregroundColor = QStringLiteral("black");
0063   m_font.backgroundColor = QStringLiteral("white");
0064   
0065   SkinSpritesData::changeable().init();
0066 //   unsigned int nationalityId = 0;
0067 //   unsigned int continentId = 0;
0068   KConfig config(m_configFileName);
0069 
0070   KConfigGroup onugroup = config.group(QStringLiteral("onu"));
0071 
0072   qCDebug(KSIRKSKINEDITOR_LOG) << "ONU XML format version: " << onugroup.readEntry("format-version");
0073   QString formatVersion = onugroup.readEntry("format-version");
0074 
0075   if (!formatVersion.isEmpty() && formatVersion != ONU_FILE_FORMAT_VERSION)
0076   {
0077     KMessageBox::error(nullptr,
0078                         i18n("Error - Invalid skin definition file format. Expected %1 and got %2",QStringLiteral(ONU_FILE_FORMAT_VERSION),formatVersion) + "<br>" + m_configFileName,
0079                         i18n("Error"));
0080 //     exit(1);
0081   }
0082 
0083   m_name = onugroup.readEntry("name");
0084   m_skin = onugroup.readEntry("skinpath");
0085   qCDebug(KSIRKSKINEDITOR_LOG) << "skin snapshot file: " << m_configDir + "/Images/snapshot.jpg";
0086   m_snapshot = QString(m_configDir + "/Images/snapshot.jpg");
0087   if (m_snapshot.isNull())
0088   {
0089     qCCritical(KSIRKSKINEDITOR_LOG) << "Was not able to load the snapshot image: " 
0090     << m_configDir + "/Images/snapshot.jpg";
0091   }
0092   m_width  = onugroup.readEntry("width",1024);
0093   m_height = onugroup.readEntry("height",768);
0094   m_description = onugroup.readEntry("desc");
0095 //   countries.resize(onugroup.readEntry("nb-countries",0));
0096 //   nationalities.resize(onugroup.readEntry("nb-nationalities",0));
0097 //   m_continents.resize(onugroup.readEntry("nb-continents",0));
0098 //    root.attribute("map");
0099   m_poolString = onugroup.readEntry("pool");
0100   if (m_poolString.isEmpty())
0101   {
0102     m_poolString = QStringLiteral("Images/pool.svg");
0103   }
0104   qCDebug(KSIRKSKINEDITOR_LOG) << "Pool path: " << m_poolString;
0105   qCDebug(KSIRKSKINEDITOR_LOG) << "Searching resource: " << (m_configDir + '/' + m_poolString);
0106   QString poolFileName = m_configDir + '/' + m_poolString;
0107   qCDebug(KSIRKSKINEDITOR_LOG) << "Pool file name: " << poolFileName;
0108   if (poolFileName.isEmpty())
0109   {
0110       KMessageBox::error(nullptr, 
0111                          i18n("Pool filename not found\nProgram cannot continue"),
0112                          i18n("Error"));
0113       exit(2);
0114   }
0115   m_map = QPixmap();
0116   m_renderer.load(poolFileName);
0117   m_svgDom.load(poolFileName);
0118   loadPoolIds(poolFileName);
0119   
0120   QString mapMaskFileName = m_configDir + '/' + onugroup.readEntry("map-mask");
0121   qCDebug(KSIRKSKINEDITOR_LOG) << "Map mask file name init: " << mapMaskFileName;
0122   if (mapMaskFileName == (m_configDir + '/'))
0123   {
0124     mapMaskFileName = m_configDir + '/' + "Images/map-mask.png";
0125   }
0126   qCDebug(KSIRKSKINEDITOR_LOG) << "Map mask file name: " << mapMaskFileName;
0127   if (mapMaskFileName.isNull())
0128   {
0129       KMessageBox::error(nullptr, 
0130                          i18n("Map mask image not found\nProgram cannot continue"),
0131                          i18n("Error"));
0132       exit(2);
0133   }
0134   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading map mask file: " << mapMaskFileName;
0135   m_countriesMask = QImage(mapMaskFileName);
0136 
0137   SkinSpritesData::changeable().intData(QStringLiteral("width-between-flag-and-fighter"), onugroup.readEntry("width-between-flag-and-fighter",0));
0138 
0139 
0140   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading flag data";
0141   SkinSpritesData::changeable().intData(QStringLiteral("flag-width"), config.group(QStringLiteral("flag")).readEntry("width",20));
0142   SkinSpritesData::changeable().intData(QStringLiteral("flag-height"), config.group(QStringLiteral("flag")).readEntry("height",20));
0143   SkinSpritesData::changeable().intData(QStringLiteral("flag-frames"), config.group(QStringLiteral("flag")).readEntry("frames",4));
0144   SkinSpritesData::changeable().intData(QStringLiteral("flag-versions"), config.group(QStringLiteral("flag")).readEntry("versions",1));
0145 
0146   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading infantry data";
0147 //   SkinSpritesData::changeable().strData("infantry-id", config.group(QStringLiteral("infantry")).readEntry("id"));
0148   SkinSpritesData::changeable().intData(QStringLiteral("infantry-width"), config.group(QStringLiteral("infantry")).readEntry("width",23));
0149   SkinSpritesData::changeable().intData(QStringLiteral("infantry-height"), config.group(QStringLiteral("infantry")).readEntry("height",32));
0150   SkinSpritesData::changeable().intData(QStringLiteral("infantry-frames"), config.group(QStringLiteral("infantry")).readEntry("frames",1));
0151   SkinSpritesData::changeable().intData(QStringLiteral("infantry-versions"), config.group(QStringLiteral("infantry")).readEntry("versions",3));
0152 
0153 //   SkinSpritesData::changeable().strData("infantry1-id", config.group(QStringLiteral("infantry1")).readEntry("id"));
0154   SkinSpritesData::changeable().intData(QStringLiteral("infantry1-width"), config.group(QStringLiteral("infantry1")).readEntry("width",0));
0155   SkinSpritesData::changeable().intData(QStringLiteral("infantry1-height"), config.group(QStringLiteral("infantry1")).readEntry("height",0));
0156   SkinSpritesData::changeable().intData(QStringLiteral("infantry1-frames"), config.group(QStringLiteral("infantry1")).readEntry("frames",0));
0157   SkinSpritesData::changeable().intData(QStringLiteral("infantry1-versions"), config.group(QStringLiteral("infantry1")).readEntry("versions",0));
0158 
0159 //   SkinSpritesData::changeable().strData("infantry2-id", config.group(QStringLiteral("infantry2")).readEntry("id"));
0160   SkinSpritesData::changeable().intData(QStringLiteral("infantry2-width"), config.group(QStringLiteral("infantry2")).readEntry("width",0));
0161   SkinSpritesData::changeable().intData(QStringLiteral("infantry2-height"), config.group(QStringLiteral("infantry2")).readEntry("height",0));
0162   SkinSpritesData::changeable().intData(QStringLiteral("infantry2-frames"), config.group(QStringLiteral("infantry2")).readEntry("frames",0));
0163   SkinSpritesData::changeable().intData(QStringLiteral("infantry2-versions"), config.group(QStringLiteral("infantry2")).readEntry("versions",0));
0164 
0165 //   SkinSpritesData::changeable().strData("infantry3-id", config.group(QStringLiteral("infantry3")).readEntry("id"));
0166   SkinSpritesData::changeable().intData(QStringLiteral("infantry3-width"), config.group(QStringLiteral("infantry3")).readEntry("width",0));
0167   SkinSpritesData::changeable().intData(QStringLiteral("infantry3-height"), config.group(QStringLiteral("infantry3")).readEntry("height",0));
0168   SkinSpritesData::changeable().intData(QStringLiteral("infantry3-frames"), config.group(QStringLiteral("infantry3")).readEntry("frames",0));
0169   SkinSpritesData::changeable().intData(QStringLiteral("infantry3-versions"), config.group(QStringLiteral("infantry3")).readEntry("versions",0));
0170 
0171   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading cavalry data";
0172 //   SkinSpritesData::changeable().strData("cavalry-id", config.group(QStringLiteral("cavalry")).readEntry("id"));
0173   SkinSpritesData::changeable().intData(QStringLiteral("cavalry-width"), config.group(QStringLiteral("cavalry")).readEntry("width",32));
0174   SkinSpritesData::changeable().intData(QStringLiteral("cavalry-height"), config.group(QStringLiteral("cavalry")).readEntry("height",32));
0175   SkinSpritesData::changeable().intData(QStringLiteral("cavalry-frames"), config.group(QStringLiteral("cavalry")).readEntry("frames",1));
0176   SkinSpritesData::changeable().intData(QStringLiteral("cavalry-versions"), config.group(QStringLiteral("cavalry")).readEntry("versions",3));
0177 
0178   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading cannon data";
0179 //   SkinSpritesData::changeable().strData("cannon-id", config.group(QStringLiteral("cannon")).readEntry("id"));
0180   SkinSpritesData::changeable().intData(QStringLiteral("cannon-width"), config.group(QStringLiteral("cannon")).readEntry("width",32));
0181   SkinSpritesData::changeable().intData(QStringLiteral("cannon-height"), config.group(QStringLiteral("cannon")).readEntry("height",32));
0182   SkinSpritesData::changeable().intData(QStringLiteral("cannon-frames"), config.group(QStringLiteral("cannon")).readEntry("frames",2));
0183   SkinSpritesData::changeable().intData(QStringLiteral("cannon-versions"), config.group(QStringLiteral("cannon")).readEntry("versions",3));
0184 
0185   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading firing data";
0186 //   SkinSpritesData::changeable().strData("firing-id", config.group(QStringLiteral("firing")).readEntry("id"));
0187   SkinSpritesData::changeable().intData(QStringLiteral("firing-width"), config.group(QStringLiteral("firing")).readEntry("width",64));
0188   SkinSpritesData::changeable().intData(QStringLiteral("firing-height"), config.group(QStringLiteral("firing")).readEntry("height",32));
0189   SkinSpritesData::changeable().intData(QStringLiteral("firing-frames"), config.group(QStringLiteral("firing")).readEntry("frames",4));
0190   SkinSpritesData::changeable().intData(QStringLiteral("firing-versions"), config.group(QStringLiteral("firing")).readEntry("versions",3));
0191 
0192   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading exploding data";
0193 //   SkinSpritesData::changeable().strData("exploding-id", config.group(QStringLiteral("exploding")).readEntry("id"));
0194   SkinSpritesData::changeable().intData(QStringLiteral("exploding-width"), config.group(QStringLiteral("exploding")).readEntry("width",32));
0195   SkinSpritesData::changeable().intData(QStringLiteral("exploding-height"), config.group(QStringLiteral("exploding")).readEntry("height",32));
0196   SkinSpritesData::changeable().intData(QStringLiteral("exploding-frames"), config.group(QStringLiteral("exploding")).readEntry("frames",4));
0197   SkinSpritesData::changeable().intData(QStringLiteral("exploding-versions"), config.group(QStringLiteral("exploding")).readEntry("versions",3));
0198 
0199   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading font data";
0200   KConfigGroup fontgroup = config.group(QStringLiteral("font"));
0201   m_font.family = fontgroup.readEntry("family","URW Chancery L");
0202   m_font.size = fontgroup.readEntry("size", 13);
0203   QString w = fontgroup.readEntry("weight", "bold");;
0204   if (w == QLatin1String("normal"))
0205   {
0206     m_font.weight = QFont::Normal;
0207   }
0208   else if (w == QLatin1String("light"))
0209   {
0210     m_font.weight = QFont::Light;
0211   }
0212   else if (w == QLatin1String("demibold"))
0213   {
0214     m_font.weight = QFont::DemiBold;
0215   }
0216   else if (w == QLatin1String("bold"))
0217   {
0218     m_font.weight = QFont::Bold;
0219   }
0220   else if (w == QLatin1String("black"))
0221   {
0222     m_font.weight = QFont::Black;
0223   }
0224   m_font.italic = fontgroup.readEntry("italic", true);
0225   m_font.foregroundColor = fontgroup.readEntry("foreground-color", "black");
0226   m_font.backgroundColor = fontgroup.readEntry("background-color", "white");
0227 
0228   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading countries data";
0229   QStringList countriesList = onugroup.readEntry("countries", QStringList());
0230 /*  while (m_countries.size() < countriesList.size())
0231   {
0232     m_countries.push_back(0);
0233   }*/
0234   foreach (const QString &country, countriesList)
0235   { 
0236     qCDebug(KSIRKSKINEDITOR_LOG) << "Loading"<<country<<"data";
0237     KConfigGroup countryGroup = config.group(country);
0238 //     unsigned int id = countryGroup.readEntry("id",0);
0239     QString name = country;
0240     QPointF anchorPoint = countryGroup.readEntry("anchor-point",QPointF());
0241     QPointF centralPoint = countryGroup.readEntry("central-point",QPointF());
0242     QPointF flagPoint = countryGroup.readEntry("flag-point",QPointF());
0243     QPointF cannonPoint = countryGroup.readEntry("cannon-point",QPointF());
0244     QPointF cavalryPoint = countryGroup.readEntry("cavalry-point",QPointF());
0245     QPointF infantryPoint = countryGroup.readEntry("infantry-point",QPointF());
0246 
0247     m_countries.push_back(new Country(name, anchorPoint, centralPoint,
0248         flagPoint, cannonPoint, cavalryPoint, infantryPoint));
0249   }
0250   
0251   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading nationalities data";
0252   QStringList nationalitiesList = onugroup.readEntry("nationalities", QStringList());
0253 /*  while (m_nationalities.size() < nationalitiesList.size())
0254   {
0255     m_nationalities.push_back(0);
0256   }*/
0257   foreach (const QString &nationality, nationalitiesList)
0258   {
0259     qCDebug(KSIRKSKINEDITOR_LOG) << "Creating nationality " << nationality;
0260     KConfigGroup nationalityGroup = config.group(nationality);
0261     QString leader = nationalityGroup.readEntry("leader","");
0262     QString flag = nationalityGroup.readEntry("flag","");
0263 //         qCDebug(KSIRKSKINEDITOR_LOG) << "Creating nationality " << name << " ; flag: " << flag;
0264     m_nationalities.push_back(new Nationality(nationality, flag, leader));
0265 //     nationalityId++;
0266   }
0267 
0268 
0269   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading continents data";
0270   QStringList continentsList = onugroup.readEntry("continents", QStringList());
0271 /*  while (m_continents.size() < continentsList.size())
0272   {
0273     m_continents.push_back(0);
0274   }*/
0275   foreach (const QString &continent, continentsList)
0276   {
0277     qCDebug(KSIRKSKINEDITOR_LOG) << "Loading"<<continent<<"data";
0278     KConfigGroup continentGroup = config.group(continent);
0279 
0280 //     unsigned int id = continentGroup.readEntry("id",0);
0281     unsigned int bonus = continentGroup.readEntry("bonus",0);
0282     QList<QString> countryIdList = continentGroup.readEntry("continent-countries",QList<QString>());
0283 //     int countryId;
0284     QList<Country*> continentList;
0285     foreach(const QString& countryId, countryIdList)
0286     {
0287       continentList.push_back(countryNamed(countryId));
0288     }
0289 //       qCDebug(KSIRKSKINEDITOR_LOG) << "Creating continent " << name;
0290     m_continents.push_back(new Continent(continent, continentList, bonus));
0291   }
0292 
0293   qCDebug(KSIRKSKINEDITOR_LOG) << "Loading goals data";
0294   QStringList goalsList = onugroup.readEntry("goals", QStringList());
0295   foreach (const QString &_goal, goalsList)
0296   {
0297     qCDebug(KSIRKSKINEDITOR_LOG) << "init goal " << _goal;
0298     KConfigGroup goalGroup = config.group(_goal);
0299 
0300     Goal* goal = new Goal();
0301     goal->setDescription(goalGroup.readEntry("desc",""));
0302     QString goalType = goalGroup.readEntry("type","");
0303     if (goalType == QLatin1String("countries"))
0304     {
0305       goal->setType(Goal::Countries);
0306       goal->setNbCountries(goalGroup.readEntry("nbCountries",0));
0307       goal->setNbArmiesByCountry(goalGroup.readEntry("nbArmiesByCountry",0));
0308       qCDebug(KSIRKSKINEDITOR_LOG) << "  nb countries: **********************************" << goal->nbCountries();
0309       qCDebug(KSIRKSKINEDITOR_LOG) << "  nbarmies countries: **********************************" << goal->nbArmiesByCountry();
0310     }
0311     else if (goalType == QLatin1String("continents") )
0312     {
0313       goal->setType(Goal::Continents);
0314       QList<QString> continentsList = goalGroup.readEntry("continents",QList<QString>());
0315       foreach(const QString& continentId, continentsList)
0316         goal->continents().push_back(continentId);
0317     }
0318     else if (goalType == QLatin1String("player") )
0319     {
0320       goal->setType(Goal::GoalPlayer);
0321       unsigned int nb = goalGroup.readEntry("nbCountriesFallback",0);
0322       goal->setNbCountries(nb);
0323     }
0324     m_goals.push_back(goal);
0325   }
0326 
0327   foreach (const QString &country, countriesList)
0328   {
0329     qCDebug(KSIRKSKINEDITOR_LOG) << "building neighbours list of " << country;
0330     QList< Country* > theNeighbours;
0331     KConfigGroup countryGroup = config.group(country);
0332     QList<QString> theNeighboursIds = countryGroup.readEntry("neighbours",QList<QString>());
0333 //     int neighbourId;
0334     foreach(const QString& neighbourId, theNeighboursIds)
0335     {
0336 
0337       theNeighbours.push_back(countryNamed(neighbourId));
0338     }
0339     countryNamed(country)-> neighbours(theNeighbours);
0340   }
0341   qCDebug(KSIRKSKINEDITOR_LOG) << "Building map";
0342   buildMap();
0343   qCDebug(KSIRKSKINEDITOR_LOG) << "Map built";
0344   
0345   qCDebug(KSIRKSKINEDITOR_LOG) << "Building flag icon";
0346   int flagWidth = SkinSpritesData::changeable().intData(QStringLiteral("flag-width"));
0347   int flagHeight = SkinSpritesData::changeable().intData(QStringLiteral("flag-height"));
0348   int flagFrames = SkinSpritesData::changeable().intData(QStringLiteral("flag-frames"));
0349   int flagVersions = SkinSpritesData::changeable().intData(QStringLiteral("flag-versions"));
0350   if (m_nationalities.empty())
0351   {
0352     m_flagIcon = QPixmap(flagWidth,flagHeight);
0353   }
0354   else
0355   {
0356     m_flagIcon = QPixmap(pixmapForId(m_nationalities[0]->name().toLower(),flagWidth*flagFrames,flagHeight*flagVersions).copy(0,0,flagWidth,flagHeight));
0357   }
0358   qCDebug(KSIRKSKINEDITOR_LOG) << "Building infantry icon";
0359   int infantryWidth = SkinSpritesData::changeable().intData(QStringLiteral("infantry-width"));
0360   int infantryHeight = SkinSpritesData::changeable().intData(QStringLiteral("infantry-height"));
0361   int infantryFrames = SkinSpritesData::changeable().intData(QStringLiteral("infantry-frames"));
0362   int infantryVersions = SkinSpritesData::changeable().intData(QStringLiteral("infantry-versions"));
0363   m_infantryIcon = QPixmap(
0364   pixmapForId(QStringLiteral("infantry"),infantryWidth*infantryFrames,infantryHeight*infantryVersions).copy(0,0,infantryWidth,infantryHeight));
0365 
0366   qCDebug(KSIRKSKINEDITOR_LOG) << "Building cavalry icon";
0367   int cavalryWidth = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-width"));
0368   int cavalryHeight = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-height"));
0369   int cavalryFrames = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-frames"));
0370   int cavalryVersions = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-versions"));
0371   m_cavalryIcon = QPixmap(
0372   pixmapForId(QStringLiteral("cavalry"),cavalryWidth*cavalryFrames,cavalryHeight*cavalryVersions).copy(0,0,cavalryWidth,cavalryHeight));
0373   
0374   qCDebug(KSIRKSKINEDITOR_LOG) << "Building cannon icon";
0375   int cannonWidth = SkinSpritesData::changeable().intData(QStringLiteral("cannon-width"));
0376   int cannonHeight = SkinSpritesData::changeable().intData(QStringLiteral("cannon-height"));
0377   int cannonFrames = SkinSpritesData::changeable().intData(QStringLiteral("cannon-frames"));
0378   int cannonVersions = SkinSpritesData::changeable().intData(QStringLiteral("cannon-versions"));
0379   m_cannonIcon = QPixmap(
0380   pixmapForId(QStringLiteral("cannon"),cannonWidth*cannonFrames,cannonHeight*cannonVersions).copy(0,0,cannonWidth,cannonHeight));
0381 
0382   qCDebug(KSIRKSKINEDITOR_LOG) << "OUT";
0383 }
0384 
0385 ONU::~ONU()
0386 {
0387   qDeleteAll(m_countries);
0388   qDeleteAll(m_nationalities);
0389   qDeleteAll(m_continents);
0390   qDeleteAll(m_goals);
0391 }
0392 
0393 void ONU::saveConfig(const QString& configFileName)
0394 {
0395   if (!configFileName.isNull())
0396   {
0397     m_configFileName = configFileName;
0398   }
0399   qCDebug(KSIRKSKINEDITOR_LOG) << m_configFileName;
0400 
0401   KConfig config(m_configFileName);
0402 
0403   KConfigGroup onugroup = config.group(QStringLiteral("onu"));
0404 
0405   qCDebug(KSIRKSKINEDITOR_LOG) << "ONU XML format version: ";
0406   onugroup.writeEntry("format-version",ONU_FILE_FORMAT_VERSION);
0407 
0408   onugroup.writeEntry("name",m_name);
0409   onugroup.writeEntry("skinpath",m_skin);
0410   onugroup.writeEntry("width",m_width);
0411   onugroup.writeEntry("height",m_height);
0412   onugroup.writeEntry("desc",m_description);
0413   onugroup.writeEntry("pool",m_poolString);
0414 
0415   onugroup.writeEntry("width-between-flag-and-fighter",SkinSpritesData::changeable().intData(QStringLiteral("width-between-flag-and-fighter")));
0416 
0417 
0418   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving flag data";
0419   config.group(QStringLiteral("flag")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("flag-width")));
0420   config.group(QStringLiteral("flag")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("flag-height")));
0421   config.group(QStringLiteral("flag")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("flag-frames")));
0422   config.group(QStringLiteral("flag")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("flag-versions")));
0423 
0424   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving infantry data";
0425 //   config.group(QStringLiteral("infantry")).writeEntry("id",SkinSpritesData::changeable().strData("infantry-id"));
0426   config.group(QStringLiteral("infantry")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("infantry-width")));
0427   config.group(QStringLiteral("infantry")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("infantry-height")));
0428   config.group(QStringLiteral("infantry")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("infantry-frames")));
0429   config.group(QStringLiteral("infantry")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("infantry-versions")));
0430 
0431   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving cavalry data";
0432 //   config.group(QStringLiteral("cavalry")).writeEntry("id",SkinSpritesData::changeable().strData("cavalry-id"));
0433   config.group(QStringLiteral("cavalry")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("cavalry-width")));
0434   config.group(QStringLiteral("cavalry")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("cavalry-height")));
0435   config.group(QStringLiteral("cavalry")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("cavalry-frames")));
0436   config.group(QStringLiteral("cavalry")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("cavalry-versions")));
0437 
0438   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving cannon data";
0439 //   config.group(QStringLiteral("cannon")).writeEntry("id",SkinSpritesData::changeable().strData("cannon-id"));
0440   config.group(QStringLiteral("cannon")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("cannon-width")));
0441   config.group(QStringLiteral("cannon")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("cannon-height")));
0442   config.group(QStringLiteral("cannon")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("cannon-frames")));
0443   config.group(QStringLiteral("cannon")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("cannon-versions")));
0444 
0445   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving firing data";
0446 //   config.group(QStringLiteral("firing")).writeEntry("id",SkinSpritesData::changeable().strData("firing-id"));
0447   config.group(QStringLiteral("firing")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("firing-width")));
0448   config.group(QStringLiteral("firing")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("firing-height")));
0449   config.group(QStringLiteral("firing")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("firing-frames")));
0450   config.group(QStringLiteral("firing")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("firing-versions")));
0451 
0452   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving exploding data";
0453 //   config.group(QStringLiteral("exploding")).writeEntry("id",SkinSpritesData::changeable().strData("exploding-id"));
0454   config.group(QStringLiteral("exploding")).writeEntry("width",SkinSpritesData::changeable().intData(QStringLiteral("exploding-width")));
0455   config.group(QStringLiteral("cannon")).writeEntry("height",SkinSpritesData::changeable().intData(QStringLiteral("exploding-height")));
0456   config.group(QStringLiteral("exploding")).writeEntry("frames",SkinSpritesData::changeable().intData(QStringLiteral("exploding-frames")));
0457   config.group(QStringLiteral("exploding")).writeEntry("versions",SkinSpritesData::changeable().intData(QStringLiteral("exploding-versions")));
0458 
0459   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving font data";
0460   KConfigGroup fontgroup = config.group(QStringLiteral("font"));
0461   fontgroup.writeEntry("family",m_font.family);
0462   fontgroup.writeEntry("size",m_font.size);
0463   switch (m_font.weight)
0464   {
0465     case QFont::Normal:
0466       fontgroup.writeEntry("weight", "normal");
0467       break;
0468     case QFont::Light:
0469       fontgroup.writeEntry("weight", "light");
0470       break;
0471     case QFont::DemiBold:
0472       fontgroup.writeEntry("weight", "demibold");
0473       break;
0474     case QFont::Bold:
0475       fontgroup.writeEntry("weight", "bold");
0476       break;
0477     case QFont::Black:
0478       fontgroup.writeEntry("weight", "black");
0479       break;
0480     default:
0481       fontgroup.writeEntry("weight", "normal");
0482   }
0483   fontgroup.writeEntry("italic", m_font.italic);
0484   fontgroup.writeEntry("foreground-color", m_font.foregroundColor);
0485   fontgroup.writeEntry("background-color", m_font.backgroundColor);
0486 
0487   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving countries data";
0488   QStringList countriesList;
0489   foreach (Country* country, m_countries)
0490   {
0491     countriesList.push_back(country->name());
0492   }
0493   onugroup.writeEntry("countries", countriesList);
0494   unsigned int countryNum = 0;
0495   foreach (Country* country, m_countries)
0496   {
0497     qCDebug(KSIRKSKINEDITOR_LOG) << "Saving"<<country->name()<<"data" << countryNum;
0498     KConfigGroup countryGroup = config.group(country->name());
0499 //     countryGroup.writeEntry("id",countryNum);
0500     countryNum++;
0501     countryGroup.writeEntry("anchor-point",country->anchorPoint());
0502     countryGroup.writeEntry("central-point",country->centralPoint());
0503     countryGroup.writeEntry("flag-point",country->pointFlag());
0504     countryGroup.writeEntry("cannon-point",country->pointCannon());
0505     countryGroup.writeEntry("cavalry-point",country->pointCavalry());
0506     countryGroup.writeEntry("infantry-point",country->pointInfantry());
0507   }
0508 
0509   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving nationalities data";
0510   QStringList nationalitiesList;
0511   foreach (Nationality* nationality, m_nationalities)
0512   {
0513     nationalitiesList.push_back(nationality->name());
0514   }
0515   onugroup.writeEntry("nationalities", nationalitiesList);
0516   foreach (Nationality* nationality, m_nationalities)
0517   {
0518     qCDebug(KSIRKSKINEDITOR_LOG) << "Saving nationality " << nationality->name();
0519     KConfigGroup nationalityGroup = config.group(nationality->name());
0520     nationalityGroup.writeEntry("leader",nationality->leaderName());
0521     nationalityGroup.writeEntry("flag",nationality->flagFileName());
0522   }
0523 
0524 
0525   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving continents data";
0526   QStringList continentsList;
0527   foreach (Continent* continent, m_continents)
0528   {
0529     continentsList.push_back(continent->name());
0530   }
0531   onugroup.writeEntry("continents", continentsList);
0532 //   unsigned int continentNum = 0;
0533   foreach (Continent* continent, m_continents)
0534   {
0535     qCDebug(KSIRKSKINEDITOR_LOG) << "Saving"<<continent->name()<<"data";
0536     KConfigGroup continentGroup = config.group(continent->name());
0537 
0538 //     continentGroup.writeEntry("id",++continentNum);
0539     continentGroup.writeEntry("bonus",continent->bonus());
0540 
0541     QList<QString> countryIdList;
0542     foreach(Country* country, continent->members())
0543     {
0544       countryIdList.push_back(country->name());
0545     }
0546     continentGroup.writeEntry("continent-countries",countryIdList);
0547   }
0548 
0549   qCDebug(KSIRKSKINEDITOR_LOG) << "Saving goals data";
0550   QStringList goalsList;
0551   int goalNum = 0;
0552   foreach (Goal* goal, m_goals)
0553   {
0554     QString name = QStringLiteral("goal") + QString::number(++goalNum);
0555     KConfigGroup goalGroup = config.group(name);
0556 
0557     goalGroup.writeEntry("desc",goal->description());
0558     QList<QString> continentsList;
0559     switch(goal->type())
0560     {
0561       case Goal::Countries:
0562         goalGroup.writeEntry("type","countries");
0563         goalGroup.writeEntry("nbCountries",goal->nbCountries());
0564         goalGroup.writeEntry("nbArmiesByCountry",goal->nbArmiesByCountry());
0565         break;
0566       case Goal::Continents:
0567         goalGroup.writeEntry("type","continents");
0568         foreach(const QString& continent, goal->continents())
0569         {
0570           continentsList.push_back(continent);
0571         }
0572         goalGroup.writeEntry("continents",continentsList);
0573         break;
0574       case Goal::GoalPlayer:
0575         goalGroup.writeEntry("type","player");
0576         goalGroup.writeEntry("nbCountriesFallback",goal->nbCountries());
0577         break;
0578       default:
0579         goalGroup.writeEntry("type","");
0580     }
0581     goalsList.push_back(name);
0582   }
0583   onugroup.writeEntry("goals", goalsList);
0584   
0585   foreach (Country* country, m_countries)
0586   {
0587     QList<QString> theNeighboursIds;
0588     KConfigGroup countryGroup = config.group(country->name());
0589     foreach(Country* theNeighbour, country->neighbours())
0590     {
0591       theNeighboursIds.push_back(theNeighbour->name());
0592     }
0593     countryGroup.writeEntry("neighbours",theNeighboursIds);
0594   }
0595 
0596   m_dirty = false;
0597   qCDebug(KSIRKSKINEDITOR_LOG) << "OUT";
0598 }
0599 
0600 
0601 /** This method returns a pointer to the country that contains the point (x,y).
0602 If there is no country at (x,y), the functions returns 0. */
0603 Country* ONU::countryAt(const QPointF& point)
0604 {
0605 //    qCDebug(KSIRKSKINEDITOR_LOG) << "ONU::countryAt x y " << x << " " << y;
0606     QPointF norm = point;
0607     if ( norm.x() < 0 || norm.x() >= m_countriesMask.width()
0608       || norm.y() < 0 || norm.y() >= m_countriesMask.height() )
0609       return nullptr;
0610 
0611     int index = qBlue(m_countriesMask.pixel(norm.toPoint()));
0612 //    qCDebug(KSIRKSKINEDITOR_LOG) << "OUT ONU::countryAt: " << index;
0613     if (index >= m_countries.size()) return nullptr;
0614     return m_countries.at(index);
0615 }
0616 
0617 void ONU::reset()
0618 {
0619   qCDebug(KSIRKSKINEDITOR_LOG);
0620   foreach (Country* country, m_countries)
0621   {
0622     country->reset();
0623   }
0624 }
0625 
0626 /**
0627   * Returns the country named "name" ; 0 in case there is no such country
0628   */
0629 Country* ONU::countryNamed(const QString& name)
0630 {
0631   if (name.isEmpty())
0632   {
0633     return nullptr;
0634   }
0635   foreach (Country *c, m_countries)
0636   {
0637     if (c-> name() == name)
0638       return c;
0639   }
0640   return nullptr;
0641 }
0642 
0643 /** @return the number of countries in the world */
0644 unsigned int ONU::getNbCountries() const
0645 {
0646     return(m_countries.size());
0647 }
0648 
0649 /** Returns the nation named "name" ; 0 in case there is no such nation */
0650 Nationality* ONU::nationNamed(const QString& name)
0651 {
0652   foreach (Nationality *n, m_nationalities)
0653   {
0654     if (n->name() == name)
0655     {
0656       return n;
0657     }
0658   }
0659   return nullptr;
0660 }
0661 
0662 // const Continent* ONU::continentWithId(const unsigned int id) const
0663 // {
0664 //   foreach (const Continent* c, m_continents)
0665 //   {
0666 //     if (c->id() == id)
0667 //     {
0668 //       return c;
0669 //     }
0670 //   }
0671 //   return 0;
0672 // }
0673 
0674 Continent* ONU::continentNamed(const QString& name)
0675 {
0676   foreach (Continent *c, m_continents)
0677   {
0678     if (c-> name() == name)
0679       return c;
0680   }
0681   return nullptr;
0682 }
0683 
0684 void ONU::buildMap()
0685 {
0686   qCDebug(KSIRKSKINEDITOR_LOG);
0687   //QSize size((int)(m_renderer.defaultSize().width()),(int)(m_renderer.defaultSize().height()));
0688   const qreal dpr = qApp->devicePixelRatio();
0689   const QSize size((int)(m_width * dpr), (int)(m_height * dpr));
0690   m_map = QPixmap(size);
0691   m_map.fill(Qt::transparent);
0692   QPainter painter(&m_map);
0693   m_renderer.render(&painter, QStringLiteral("map"));
0694 
0695   QFont foregroundFont(m_font.family, m_font.size, m_font.weight, m_font.italic);
0696   QFont backgroundFont(m_font.family, m_font.size, QFont::Normal, m_font.italic);
0697 
0698   painter.scale(dpr, dpr);
0699   for (int i = 0; i < m_countries.size(); i++)
0700   {
0701     Country* country = m_countries[i];
0702     const QString& countryName = i18n(country->name().toUtf8().data());
0703     if (m_font.backgroundColor != QLatin1String("none"))
0704     {
0705       painter.setPen(m_font.backgroundColor);
0706       painter.setFont(backgroundFont);
0707       QRect countryNameRect = painter.fontMetrics().boundingRect(countryName);
0708       painter.drawText(
0709         int((country->centralPoint().x()-countryNameRect.width()/2+1)),
0710         int((country->centralPoint().y()+countryNameRect.height()/2 + 1)),
0711         countryName);
0712     }
0713     painter.setPen(m_font.foregroundColor);
0714     painter.setFont(foregroundFont);
0715     QRect countryNameRect = painter.fontMetrics().boundingRect(countryName);
0716     painter.drawText(
0717     int((country->centralPoint().x()-countryNameRect.width()/2)),
0718     int((country->centralPoint().y()+countryNameRect.height()/2)),
0719         countryName);
0720   }
0721   m_map.setDevicePixelRatio(dpr);
0722 }
0723 
0724 QPixmap ONU::pixmapForId(const QString& id, int width, int height)
0725 {
0726   qCDebug(KSIRKSKINEDITOR_LOG) << id << width << height;
0727   //QSize size((int)(m_renderer.defaultSize().width()),(int)(m_renderer.defaultSize().height()));
0728   const qreal dpr = qApp->devicePixelRatio();
0729   const QSize size(width * dpr, height * dpr);
0730   QPixmap pixmap(size);
0731   pixmap.fill(Qt::transparent);
0732   QPainter p(&pixmap);
0733   m_renderer.render(&p, id);
0734   pixmap.setDevicePixelRatio(dpr);
0735   return pixmap;
0736 }
0737 
0738 QSvgRenderer* ONU::renderer()
0739 {
0740   return &m_renderer;
0741 }
0742 
0743 KGameSvgDocument* ONU::svgDom()
0744 {
0745   return &m_svgDom;
0746 }
0747 
0748 QGraphicsItem* ONU::itemFor(const Country* country, SpriteType spriteType)
0749 {
0750   if (country==nullptr || spriteType == None) return nullptr;
0751   foreach (QGraphicsItem* item, m_itemsMap.keys())
0752   {
0753     if (m_itemsMap[item].first == country && m_itemsMap[item].second == spriteType)
0754     {
0755 //       qCDebug(KSIRKSKINEDITOR_LOG) << item << (void*)country << spriteType;
0756       return item;
0757     }
0758   }
0759   qCDebug(KSIRKSKINEDITOR_LOG) << 0;
0760   return nullptr;
0761 }
0762 
0763 QFont ONU::foregroundFont()
0764 {
0765   QFont foregroundFont(m_font.family, m_font.size, m_font.weight, m_font.italic);
0766   return foregroundFont;
0767 }
0768 
0769 QFont ONU::backgroundFont()
0770 {
0771   QFont backgroundFont(m_font.family, m_font.size, QFont::Normal, m_font.italic);
0772   return backgroundFont;
0773 }
0774 
0775 void ONU::setFont(const QFont& font)
0776 {
0777   if (m_font.family == font.family()
0778       && m_font.size == font.pointSize()
0779       && m_font.weight == (QFont::Weight)font.weight()
0780       && m_font.italic == font.italic())
0781     return;
0782   m_font.family = font.family();
0783   m_font.size = font.pointSize();
0784   m_font.weight = (QFont::Weight)font.weight();
0785   m_font.italic = font.italic();
0786   m_dirty = true;
0787 }
0788 
0789 void ONU::setFontFgColor(const QColor& color)
0790 {
0791   if (m_font.foregroundColor == color.name())
0792     return;
0793   m_font.foregroundColor = color.name();
0794   m_dirty = true;
0795 }
0796 
0797 void ONU::setFontBgColor(const QColor& color)
0798 {
0799   if (m_font.backgroundColor == color.name())
0800     return;
0801   m_font.backgroundColor = color.name();
0802   m_dirty = true;
0803 }
0804 
0805 
0806 void ONU::createCountry(const QString& newCountryName)
0807 {
0808   qCDebug(KSIRKSKINEDITOR_LOG);
0809   Country* newCountry = new Country(newCountryName, QPointF(), QPointF(), QPointF(), QPointF(), QPointF(), QPointF()/*, m_countries.size()*/);
0810   m_countries.push_back(newCountry);
0811   m_dirty = true;
0812 }
0813 
0814 void ONU::deleteCountry(Country* country)
0815 {
0816   qCDebug(KSIRKSKINEDITOR_LOG) << country->name();
0817   QList<QGraphicsItem*> itemsToRemove;
0818   foreach (QGraphicsItem* item, m_itemsMap.keys())
0819   {
0820     if (m_itemsMap[item].first == country)
0821     {
0822       itemsToRemove.push_back(item);
0823     }
0824   }
0825   foreach (QGraphicsItem* item, itemsToRemove)
0826   {
0827     qCDebug(KSIRKSKINEDITOR_LOG) << "remove an item";
0828     item->hide();
0829     item->scene()->removeItem(item);
0830     m_itemsMap.remove(item);
0831     delete item;
0832   }
0833   qCDebug(KSIRKSKINEDITOR_LOG) << "remove and delete the country";
0834   KConfig config(m_configFileName);
0835   config.deleteGroup(country->name());
0836 
0837   m_countries.removeAll(country);
0838   delete country;
0839   m_dirty = true;
0840 }
0841 
0842 void ONU::createContinent(const QString& newContinentName)
0843 {
0844   qCDebug(KSIRKSKINEDITOR_LOG);
0845   Continent* newContinent = new Continent(newContinentName, QList<Country*>(), 0);
0846   m_continents.push_back(newContinent);
0847   m_dirty = true;
0848 }
0849 
0850 void ONU::deleteContinent(Continent* continent)
0851 {
0852   qCDebug(KSIRKSKINEDITOR_LOG) << continent->name();
0853   qCDebug(KSIRKSKINEDITOR_LOG) << "remove and delete the continent";
0854   KConfig config(m_configFileName);
0855   config.deleteGroup(continent->name());
0856   
0857   m_continents.removeAll(continent);
0858   delete continent;
0859   m_dirty = true;
0860 }
0861 
0862 void ONU::updateIcon(SpriteType type)
0863 {
0864   qCDebug(KSIRKSKINEDITOR_LOG) << type;
0865   int flagWidth;
0866   int flagHeight;
0867   int flagFrames;
0868   int flagVersions;
0869   int infantryWidth;
0870   int infantryHeight;
0871   int infantryFrames;
0872   int infantryVersions;
0873   int cavalryWidth;
0874   int cavalryHeight;
0875   int cavalryFrames;
0876   int cavalryVersions;
0877   int cannonWidth;
0878   int cannonHeight;
0879   int cannonFrames;
0880   int cannonVersions;
0881 
0882   switch (type)
0883   {
0884     case Flag:
0885       flagWidth = SkinSpritesData::changeable().intData(QStringLiteral("flag-width"));
0886       flagHeight = SkinSpritesData::changeable().intData(QStringLiteral("flag-height"));
0887       flagFrames = SkinSpritesData::changeable().intData(QStringLiteral("flag-frames"));
0888       flagVersions = SkinSpritesData::changeable().intData(QStringLiteral("flag-versions"));
0889       if (m_nationalities.empty())
0890       {
0891         m_flagIcon = QPixmap(flagWidth,flagHeight);
0892       }
0893       else
0894       {
0895         m_flagIcon = QPixmap(pixmapForId(nationalities()[0]->name().toLower(),flagWidth*flagFrames,flagHeight*flagVersions).copy(0,0,flagWidth,flagHeight));
0896       }
0897       break;
0898     case Infantry:
0899       infantryWidth = SkinSpritesData::changeable().intData(QStringLiteral("infantry-width"));
0900       infantryHeight = SkinSpritesData::changeable().intData(QStringLiteral("infantry-height"));
0901       infantryFrames = SkinSpritesData::changeable().intData(QStringLiteral("infantry-frames"));
0902       infantryVersions = SkinSpritesData::changeable().intData(QStringLiteral("infantry-versions"));
0903       m_infantryIcon = QPixmap(
0904       pixmapForId(QStringLiteral("infantry"),infantryWidth*infantryFrames,infantryHeight*infantryVersions).copy(0,0,infantryWidth,infantryHeight));
0905       break;
0906     case Cavalry:
0907       cavalryWidth = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-width"));
0908       cavalryHeight = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-height"));
0909       cavalryFrames = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-frames"));
0910       cavalryVersions = SkinSpritesData::changeable().intData(QStringLiteral("cavalry-versions"));
0911       m_cavalryIcon = QPixmap(
0912       pixmapForId(QStringLiteral("cavalry"),cavalryWidth*cavalryFrames,cavalryHeight*cavalryVersions).copy(0,0,cavalryWidth,cavalryHeight));
0913       break;
0914     case Cannon:
0915       cannonWidth = SkinSpritesData::changeable().intData(QStringLiteral("cannon-width"));
0916       cannonHeight = SkinSpritesData::changeable().intData(QStringLiteral("cannon-height"));
0917       cannonFrames = SkinSpritesData::changeable().intData(QStringLiteral("cannon-frames"));
0918       cannonVersions = SkinSpritesData::changeable().intData(QStringLiteral("cannon-versions"));
0919       m_cannonIcon = QPixmap(
0920       pixmapForId(QStringLiteral("cannon"),cannonWidth*cannonFrames,cannonHeight*cannonVersions).copy(0,0,cannonWidth,cannonHeight));
0921       break;
0922     default:;
0923   }
0924 }
0925 
0926 void ONU::createGoal()
0927 {
0928   Goal* goal = new Goal();
0929   m_goals.push_back(goal);
0930   m_dirty = true;
0931 }
0932 
0933 void ONU::deleteGoal(int g)
0934 {
0935   qCDebug(KSIRKSKINEDITOR_LOG) << m_goals.size() << g;
0936 
0937   KConfig config(m_configFileName);
0938   QString groupName = QStringLiteral("goal")+QString::number(g+1);
0939   qCDebug(KSIRKSKINEDITOR_LOG) << "delete group" << groupName;
0940   config.deleteGroup(groupName);
0941   
0942   Goal* goal = m_goals.takeAt(g);
0943   delete goal;
0944   m_dirty = true;
0945 }
0946 
0947 Nationality* ONU::nationalityNamed(const QString& name)
0948 {
0949   foreach (Nationality* nationality, m_nationalities)
0950   {
0951     if (nationality->name() == name)
0952     {
0953       return nationality;
0954     }
0955   }
0956   return nullptr;
0957 }
0958 
0959 void ONU::createNationality(const QString& newNationalityName)
0960 {
0961   Nationality* nationality = new Nationality(newNationalityName, QLatin1String(""), QLatin1String(""));
0962   
0963   m_nationalities.push_back(nationality);
0964   m_dirty = true;
0965 }
0966 
0967 void ONU::deleteNationality(Nationality* nationality)
0968 {
0969   qCDebug(KSIRKSKINEDITOR_LOG);
0970   
0971   KConfig config(m_configFileName);
0972   config.deleteGroup(nationality->name());
0973   
0974   m_nationalities.removeAll(nationality);
0975   delete nationality;
0976   m_dirty = true;
0977 }
0978 
0979 void ONU::loadPoolIds(const QString& fileName)
0980 {
0981   qCDebug(KSIRKSKINEDITOR_LOG) << fileName;
0982   QFile file(fileName);
0983   if (!file.open(QFile::ReadOnly | QFile::Text))
0984   {
0985     KMessageBox::error(nullptr,
0986                         i18n("Cannot read file %1:\n%2.",fileName,file.errorString()),
0987                         i18n("PoolLoader"));
0988                         return;
0989   }
0990   
0991   QXmlStreamReader xml(&file);
0992   QRegExp reg("\\D+\\d+");
0993   while (!xml.atEnd())
0994   {
0995     QXmlStreamReader::TokenType type = xml.readNext();
0996     if (type == QXmlStreamReader::StartElement)
0997     {
0998       qCDebug(KSIRKSKINEDITOR_LOG) << xml.text().toString();
0999       QXmlStreamAttributes attributes = xml.attributes ();
1000       auto id = attributes.value(QLatin1String(""), QStringLiteral("id") );
1001 
1002       if (!id.isEmpty() && !reg.exactMatch(id.toString()))
1003       {
1004         m_poolIds.push_back(id.toString());
1005       }
1006     }
1007   }
1008   if (xml.hasError())
1009   {
1010     qCCritical(KSIRKSKINEDITOR_LOG) << "Error: " << xml.errorString();
1011     // do error handling
1012   }
1013   m_poolIds.sort();
1014 }
1015 
1016 }
1017 
1018 #include "moc_onu.cpp"