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