File indexing completed on 2024-04-28 07:29:11

0001 /***************************************************************************
0002  *   Copyright (C) 2004-2007 by Albert Astals Cid                          *
0003  *   aacid@kde.org                                                         *
0004  *                                                                         *
0005  *   This program 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 
0011 #include "map.h"
0012 
0013 
0014 #include <QFile>
0015 #include <QFileInfo>
0016 #include <QRandomGenerator>
0017 
0018 #include <KLazyLocalizedString>
0019 
0020 KGmap::KGmap()
0021 {
0022     p_capitalToDivisionPattern = QString::fromUtf8(kli18nc("@title:group", "%1 is the capital of...").untranslatedText());
0023     p_divisionToCapitalPattern = QString::fromUtf8(kli18nc("@title:group", "The capital of %1 is...").untranslatedText());
0024 }
0025 
0026 KGmap::~KGmap()
0027 {
0028     qDeleteAll(p_divisions);
0029 }
0030 
0031 bool KGmap::addDivision(division *d)
0032 {
0033     bool b;
0034     const division *divByName = getDivision(d -> getUntranslatedName());
0035     const division *divByColor = getDivision(d -> getRGB());
0036     if ( ( divByName == nullptr && divByColor == nullptr ) || 
0037          ( divByName != nullptr && divByColor == nullptr && !d->canAsk(division::eClick) && !divByName->canAsk(division::eClick) ) )
0038     {
0039         p_divisions.append(d);
0040         b = true;
0041     }
0042     else b = false;
0043     return b;
0044 }
0045 
0046 void KGmap::setFile(const QString &s)
0047 {
0048     p_file = s;
0049 }
0050 
0051 bool KGmap::setMapFile(const QString &s)
0052 {
0053     p_mapFile = s;
0054     return QFile::exists(s);
0055 }
0056 
0057 void KGmap::setName(const QString &s)
0058 {
0059     p_name = s;
0060 }
0061 
0062 void KGmap::setDivisionsString(const QString &s)
0063 {
0064     p_divisionsString = s;
0065 }
0066 
0067 void KGmap::setAuthor(const QString &s)
0068 {
0069     p_author = s;
0070 }
0071 
0072 void KGmap::setCapitalToDivisionQuestionPattern(const QString &str)
0073 {
0074     p_capitalToDivisionPattern = str;
0075 }
0076 
0077 void KGmap::setDivisionToCapitalQuestionPattern(const QString &str)
0078 {
0079     p_divisionToCapitalPattern = str;
0080 }
0081 
0082 void KGmap::setCapitalToDivisionTitle(const QString &str)
0083 {
0084     p_capitalToDivisionTitle = str;
0085 }
0086 
0087 void KGmap::setDivisionToCapitalTitle(const QString &str)
0088 {
0089     p_divisionToCapitalTitle = str;
0090 }
0091 
0092 uint KGmap::count(division::askMode am) const
0093 {
0094     uint count = 0;
0095     for(const division *d : p_divisions)
0096     {
0097         if (d->canAsk(am)) count++;
0098     }
0099     return count;
0100 }
0101 
0102 KLocalizedString KGmap::getCapitalToDivisionQuestionPattern() const
0103 {
0104     return ki18nc("@title:group", p_capitalToDivisionPattern.toUtf8().constData());
0105 }
0106 
0107 KLocalizedString KGmap::getDivisionToCapitalQuestionPattern() const
0108 {
0109     return ki18nc("@title:group", p_divisionToCapitalPattern.toUtf8().constData());
0110 }
0111 
0112 QString KGmap::getCapitalToDivisionTitle() const
0113 {
0114     if (p_capitalToDivisionTitle.isNull()) return i18n("%1 by Capital", getDivisionsString());
0115     else return p_capitalToDivisionTitle;
0116 }
0117 
0118 QString KGmap::getDivisionToCapitalTitle() const
0119 {
0120     if (p_divisionToCapitalTitle.isNull()) return i18n("Capitals of %1", getDivisionsString());
0121     else return p_divisionToCapitalTitle;
0122 }
0123 
0124 QString KGmap::getFile() const
0125 {
0126     return p_file;
0127 }
0128 
0129 QString KGmap::getFileName() const
0130 {
0131     QFileInfo fi(p_file);
0132     return fi.fileName();
0133 }
0134 
0135 QString KGmap::getMapFile() const
0136 {
0137     return p_mapFile;
0138 }
0139 
0140 QString KGmap::getName() const
0141 {
0142     return p_name;
0143 }
0144 
0145 QString KGmap::getDivisionsString() const
0146 {
0147     if (p_divisionsString.isNull()) return i18n("Regions");
0148     else return p_divisionsString;
0149 }
0150 
0151 division *KGmap::getRandomDivision(division::askMode am) const
0152 {
0153     QList<division*> aux;
0154     const int i = QRandomGenerator::global()->bounded(p_divisions.size());
0155     if (!p_divisions[i] -> canAsk(am)) return getRandomDivision(am);
0156     else return p_divisions[i];
0157 }
0158 
0159 QString KGmap::getWhatIs(QRgb c, bool all) const
0160 {
0161     // this is only asked from mapasker.cpp hence the division::eClick in canAsk
0162     division *d = getDivision(c);
0163     if (d == nullptr) return QStringLiteral("nothing");
0164     else
0165     {
0166         if (all) return d -> getUntranslatedName();
0167         else if (d -> canAsk(division::eClick)) return d -> getUntranslatedName();
0168         else return QLatin1String("");
0169     }
0170 }
0171 
0172 QString KGmap::getAuthor() const
0173 {
0174     return p_author;
0175 }
0176 
0177 QColor KGmap::getColor(const QString &s) const
0178 {
0179     return QColor(getDivision(s)->getRGB());
0180 }
0181 
0182 QList<const division*> KGmap::getIgnoredDivisions(division::askMode am) const
0183 {
0184     QList<const division*> ignoredDivisions;
0185     for (division* div : p_divisions)
0186         if (!div->canAsk(am))
0187             ignoredDivisions << div;
0188     return ignoredDivisions;
0189 }
0190 
0191 QList<const division*> KGmap::getAllDivisionsOrdered() const
0192 {
0193     QList<const division*> constDivisions;
0194     for (const division* div : p_divisions)
0195         constDivisions << div;
0196     return constDivisions;
0197 }
0198 
0199 division *KGmap::getDivision(const QString &divisionName) const
0200 {
0201     for (division* div : p_divisions)
0202     {
0203         if (div->getUntranslatedName() == divisionName) return div;
0204     }
0205     return nullptr;
0206 }
0207 
0208 division *KGmap::getDivision(QRgb c) const
0209 {
0210     for (division* div : p_divisions)
0211     {
0212         if (div->getRGB() == c) return div;
0213     }
0214     return nullptr;
0215 }