Search for Power Button Panel
[pierogi] / dialogs / pireditkeysetdialog.cpp
1 #include "pireditkeysetdialog.h"
2 #include "ui_pireditkeysetdialog.h"
3
4 #include "mainwindow.h"
5 #include "pirkeysetwidgetitem.h"
6
7 #include <QSettings>
8
9 #include "pirmakenames.h"
10 extern PIRMakeMgr makeManager;
11
12 /*
13 PIREditKeysetDialog::PIREditKeysetDialog(QWidget *parent) :
14   QDialog(parent),
15   ui(new Ui::PIREditKeysetDialog)
16 {
17   ui->setupUi(this);
18 }
19 */
20
21 PIREditKeysetDialog::PIREditKeysetDialog(
22   MainWindow *mw)
23   : QDialog(mw),
24     ui(new Ui::PIREditKeysetDialog),
25     mainWindow(mw)
26 {
27   ui->setupUi(this);
28
29   connect(
30     this,
31     SIGNAL(accepted()),
32     this,
33     SLOT(enactChanges()),
34     Qt::QueuedConnection);
35 }
36
37 PIREditKeysetDialog::~PIREditKeysetDialog()
38 {
39   delete ui;
40 }
41
42
43 void PIREditKeysetDialog::setupDialog(
44   PIRKeysetWidgetItem *kwi)
45 {
46   ui->keysetNameLabel->setText(
47     kwi->text());
48
49   ui->addToFavoritesCheckBox->setChecked(kwi->isFavorite());
50
51   if (kwi->hasNickname())
52   {
53     ui->nicknameLineEdit->setText(kwi->getNickname());
54   }
55   else
56   {
57     ui->nicknameLineEdit->clear();
58   }
59
60   keysetItem = kwi;
61 }
62
63
64 void PIREditKeysetDialog::enactChanges()
65 {
66   // Did the nickname change?
67   bool nickChanged = false;
68   QString newNick = ui->nicknameLineEdit->text();
69   if (newNick != keysetItem->getNickname())
70   {
71     nickChanged = true;
72
73     keysetItem->setNickname(newNick);
74
75     // Need to update the display name:
76     QString newDisplayName;
77     if (!newNick.isEmpty())
78     {
79       newDisplayName = newNick;
80       newDisplayName.append(" (");
81       newDisplayName.append(makeManager.getMakeString(keysetItem->getMake()));
82       newDisplayName.append(" ");
83       newDisplayName.append(keysetItem->getInternalName());
84       newDisplayName.append(")");
85
86       updateQSettingsNickname();
87     }
88     else
89     {
90       newDisplayName = makeManager.getMakeString(keysetItem->getMake());
91       newDisplayName.append(" ");
92       newDisplayName.append(keysetItem->getInternalName());
93
94       removeQSettingsNickname();
95     }
96
97     keysetItem->setText(newDisplayName);
98   }
99
100   // Did the favorites setting change?
101   if (keysetItem->isFavorite())
102   {
103     if (!ui->addToFavoritesCheckBox->isChecked())
104     {
105       // Remove it from the favorites list:
106       keysetItem->setFavorite(false);
107       mainWindow->removeFromFavorites(keysetItem->getID());
108     }
109     else
110     {
111       // It's already in the favorites list, but if the nickname changed,
112       // we still need to update its entry:
113       if (nickChanged)
114       {
115         mainWindow->removeFromFavorites(keysetItem->getID());
116         mainWindow->addToFavorites(keysetItem);
117       }
118     }
119   }
120   else
121   {
122     if (ui->addToFavoritesCheckBox->isChecked())
123     {
124       keysetItem->setFavorite(true);
125       mainWindow->addToFavorites(keysetItem);
126     }
127   }
128 }
129
130
131 // Creating a new QSettings array entry, or updating an existing one, is
132 // relatively painless:
133 void PIREditKeysetDialog::updateQSettingsNickname()
134 {
135   QSettings settings("pietrzak.org", "Pierogi");
136
137   // Try to find an existing entry:
138   int size = settings.beginReadArray("userNames");
139   int index = 0;
140   QString name;
141   QString makeStr;
142   PIRMakeName makeID;
143
144   while (index < size)
145   {
146     settings.setArrayIndex(index);
147     name = settings.value("keysetName").toString();
148
149     if (name == keysetItem->getInternalName())
150     {
151       makeStr = settings.value("keysetMake").toString();
152       makeID = makeManager.getMakeID(makeStr);
153
154       if (makeID == keysetItem->getMake())
155       {
156         // We've found a match, so we just need to update it:
157         settings.endArray();
158         settings.beginWriteArray("userNames");
159         settings.setArrayIndex(index);
160         settings.setValue("keysetNickname", keysetItem->getNickname());
161         settings.endArray();
162
163         // And we're done!
164         return;
165       }
166     }
167
168     ++index;
169   }
170
171   settings.endArray();
172
173   // There was no existing entry, so we just need to make one:
174   settings.beginWriteArray("userNames");
175   settings.setArrayIndex(size);
176
177   settings.setValue(
178     "keysetName",
179     keysetItem->getInternalName());
180
181   settings.setValue(
182     "keysetMake",
183     makeManager.getMakeString(keysetItem->getMake()));
184
185   settings.setValue(
186     "keysetNickname",
187     keysetItem->getNickname());
188
189   settings.endArray();
190 }
191
192
193 // Removing an entry from a QSettings array is, unfortunately, quite painful:
194 struct stringTriple
195 {
196   QString keysetName;
197   QString keysetMake;
198   QString keysetNickname;
199 };
200
201 typedef std::map <int, stringTriple> PIRSettingsData;
202
203 void PIREditKeysetDialog::removeQSettingsNickname()
204 {
205   QSettings settings("pietrzak.org", "Pierogi");
206
207   int size = settings.beginReadArray("userNames");
208   int index = 0;
209   int index2 = 0;
210   PIRSettingsData backupData;
211   QString nameToRemove = keysetItem->getInternalName();
212   QString makeToRemove = makeManager.getMakeString(keysetItem->getMake());
213
214   while (index < size)
215   {
216     settings.setArrayIndex(index);
217
218     if ( (settings.value("keysetName").toString() != nameToRemove)
219       && (settings.value("keysetMake").toString() != makeToRemove) )
220     {
221       backupData[index2].keysetName =
222         settings.value("keysetName").toString();
223       backupData[index2].keysetMake =
224         settings.value("keysetMake").toString();
225       backupData[index2].keysetNickname =
226         settings.value("keysetNickname").toString();
227       ++index2;
228     }
229
230     ++index;
231   }
232
233   // Close the array, blow it away, and create a new one:
234
235   settings.endArray();
236   settings.remove("userNames");
237   settings.beginWriteArray("userNames");
238
239   size = index2;
240   index = 0;
241
242   while (index < size)
243   {
244     settings.setArrayIndex(index);
245     settings.setValue("keysetName", backupData[index].keysetName);
246     settings.setValue("keysetMake", backupData[index].keysetMake);
247     settings.setValue("keysetNickname", backupData[index].keysetNickname);
248     ++index;
249   }
250   settings.endArray();
251 }