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