1 /***************************************************************************
2 * Copyright (C) 2004-2007 by Albert Astals Cid *
3 * aacid@kde.org *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 ***************************************************************************/
10
11 #include "map.h"
12
13
14 #include <QFile>
15 #include <QFileInfo>
16 #include <QRandomGenerator>
17
18
KGmap()19 KGmap::KGmap()
20 {
21 p_capitalToDivisionPattern = I18N_NOOP2("@title:group", "%1 is the capital of...");
22 p_divisionToCapitalPattern = I18N_NOOP2("@title:group", "The capital of %1 is...");
23 }
24
~KGmap()25 KGmap::~KGmap()
26 {
27 qDeleteAll(p_divisions);
28 }
29
addDivision(division * d)30 bool KGmap::addDivision(division *d)
31 {
32 bool b;
33 const division *divByName = getDivision(d -> getUntranslatedName());
34 const division *divByColor = getDivision(d -> getRGB());
35 if ( ( divByName == NULL && divByColor == NULL ) ||
36 ( divByName != NULL && divByColor == NULL && !d->canAsk(division::eClick) && !divByName->canAsk(division::eClick) ) )
37 {
38 p_divisions.append(d);
39 b = true;
40 }
41 else b = false;
42 return b;
43 }
44
setFile(const QString & s)45 void KGmap::setFile(const QString &s)
46 {
47 p_file = s;
48 }
49
setMapFile(const QString & s)50 bool KGmap::setMapFile(const QString &s)
51 {
52 p_mapFile = s;
53 return QFile::exists(s);
54 }
55
setName(const QString & s)56 void KGmap::setName(const QString &s)
57 {
58 p_name = s;
59 }
60
setDivisionsString(const QString & s)61 void KGmap::setDivisionsString(const QString &s)
62 {
63 p_divisionsString = s;
64 }
65
setAuthor(const QString & s)66 void KGmap::setAuthor(const QString &s)
67 {
68 p_author = s;
69 }
70
setCapitalToDivisionQuestionPattern(const QString & str)71 void KGmap::setCapitalToDivisionQuestionPattern(const QString &str)
72 {
73 p_capitalToDivisionPattern = str;
74 }
75
setDivisionToCapitalQuestionPattern(const QString & str)76 void KGmap::setDivisionToCapitalQuestionPattern(const QString &str)
77 {
78 p_divisionToCapitalPattern = str;
79 }
80
setCapitalToDivisionTitle(const QString & str)81 void KGmap::setCapitalToDivisionTitle(const QString &str)
82 {
83 p_capitalToDivisionTitle = str;
84 }
85
setDivisionToCapitalTitle(const QString & str)86 void KGmap::setDivisionToCapitalTitle(const QString &str)
87 {
88 p_divisionToCapitalTitle = str;
89 }
90
count(division::askMode am) const91 uint KGmap::count(division::askMode am) const
92 {
93 uint count = 0;
94 foreach(const division *d, p_divisions)
95 {
96 if (d->canAsk(am)) count++;
97 }
98 return count;
99 }
100
getCapitalToDivisionQuestionPattern() const101 KLocalizedString KGmap::getCapitalToDivisionQuestionPattern() const
102 {
103 return ki18nc("@title:group", p_capitalToDivisionPattern.toUtf8());
104 }
105
getDivisionToCapitalQuestionPattern() const106 KLocalizedString KGmap::getDivisionToCapitalQuestionPattern() const
107 {
108 return ki18nc("@title:group", p_divisionToCapitalPattern.toUtf8());
109 }
110
getCapitalToDivisionTitle() const111 QString KGmap::getCapitalToDivisionTitle() const
112 {
113 if (p_capitalToDivisionTitle.isNull()) return i18n("%1 by Capital", getDivisionsString());
114 else return p_capitalToDivisionTitle;
115 }
116
getDivisionToCapitalTitle() const117 QString KGmap::getDivisionToCapitalTitle() const
118 {
119 if (p_divisionToCapitalTitle.isNull()) return i18n("Capitals of %1", getDivisionsString());
120 else return p_divisionToCapitalTitle;
121 }
122
getFile() const123 QString KGmap::getFile() const
124 {
125 return p_file;
126 }
127
getFileName() const128 QString KGmap::getFileName() const
129 {
130 QFileInfo fi(p_file);
131 return fi.fileName();
132 }
133
getMapFile() const134 QString KGmap::getMapFile() const
135 {
136 return p_mapFile;
137 }
138
getName() const139 QString KGmap::getName() const
140 {
141 return p_name;
142 }
143
getDivisionsString() const144 QString KGmap::getDivisionsString() const
145 {
146 if (p_divisionsString.isNull()) return i18n("Regions");
147 else return p_divisionsString;
148 }
149
getRandomDivision(division::askMode am) const150 division *KGmap::getRandomDivision(division::askMode am) const
151 {
152 QList<division*> aux;
153 const int i = QRandomGenerator::global()->bounded(p_divisions.size());
154 if (!p_divisions[i] -> canAsk(am)) return getRandomDivision(am);
155 else return p_divisions[i];
156 }
157
getWhatIs(QRgb c,bool all) const158 QString KGmap::getWhatIs(QRgb c, bool all) const
159 {
160 // this is only asked from mapasker.cpp hence the division::eClick in canAsk
161 division *d = getDivision(c);
162 if (d == NULL) return QStringLiteral("nothing");
163 else
164 {
165 if (all) return d -> getUntranslatedName();
166 else if (d -> canAsk(division::eClick)) return d -> getUntranslatedName();
167 else return QLatin1String("");
168 }
169 }
170
getAuthor() const171 QString KGmap::getAuthor() const
172 {
173 return p_author;
174 }
175
getColor(const QString & s) const176 QColor KGmap::getColor(const QString &s) const
177 {
178 return QColor(getDivision(s)->getRGB());
179 }
180
getIgnoredDivisions(division::askMode am) const181 QList<const division*> KGmap::getIgnoredDivisions(division::askMode am) const
182 {
183 QList<const division*> ignoredDivisions;
184 foreach (division* div, p_divisions)
185 if (!div->canAsk(am))
186 ignoredDivisions << div;
187 return ignoredDivisions;
188 }
189
getAllDivisionsOrdered() const190 QList<const division*> KGmap::getAllDivisionsOrdered() const
191 {
192 QList<const division*> constDivisions;
193 foreach (const division* div, p_divisions)
194 constDivisions << div;
195 return constDivisions;
196 }
197
getDivision(const QString & divisionName) const198 division *KGmap::getDivision(const QString &divisionName) const
199 {
200 foreach (division* div, p_divisions)
201 {
202 if (div->getUntranslatedName() == divisionName) return div;
203 }
204 return NULL;
205 }
206
getDivision(QRgb c) const207 division *KGmap::getDivision(QRgb c) const
208 {
209 foreach (division* div, p_divisions)
210 {
211 if (div->getRGB() == c) return div;
212 }
213 return NULL;
214 }
215