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