1 /*
2 SPDX-FileCopyrightText: 2009 Mathias Kraus <k.hias@gmx.de>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "playersettings.h"
8 #include "settings.h"
9
10 #include <KConfig>
11 #include <QDir>
12 #include <QStandardPaths>
13
PlayerSettings()14 PlayerSettings::PlayerSettings()
15 {
16 QStringList playersAvailable;
17 QStringList playerFilesAvailable;
18 QStringList playerNamesAvailable;
19
20 const QStringList dirs = QStandardPaths::locateAll(QStandardPaths::AppDataLocation, QStringLiteral("players"), QStandardPaths::LocateDirectory);
21 for(const auto& dir: dirs) {
22 const QStringList fileNames = QDir(dir).entryList(QStringList() << QStringLiteral("*.desktop"));
23 for(const auto& file: fileNames) {
24 playersAvailable.append(file);
25 }
26 }
27
28 playersAvailable.removeDuplicates();
29 playersAvailable.sort();
30 for(const auto& player: playersAvailable)
31 {
32 StructPlayerSettings settings;
33 settings.strPlayerID = player;
34
35 KConfig desktopFile(QStandardPaths::locate(QStandardPaths::AppDataLocation, QStringLiteral("players/") + settings.strPlayerID), KConfig::SimpleConfig);
36
37 settings.strPlayerDesktopFilePath = desktopFile.name();
38 settings.strPlayerName = desktopFile.group("KGameTheme").readEntry<QString>("Name", QLatin1String(""));
39 settings.strPlayerGraphicsFile = desktopFile.group("KGameTheme").readEntry<QString>("FileName", QLatin1String(""));
40 settings.enabled = false;
41
42 m_playerSettings.insert(settings.strPlayerID, settings);
43 }
44
45
46 QStringList playersGroupList;
47 QString strPlayerID;
48 KConfig granatierConfig(QStringLiteral("granatierrc"), KConfig::NoGlobals );
49 int nEnableCount = 0;
50 if(granatierConfig.hasGroup("Player"))
51 {
52 playersGroupList = granatierConfig.group("Player").groupList();
53 playersGroupList.sort();
54 for(const auto& player: playersGroupList)
55 {
56 strPlayerID = granatierConfig.group("Player").group(player).readEntry<QString>("PlayerID", QStringLiteral(""));
57 if(m_playerSettings.contains(strPlayerID))
58 {
59 m_playerSettings.find(strPlayerID).value().strPlayerName = granatierConfig.group("Player").group(player).readEntry<QString>("Name", QStringLiteral(""));
60 m_playerSettings.find(strPlayerID).value().enabled = granatierConfig.group("Player").group(player).readEntry<int>("Enabled", 0);
61 if(m_playerSettings.find(strPlayerID).value().enabled)
62 {
63 nEnableCount++;
64 }
65
66 m_playerSettings.find(strPlayerID).value().keyUp = QKeySequence(granatierConfig.group("Player").group(player).readEntry<QString>("KeyUp", QStringLiteral("")));
67 m_playerSettings.find(strPlayerID).value().keyRight = QKeySequence(granatierConfig.group("Player").group(player).readEntry<QString>("KeyRight", QStringLiteral("")));
68 m_playerSettings.find(strPlayerID).value().keyDown = QKeySequence(granatierConfig.group("Player").group(player).readEntry<QString>("KeyDown", QStringLiteral("")));
69 m_playerSettings.find(strPlayerID).value().keyLeft = QKeySequence(granatierConfig.group("Player").group(player).readEntry<QString>("KeyLeft", QStringLiteral("")));
70 m_playerSettings.find(strPlayerID).value().keyPutBomb = QKeySequence(granatierConfig.group("Player").group(player).readEntry<QString>("KeyPutBomb", QStringLiteral("")));
71 }
72 }
73 }
74
75 auto settingsIterator = m_playerSettings.begin();
76 while (nEnableCount < 2 && settingsIterator != m_playerSettings.end())
77 {
78 if(!(*settingsIterator).enabled)
79 {
80 (*settingsIterator).enabled = true;
81 nEnableCount++;
82 }
83 ++settingsIterator;
84 }
85
86 int nFirstRun = granatierConfig.group("General").readEntry<int>("FirstRun", 1);
87 if(nFirstRun)
88 {
89 settingsIterator = m_playerSettings.begin();
90 (*settingsIterator).keyUp = QKeySequence(Qt::Key_Up);
91 (*settingsIterator).keyRight = QKeySequence(Qt::Key_Right);
92 (*settingsIterator).keyDown = QKeySequence(Qt::Key_Down);
93 (*settingsIterator).keyLeft = QKeySequence(Qt::Key_Left);
94 (*settingsIterator).keyPutBomb = QKeySequence(Qt::Key_Return);
95 ++settingsIterator;
96 (*settingsIterator).keyUp = QKeySequence(Qt::Key_W);
97 (*settingsIterator).keyRight = QKeySequence(Qt::Key_D);
98 (*settingsIterator).keyDown = QKeySequence(Qt::Key_S);
99 (*settingsIterator).keyLeft = QKeySequence(Qt::Key_A);
100 (*settingsIterator).keyPutBomb = QKeySequence(Qt::Key_Q);
101 ++settingsIterator;
102 (*settingsIterator).keyUp = QKeySequence(Qt::Key_I);
103 (*settingsIterator).keyRight = QKeySequence(Qt::Key_L);
104 (*settingsIterator).keyDown = QKeySequence(Qt::Key_K);
105 (*settingsIterator).keyLeft = QKeySequence(Qt::Key_J);
106 (*settingsIterator).keyPutBomb = QKeySequence(Qt::Key_Space);
107 m_pendingPlayerSettings = m_playerSettings;
108 savePlayerSettings();
109 granatierConfig.group("General").writeEntry("FirstRun", 0);
110 }
111
112 m_pendingPlayerSettings = m_playerSettings;
113 }
114
~PlayerSettings()115 PlayerSettings::~PlayerSettings()
116 {
117 }
118
playerIDs() const119 const QStringList PlayerSettings::playerIDs() const
120 {
121 return m_playerSettings.keys();
122 }
123
playerName(const QString & strPlayerID) const124 const QString PlayerSettings::playerName(const QString& strPlayerID) const
125 {
126 return m_playerSettings.value(strPlayerID).strPlayerName;
127 }
128
playerDesktopFilePath(const QString & strPlayerID) const129 const QString PlayerSettings::playerDesktopFilePath(const QString& strPlayerID) const
130 {
131 return m_playerSettings.value(strPlayerID).strPlayerDesktopFilePath;
132 }
133
playerGraphicsFile(const QString & strPlayerID) const134 const QString PlayerSettings::playerGraphicsFile(const QString& strPlayerID) const
135 {
136 return m_playerSettings.value(strPlayerID).strPlayerGraphicsFile;
137 }
138
enabled(const QString & strPlayerID) const139 bool PlayerSettings::enabled(const QString& strPlayerID) const
140 {
141 return m_playerSettings.value(strPlayerID).enabled;
142 }
143
keyUp(const QString & strPlayerID) const144 const QKeySequence PlayerSettings::keyUp(const QString& strPlayerID) const
145 {
146 return m_playerSettings.value(strPlayerID).keyUp;
147 }
148
keyRight(const QString & strPlayerID) const149 const QKeySequence PlayerSettings::keyRight(const QString& strPlayerID) const
150 {
151 return m_playerSettings.value(strPlayerID).keyRight;
152 }
153
keyDown(const QString & strPlayerID) const154 const QKeySequence PlayerSettings::keyDown(const QString& strPlayerID) const
155 {
156 return m_playerSettings.value(strPlayerID).keyDown;
157 }
158
keyLeft(const QString & strPlayerID) const159 const QKeySequence PlayerSettings::keyLeft(const QString& strPlayerID) const
160 {
161 return m_playerSettings.value(strPlayerID).keyLeft;
162 }
163
keyPutBomb(const QString & strPlayerID) const164 const QKeySequence PlayerSettings::keyPutBomb(const QString& strPlayerID) const
165 {
166 return m_playerSettings.value(strPlayerID).keyPutBomb;
167 }
168
savePlayerSettings()169 void PlayerSettings::savePlayerSettings()
170 {
171 m_playerSettings = m_pendingPlayerSettings;
172
173 QStringList playersGroupList;
174 QStringList strPlayerIDList;
175 KConfig granatierConfig(QStringLiteral("granatierrc"), KConfig::NoGlobals );
176 if(granatierConfig.hasGroup("Player"))
177 {
178 playersGroupList = granatierConfig.group("Player").groupList();
179 playersGroupList.sort();
180 for(const auto& player: std::as_const(playersGroupList))
181 {
182 strPlayerIDList.append(granatierConfig.group("Player").group(player).readEntry<QString>("PlayerID", QStringLiteral("")));
183 }
184
185 int nPlayersGroupIndex;
186 int nIndex;
187 auto player = m_playerSettings.constBegin();
188 while ( player != m_playerSettings.constEnd())
189 {
190 playersGroupList.sort();
191 nIndex = strPlayerIDList.indexOf( player.key());
192 if(nIndex < 0)
193 {
194 for(int j = 0; j < playersGroupList.count(); j++)
195 {
196 if(playersGroupList[j].toInt() > j+1)
197 {
198 playersGroupList.append(QStringLiteral("%1").arg(j+1));
199 strPlayerIDList.append( player.key());
200 nPlayersGroupIndex = j+1;
201 nIndex = nPlayersGroupIndex;
202 break;
203 }
204 }
205 if(nIndex < 0)
206 {
207 playersGroupList.append(QStringLiteral("%1").arg(playersGroupList.count() + 1));
208 strPlayerIDList.append( player.key());
209 nPlayersGroupIndex = playersGroupList.count();
210 }
211 }
212 else
213 {
214 nPlayersGroupIndex = playersGroupList[nIndex].toInt();
215 }
216
217 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("PlayerID", (*player).strPlayerID);
218 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("Name", (*player).strPlayerName);
219 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("Enabled", ((*player).enabled ? 1 : 0));
220
221 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyUp", (*player).keyUp.toString());
222 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyRight", (*player).keyRight.toString());
223 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyDown", (*player).keyDown.toString());
224 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyLeft", (*player).keyLeft.toString());
225 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyPutBomb", (*player).keyPutBomb.toString());
226
227 ++player;
228 }
229 }
230 else
231 {
232 int nPlayersGroupIndex = 1;
233 for (const auto& player: m_playerSettings)
234 {
235 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("PlayerID", player.strPlayerID);
236 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("Name", player.strPlayerName);
237 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("Enabled", ( player.enabled ? 1 : 0));
238
239 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyUp", player.keyUp.toString());
240 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyRight", player.keyRight.toString());
241 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyDown", player.keyDown.toString());
242 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyLeft", player.keyLeft.toString());
243 granatierConfig.group("Player").group(QStringLiteral("%1").arg(nPlayersGroupIndex)).writeEntry("KeyPutBomb", player.keyPutBomb.toString());
244
245 nPlayersGroupIndex++;
246 }
247 }
248 }
249
discardUnsavedSettings()250 void PlayerSettings::discardUnsavedSettings()
251 {
252 m_pendingPlayerSettings = m_playerSettings;
253 }
254
setPlayerName(const QString & strPlayerID,const QString & strName)255 void PlayerSettings::setPlayerName(const QString& strPlayerID, const QString& strName)
256 {
257 if( m_pendingPlayerSettings.contains(strPlayerID))
258 {
259 m_pendingPlayerSettings.find(strPlayerID).value().strPlayerName = strName;
260 Settings::self()->setDummy(Settings::self()->dummy() + 3);
261 }
262 }
263
setEnabled(const QString & strPlayerID,const bool enabled)264 void PlayerSettings::setEnabled(const QString& strPlayerID, const bool enabled)
265 {
266 if( m_pendingPlayerSettings.contains(strPlayerID))
267 {
268 m_pendingPlayerSettings.find(strPlayerID).value().enabled = enabled;
269 Settings::self()->setDummy(Settings::self()->dummy() + 3);
270 }
271 }
272
setKeyUp(const QString & strPlayerID,const QKeySequence & key)273 void PlayerSettings::setKeyUp(const QString& strPlayerID, const QKeySequence& key)
274 {
275 if( m_pendingPlayerSettings.contains(strPlayerID))
276 {
277 m_pendingPlayerSettings.find(strPlayerID).value().keyUp = key;
278 Settings::self()->setDummy(Settings::self()->dummy() + 3);
279 }
280 }
281
setKeyRight(const QString & strPlayerID,const QKeySequence & key)282 void PlayerSettings::setKeyRight(const QString& strPlayerID, const QKeySequence& key)
283 {
284 if( m_pendingPlayerSettings.contains(strPlayerID))
285 {
286 m_pendingPlayerSettings.find(strPlayerID).value().keyRight = key;
287 Settings::self()->setDummy(Settings::self()->dummy() + 3);
288 }
289 }
290
setKeyDown(const QString & strPlayerID,const QKeySequence & key)291 void PlayerSettings::setKeyDown(const QString& strPlayerID, const QKeySequence& key)
292 {
293 if( m_pendingPlayerSettings.contains(strPlayerID))
294 {
295 m_pendingPlayerSettings.find(strPlayerID).value().keyDown = key;
296 Settings::self()->setDummy(Settings::self()->dummy() + 3);
297 }
298 }
299
setKeyLeft(const QString & strPlayerID,const QKeySequence & key)300 void PlayerSettings::setKeyLeft(const QString& strPlayerID, const QKeySequence& key)
301 {
302 if( m_pendingPlayerSettings.contains(strPlayerID))
303 {
304 m_pendingPlayerSettings.find(strPlayerID).value().keyLeft = key;
305 Settings::self()->setDummy(Settings::self()->dummy() + 3);
306 }
307 }
308
setKeyPutBomb(const QString & strPlayerID,const QKeySequence & key)309 void PlayerSettings::setKeyPutBomb(const QString& strPlayerID, const QKeySequence& key)
310 {
311 if( m_pendingPlayerSettings.contains(strPlayerID))
312 {
313 m_pendingPlayerSettings.find(strPlayerID).value().keyPutBomb = key;
314 Settings::self()->setDummy(Settings::self()->dummy() + 3);
315 }
316 }
317