1 #include <QtCore>
2 #include <QMenu>
3 #include <QApplication>
4 #include <QToolButton>
5 #include <QFontMetrics>
6 #include <QAction>
7 #include <QFileDialog>
8
9 #include "settings.h"
10 #include "options.h"
11 #include "customidsetup.h"
12 #include "macros.h"
13
14 extern Settings *qmc2Config;
15 extern Options *qmc2Options;
16
CustomIDSetup(QString foreignEmulatorName,QWidget * parent)17 CustomIDSetup::CustomIDSetup(QString foreignEmulatorName, QWidget *parent)
18 : QDialog(parent)
19 {
20 setupUi(this);
21
22 copyIDsMenu = 0;
23 adjustFontAndIconSizes();
24 foreignEmulator = foreignEmulatorName;
25 setWindowTitle(tr("Setup custom IDs for '%1'").arg(foreignEmulator));
26
27 QSize widgetSize = qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/Size", QSize()).toSize();
28 if ( !widgetSize.isEmpty() )
29 resize(widgetSize);
30 QByteArray headerState = qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/IDListHeaderState", QByteArray()).toByteArray();
31 if ( !headerState.isEmpty() )
32 tableWidgetCustomIDs->horizontalHeader()->restoreState(headerState);
33 bool enable = qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/SortingEnabled", true).toBool();
34 tableWidgetCustomIDs->setSortingEnabled(enable);
35 tableWidgetCustomIDs->setDragDropMode(enable ? QAbstractItemView::NoDragDrop : QAbstractItemView::InternalMove);
36 toolButtonSort->setChecked(enable);
37 QString displayFormat = qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/DisplayFormat", "$ID$ - $DESCRIPTION$").toString();
38 if ( !displayFormat.isEmpty() ) {
39 int index = comboBoxDisplayFormat->findText(displayFormat);
40 if ( index >= 0 ) {
41 comboBoxDisplayFormat->setCurrentIndex(index);
42 } else {
43 comboBoxDisplayFormat->addItem(displayFormat);
44 comboBoxDisplayFormat->setCurrentIndex(comboBoxDisplayFormat->count() - 1);
45 }
46 }
47
48 QTimer::singleShot(0, this, SLOT(load()));
49 QTimer::singleShot(0, this, SLOT(setupCopyIDsMenu()));
50 }
51
~CustomIDSetup()52 CustomIDSetup::~CustomIDSetup()
53 {
54 qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/Size", size());
55 qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/IDListHeaderState", tableWidgetCustomIDs->horizontalHeader()->saveState());
56 qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/SortingEnabled", toolButtonSort->isChecked());
57 qmc2Config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/DisplayFormat", comboBoxDisplayFormat->currentText());
58 }
59
adjustFontAndIconSizes()60 void CustomIDSetup::adjustFontAndIconSizes()
61 {
62 QFont f;
63 f.fromString(qmc2Config->value(QMC2_FRONTEND_PREFIX + "GUI/Font").toString());
64 setFont(f);
65 QFontMetrics fm(f);
66 QSize iconSize(fm.height() - 2, fm.height() - 2);
67 toolButtonAddID->setIconSize(iconSize);
68 toolButtonRemoveID->setIconSize(iconSize);
69 toolButtonSort->setIconSize(iconSize);
70 toolButtonCopyIDs->setIconSize(iconSize);
71 pushButtonOk->setIconSize(iconSize);
72 pushButtonCancel->setIconSize(iconSize);
73 }
74
setupCopyIDsMenu()75 void CustomIDSetup::setupCopyIDsMenu()
76 {
77 qmc2Config->beginGroup(QMC2_EMULATOR_PREFIX + "CustomIDs");
78 QStringList childGroups = qmc2Config->childGroups();
79
80 if ( !childGroups.isEmpty() ) {
81 copyIDsMenu = new QMenu(this);
82 int emuCount = 0;
83 foreach (QString emuName, childGroups) {
84 if ( emuName != this->foreignEmulator ) {
85 QAction *action = copyIDsMenu->addAction(emuName);
86 action->setIcon(QIcon(QString::fromUtf8(":/data/img/editcopy.png")));
87 connect(action, SIGNAL(triggered()), this, SLOT(action_copyIDsMenuItem_triggered()));
88 emuCount++;
89 }
90 }
91 toolButtonCopyIDs->setMenu(copyIDsMenu);
92 if ( emuCount > 0 )
93 toolButtonCopyIDs->setEnabled(true);
94 }
95
96 qmc2Config->endGroup();
97 }
98
action_copyIDsMenuItem_triggered()99 void CustomIDSetup::action_copyIDsMenuItem_triggered()
100 {
101 QAction *action = (QAction *)sender();
102 QString emuName = action->iconText();
103 if ( !emuName.isEmpty() ) {
104 bool oldSortingEnabled = tableWidgetCustomIDs->isSortingEnabled();
105 tableWidgetCustomIDs->setSortingEnabled(false);
106 qmc2Config->beginGroup(QString(QMC2_EMULATOR_PREFIX + "CustomIDs/%1").arg(emuName));
107 QStringList idList = qmc2Config->value("IDs", QStringList()).toStringList();
108 QStringList descriptionList = qmc2Config->value("Descriptions", QStringList()).toStringList();
109 int i = 0;
110 int row = tableWidgetCustomIDs->rowCount();
111 while ( i < idList.count() ) {
112 QString id = idList[i];
113 if ( !id.isEmpty() ) {
114 tableWidgetCustomIDs->insertRow(row);
115 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_ID, new QTableWidgetItem(id));
116 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_DESCRIPTION, new QTableWidgetItem(descriptionList[i]));
117 row++;
118 }
119 i++;
120 }
121 qmc2Config->endGroup();
122 tableWidgetCustomIDs->setSortingEnabled(oldSortingEnabled);
123 }
124 }
125
on_toolButtonAddID_clicked()126 void CustomIDSetup::on_toolButtonAddID_clicked()
127 {
128 int row = tableWidgetCustomIDs->rowCount();
129 bool oldSortingEnabled = tableWidgetCustomIDs->isSortingEnabled();
130 tableWidgetCustomIDs->setSortingEnabled(false);
131 tableWidgetCustomIDs->insertRow(row);
132 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_ID, new QTableWidgetItem());
133 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_DESCRIPTION, new QTableWidgetItem());
134 QToolButton *tb = new QToolButton(0);
135 QFontMetrics fm(qApp->font());
136 tb->setIconSize(QSize(fm.height(), fm.height()));
137 tb->setIcon(QIcon(QString::fromUtf8(":/data/img/pacman.png")));
138 tb->setWhatsThis(":/data/img/pacman.png");
139 tb->setToolTip(tr("Choose icon for this foreign ID (hold down for menu)"));
140 QMenu *menu = new QMenu(tb);
141 QAction *action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/pacman.png")), tr("Default icon"));
142 connect(action, SIGNAL(triggered(bool)), this, SLOT(actionDefaultIdIconTriggered()));
143 menu->addSeparator();
144 action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/no.png")), tr("No icon"));
145 connect(action, SIGNAL(triggered(bool)), this, SLOT(actionNoIdIconTriggered()));
146 tb->setMenu(menu);
147 tableWidgetCustomIDs->setCellWidget(row, QMC2_CUSTOMIDS_COLUMN_ICON, tb);
148 connect(tb, SIGNAL(clicked()), this, SLOT(chooseIdIconClicked()));
149 tableWidgetCustomIDs->setSortingEnabled(oldSortingEnabled);
150 tableWidgetCustomIDs->resizeRowsToContents();
151 }
152
on_toolButtonRemoveID_clicked()153 void CustomIDSetup::on_toolButtonRemoveID_clicked()
154 {
155 QList<QTableWidgetItem *> selectedItems = tableWidgetCustomIDs->selectedItems();
156 if ( selectedItems.count() > 0 )
157 tableWidgetCustomIDs->removeRow(tableWidgetCustomIDs->row(selectedItems[0]));
158 else if ( tableWidgetCustomIDs->currentRow() >= 0 )
159 tableWidgetCustomIDs->removeRow(tableWidgetCustomIDs->currentRow());
160 }
161
on_tableWidgetCustomIDs_itemSelectionChanged()162 void CustomIDSetup::on_tableWidgetCustomIDs_itemSelectionChanged()
163 {
164 QList<QTableWidgetItem *> selectedItems = tableWidgetCustomIDs->selectedItems();
165 if ( selectedItems.count() > 0 )
166 toolButtonRemoveID->setEnabled(true);
167 else
168 toolButtonRemoveID->setEnabled(tableWidgetCustomIDs->currentRow() >= 0);
169 }
170
on_tableWidgetCustomIDs_currentItemChanged(QTableWidgetItem * current,QTableWidgetItem * previous)171 void CustomIDSetup::on_tableWidgetCustomIDs_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
172 {
173 on_tableWidgetCustomIDs_itemSelectionChanged();
174 }
175
on_toolButtonSort_toggled(bool enable)176 void CustomIDSetup::on_toolButtonSort_toggled(bool enable)
177 {
178 tableWidgetCustomIDs->setSortingEnabled(enable);
179 tableWidgetCustomIDs->setDragDropMode(enable ? QAbstractItemView::NoDragDrop : QAbstractItemView::InternalMove);
180 if ( enable )
181 tableWidgetCustomIDs->sortByColumn(tableWidgetCustomIDs->horizontalHeader()->sortIndicatorSection(), tableWidgetCustomIDs->horizontalHeader()->sortIndicatorOrder());
182 }
183
load()184 void CustomIDSetup::load()
185 {
186 QString groupKey = QString(QMC2_EMULATOR_PREFIX + "CustomIDs/%1").arg(foreignEmulator);
187
188 qmc2Config->beginGroup(groupKey);
189 QStringList idList = qmc2Config->value("IDs", QStringList()).toStringList();
190 QStringList descriptionList = qmc2Config->value("Descriptions", QStringList()).toStringList();
191 while ( descriptionList.count() < idList.count() )
192 descriptionList << QString();
193 QStringList iconList = qmc2Config->value("Icons", QStringList()).toStringList();
194 while ( iconList.count() < idList.count() )
195 iconList << QString();
196 qmc2Config->endGroup();
197
198 tableWidgetCustomIDs->clearContents();
199 bool oldSortingEnabled = tableWidgetCustomIDs->isSortingEnabled();
200 tableWidgetCustomIDs->setSortingEnabled(false);
201 int row = 0;
202 for (int i = 0; i < idList.count(); i++) {
203 QString id = idList[i];
204 if ( !id.isEmpty() ) {
205 QString description = descriptionList[i];
206 QString idIcon = iconList[i];
207 tableWidgetCustomIDs->insertRow(row);
208 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_ID, new QTableWidgetItem(id));
209 tableWidgetCustomIDs->setItem(row, QMC2_CUSTOMIDS_COLUMN_DESCRIPTION, new QTableWidgetItem(description));
210 QToolButton *tb = new QToolButton(0);
211 QFontMetrics fm(qApp->font());
212 tb->setIconSize(QSize(fm.height(), fm.height()));
213 if ( idIcon.isEmpty() ) {
214 tb->setIcon(QIcon(QString::fromUtf8(":/data/img/pacman.png")));
215 tb->setWhatsThis(":/data/img/pacman.png");
216 } else {
217 if ( idIcon == "[none]" ) {
218 tb->setIcon(QIcon());
219 tb->setWhatsThis("[none]");
220 } else {
221 QIcon icon = QIcon(idIcon);
222 if ( !icon.isNull() ) {
223 tb->setIcon(icon);
224 tb->setWhatsThis(idIcon);
225 } else {
226 tb->setIcon(QIcon(QString::fromUtf8(":/data/img/pacman.png")));
227 tb->setWhatsThis(":/data/img/pacman.png");
228 }
229 }
230 }
231 tb->setToolTip(tr("Choose icon for this foreign ID (hold down for menu)"));
232 QMenu *menu = new QMenu(tb);
233 QAction *action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/pacman.png")), tr("Default icon"));
234 connect(action, SIGNAL(triggered(bool)), this, SLOT(actionDefaultIdIconTriggered()));
235 menu->addSeparator();
236 action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/no.png")), tr("No icon"));
237 connect(action, SIGNAL(triggered(bool)), this, SLOT(actionNoIdIconTriggered()));
238 tb->setMenu(menu);
239 tableWidgetCustomIDs->setCellWidget(row, QMC2_CUSTOMIDS_COLUMN_ICON, tb);
240 connect(tb, SIGNAL(clicked()), this, SLOT(chooseIdIconClicked()));
241 row++;
242 }
243 }
244 tableWidgetCustomIDs->setSortingEnabled(oldSortingEnabled);
245 if ( oldSortingEnabled )
246 tableWidgetCustomIDs->sortByColumn(tableWidgetCustomIDs->horizontalHeader()->sortIndicatorSection(), tableWidgetCustomIDs->horizontalHeader()->sortIndicatorOrder());
247 tableWidgetCustomIDs->resizeRowsToContents();
248 }
249
save()250 void CustomIDSetup::save()
251 {
252 QString groupKey = QString(QMC2_EMULATOR_PREFIX + "CustomIDs/%1").arg(foreignEmulator);
253 qmc2Config->remove(groupKey);
254
255 QStringList idList, descriptionList, iconList;
256 for (int row = 0; row < tableWidgetCustomIDs->rowCount(); row++) {
257 QTableWidgetItem *idItem = tableWidgetCustomIDs->item(row, QMC2_CUSTOMIDS_COLUMN_ID);
258 QTableWidgetItem *descriptionItem = tableWidgetCustomIDs->item(row, QMC2_CUSTOMIDS_COLUMN_DESCRIPTION);
259 if ( idItem ) {
260 QString id = idItem->text();
261 QString description;
262 if ( descriptionItem )
263 description = descriptionItem->text();
264 if ( !id.isEmpty() ) {
265 idList << id;
266 descriptionList << description;
267 }
268 QToolButton *tb = (QToolButton *)tableWidgetCustomIDs->cellWidget(row, QMC2_CUSTOMIDS_COLUMN_ICON);
269 if ( tb ) {
270 QString idIcon = tb->whatsThis();
271 if ( !idIcon.startsWith(":") )
272 iconList << idIcon;
273 else
274 iconList << QString();
275 } else
276 iconList << QString();
277 }
278 }
279
280 if ( !idList.isEmpty() ) {
281 qmc2Config->beginGroup(groupKey);
282 qmc2Config->setValue("IDs", idList);
283 qmc2Config->setValue("Descriptions", descriptionList);
284 QStringList iconSaveList = iconList;
285 iconSaveList.removeAll(QString());
286 if ( !iconSaveList.isEmpty() )
287 qmc2Config->setValue("Icons", iconList);
288 else
289 qmc2Config->remove("Icons");
290 qmc2Config->endGroup();
291 }
292 }
293
chooseIdIconClicked()294 void CustomIDSetup::chooseIdIconClicked()
295 {
296 QToolButton *tb = (QToolButton *)sender();
297 if ( tb ) {
298 QString idIcon = tb->whatsThis();
299 if ( idIcon.startsWith(":") )
300 idIcon.clear();
301 QStringList imageFileTypes;
302 foreach (QByteArray imageFormat, QImageReader::supportedImageFormats())
303 imageFileTypes << "*." + QString(imageFormat).toLower();
304 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose image file"), idIcon, tr("Supported image files (%1)").arg(imageFileTypes.join(" ")) + ";;" + tr("All files (*)"), 0, qmc2Options->useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
305 if ( !fileName.isEmpty() ) {
306 QIcon icon = QIcon(fileName);
307 if ( !icon.isNull() ) {
308 tb->setIcon(icon);
309 tb->setWhatsThis(fileName);
310 }
311 }
312 }
313 }
314
actionDefaultIdIconTriggered()315 void CustomIDSetup::actionDefaultIdIconTriggered()
316 {
317 QAction *action = (QAction *)sender();
318 if ( action ) {
319 QToolButton *tb = (QToolButton *)action->parentWidget()->parentWidget();
320 if ( tb ) {
321 tb->setIcon(QIcon(QString::fromUtf8(":/data/img/pacman.png")));
322 tb->setWhatsThis(":/data/img/pacman.png");
323 }
324 }
325 }
326
actionNoIdIconTriggered()327 void CustomIDSetup::actionNoIdIconTriggered()
328 {
329 QAction *action = (QAction *)sender();
330 if ( action ) {
331 QToolButton *tb = (QToolButton *)action->parentWidget()->parentWidget();
332 if ( tb ) {
333 tb->setIcon(QIcon());
334 tb->setWhatsThis("[none]");
335 }
336 }
337 }
338