Adding per-keyset editable data
[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
56   keysetItem = kwi;
57 }
58
59
60 void PIREditKeysetDialog::enactChanges()
61 {
62   // Did the nickname change?
63   bool nickChanged = false;
64   QString newNick = ui->nicknameLineEdit->text();
65   if (newNick != keysetItem->getNickname())
66   {
67     nickChanged = true;
68
69     keysetItem->setNickname(newNick);
70
71     // Need to update the display name:
72     QString newDisplayName;
73     if (!newNick.isEmpty())
74     {
75       newDisplayName = newNick;
76       newDisplayName.append(" (");
77       newDisplayName.append(makeManager.getMakeString(keysetItem->getMake()));
78       newDisplayName.append(" ");
79       newDisplayName.append(keysetItem->getInternalName());
80       newDisplayName.append(")");
81
82       updateQSettingsNickname();
83     }
84     else
85     {
86       newDisplayName = makeManager.getMakeString(keysetItem->getMake());
87       newDisplayName.append(" ");
88       newDisplayName.append(keysetItem->getInternalName());
89
90       removeQSettingsNickname();
91     }
92
93     keysetItem->setText(newDisplayName);
94   }
95
96   // Did the favorites setting change?
97   if (keysetItem->isFavorite())
98   {
99     if (!ui->addToFavoritesCheckBox->isChecked())
100     {
101       // Remove it from the favorites list:
102       keysetItem->setFavorite(false);
103       mainWindow->removeFromFavorites(keysetItem->getID());
104     }
105     else
106     {
107       // It's already in the favorites list, but if the nickname changed,
108       // we still need to update its entry:
109       if (nickChanged)
110       {
111         mainWindow->removeFromFavorites(keysetItem->getID());
112         mainWindow->addToFavorites(keysetItem);
113       }
114     }
115   }
116   else
117   {
118     if (ui->addToFavoritesCheckBox->isChecked())
119     {
120       keysetItem->setFavorite(true);
121       mainWindow->addToFavorites(keysetItem);
122     }
123   }
124
125   // Finally, clean up the dialog box for the next user:
126   ui->nicknameLineEdit->clear();
127 }
128
129
130 // Creating a new QSettings array entry, or updating an existing one, is
131 // relatively painless:
132 void PIREditKeysetDialog::updateQSettingsNickname()
133 {
134   QSettings settings("pietrzak.org", "Pierogi");
135
136   // Try to find an existing entry:
137   int size = settings.beginReadArray("userNames");
138   int index = 0;
139   QString name;
140   QString makeStr;
141   PIRMakeName makeID;
142
143   while (index < size)
144   {
145     settings.setArrayIndex(index);
146     name = settings.value("keysetName").toString();
147
148     if (name == keysetItem->getInternalName())
149     {
150       makeStr = settings.value("keysetMake").toString();
151       makeID = makeManager.getMakeID(makeStr);
152
153       if (makeID == keysetItem->getMake())
154       {
155         // We've found a match, so we just need to update it:
156         settings.endArray();
157         settings.beginWriteArray("userNames");
158         settings.setArrayIndex(index);
159         settings.setValue("keysetNickname", keysetItem->getNickname());
160         settings.endArray();
161
162         // And we're done!
163         return;
164       }
165     }
166
167     ++index;
168   }
169
170   settings.endArray();
171
172   // There was no existing entry, so we just need to make one:
173   settings.beginWriteArray("userNames");
174   settings.setArrayIndex(size);
175
176   settings.setValue(
177     "keysetName",
178     keysetItem->getInternalName());
179
180   settings.setValue(
181     "keysetMake",
182     makeManager.getMakeString(keysetItem->getMake()));
183
184   settings.setValue(
185     "keysetNickname",
186     keysetItem->getNickname());
187
188   settings.endArray();
189 }
190
191
192 // Removing an entry from a QSettings array is, unfortunately, quite painful:
193 struct stringTriple
194 {
195   QString keysetName;
196   QString keysetMake;
197   QString keysetNickname;
198 };
199
200 typedef std::map <int, stringTriple> PIRSettingsData;
201
202 void PIREditKeysetDialog::removeQSettingsNickname()
203 {
204   QSettings settings("pietrzak.org", "Pierogi");
205
206   int size = settings.beginReadArray("userNames");
207   int index = 0;
208   int index2 = 0;
209   PIRSettingsData backupData;
210   QString nameToRemove = keysetItem->getInternalName();
211   QString makeToRemove = makeManager.getMakeString(keysetItem->getMake());
212
213   while (index < size)
214   {
215     settings.setArrayIndex(index);
216
217     if ( (settings.value("keysetName").toString() != nameToRemove)
218       && (settings.value("keysetMake").toString() != makeToRemove) )
219     {
220       backupData[index2].keysetName =
221         settings.value("keysetName").toString();
222       backupData[index2].keysetMake =
223         settings.value("keysetMake").toString();
224       backupData[index2].keysetNickname =
225         settings.value("keysetNickname").toString();
226       ++index2;
227     }
228
229     ++index;
230   }
231
232   // Close the array, blow it away, and create a new one:
233
234   settings.endArray();
235   settings.remove("userNames");
236   settings.beginWriteArray("userNames");
237
238   size = index2;
239   index = 0;
240
241   while (index < size)
242   {
243     settings.setArrayIndex(index);
244     settings.setValue("keysetName", backupData[index].keysetName);
245     settings.setValue("keysetMake", backupData[index].keysetMake);
246     settings.setValue("keysetNickname", backupData[index].keysetNickname);
247     ++index;
248   }
249   settings.endArray();
250 }