1 #include <QTranslator>
2 #include <QFileInfo>
3 #include <QFileDialog>
4 #include <QFontDialog>
5 #include <QMessageBox>
6 #include <QTimer>
7 #include <QMap>
8 #include <QMultiMap>
9 #include <QHash>
10 #include <QHashIterator>
11 #include <QStyleFactory>
12 #include <QHeaderView>
13 #include <QBitArray>
14 #include <QAction>
15 #include <QPair>
16 #include <QNetworkProxy>
17 #include <QScrollBar>
18 #include <QInputDialog>
19 #include <QSplashScreen>
20 #include <QNetworkAccessManager>
21 #include <QWebSettings>
22 #include <QCache>
23 
24 #include "options.h"
25 #include "emuopt.h"
26 #include "preview.h"
27 #include "flyer.h"
28 #include "cabinet.h"
29 #include "controller.h"
30 #include "marquee.h"
31 #include "title.h"
32 #include "pcb.h"
33 #include "qmc2main.h"
34 #include "machinelist.h"
35 #include "imagechecker.h"
36 #include "macros.h"
37 #include "unzip.h"
38 #include "keyseqscan.h"
39 #include "romalyzer.h"
40 #include "romstatusexport.h"
41 #include "docbrowser.h"
42 #include "componentsetup.h"
43 #include "toolbarcustomizer.h"
44 #include "paletteeditor.h"
45 #include "iconlineedit.h"
46 #include "imagewidget.h"
47 #include "cookiejar.h"
48 #include "cookiemanager.h"
49 #include "networkaccessmanager.h"
50 #include "additionalartworksetup.h"
51 #include "imageformatsetup.h"
52 #if QMC2_JOYSTICK == 1
53 #include "joystick.h"
54 #include "joyfuncscan.h"
55 #endif
56 #include "deviceconfigurator.h"
57 #include "softwarelist.h"
58 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
59 #include "embedder.h"
60 #include "embedderopt.h"
61 #endif
62 #if QMC2_USE_PHONON_API
63 #include "audioeffects.h"
64 #endif
65 #if defined(QMC2_YOUTUBE_ENABLED)
66 #include "youtubevideoplayer.h"
67 #endif
68 #include "htmleditor/htmleditor.h"
69 #include "customidsetup.h"
70 #include "samplechecker.h"
71 #include "rankitemwidget.h"
72 #include "componentsetup.h"
73 #include "cryptedbytearray.h"
74 #include "individualfallbacksettings.h"
75 #include "catverinioptimizer.h"
76 #include "iconcachesetupdialog.h"
77 #include "manualscanner.h"
78 
79 // external global variables
80 extern MainWindow *qmc2MainWindow;
81 extern Options *qmc2Options;
82 extern bool qmc2GuiReady;
83 extern bool qmc2CleaningUp;
84 extern bool qmc2StartingUp;
85 extern bool qmc2EarlyStartup;
86 extern bool qmc2ReloadActive;
87 extern bool qmc2ScaledPreview;
88 extern bool qmc2ScaledFlyer;
89 extern bool qmc2ScaledCabinet;
90 extern bool qmc2ScaledController;
91 extern bool qmc2ScaledMarquee;
92 extern bool qmc2ScaledTitle;
93 extern bool qmc2ScaledPCB;
94 extern bool qmc2ScaledSoftwareSnapshot;
95 extern bool qmc2SmoothScaling;
96 extern bool qmc2RetryLoadingImages;
97 extern bool qmc2ParentImageFallback;
98 extern bool qmc2VerifyActive;
99 extern bool qmc2ImageCheckActive;
100 extern bool qmc2SampleCheckActive;
101 extern bool qmc2UsePreviewFile;
102 extern bool qmc2UseFlyerFile;
103 extern bool qmc2UseIconFile;
104 extern bool qmc2UseCabinetFile;
105 extern bool qmc2UseControllerFile;
106 extern bool qmc2UseMarqueeFile;
107 extern bool qmc2UseTitleFile;
108 extern bool qmc2UsePCBFile;
109 extern bool qmc2UseSoftwareSnapFile;
110 extern bool qmc2AutomaticReload;
111 extern bool qmc2SuppressQtMessages;
112 extern bool qmc2ShowMachineName;
113 extern bool qmc2ShowMachineNameOnlyWhenRequired;
114 extern bool qmc2StatesTogglesEnabled;
115 extern int qmc2MachineListResponsiveness;
116 extern int qmc2UpdateDelay;
117 extern EmulatorOptions *qmc2GlobalEmulatorOptions;
118 extern EmulatorOptions *qmc2EmulatorOptions;
119 extern Preview *qmc2Preview;
120 extern Flyer *qmc2Flyer;
121 extern Cabinet *qmc2Cabinet;
122 extern Controller *qmc2Controller;
123 extern Marquee *qmc2Marquee;
124 extern Title *qmc2Title;
125 extern PCB *qmc2PCB;
126 extern SoftwareSnap *qmc2SoftwareSnap;
127 extern MachineList *qmc2MachineList;
128 extern ImageChecker *qmc2ImageChecker;
129 extern ROMAlyzer *qmc2SystemROMAlyzer;
130 extern ROMAlyzer *qmc2SoftwareROMAlyzer;
131 extern ROMStatusExporter *qmc2ROMStatusExporter;
132 extern DocBrowser *qmc2DocBrowser;
133 extern int qmc2SortCriteria;
134 extern Qt::SortOrder qmc2SortOrder;
135 extern Settings *qmc2Config;
136 extern QBitArray qmc2Filter;
137 extern QMap<QString, unzFile> qmc2IconFileMap;
138 extern QMap<QString, SevenZipFile *> qmc2IconFileMap7z;
139 #if defined(QMC2_LIBARCHIVE_ENABLED)
140 extern QMap<QString, ArchiveFile *> qmc2IconArchiveMap;
141 #endif
142 extern QHash<QString, QPair<QString, QAction *> > qmc2ShortcutHash;
143 extern QHash<QString, QString> qmc2CustomShortcutHash;
144 extern MainEventFilter *qmc2MainEventFilter;
145 extern QHash<QString, QKeySequence> qmc2QtKeyHash;
146 extern ComponentSetup *qmc2ComponentSetup;
147 extern ToolBarCustomizer *qmc2ToolBarCustomizer;
148 extern PaletteEditor *qmc2PaletteEditor;
149 #if QMC2_JOYSTICK == 1
150 extern QHash<QString, QString> qmc2JoystickFunctionHash;
151 extern bool qmc2JoystickIsCalibrating;
152 #endif
153 extern DeviceConfigurator *qmc2DeviceConfigurator;
154 extern MiniWebBrowser *qmc2ProjectMESS;
155 extern SoftwareList *qmc2SoftwareList;
156 #if QMC2_USE_PHONON_API
157 extern AudioEffectDialog *qmc2AudioEffectDialog;
158 #endif
159 #if defined(QMC2_YOUTUBE_ENABLED)
160 extern YouTubeVideoPlayer *qmc2YouTubeWidget;
161 #endif
162 extern QAbstractItemView::ScrollHint qmc2CursorPositioningMode;
163 extern QFont *qmc2StartupDefaultFont;
164 extern int qmc2SoftwareSnapPosition;
165 extern int qmc2DefaultLaunchMode;
166 extern HtmlEditor *qmc2SystemNotesEditor;
167 extern HtmlEditor *qmc2SoftwareNotesEditor;
168 extern QSplashScreen *qmc2SplashScreen;
169 extern QCache<QString, ImagePixmap> qmc2ImagePixmapCache;
170 extern QList<QTreeWidgetItem *> qmc2ExpandedMachineListItems;
171 extern bool qmc2SortingActive;
172 extern SampleChecker *qmc2SampleChecker;
173 extern NetworkAccessManager *qmc2NetworkAccessManager;
174 extern QPalette qmc2CustomPalette;
175 extern QMap<QString, QPalette> qmc2StandardPalettes;
176 extern bool qmc2CategoryInfoUsed;
177 extern bool qmc2VersionInfoUsed;
178 extern bool qmc2LoadingSoftwareInfoDB;
179 extern bool qmc2LoadingEmuInfoDB;
180 extern bool qmc2LoadingMachineInfoDB;
181 
182 QBrush Options::greenBrush(QColor(0, 255, 0));
183 QBrush Options::yellowBrush(QColor(255, 255, 0));
184 QBrush Options::blueBrush(QColor(0, 0, 255));
185 QBrush Options::redBrush(QColor(255, 0, 0));
186 QBrush Options::greyBrush(QColor(128, 128, 128));
187 QBrush Options::lightgreyBrush(QColor(200, 200, 200));
188 
Options(QWidget * parent)189 Options::Options(QWidget *parent) :
190 #if defined(QMC2_OS_WIN)
191 	QDialog(parent, Qt::Dialog),
192 #else
193 	QDialog(parent, Qt::Dialog | Qt::SubWindow),
194 #endif
195 	m_enableOutputNotifiers(true)
196 {
197 	qmc2Filter.resize(QMC2_ROMSTATE_COUNT);
198 
199 	QCoreApplication::setOrganizationName(QMC2_ORGANIZATION_NAME);
200 	QCoreApplication::setOrganizationDomain(QMC2_ORGANIZATION_DOMAIN);
201 	QCoreApplication::setApplicationName(QMC2_VARIANT_NAME);
202 
203 #if !defined(QMC2_OS_WIN)
204 	QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, QMC2_SYSCONF_PATH);
205 #endif
206 	QString userScopePath = configPath();
207 	QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, userScopePath);
208 	QDir userScopeDir(userScopePath);
209 	if ( !userScopeDir.exists() )
210 		userScopeDir.mkdir(userScopePath);
211 
212 	config = new Settings(QSettings::IniFormat, QSettings::UserScope, "qmc2");
213 
214 	QWebSettings::enablePersistentStorage(userScopePath);
215 
216 	setupUi(this);
217 
218 #if !defined(QMC2_LIBARCHIVE_ENABLED)
219 	comboBoxPreviewFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
220 	comboBoxFlyerFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
221 	comboBoxCabinetFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
222 	comboBoxControllerFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
223 	comboBoxMarqueeFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
224 	comboBoxTitleFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
225 	comboBoxPCBFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
226 	comboBoxIconFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
227 	comboBoxSoftwareSnapFileType->removeItem(QMC2_IMG_FILETYPE_ARCHIVE);
228 #endif
229 
230 	cancelClicked = false;
231 
232 	setStandardWorkDir(QDir::currentPath());
233 
234 #if !defined(QMC2_OS_MAC)
235 	checkBoxUnifiedTitleAndToolBarOnMac->setVisible(false);
236 #endif
237 
238 #if !defined(QMC2_OS_UNIX) && !defined(QMC2_OS_WIN)
239 	labelDefaultLaunchMode->setVisible(false);
240 	comboBoxDefaultLaunchMode->setVisible(false);
241 #endif
242 
243 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
244 	checkBoxMinimizeOnEmuLaunch->setToolTip(tr("Minimize when launching (non-embedded) emulators?"));
245 #endif
246 
247 	comboBoxSortCriteria->insertItem(QMC2_SORTCRITERIA_CATEGORY, tr("Category"));
248 	comboBoxSortCriteria->insertItem(QMC2_SORTCRITERIA_VERSION, tr("Version"));
249 
250 	// shortcuts
251 	qmc2ShortcutHash.insert("Ctrl+1", QPair<QString, QAction *>(tr("Check all ROM states"), 0));
252 	qmc2ShortcutHash.insert("Ctrl+2", QPair<QString, QAction *>(tr("Check all sample sets"), 0));
253 	qmc2ShortcutHash.insert("Ctrl+3", QPair<QString, QAction *>(tr("Check images and icons"), 0));
254 	qmc2ShortcutHash.insert("Ctrl+B", QPair<QString, QAction *>(tr("About QMC2"), 0));
255 	qmc2ShortcutHash.insert("Ctrl+D", QPair<QString, QAction *>(tr("Analyze current machine"), 0));
256 	qmc2ShortcutHash.insert("Ctrl+Shift+D", QPair<QString, QAction *>(tr("Analyze tagged sets"), 0));
257 	qmc2ShortcutHash.insert("Ctrl+E", QPair<QString, QAction *>(tr("Export ROM Status"), 0));
258 	qmc2ShortcutHash.insert("Ctrl+J", QPair<QString, QAction *>(tr("Copy machine to favorites"), 0));
259 	qmc2ShortcutHash.insert("Ctrl+Shift+J", QPair<QString, QAction *>(tr("Copy tagged sets to favorites"), 0));
260 	qmc2ShortcutHash.insert("Ctrl+H", QPair<QString, QAction *>(tr("Online documentation"), 0));
261 	qmc2ShortcutHash.insert("Ctrl+I", QPair<QString, QAction *>(tr("Clear image cache"), 0));
262 	qmc2ShortcutHash.insert("Ctrl+Shift+A", QPair<QString, QAction *>(tr("Setup arcade mode"), 0));
263 	qmc2ShortcutHash.insert("Ctrl+M", QPair<QString, QAction *>(tr("Clear ProjectMESS cache"), 0));
264 	qmc2ShortcutHash.insert("Ctrl+N", QPair<QString, QAction *>(tr("Clear icon cache"), 0));
265 #if defined(QMC2_OS_MAC)
266 	qmc2ShortcutHash.insert("Ctrl+,", QPair<QString, QAction *>(tr("Open options dialog"), 0));
267 #else
268 	qmc2ShortcutHash.insert("Ctrl+O", QPair<QString, QAction *>(tr("Open options dialog"), 0));
269 #endif
270 	qmc2ShortcutHash.insert("Ctrl+P", QPair<QString, QAction *>(tr("Play (independent)"), 0));
271 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
272 	qmc2ShortcutHash.insert("Ctrl+Shift+P", QPair<QString, QAction *>(tr("Play (embedded)"), 0));
273 #endif
274 #if !defined(QMC2_OS_MAC)
275 	qmc2ShortcutHash.insert("Ctrl+Q", QPair<QString, QAction *>(tr("About Qt"), 0));
276 #endif
277 	qmc2ShortcutHash.insert("Ctrl+R", QPair<QString, QAction *>(tr("Reload machine list"), 0));
278 	qmc2ShortcutHash.insert("Ctrl+S", QPair<QString, QAction *>(tr("Check machine's ROM state"), 0));
279 	qmc2ShortcutHash.insert("Ctrl+Shift+S", QPair<QString, QAction *>(tr("Check states of tagged ROMs"), 0));
280 	qmc2ShortcutHash.insert("Ctrl+T", QPair<QString, QAction *>(tr("Recreate template map"), 0));
281 	qmc2ShortcutHash.insert("Ctrl+Shift+C", QPair<QString, QAction *>(tr("Check template map"), 0));
282 #if defined(QMC2_OS_MAC)
283 	qmc2ShortcutHash.insert("Ctrl+Q", QPair<QString, QAction *>(tr("Stop processing / exit QMC2"), 0));
284 #else
285 	qmc2ShortcutHash.insert("Ctrl+X", QPair<QString, QAction *>(tr("Stop processing / exit QMC2"), 0));
286 #endif
287 #if defined(QMC2_YOUTUBE_ENABLED)
288 	qmc2ShortcutHash.insert("Ctrl+Y", QPair<QString, QAction *>(tr("Clear YouTube cache"), 0));
289 #endif
290 	qmc2ShortcutHash.insert("Ctrl+Z", QPair<QString, QAction *>(tr("Open ROMAlyzer (system mode)"), 0));
291 	qmc2ShortcutHash.insert("Ctrl+W", QPair<QString, QAction *>(tr("Open ROMAlyzer (software mode)"), 0));
292 	qmc2ShortcutHash.insert("Ctrl+Alt+C", QPair<QString, QAction *>(tr("Toggle ROM state C"), 0));
293 	qmc2ShortcutHash.insert("Ctrl+Alt+M", QPair<QString, QAction *>(tr("Toggle ROM state M"), 0));
294 	qmc2ShortcutHash.insert("Ctrl+Alt+I", QPair<QString, QAction *>(tr("Toggle ROM state I"), 0));
295 	qmc2ShortcutHash.insert("Ctrl+Alt+N", QPair<QString, QAction *>(tr("Toggle ROM state N"), 0));
296 	qmc2ShortcutHash.insert("Ctrl+Alt+U", QPair<QString, QAction *>(tr("Toggle ROM state U"), 0));
297 	qmc2ShortcutHash.insert("Ctrl+Shift+T", QPair<QString, QAction *>(tr("Tag current set"), 0));
298 	qmc2ShortcutHash.insert("Ctrl+Shift+U", QPair<QString, QAction *>(tr("Untag current set"), 0));
299 	qmc2ShortcutHash.insert("Ctrl+Shift+G", QPair<QString, QAction *>(tr("Toggle tag mark"), 0));
300 	qmc2ShortcutHash.insert("Shift+Down", QPair<QString, QAction *>(tr("Toggle tag / cursor down"), 0));
301 	qmc2ShortcutHash.insert("Shift+Up", QPair<QString, QAction *>(tr("Toggle tag / cursor up"), 0));
302 	qmc2ShortcutHash.insert("Ctrl+Shift+L", QPair<QString, QAction *>(tr("Tag all sets"), 0));
303 	qmc2ShortcutHash.insert("Ctrl+Shift+N", QPair<QString, QAction *>(tr("Untag all sets"), 0));
304 	qmc2ShortcutHash.insert("Ctrl+Shift+I", QPair<QString, QAction *>(tr("Invert all tags"), 0));
305 	qmc2ShortcutHash.insert("Ctrl+Shift+X", QPair<QString, QAction *>(tr("Tag visible sets"), 0));
306 	qmc2ShortcutHash.insert("Ctrl+Shift+Y", QPair<QString, QAction *>(tr("Untag visible sets"), 0));
307 	qmc2ShortcutHash.insert("Ctrl+Shift+Z", QPair<QString, QAction *>(tr("Invert visible tags"), 0));
308 	qmc2ShortcutHash.insert("F2", QPair<QString, QAction *>(tr("Rebuild current machine"), 0));
309 	qmc2ShortcutHash.insert("Ctrl+Shift+F2", QPair<QString, QAction *>(tr("Rebuild tagged machines"), 0));
310 	qmc2ShortcutHash.insert("F5", QPair<QString, QAction *>(tr("Full detail view"), 0));
311 	qmc2ShortcutHash.insert("Shift+F5", QPair<QString, QAction *>(tr("Software-list view-mode flat"), 0));
312 	qmc2ShortcutHash.insert("F6", QPair<QString, QAction *>(tr("Hierarchical view"), 0));
313 	qmc2ShortcutHash.insert("Shift+F6", QPair<QString, QAction *>(tr("Software-list view-mode tree"), 0));
314 	qmc2ShortcutHash.insert("F7", QPair<QString, QAction *>(tr("Category view"), 0));
315 	qmc2ShortcutHash.insert("F8", QPair<QString, QAction *>(tr("Version view"), 0));
316 #if defined(QMC2_WIP_ENABLED)
317 	qmc2ShortcutHash.insert("F9", QPair<QString, QAction *>(tr("Custom view"), 0));
318 #endif
319 	qmc2ShortcutHash.insert("Shift+F9", QPair<QString, QAction *>(tr("Run external ROM tool"), 0));
320 	qmc2ShortcutHash.insert("Ctrl+Shift+F9", QPair<QString, QAction *>(tr("Run ROM tool for tagged sets"), 0));
321 	qmc2ShortcutHash.insert("F10", QPair<QString, QAction *>(tr("Check software-states"), 0));
322 	qmc2ShortcutHash.insert("F11", QPair<QString, QAction *>(tr("Toggle full screen"), 0));
323 	qmc2ShortcutHash.insert("F12", QPair<QString, QAction *>(tr("Launch arcade mode"), 0));
324 #if QMC2_USE_PHONON_API || QMC2_MULTIMEDIA_ENABLED
325 	qmc2ShortcutHash.insert("Ctrl+Alt+Left", QPair<QString, QAction *>(tr("Previous track (audio player)"), 0));
326 	qmc2ShortcutHash.insert("Ctrl+Alt+Right", QPair<QString, QAction *>(tr("Next track (audio player)"), 0));
327 	qmc2ShortcutHash.insert("Ctrl+Alt+B", QPair<QString, QAction *>(tr("Fast backward (audio player)"), 0));
328 	qmc2ShortcutHash.insert("Ctrl+Alt+F", QPair<QString, QAction *>(tr("Fast forward (audio player)"), 0));
329 	qmc2ShortcutHash.insert("Ctrl+Alt+S", QPair<QString, QAction *>(tr("Stop track (audio player)"), 0));
330 	qmc2ShortcutHash.insert("Ctrl+Alt+#", QPair<QString, QAction *>(tr("Pause track (audio player)"), 0));
331 	qmc2ShortcutHash.insert("Ctrl+Alt+P", QPair<QString, QAction *>(tr("Play track (audio player)"), 0));
332 	qmc2ShortcutHash.insert("Ctrl+Alt+PgUp", QPair<QString, QAction *>(tr("Raise volume (audio player)"), 0));
333 	qmc2ShortcutHash.insert("Ctrl+Alt+PgDown", QPair<QString, QAction *>(tr("Lower volume (audio player)"), 0));
334 #endif
335 	qmc2ShortcutHash.insert("Alt+PgUp", QPair<QString, QAction *>(tr("Increase rank"), 0));
336 	qmc2ShortcutHash.insert("Alt+PgDown", QPair<QString, QAction *>(tr("Decrease rank"), 0));
337 
338 	// special keys
339 	qmc2ShortcutHash.insert("+", QPair<QString, QAction *>(tr("Plus (+)"), 0));
340 	qmc2ShortcutHash.insert("-", QPair<QString, QAction *>(tr("Minus (-)"), 0));
341 	qmc2ShortcutHash.insert("Down", QPair<QString, QAction *>(tr("Cursor down"), 0));
342 	qmc2ShortcutHash.insert("End", QPair<QString, QAction *>(tr("End"), 0));
343 	qmc2ShortcutHash.insert("Enter", QPair<QString, QAction *>(tr("Enter key"), 0));
344 	qmc2ShortcutHash.insert("Esc", QPair<QString, QAction *>(tr("Escape"), 0));
345 	qmc2ShortcutHash.insert("Left", QPair<QString, QAction *>(tr("Cursor left"), 0));
346 	qmc2ShortcutHash.insert("Home", QPair<QString, QAction *>(tr("Home"), 0));
347 	qmc2ShortcutHash.insert("PgDown", QPair<QString, QAction *>(tr("Page down"), 0));
348 	qmc2ShortcutHash.insert("PgUp", QPair<QString, QAction *>(tr("Page up"), 0));
349 	qmc2ShortcutHash.insert("Return", QPair<QString, QAction *>(tr("Return key"), 0));
350 	qmc2ShortcutHash.insert("Right", QPair<QString, QAction *>(tr("Cursor right"), 0));
351 	qmc2ShortcutHash.insert("Tab", QPair<QString, QAction *>(tr("Tabulator"), 0));
352 	qmc2ShortcutHash.insert("Up", QPair<QString, QAction *>(tr("Cursor up"), 0));
353 #if defined(QMC2_OS_MAC)
354 	qmc2ShortcutHash.insert("Ctrl+O", QPair<QString, QAction *>(tr("Activate item"), 0));
355 #endif
356 
357 	if ( !config->isWritable() )
358 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("WARNING: configuration is not writeable, please check access permissions for ") + config->fileName());
359 
360 	// font reset actions
361 	QMenu *fontButtonMenu = new QMenu(0);
362 	QString s = tr("Reset to default font");
363 	QAction *action = fontButtonMenu->addAction(s);
364 	action->setToolTip(s); action->setStatusTip(s);
365 	toolButtonBrowseFont->setMenu(fontButtonMenu);
366 	connect(action, SIGNAL(triggered()), lineEditFont, SLOT(clear()));
367 
368 	QMenu *logFontButtonMenu = new QMenu(0);
369 	s = tr("Reset to default font");
370 	action = logFontButtonMenu->addAction(s);
371 	action->setToolTip(s); action->setStatusTip(s);
372 	toolButtonBrowseLogFont->setMenu(logFontButtonMenu);
373 	connect(action, SIGNAL(triggered()), lineEditLogFont, SLOT(clear()));
374 
375 	// style-sheet reset action
376 	QMenu *styleSheetButtonMenu = new QMenu(0);
377 	s = tr("No style sheet");
378 	action = styleSheetButtonMenu->addAction(s);
379 	action->setToolTip(s); action->setStatusTip(s);
380 	toolButtonBrowseStyleSheet->setMenu(styleSheetButtonMenu);
381 	connect(action, SIGNAL(triggered()), lineEditStyleSheet, SLOT(clear()));
382 
383 	lineEditStyleSheet->setPlaceholderText(tr("No style sheet"));
384 	lineEditFont->setPlaceholderText(tr("Default"));
385 	lineEditLogFont->setPlaceholderText(tr("Default"));
386 
387 #if QMC2_JOYSTICK != 1
388 	tabWidgetFrontendSettings->removeTab(tabWidgetFrontendSettings->indexOf(tabFrontendJoystick));
389 #else
390 	joystick = 0;
391 	joystickCalibrationWidget = 0;
392 	joystickTestWidget = 0;
393 	scrollArea = new QScrollArea(frameCalibrationAndTest);
394 	scrollArea->hide();
395 	scrollArea->setWidgetResizable(true);
396 #endif
397 
398 	lineEditPreviewDirectory->setToolTip(lineEditPreviewDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
399 	lineEditPreviewFile->setToolTip(lineEditPreviewFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
400 	lineEditFlyerDirectory->setToolTip(lineEditFlyerDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
401 	lineEditFlyerFile->setToolTip(lineEditFlyerFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
402 	lineEditIconDirectory->setToolTip(lineEditIconDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
403 	lineEditIconFile->setToolTip(lineEditIconFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
404 	lineEditCabinetDirectory->setToolTip(lineEditCabinetDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
405 	lineEditCabinetFile->setToolTip(lineEditCabinetFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
406 	lineEditControllerDirectory->setToolTip(lineEditControllerDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
407 	lineEditControllerFile->setToolTip(lineEditControllerFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
408 	lineEditMarqueeDirectory->setToolTip(lineEditMarqueeDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
409 	lineEditMarqueeFile->setToolTip(lineEditMarqueeFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
410 	lineEditTitleDirectory->setToolTip(lineEditTitleDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
411 	lineEditTitleFile->setToolTip(lineEditTitleFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
412 	lineEditPCBDirectory->setToolTip(lineEditPCBDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
413 	lineEditPCBFile->setToolTip(lineEditPCBFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
414 	lineEditSoftwareSnapDirectory->setToolTip(lineEditSoftwareSnapDirectory->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
415 	lineEditSoftwareSnapFile->setToolTip(lineEditSoftwareSnapFile->toolTip() + " - " + tr("use semicolon (;) to separate multiple files"));
416 	lineEditVideoSnapFolder->setToolTip(lineEditVideoSnapFolder->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
417 	lineEditSystemManualFolder->setToolTip(lineEditSystemManualFolder->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
418 	lineEditSoftwareManualFolder->setToolTip(lineEditSoftwareManualFolder->toolTip() + " - " + tr("use semicolon (;) to separate multiple folders"));
419 
420 	checkPlaceholderStatus();
421 	restoreCurrentConfig();
422 }
423 
~Options()424 Options::~Options()
425 {
426 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/FrontendTab", tabWidgetFrontendSettings->currentIndex());
427 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/MAMETab", tabWidgetGlobalMAMESetup->currentIndex());
428 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/OptionsTab", tabWidgetOptions->currentIndex());
429 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/ShortcutsHeaderState", treeWidgetShortcuts->header()->saveState());
430 #if QMC2_JOYSTICK == 1
431 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/JoyMapHeaderState", treeWidgetJoystickMappings->header()->saveState());
432 #endif
433 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/RegisteredEmulatorsHeaderState", tableWidgetRegisteredEmulators->horizontalHeader()->saveState());
434 
435 #if QMC2_JOYSTICK == 1
436 	if ( joystick )
437 		delete joystick;
438 #endif
439 
440 	delete config;
441 	close();
442 }
443 
apply()444 void Options::apply()
445 {
446 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
447 	if ( qmc2MainWindow->tabWidgetMachineList->currentIndex() != QMC2_EMBED_INDEX || !qmc2MainWindow->toolButtonEmbedderMaximizeToggle->isChecked() ) {
448 		qmc2MainWindow->statusBar()->setVisible(config->value(QMC2_FRONTEND_PREFIX + "GUI/Statusbar", true).toBool());
449 		qmc2MainWindow->toolbar->setVisible(config->value(QMC2_FRONTEND_PREFIX + "GUI/Toolbar", true).toBool());
450 	}
451 #else
452 	qmc2MainWindow->statusBar()->setVisible(config->value(QMC2_FRONTEND_PREFIX + "GUI/Statusbar", true).toBool());
453 	qmc2MainWindow->toolbar->setVisible(config->value(QMC2_FRONTEND_PREFIX + "GUI/Toolbar", true).toBool());
454 #endif
455 	QFont f;
456 	if ( qmc2StartupDefaultFont )
457 		f = *qmc2StartupDefaultFont;
458 	if ( !config->value(QMC2_FRONTEND_PREFIX + "GUI/Font").toString().isEmpty() )
459 		f.fromString(config->value(QMC2_FRONTEND_PREFIX + "GUI/Font").toString());
460 	qApp->setFont(f);
461 	QFontMetrics fm(f);
462 	QSize iconSize(fm.height() - 2, fm.height() - 2);
463 	QSize iconSizeMiddle = iconSize + QSize(2, 2);
464 	QSize iconSizeLarge = iconSize + QSize(4, 4);
465 	foreach (QWidget *widget, QApplication::allWidgets()) {
466 		widget->setFont(f);
467 		if ( widget->objectName() == "MiniWebBrowser" )
468 			QTimer::singleShot(0, (MiniWebBrowser *)widget, SLOT(adjustIconSizes()));
469 	}
470 	if ( qmc2SplashScreen ) {
471 		QFont splashFont = f;
472 		splashFont.setBold(true);
473 		qmc2SplashScreen->setFont(splashFont);
474 	}
475 	QFont logFont = f;
476 	if ( !config->value(QMC2_FRONTEND_PREFIX + "GUI/LogFont").toString().isEmpty() )
477 		logFont.fromString(config->value(QMC2_FRONTEND_PREFIX + "GUI/LogFont").toString());
478 	qmc2MainWindow->textBrowserFrontendLog->setFont(logFont);
479 	qmc2MainWindow->textBrowserEmulatorLog->setFont(logFont);
480 	lineEditLogFont->setFont(logFont);
481 	((IconLineEdit *)qmc2MainWindow->comboBoxSearch->lineEdit())->setIconSize(iconSizeMiddle);
482 	((IconLineEdit *)qmc2MainWindow->comboBoxToolbarSearch->lineEdit())->setIconSize(iconSizeMiddle);
483 	qmc2MainWindow->treeWidgetMachineList->setIconSize(iconSizeMiddle);
484 	qmc2MainWindow->treeWidgetHierarchy->setIconSize(iconSizeMiddle);
485 	qmc2MainWindow->treeWidgetForeignIDs->setIconSize(iconSizeMiddle);
486 	qmc2MainWindow->treeWidgetEmulators->setIconSize(iconSizeMiddle);
487 	qmc2MainWindow->floatToggleButtonSoftwareDetail->setIconSize(iconSizeMiddle);
488 	pushButtonApply->setIconSize(iconSize);
489 	pushButtonRestore->setIconSize(iconSize);
490 	pushButtonDefault->setIconSize(iconSize);
491 	pushButtonOk->setIconSize(iconSize);
492 	pushButtonCancel->setIconSize(iconSize);
493 	toolButtonBrowseStyleSheet->setIconSize(iconSize);
494 	toolButtonBrowseFont->setIconSize(iconSize);
495 	toolButtonBrowseLogFont->setIconSize(iconSize);
496 	toolButtonBrowseFrontendLogFile->setIconSize(iconSize);
497 	toolButtonBrowseFavoritesFile->setIconSize(iconSize);
498 	toolButtonBrowseHistoryFile->setIconSize(iconSize);
499 	toolButtonBrowseMachineListCacheFile->setIconSize(iconSize);
500 	toolButtonBrowseROMStateCacheFile->setIconSize(iconSize);
501 	toolButtonBrowseDataDirectory->setIconSize(iconSize);
502 	toolButtonBrowseDatInfoDatabase->setIconSize(iconSize);
503 	toolButtonBrowseMameHistoryDat->setIconSize(iconSize);
504 	toolButtonBrowseMessSysinfoDat->setIconSize(iconSize);
505 	toolButtonBrowseMameInfoDat->setIconSize(iconSize);
506 	toolButtonBrowseMessInfoDat->setIconSize(iconSize);
507 	toolButtonBrowseSoftwareInfoDB->setIconSize(iconSize);
508 	toolButtonImportGameInfo->setIconSize(iconSize);
509 	toolButtonImportMachineInfo->setIconSize(iconSize);
510 	toolButtonImportMameInfo->setIconSize(iconSize);
511 	toolButtonImportMessInfo->setIconSize(iconSize);
512 	toolButtonImportSoftwareInfo->setIconSize(iconSize);
513 	toolButtonOptimizeCatverIni->setIconSize(iconSize);
514 	toolButtonSetupIconDatabase->setIconSize(iconSize);
515 	qmc2MainWindow->treeWidgetCategoryView->setIconSize(iconSizeMiddle);
516 	checkBoxUseCategoryIni->setIconSize(iconSize);
517 	toolButtonBrowseCategoryIniFile->setIconSize(iconSize);
518 	qmc2MainWindow->treeWidgetVersionView->setIconSize(iconSizeMiddle);
519 	checkBoxUseCatverIni->setIconSize(iconSize);
520 	toolButtonBrowseCatverIniFile->setIconSize(iconSize);
521 	toolButtonBrowsePreviewDirectory->setIconSize(iconSize);
522 	toolButtonBrowsePreviewFile->setIconSize(iconSize);
523 	comboBoxPreviewFileType->setIconSize(iconSize);
524 	toolButtonBrowseFlyerDirectory->setIconSize(iconSize);
525 	toolButtonBrowseFlyerFile->setIconSize(iconSize);
526 	comboBoxFlyerFileType->setIconSize(iconSize);
527 	toolButtonBrowseIconDirectory->setIconSize(iconSize);
528 	toolButtonBrowseIconFile->setIconSize(iconSize);
529 	comboBoxIconFileType->setIconSize(iconSize);
530 	toolButtonBrowseCabinetDirectory->setIconSize(iconSize);
531 	toolButtonBrowseCabinetFile->setIconSize(iconSize);
532 	comboBoxCabinetFileType->setIconSize(iconSize);
533 	toolButtonBrowseControllerDirectory->setIconSize(iconSize);
534 	toolButtonBrowseControllerFile->setIconSize(iconSize);
535 	comboBoxControllerFileType->setIconSize(iconSize);
536 	toolButtonBrowseMarqueeDirectory->setIconSize(iconSize);
537 	toolButtonBrowseMarqueeFile->setIconSize(iconSize);
538 	comboBoxMarqueeFileType->setIconSize(iconSize);
539 	toolButtonBrowseTitleDirectory->setIconSize(iconSize);
540 	toolButtonBrowseTitleFile->setIconSize(iconSize);
541 	comboBoxTitleFileType->setIconSize(iconSize);
542 	toolButtonBrowsePCBDirectory->setIconSize(iconSize);
543 	toolButtonBrowsePCBFile->setIconSize(iconSize);
544 	comboBoxPCBFileType->setIconSize(iconSize);
545 	toolButtonBrowseSoftwareSnapDirectory->setIconSize(iconSize);
546 	toolButtonBrowseSoftwareSnapFile->setIconSize(iconSize);
547 	comboBoxSoftwareSnapFileType->setIconSize(iconSize);
548 	toolButtonBrowseSoftwareNotesFolder->setIconSize(iconSize);
549 	toolButtonBrowseSoftwareNotesTemplate->setIconSize(iconSize);
550 	toolButtonBrowseSystemNotesFolder->setIconSize(iconSize);
551 	toolButtonBrowseSystemNotesTemplate->setIconSize(iconSize);
552 	toolButtonBrowseVideoSnapFolder->setIconSize(iconSize);
553 	toolButtonScanSystemManuals->setIconSize(iconSize);
554 	toolButtonBrowseSystemManualFolder->setIconSize(iconSize);
555 	toolButtonScanSoftwareManuals->setIconSize(iconSize);
556 	toolButtonBrowseSoftwareManualFolder->setIconSize(iconSize);
557 	toolButtonShowC->setIconSize(iconSize);
558 	toolButtonShowM->setIconSize(iconSize);
559 	toolButtonShowI->setIconSize(iconSize);
560 	toolButtonShowN->setIconSize(iconSize);
561 	toolButtonShowU->setIconSize(iconSize);
562 	checkBoxRomStateFilter->setIconSize(iconSize);
563 	comboBoxSortOrder->setIconSize(iconSize);
564 	checkBoxShowROMStatusIcons->setIconSize(iconSize);
565 	checkBoxShowDeviceSets->setIconSize(iconSize);
566 	checkBoxShowBiosSets->setIconSize(iconSize);
567 	toolButtonBrowseExecutableFile->setIconSize(iconSize);
568 	toolButtonBrowseWorkingDirectory->setIconSize(iconSize);
569 	toolButtonBrowseEmulatorLogFile->setIconSize(iconSize);
570 	toolButtonBrowseOptionsTemplateFile->setIconSize(iconSize);
571 	toolButtonBrowseXmlCacheDatabase->setIconSize(iconSize);
572 	toolButtonBrowseUserDataDatabase->setIconSize(iconSize);
573 	toolButtonBrowseMachineListDatabase->setIconSize(iconSize);
574 	toolButtonCleanupUserDataDatabase->setIconSize(iconSize);
575 	toolButtonClearUserDataDatabase->setIconSize(iconSize);
576 	toolButtonBrowseCookieDatabase->setIconSize(iconSize);
577 	toolButtonBrowseZipTool->setIconSize(iconSize);
578 	toolButtonBrowseSevenZipTool->setIconSize(iconSize);
579 	toolButtonBrowseRomTool->setIconSize(iconSize);
580 	toolButtonBrowseRomToolWorkingDirectory->setIconSize(iconSize);
581 	pushButtonRedefineKeySequence->setIconSize(iconSize);
582 	pushButtonResetShortcut->setIconSize(iconSize);
583 	toolButtonAddEmulator->setIconSize(iconSize);
584 	toolButtonSaveEmulator->setIconSize(iconSize);
585 	toolButtonRemoveEmulator->setIconSize(iconSize);
586 	toolButtonBrowseAdditionalEmulatorExecutable->setIconSize(iconSize);
587 	toolButtonBrowseAdditionalEmulatorWorkingDirectory->setIconSize(iconSize);
588 	QPixmap exitPixmap = QPixmap(QString::fromUtf8(":/data/img/exit.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
589 	QPixmap reloadPixmap = QPixmap(QString::fromUtf8(":/data/img/reload.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
590 	labelLanguagePic->setPixmap(exitPixmap);
591 	labelLegend1Pic->setPixmap(exitPixmap);
592 	labelLegend3Pic->setPixmap(reloadPixmap);
593 	labelExecutableFilePic->setPixmap(reloadPixmap);
594 	labelLegend4Pic->setPixmap(reloadPixmap);
595 	labelLegend5Pic->setPixmap(reloadPixmap);
596 	tableWidgetRegisteredEmulators->resizeRowsToContents();
597 	for (int i = 0; i < tableWidgetRegisteredEmulators->rowCount(); i++) {
598 		QToolButton *tb = (QToolButton *)tableWidgetRegisteredEmulators->cellWidget(i, QMC2_ADDTLEMUS_COLUMN_ICON);
599 		if ( tb )
600 			tb->setIconSize(iconSizeMiddle);
601 	}
602 	// global web-browser fonts
603 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::StandardFont, qApp->font().family());
604 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::SerifFont, qApp->font().family());
605 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::SansSerifFont, qApp->font().family());
606 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::FantasyFont, qApp->font().family());
607 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::CursiveFont, qApp->font().family());
608 	QWebSettings::globalSettings()->setFontFamily(QWebSettings::FixedFont, logFont.family());
609 	QWebSettings::globalSettings()->setFontSize(QWebSettings::DefaultFontSize, qApp->font().pointSize() + 1);
610 	QWebSettings::globalSettings()->setFontSize(QWebSettings::DefaultFixedFontSize, logFont.pointSize() + 1);
611 #if QMC2_JOYSTICK == 1
612 	pushButtonRescanJoysticks->setIconSize(iconSize);
613 	pushButtonRemapJoystickFunction->setIconSize(iconSize);
614 	pushButtonRemoveJoystickMapping->setIconSize(iconSize);
615 #endif
616 	if ( qmc2SystemROMAlyzer ) {
617 		qmc2SystemROMAlyzer->textBrowserLog->setFont(logFont);
618 		QTimer::singleShot(0, qmc2SystemROMAlyzer, SLOT(adjustIconSizes()));
619 		if ( qmc2SystemROMAlyzer->checkSumScannerLog() )
620 			qmc2SystemROMAlyzer->checkSumScannerLog()->plainTextEditLog->setFont(logFont);
621 		if ( qmc2SystemROMAlyzer->collectionRebuilder() ) {
622 			qmc2SystemROMAlyzer->collectionRebuilder()->plainTextEditLog->setFont(logFont);
623 			QTimer::singleShot(0, qmc2SystemROMAlyzer->collectionRebuilder(), SLOT(adjustIconSizes()));
624 		}
625 		if ( qmc2SystemROMAlyzer->romPathCleaner() ) {
626 			qmc2SystemROMAlyzer->romPathCleaner()->plainTextEditLog->setFont(logFont);
627 			QTimer::singleShot(0, qmc2SystemROMAlyzer->romPathCleaner(), SLOT(adjustIconSizes()));
628 		}
629 	}
630 	if ( qmc2SoftwareROMAlyzer ) {
631 		qmc2SoftwareROMAlyzer->textBrowserLog->setFont(logFont);
632 		QTimer::singleShot(0, qmc2SoftwareROMAlyzer, SLOT(adjustIconSizes()));
633 		if ( qmc2SoftwareROMAlyzer->checkSumScannerLog() )
634 			qmc2SoftwareROMAlyzer->checkSumScannerLog()->plainTextEditLog->setFont(logFont);
635 		if ( qmc2SoftwareROMAlyzer->collectionRebuilder() ) {
636 			qmc2SoftwareROMAlyzer->collectionRebuilder()->plainTextEditLog->setFont(logFont);
637 			QTimer::singleShot(0, qmc2SoftwareROMAlyzer->collectionRebuilder(), SLOT(adjustIconSizes()));
638 		}
639 		if ( qmc2SoftwareROMAlyzer->romPathCleaner() ) {
640 			qmc2SoftwareROMAlyzer->romPathCleaner()->plainTextEditLog->setFont(logFont);
641 			QTimer::singleShot(0, qmc2SoftwareROMAlyzer->romPathCleaner(), SLOT(adjustIconSizes()));
642 		}
643 	}
644 	if ( qmc2ImageChecker )
645 		qmc2ImageChecker->adjustIconSizes();
646 	if ( qmc2SampleChecker )
647 		QTimer::singleShot(0, qmc2SampleChecker, SLOT(adjustIconSizes()));
648 #if QMC2_USE_PHONON_API || QMC2_MULTIMEDIA_ENABLED
649 	qmc2MainWindow->toolButtonAudioPreviousTrack->setIconSize(iconSize);
650 	qmc2MainWindow->toolButtonAudioNextTrack->setIconSize(iconSize);
651 	qmc2MainWindow->toolButtonAudioFastBackward->setIconSize(iconSize);
652 	qmc2MainWindow->toolButtonAudioFastForward->setIconSize(iconSize);
653 	qmc2MainWindow->toolButtonAudioStopTrack->setIconSize(iconSize);
654 	qmc2MainWindow->toolButtonAudioPauseTrack->setIconSize(iconSize);
655 	qmc2MainWindow->toolButtonAudioPlayTrack->setIconSize(iconSize);
656 	qmc2MainWindow->toolButtonAudioAddTracks->setIconSize(iconSize);
657 	qmc2MainWindow->toolButtonAudioAddURL->setIconSize(iconSize);
658 	qmc2MainWindow->toolButtonAudioRemoveTracks->setIconSize(iconSize);
659 	qmc2MainWindow->toolButtonAudioSetupEffects->setIconSize(iconSize);
660 #endif
661 #if QMC2_USE_PHONON_API
662 	if ( qmc2AudioEffectDialog )
663 		QTimer::singleShot(0, qmc2AudioEffectDialog, SLOT(adjustIconSizes()));
664 #endif
665 #if defined(QMC2_YOUTUBE_ENABLED)
666 	if ( qmc2YouTubeWidget )
667 		QTimer::singleShot(0, qmc2YouTubeWidget, SLOT(adjustIconSizes()));
668 #endif
669 	if ( qmc2ROMStatusExporter )
670 		QTimer::singleShot(0, qmc2ROMStatusExporter, SLOT(adjustIconSizes()));
671 	toolButtonBrowseSoftwareListCacheDb->setIconSize(iconSize);
672 	toolButtonBrowseSoftwareStateCache->setIconSize(iconSize);
673 	toolButtonBrowseGeneralSoftwareFolder->setIconSize(iconSize);
674 	if ( qmc2DeviceConfigurator ) {
675 		qmc2DeviceConfigurator->toolButtonConfiguration->setIconSize(iconSize);
676 		qmc2DeviceConfigurator->toolButtonNewConfiguration->setIconSize(iconSize);
677 		qmc2DeviceConfigurator->toolButtonCloneConfiguration->setIconSize(iconSize);
678 		qmc2DeviceConfigurator->toolButtonSaveConfiguration->setIconSize(iconSize);
679 		qmc2DeviceConfigurator->toolButtonRemoveConfiguration->setIconSize(iconSize);
680 		qmc2DeviceConfigurator->toolButtonChooserPlay->setIconSize(iconSize);
681 		qmc2DeviceConfigurator->toolButtonChooserPlayEmbedded->setIconSize(iconSize);
682 		qmc2DeviceConfigurator->toolButtonChooserReload->setIconSize(iconSize);
683 		qmc2DeviceConfigurator->toolButtonChooserClearFilterPattern->setIconSize(iconSize);
684 		qmc2DeviceConfigurator->toolButtonChooserAutoSelect->setIconSize(iconSize);
685 		qmc2DeviceConfigurator->toolButtonChooserFilter->setIconSize(iconSize);
686 		qmc2DeviceConfigurator->toolButtonChooserProcessZIPs->setIconSize(iconSize);
687 		qmc2DeviceConfigurator->toolButtonChooserMergeMaps->setIconSize(iconSize);
688 		qmc2DeviceConfigurator->toolButtonChooserSaveConfiguration->setIconSize(iconSize);
689 		qmc2DeviceConfigurator->comboBoxDeviceInstanceChooser->setIconSize(iconSize);
690 		qmc2DeviceConfigurator->treeWidgetDeviceSetup->setIconSize(iconSize);
691 		qmc2DeviceConfigurator->treeWidgetSlotOptions->setIconSize(iconSize);
692 		((IconLineEdit *)qmc2DeviceConfigurator->comboBoxChooserFilterPattern->lineEdit())->setIconSize(iconSizeMiddle);
693 	}
694 	if ( qmc2SoftwareList ) {
695 		qmc2SoftwareList->toolButtonExport->setIconSize(iconSize);
696 		qmc2SoftwareList->toolButtonAddToFavorites->setIconSize(iconSize);
697 		qmc2SoftwareList->toolButtonRemoveFromFavorites->setIconSize(iconSize);
698 		qmc2SoftwareList->toolButtonFavoritesOptions->setIconSize(iconSize);
699 		qmc2SoftwareList->toolButtonPlay->setIconSize(iconSize);
700 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
701 		qmc2SoftwareList->toolButtonPlayEmbedded->setIconSize(iconSize);
702 #endif
703 		qmc2SoftwareList->toolButtonToggleSoftwareInfo->setIconSize(iconSize);
704 		qmc2SoftwareList->toolButtonCompatFilterToggle->setIconSize(iconSize);
705 		qmc2SoftwareList->toolButtonReload->setIconSize(iconSize);
706 		qmc2SoftwareList->toolButtonToggleSnapnameAdjustment->setIconSize(iconSize);
707 		qmc2SoftwareList->toolButtonSoftwareStates->setIconSize(iconSize);
708 		qmc2SoftwareList->treeWidgetKnownSoftware->setIconSize(iconSizeMiddle);
709 		qmc2SoftwareList->treeWidgetFavoriteSoftware->setIconSize(iconSizeMiddle);
710 		qmc2SoftwareList->treeWidgetSearchResults->setIconSize(iconSizeMiddle);
711 		if ( qmc2SoftwareList->viewTree() )
712 			qmc2SoftwareList->toolBoxSoftwareList->setItemIcon(QMC2_SWLIST_KNOWN_SW_PAGE, QIcon(QPixmap(QString::fromUtf8(":/data/img/view_tree.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
713 		else
714 			qmc2SoftwareList->toolBoxSoftwareList->setItemIcon(QMC2_SWLIST_KNOWN_SW_PAGE, QIcon(QPixmap(QString::fromUtf8(":/data/img/view_detail.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
715 		qmc2SoftwareList->toolBoxSoftwareList->setItemIcon(QMC2_SWLIST_FAVORITES_PAGE, QIcon(QPixmap(QString::fromUtf8(":/data/img/favorites.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
716 		qmc2SoftwareList->toolBoxSoftwareList->setItemIcon(QMC2_SWLIST_SEARCH_PAGE, QIcon(QPixmap(QString::fromUtf8(":/data/img/hint.png")).scaled(iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
717 		((IconLineEdit *)qmc2SoftwareList->comboBoxSearch->lineEdit())->setIconSize(iconSizeMiddle);
718 		if ( qmc2SoftwareList->exporter )
719 			QTimer::singleShot(0, qmc2SoftwareList->exporter, SLOT(adjustIconSizes()));
720 		if ( qmc2SoftwareNotesEditor )
721 			qmc2SoftwareNotesEditor->adjustIconSizes();
722 		if ( qmc2SystemNotesEditor )
723 			qmc2SystemNotesEditor->adjustIconSizes();
724 	}
725 	qmc2MainWindow->pushButtonClearFinishedDownloads->setIconSize(iconSize);
726 	qmc2MainWindow->pushButtonReloadSelectedDownloads->setIconSize(iconSize);
727 	qmc2MainWindow->pushButtonStopSelectedDownloads->setIconSize(iconSize);
728 	qmc2MainWindow->treeWidgetDownloads->setIconSize(iconSize);
729 	qmc2MainWindow->toolButtonSelectRomFilter->setIconSize(iconSize);
730 	qmc2MainWindow->comboBoxViewSelect->setIconSize(iconSize);
731 	QTabBar *tabBar = qmc2MainWindow->tabWidgetMachineList->findChild<QTabBar *>();
732 	if ( tabBar )
733 		tabBar->setIconSize(iconSizeMiddle);
734 	tabBar = qmc2MainWindow->tabWidgetMachineDetail->findChild<QTabBar *>();
735 	if ( tabBar )
736 		tabBar->setIconSize(iconSizeMiddle);
737 	tabBar = qmc2MainWindow->tabWidgetLogsAndEmulators->findChild<QTabBar *>();
738 	if ( tabBar )
739 		tabBar->setIconSize(iconSizeMiddle);
740 	tabBar = qmc2MainWindow->tabWidgetSoftwareDetail->findChild<QTabBar *>();
741 	if ( tabBar )
742 		tabBar->setIconSize(iconSizeMiddle);
743 	qmc2MainWindow->toolbar->setIconSize(iconSizeLarge);
744 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
745 	for (int i = 0; i < qmc2MainWindow->tabWidgetEmbeddedEmulators->count(); i++) {
746 		Embedder *embedder = (Embedder *)qmc2MainWindow->tabWidgetEmbeddedEmulators->widget(i);
747 		embedder->adjustIconSizes();
748 		if ( embedder->embedderOptions )
749 			embedder->embedderOptions->adjustIconSizes();
750 	}
751 	qmc2MainWindow->toolButtonEmbedderMaximizeToggle->setIconSize(iconSizeLarge);
752 #if defined(QMC2_OS_UNIX)
753 	qmc2MainWindow->toolButtonEmbedderAutoPause->setIconSize(iconSizeLarge);
754 #endif
755 #endif
756 	if ( qmc2ComponentSetup )
757 		if ( qmc2ComponentSetup->isVisible() )
758 			QTimer::singleShot(0, qmc2ComponentSetup, SLOT(adjustIconSizes()));
759 	if ( qmc2ToolBarCustomizer )
760 		if ( qmc2ToolBarCustomizer->isVisible() )
761 			QTimer::singleShot(0, qmc2ToolBarCustomizer, SLOT(adjustIconSizes()));
762 	if ( qmc2GlobalEmulatorOptions ) {
763 		QTimer::singleShot(0, qmc2GlobalEmulatorOptions, SLOT(adjustIconSizes()));
764 		QTimer::singleShot(0, qmc2GlobalEmulatorOptions, SLOT(save()));
765 	}
766 	if ( qmc2EmulatorOptions )
767 		QTimer::singleShot(0, qmc2EmulatorOptions, SLOT(adjustIconSizes()));
768 	QTimer::singleShot(0, qmc2MainWindow, SLOT(updateUserData()));
769 
770 	// we get an X error / Qt warning here upon qApp->processEvents(), but it seems safe to ignore it
771 	qmc2SuppressQtMessages = true;
772 	qApp->processEvents();
773 	qmc2SuppressQtMessages = config->value(QMC2_FRONTEND_PREFIX + "GUI/SuppressQtMessages", false).toBool();;
774 	applied = true;
775 }
776 
on_pushButtonOk_clicked()777 void Options::on_pushButtonOk_clicked()
778 {
779 	on_pushButtonApply_clicked();
780 }
781 
on_pushButtonCancel_clicked()782 void Options::on_pushButtonCancel_clicked()
783 {
784 	cancelClicked = true;
785 	restoreCurrentConfig();
786 }
787 
on_pushButtonRestore_clicked()788 void Options::on_pushButtonRestore_clicked()
789 {
790 	restoreCurrentConfig();
791 }
792 
on_pushButtonApply_clicked()793 void Options::on_pushButtonApply_clicked()
794 {
795 	static int oldCacheSize = 0;
796 	static bool initialCall = true;
797 	QString s;
798 	int i;
799 	bool needRestart = false,
800 	     needResort = false,
801 	     needRecreateTemplateMap = false,
802 	     needFilter = false,
803 	     needReopenPreviewFile = false,
804 	     needReopenFlyerFile = false,
805 	     needReopenIconFile = false,
806 	     needReopenCabinetFile = false,
807 	     needReopenControllerFile = false,
808 	     needReopenMarqueeFile = false,
809 	     needReopenTitleFile = false,
810 	     needReopenPCBFile = false,
811 	     needReopenSoftwareSnapFile = false,
812 	     needReload = false,
813 	     needManualReload = false,
814 	     needChangeCookieJar = false;
815 
816 	pushButtonApply->setEnabled(false);
817 	pushButtonRestore->setEnabled(false);
818 	pushButtonDefault->setEnabled(false);
819 	pushButtonOk->setEnabled(false);
820 	pushButtonCancel->setEnabled(false);
821 
822 	if ( qmc2EarlyStartup )
823 		initialCall = true;
824 
825 	// General
826 	config->setValue("Version", QString(XSTR(QMC2_VERSION)));
827 #if QMC2_SVN_REV > 0
828 	config->setValue("SVN_Revision", QMC2_SVN_REV);
829 #else
830 	config->remove("SVN_Revision");
831 #endif
832 
833 	// Frontend
834 
835 	// GUI
836 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/Toolbar", checkBoxToolbar->isChecked());
837 #if defined(QMC2_OS_MAC)
838 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/UnifiedTitleAndToolBarOnMac", checkBoxUnifiedTitleAndToolBarOnMac->isChecked());
839 	qmc2MainWindow->setUnifiedTitleAndToolBarOnMac(checkBoxUnifiedTitleAndToolBarOnMac->isChecked());
840 #endif
841 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/Statusbar", checkBoxStatusbar->isChecked());
842 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/StandardColorPalette", checkBoxStandardColorPalette->isChecked());
843 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ProgressTexts", checkBoxProgressTexts->isChecked());
844 
845 	bool b;
846 
847 	bool invalidateGameInfoDB = false;
848 	b = checkBoxProcessMameHistoryDat->isChecked();
849 	needManualReload |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat").toBool() != b);
850 	invalidateGameInfoDB |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat").toBool() != b);
851 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat", checkBoxProcessMameHistoryDat->isChecked());
852 	b = checkBoxProcessMessSysinfoDat->isChecked();
853 	needManualReload |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat").toBool() != b);
854 	invalidateGameInfoDB |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat").toBool() != b);
855 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat", checkBoxProcessMessSysinfoDat->isChecked());
856 
857 	bool invalidateEmuInfoDB = false;
858 	b = checkBoxProcessMameInfoDat->isChecked();
859 	needManualReload |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat").toBool() != b);
860 	invalidateEmuInfoDB |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat").toBool() != b);
861 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat", checkBoxProcessMameInfoDat->isChecked());
862 	b = checkBoxProcessMessInfoDat->isChecked();
863 	needManualReload |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat").toBool() != b);
864 	invalidateEmuInfoDB |= (config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat").toBool() != b);
865 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat", checkBoxProcessMessInfoDat->isChecked());
866 	b = checkBoxProcessSoftwareInfoDB->isChecked();
867 	needManualReload |= (config->value(QMC2_FRONTEND_PREFIX + "GUI/ProcessSoftwareInfoDB").toBool() != b);
868 	bool invalidateSoftwareInfoDB = (config->value(QMC2_FRONTEND_PREFIX + "GUI/ProcessSoftwareInfoDB").toBool() != b);
869 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ProcessSoftwareInfoDB", checkBoxProcessSoftwareInfoDB->isChecked());
870 	qmc2ScaledPreview = checkBoxScaledPreview->isChecked();
871 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledPreview", qmc2ScaledPreview);
872 	qmc2ScaledFlyer = checkBoxScaledFlyer->isChecked();
873 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledFlyer", qmc2ScaledFlyer);
874 	qmc2ScaledCabinet = checkBoxScaledCabinet->isChecked();
875 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledCabinet", qmc2ScaledCabinet);
876 	qmc2ScaledController = checkBoxScaledController->isChecked();
877 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledController", qmc2ScaledController);
878 	qmc2ScaledMarquee = checkBoxScaledMarquee->isChecked();
879 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledMarquee", qmc2ScaledMarquee);
880 	qmc2ScaledTitle = checkBoxScaledTitle->isChecked();
881 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledTitle", qmc2ScaledTitle);
882 	qmc2ScaledPCB = checkBoxScaledPCB->isChecked();
883 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledPCB", qmc2ScaledPCB);
884 	qmc2ScaledSoftwareSnapshot = checkBoxScaledSoftwareSnapshot->isChecked();
885 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ScaledSoftwareSnapshot", qmc2ScaledSoftwareSnapshot);
886 	qmc2SmoothScaling = checkBoxSmoothScaling->isChecked();
887 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/SmoothScaling", qmc2SmoothScaling);
888 	qmc2RetryLoadingImages = checkBoxRetryLoadingImages->isChecked();
889 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/RetryLoadingImages", qmc2RetryLoadingImages);
890 	qmc2ParentImageFallback = checkBoxParentImageFallback->isChecked();
891 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ParentImageFallback", qmc2ParentImageFallback);
892 	s = comboBoxLanguage->currentText().left(2).toLower();
893 	needRestart |= (config->value(QMC2_FRONTEND_PREFIX + "GUI/Language", "us").toString() != s);
894 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/Language", s);
895 
896 #if QMC2_JOYSTICK == 1
897 	if ( joystickTestWidget )
898 		joystickTestWidget->cleanupPalette();
899 #endif
900 	if ( !lineEditFont->text().isEmpty() )
901 		config->setValue(QMC2_FRONTEND_PREFIX + "GUI/Font", lineEditFont->text());
902 	else
903 		config->remove(QMC2_FRONTEND_PREFIX + "GUI/Font");
904 	if ( !lineEditLogFont->text().isEmpty() )
905 		config->setValue(QMC2_FRONTEND_PREFIX + "GUI/LogFont", lineEditLogFont->text());
906 	else
907 		config->remove(QMC2_FRONTEND_PREFIX + "GUI/LogFont");
908 	if ( spinBoxPixmapCacheSize->value() != oldCacheSize ) {
909 		oldCacheSize = spinBoxPixmapCacheSize->value();
910 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("image cache size set to %1 MB").arg(oldCacheSize));
911 	}
912 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/PixmapCacheSize", oldCacheSize);
913 	qmc2ImagePixmapCache.setMaxCost(oldCacheSize * QMC2_1M);
914 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/MinimizeOnEmuLaunch", checkBoxMinimizeOnEmuLaunch->isChecked());
915 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/KillEmulatorsOnExit", checkBoxKillEmulatorsOnExit->isChecked());
916 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/OneEmulatorOnly", checkBoxOneEmulatorOnly->isChecked());
917 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ShowMenuBar", checkBoxShowMenuBar->isChecked());
918 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/CheckSingleInstance", checkBoxCheckSingleInstance->isChecked());
919 	qmc2SuppressQtMessages = checkBoxSuppressQtMessages->isChecked();
920 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/SuppressQtMessages", qmc2SuppressQtMessages);
921 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ShowSplashScreen", checkBoxShowSplashScreen->isChecked());
922 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ShowLoadingAnimation", checkBoxShowLoadingAnimation->isChecked());
923 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/SetWorkDirFromExec", checkBoxSetWorkDirFromExec->isChecked());
924 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicator", checkBoxMachineStatusIndicator->isChecked());
925 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicatorOnlyWhenRequired", checkBoxMachineStatusIndicatorOnlyWhenRequired->isChecked());
926 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ShowMachineName", checkBoxShowMachineName->isChecked());
927 	qmc2ShowMachineName = checkBoxShowMachineName->isChecked();
928 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/ShowMachineNameOnlyWhenRequired", checkBoxShowMachineNameOnlyWhenRequired->isChecked());
929 	qmc2ShowMachineNameOnlyWhenRequired = checkBoxShowMachineNameOnlyWhenRequired->isChecked();
930 	// show / hide game status indicator
931 	if ( config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicator").toBool() ) {
932 		if ( config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicatorOnlyWhenRequired").toBool() ) {
933 			if ( qmc2MainWindow->hSplitter->sizes()[0] == 0 || qmc2MainWindow->tabWidgetMachineList->currentIndex() != QMC2_MACHINELIST_INDEX )
934 				qmc2MainWindow->labelMachineStatus->setVisible(true);
935 			else
936 				qmc2MainWindow->labelMachineStatus->setVisible(false);
937 		} else
938 			qmc2MainWindow->labelMachineStatus->setVisible(true);
939 	} else
940 		qmc2MainWindow->labelMachineStatus->setVisible(false);
941 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/FrontendLogSize", spinBoxFrontendLogSize->value());
942 	qmc2MainWindow->textBrowserFrontendLog->setMaximumBlockCount(spinBoxFrontendLogSize->value());
943 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/EmulatorLogSize", spinBoxEmulatorLogSize->value());
944 	qmc2MainWindow->textBrowserEmulatorLog->setMaximumBlockCount(spinBoxEmulatorLogSize->value());
945 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/NativeFileDialogs", checkBoxNativeFileDialogs->isChecked());
946 
947 	// Files and directories
948 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/LogFile", lineEditFrontendLogFile->text());
949 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/DataDirectory", lineEditDataDirectory->text());
950 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/DatInfoDatabase", lineEditDatInfoDatabase->text());
951 	needReopenPreviewFile = (qmc2UsePreviewFile != (stackedWidgetPreview->currentIndex() == 1)) || (initialCall && qmc2UsePreviewFile);
952 	needReopenPreviewFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PreviewFile").toString() != lineEditPreviewFile->text());
953 	qmc2UsePreviewFile = (stackedWidgetPreview->currentIndex() == 1);
954 	config->setValue("MAME/FilesAndDirectories/UsePreviewFile", qmc2UsePreviewFile);
955 	config->setValue("MAME/FilesAndDirectories/PreviewDirectory", lineEditPreviewDirectory->text());
956 	config->setValue("MAME/FilesAndDirectories/PreviewFile", lineEditPreviewFile->text());
957 	needReopenPreviewFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PreviewFileType").toInt() != comboBoxPreviewFileType->currentIndex());
958 	config->setValue("MAME/FilesAndDirectories/PreviewFileType", comboBoxPreviewFileType->currentIndex());
959 	needReopenFlyerFile = (qmc2UseFlyerFile != (stackedWidgetFlyer->currentIndex() == 1)) || (initialCall && qmc2UseFlyerFile);
960 	needReopenFlyerFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/FlyerFile").toString() != lineEditFlyerFile->text());
961 	qmc2UseFlyerFile = (stackedWidgetFlyer->currentIndex() == 1);
962 	config->setValue("MAME/FilesAndDirectories/UseFlyerFile", qmc2UseFlyerFile);
963 	config->setValue("MAME/FilesAndDirectories/FlyerDirectory", lineEditFlyerDirectory->text());
964 	config->setValue("MAME/FilesAndDirectories/FlyerFile", lineEditFlyerFile->text());
965 	needReopenFlyerFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/FlyerFileType").toInt() != comboBoxFlyerFileType->currentIndex());
966 	config->setValue("MAME/FilesAndDirectories/FlyerFileType", comboBoxFlyerFileType->currentIndex());
967 	needReopenIconFile = (qmc2UseIconFile != (stackedWidgetIcon->currentIndex() == 1)) || (initialCall && qmc2UseIconFile);
968 	needReopenIconFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/IconFile").toString() != lineEditIconFile->text());
969 	qmc2UseIconFile = (stackedWidgetIcon->currentIndex() == 1);
970 	config->setValue("MAME/FilesAndDirectories/UseIconFile", qmc2UseIconFile);
971 	config->setValue("MAME/FilesAndDirectories/IconDirectory", lineEditIconDirectory->text());
972 	config->setValue("MAME/FilesAndDirectories/IconFile", lineEditIconFile->text());
973 	needReopenIconFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/IconFileType").toInt() != comboBoxIconFileType->currentIndex());
974 	config->setValue("MAME/FilesAndDirectories/IconFileType", comboBoxIconFileType->currentIndex());
975 	needReopenCabinetFile = (qmc2UseCabinetFile != (stackedWidgetCabinet->currentIndex() == 1)) || (initialCall && qmc2UseCabinetFile);
976 	needReopenCabinetFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CabinetFile").toString() != lineEditCabinetFile->text());
977 	qmc2UseCabinetFile = (stackedWidgetCabinet->currentIndex() == 1);
978 	config->setValue("MAME/FilesAndDirectories/UseCabinetFile", qmc2UseCabinetFile);
979 	config->setValue("MAME/FilesAndDirectories/CabinetDirectory", lineEditCabinetDirectory->text());
980 	config->setValue("MAME/FilesAndDirectories/CabinetFile", lineEditCabinetFile->text());
981 	needReopenCabinetFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CabinetFileType").toInt() != comboBoxCabinetFileType->currentIndex());
982 	config->setValue("MAME/FilesAndDirectories/CabinetFileType", comboBoxCabinetFileType->currentIndex());
983 	needReopenControllerFile = (qmc2UseControllerFile != (stackedWidgetController->currentIndex() == 1)) || (initialCall && qmc2UseControllerFile);
984 	needReopenControllerFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/ControllerFile").toString() != lineEditControllerFile->text());
985 	qmc2UseControllerFile = (stackedWidgetController->currentIndex() == 1);
986 	config->setValue("MAME/FilesAndDirectories/UseControllerFile", qmc2UseControllerFile);
987 	config->setValue("MAME/FilesAndDirectories/ControllerDirectory", lineEditControllerDirectory->text());
988 	config->setValue("MAME/FilesAndDirectories/ControllerFile", lineEditControllerFile->text());
989 	needReopenControllerFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/ControllerFileType").toInt() != comboBoxControllerFileType->currentIndex());
990 	config->setValue("MAME/FilesAndDirectories/ControllerFileType", comboBoxControllerFileType->currentIndex());
991 	needReopenMarqueeFile = (qmc2UseMarqueeFile != (stackedWidgetMarquee->currentIndex() == 1)) || (initialCall && qmc2UseMarqueeFile);
992 	needReopenMarqueeFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/MarqueeFile").toString() != lineEditMarqueeFile->text());
993 	qmc2UseMarqueeFile = (stackedWidgetMarquee->currentIndex() == 1);
994 	config->setValue("MAME/FilesAndDirectories/UseMarqueeFile", qmc2UseMarqueeFile);
995 	config->setValue("MAME/FilesAndDirectories/MarqueeDirectory", lineEditMarqueeDirectory->text());
996 	config->setValue("MAME/FilesAndDirectories/MarqueeFile", lineEditMarqueeFile->text());
997 	needReopenControllerFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/MarqueeFileType").toInt() != comboBoxMarqueeFileType->currentIndex());
998 	config->setValue("MAME/FilesAndDirectories/MarqueeFileType", comboBoxMarqueeFileType->currentIndex());
999 	needReopenTitleFile = (qmc2UseTitleFile != (stackedWidgetTitle->currentIndex() == 1)) || (initialCall && qmc2UseTitleFile);
1000 	needReopenTitleFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/TitleFile").toString() != lineEditTitleFile->text());
1001 	qmc2UseTitleFile = (stackedWidgetTitle->currentIndex() == 1);
1002 	config->setValue("MAME/FilesAndDirectories/UseTitleFile", qmc2UseTitleFile);
1003 	config->setValue("MAME/FilesAndDirectories/TitleDirectory", lineEditTitleDirectory->text());
1004 	config->setValue("MAME/FilesAndDirectories/TitleFile", lineEditTitleFile->text());
1005 	needReopenTitleFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/TitleFileType").toInt() != comboBoxTitleFileType->currentIndex());
1006 	config->setValue("MAME/FilesAndDirectories/TitleFileType", comboBoxTitleFileType->currentIndex());
1007 	needReopenPCBFile = (qmc2UsePCBFile != (stackedWidgetPCB->currentIndex() == 1)) || (initialCall && qmc2UsePCBFile);
1008 	needReopenPCBFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PCBFile").toString() != lineEditPCBFile->text());
1009 	qmc2UsePCBFile = (stackedWidgetPCB->currentIndex() == 1);
1010 	config->setValue("MAME/FilesAndDirectories/UsePCBFile", qmc2UsePCBFile);
1011 	config->setValue("MAME/FilesAndDirectories/PCBDirectory", lineEditPCBDirectory->text());
1012 	config->setValue("MAME/FilesAndDirectories/PCBFile", lineEditPCBFile->text());
1013 	needReopenPCBFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PCBFileType").toInt() != comboBoxPCBFileType->currentIndex());
1014 	config->setValue("MAME/FilesAndDirectories/PCBFileType", comboBoxPCBFileType->currentIndex());
1015 	needReopenSoftwareSnapFile = (qmc2UseSoftwareSnapFile != (stackedWidgetSWSnap->currentIndex() == 1)) || (initialCall && qmc2UseSoftwareSnapFile);
1016 	needReopenSoftwareSnapFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareSnapFile").toString() != lineEditSoftwareSnapFile->text());
1017 	qmc2UseSoftwareSnapFile = (stackedWidgetSWSnap->currentIndex() == 1);
1018 	config->setValue("MAME/FilesAndDirectories/UseSoftwareSnapFile", qmc2UseSoftwareSnapFile);
1019 	config->setValue("MAME/FilesAndDirectories/SoftwareSnapDirectory", lineEditSoftwareSnapDirectory->text());
1020 	config->setValue("MAME/FilesAndDirectories/SoftwareSnapFile", lineEditSoftwareSnapFile->text());
1021 	needReopenSoftwareSnapFile |= (QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareSnapFileType").toInt() != comboBoxSoftwareSnapFileType->currentIndex());
1022 	config->setValue("MAME/FilesAndDirectories/SoftwareSnapFileType", comboBoxSoftwareSnapFileType->currentIndex());
1023 	config->setValue("MAME/FilesAndDirectories/SoftwareNotesFolder", lineEditSoftwareNotesFolder->text());
1024 	config->setValue("MAME/FilesAndDirectories/UseSoftwareNotesTemplate", checkBoxUseSoftwareNotesTemplate->isChecked());
1025 	config->setValue("MAME/FilesAndDirectories/SoftwareNotesTemplate", lineEditSoftwareNotesTemplate->text());
1026 	config->setValue("MAME/FilesAndDirectories/SystemNotesFolder", lineEditSystemNotesFolder->text());
1027 	config->setValue("MAME/FilesAndDirectories/UseSystemNotesTemplate", checkBoxUseSystemNotesTemplate->isChecked());
1028 	config->setValue("MAME/FilesAndDirectories/SystemNotesTemplate", lineEditSystemNotesTemplate->text());
1029 	config->setValue("MAME/FilesAndDirectories/VideoSnapFolder", lineEditVideoSnapFolder->text());
1030 	config->setValue("MAME/FilesAndDirectories/SystemManualFolder", lineEditSystemManualFolder->text());
1031 	config->setValue("MAME/FilesAndDirectories/SoftwareManualFolder", lineEditSoftwareManualFolder->text());
1032 	s = lineEditMameHistoryDat->text();
1033 	needManualReload |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat").toString() != s);
1034 	invalidateGameInfoDB |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat").toString() != s);
1035 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat", lineEditMameHistoryDat->text());
1036 	s = lineEditMessSysinfoDat->text();
1037 	needManualReload |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat").toString() != s);
1038 	invalidateGameInfoDB |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat").toString() != s);
1039 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat", lineEditMessSysinfoDat->text());
1040 	s = lineEditMameInfoDat->text();
1041 	needManualReload |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat").toString() != s);
1042 	invalidateEmuInfoDB |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat").toString() != s);
1043 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat", lineEditMameInfoDat->text());
1044 	s = lineEditMessInfoDat->text();
1045 	needManualReload |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat").toString() != s);
1046 	invalidateEmuInfoDB |= (QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat").toString() != s);
1047 	config->setValue(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat", lineEditMessInfoDat->text());
1048 	config->setValue("MAME/FilesAndDirectories/CatverIni", lineEditCatverIniFile->text());
1049 	config->setValue("MAME/FilesAndDirectories/CategoryIni", lineEditCategoryIniFile->text());
1050 	s = lineEditSoftwareInfoDB->text();
1051 	needManualReload |= (config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareInfoDB").toString() != s);
1052 	invalidateSoftwareInfoDB |= (config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareInfoDB").toString() != s);
1053 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareInfoDB", lineEditSoftwareInfoDB->text());
1054 	if ( qmc2SystemNotesEditor ) {
1055 		qmc2SystemNotesEditor->enableFileNewFromTemplateAction(checkBoxUseSystemNotesTemplate->isChecked());
1056 		qmc2SystemNotesEditor->setCurrentTemplateName(lineEditSystemNotesTemplate->text());
1057 	}
1058 	if ( qmc2SoftwareNotesEditor ) {
1059 		qmc2SoftwareNotesEditor->enableFileNewFromTemplateAction(checkBoxUseSoftwareNotesTemplate->isChecked());
1060 		qmc2SoftwareNotesEditor->setCurrentTemplateName(lineEditSoftwareNotesTemplate->text());
1061 	}
1062 	bool catverUsed = checkBoxUseCatverIni->isChecked();
1063 	needReload |= (config->value(QMC2_FRONTEND_PREFIX + "MachineList/UseCatverIni", false).toBool() != catverUsed );
1064 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/UseCatverIni", catverUsed);
1065 	bool categoryUsed = checkBoxUseCategoryIni->isChecked();
1066 	needReload |= (config->value(QMC2_FRONTEND_PREFIX + "MachineList/UseCategoryIni", false).toBool() != categoryUsed );
1067 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/UseCategoryIni", categoryUsed);
1068 
1069 	qmc2CategoryInfoUsed = catverUsed | categoryUsed;
1070 	qmc2VersionInfoUsed = catverUsed;
1071 	int viewCount = 2;
1072 
1073 	if ( qmc2CategoryInfoUsed ) {
1074 		viewCount++;
1075 		if ( !qmc2MainWindow->treeWidgetMachineList->isColumnHidden(QMC2_MACHINELIST_COLUMN_CATEGORY) )
1076 			qmc2MainWindow->treeWidgetMachineList->showColumn(QMC2_MACHINELIST_COLUMN_CATEGORY);
1077 		if ( !qmc2MainWindow->treeWidgetHierarchy->isColumnHidden(QMC2_MACHINELIST_COLUMN_CATEGORY) )
1078 			qmc2MainWindow->treeWidgetHierarchy->showColumn(QMC2_MACHINELIST_COLUMN_CATEGORY);
1079 		qmc2MainWindow->actionViewByCategory->setVisible(true);
1080 		qmc2MainWindow->actionViewByCategory->setEnabled(true);
1081 		qmc2MainWindow->actionMenuMachineListHeaderCategory->setVisible(true);
1082 		qmc2MainWindow->actionMenuMachineListHeaderCategory->setEnabled(true);
1083 		qmc2MainWindow->actionMenuHierarchyHeaderCategory->setVisible(true);
1084 		qmc2MainWindow->actionMenuHierarchyHeaderCategory->setEnabled(true);
1085 		qmc2MainWindow->actionMenuVersionHeaderCategory->setVisible(true);
1086 		qmc2MainWindow->actionMenuVersionHeaderCategory->setEnabled(true);
1087 		int index = comboBoxSortCriteria->findText(tr("Category"));
1088 		if ( index < 0 )
1089 			comboBoxSortCriteria->insertItem(comboBoxSortCriteria->count(), tr("Category"));
1090 		index = qmc2MainWindow->comboBoxViewSelect->findText(tr("Category view"));
1091 		if ( index < 0 ) {
1092 			for (int i = 0; i < qmc2MainWindow->comboBoxViewSelect->count() && index < 0; i++)
1093 				if ( qmc2MainWindow->comboBoxViewSelect->itemData(i).toInt() == -1 )
1094 					index = i;
1095 			if ( index < 0 )
1096 				index = qmc2MainWindow->comboBoxViewSelect->count();
1097 			qmc2MainWindow->comboBoxViewSelect->insertItem(index, tr("Category view"));
1098 			qmc2MainWindow->comboBoxViewSelect->setItemIcon(index, QIcon(QString::fromUtf8(":/data/img/category.png")));
1099 		}
1100 	} else {
1101 		qmc2MainWindow->treeWidgetMachineList->hideColumn(QMC2_MACHINELIST_COLUMN_CATEGORY);
1102 		qmc2MainWindow->treeWidgetHierarchy->hideColumn(QMC2_MACHINELIST_COLUMN_CATEGORY);
1103 		qmc2MainWindow->actionViewByCategory->setVisible(false);
1104 		qmc2MainWindow->actionViewByCategory->setEnabled(false);
1105 		qmc2MainWindow->actionMenuMachineListHeaderCategory->setVisible(false);
1106 		qmc2MainWindow->actionMenuMachineListHeaderCategory->setEnabled(false);
1107 		qmc2MainWindow->actionMenuHierarchyHeaderCategory->setVisible(false);
1108 		qmc2MainWindow->actionMenuHierarchyHeaderCategory->setEnabled(false);
1109 		qmc2MainWindow->actionMenuVersionHeaderCategory->setVisible(false);
1110 		qmc2MainWindow->actionMenuVersionHeaderCategory->setEnabled(false);
1111 		int index = comboBoxSortCriteria->findText(tr("Category"));
1112 		if ( index >= 0 )
1113 			comboBoxSortCriteria->removeItem(index);
1114 		index = qmc2MainWindow->comboBoxViewSelect->findText(tr("Category view"));
1115 		if ( index >= 0 )
1116 			qmc2MainWindow->comboBoxViewSelect->removeItem(index);
1117 	}
1118 
1119 	if ( qmc2VersionInfoUsed ) {
1120 		viewCount++;
1121 		if ( !qmc2MainWindow->treeWidgetMachineList->isColumnHidden(QMC2_MACHINELIST_COLUMN_VERSION) )
1122 			qmc2MainWindow->treeWidgetMachineList->showColumn(QMC2_MACHINELIST_COLUMN_VERSION);
1123 		if ( !qmc2MainWindow->treeWidgetHierarchy->isColumnHidden(QMC2_MACHINELIST_COLUMN_VERSION) )
1124 			qmc2MainWindow->treeWidgetHierarchy->showColumn(QMC2_MACHINELIST_COLUMN_VERSION);
1125 		qmc2MainWindow->actionViewByVersion->setVisible(true);
1126 		qmc2MainWindow->actionViewByVersion->setEnabled(true);
1127 		qmc2MainWindow->actionMenuMachineListHeaderVersion->setVisible(true);
1128 		qmc2MainWindow->actionMenuMachineListHeaderVersion->setEnabled(true);
1129 		qmc2MainWindow->actionMenuHierarchyHeaderVersion->setVisible(true);
1130 		qmc2MainWindow->actionMenuHierarchyHeaderVersion->setEnabled(true);
1131 		qmc2MainWindow->actionMenuCategoryHeaderVersion->setVisible(true);
1132 		qmc2MainWindow->actionMenuCategoryHeaderVersion->setEnabled(true);
1133 		int index = comboBoxSortCriteria->findText(tr("Version"));
1134 		if ( index < 0 )
1135 			comboBoxSortCriteria->insertItem(comboBoxSortCriteria->count(), tr("Version"));
1136 		index = qmc2MainWindow->comboBoxViewSelect->findText(tr("Version view"));
1137 		if ( index < 0 ) {
1138 			for (int i = 0; i < qmc2MainWindow->comboBoxViewSelect->count() && index < 0; i++)
1139 				if ( qmc2MainWindow->comboBoxViewSelect->itemData(i).toInt() == -1 )
1140 					index = i;
1141 			if ( index < 0 )
1142 				index = qmc2MainWindow->comboBoxViewSelect->count();
1143 			qmc2MainWindow->comboBoxViewSelect->insertItem(index, tr("Version view"));
1144 			qmc2MainWindow->comboBoxViewSelect->setItemIcon(index, QIcon(QString::fromUtf8(":/data/img/version.png")));
1145 		}
1146 	} else {
1147 		qmc2MainWindow->treeWidgetMachineList->hideColumn(QMC2_MACHINELIST_COLUMN_VERSION);
1148 		qmc2MainWindow->treeWidgetHierarchy->hideColumn(QMC2_MACHINELIST_COLUMN_VERSION);
1149 		qmc2MainWindow->actionViewByVersion->setVisible(false);
1150 		qmc2MainWindow->actionViewByVersion->setEnabled(false);
1151 		qmc2MainWindow->actionMenuMachineListHeaderVersion->setVisible(false);
1152 		qmc2MainWindow->actionMenuMachineListHeaderVersion->setEnabled(false);
1153 		qmc2MainWindow->actionMenuHierarchyHeaderVersion->setVisible(false);
1154 		qmc2MainWindow->actionMenuHierarchyHeaderVersion->setEnabled(false);
1155 		qmc2MainWindow->actionMenuCategoryHeaderVersion->setVisible(false);
1156 		qmc2MainWindow->actionMenuCategoryHeaderVersion->setEnabled(false);
1157 		int index = comboBoxSortCriteria->findText(tr("Version"));
1158 		if ( index >= 0 )
1159 			comboBoxSortCriteria->removeItem(index);
1160 		index = qmc2MainWindow->comboBoxViewSelect->findText(tr("Version view"));
1161 		if ( index >= 0 )
1162 			qmc2MainWindow->comboBoxViewSelect->removeItem(index);
1163 	}
1164 
1165 	MachineListViewer::setViewSelectSeparatorIndex(viewCount);
1166 #if defined(QMC2_WIP_ENABLED)
1167 	// load saved and attached views
1168 	if ( !MachineListViewer::savedViewsLoaded() )
1169 		MachineListViewer::loadSavedViews();
1170 #endif
1171 
1172 	if ( config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineListView").toInt() > MachineListViewer::totalViews() )
1173 		config->setValue(QMC2_FRONTEND_PREFIX + "GUI/MachineListView", QMC2_VIEWMACHINELIST_INDEX);
1174 
1175 	if ( qmc2ToolBarCustomizer )
1176 		QTimer::singleShot(0, qmc2ToolBarCustomizer, SLOT(refreshAvailableActions()));
1177 
1178 	if ( initialCall ) {
1179 		// make sure the current view is visible / set tab icon accordingly
1180 		qmc2MainWindow->comboBoxViewSelect->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineListView", QMC2_VIEWMACHINELIST_INDEX).toInt());
1181 	}
1182 
1183 	ComponentInfo *componentInfo = qmc2ComponentSetup->componentInfoHash().value("Component1");
1184 	int index = componentInfo->appliedFeatureList().indexOf(QMC2_MACHINELIST_INDEX);
1185 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
1186 	int embedIndex = componentInfo->appliedFeatureList().indexOf(QMC2_EMBED_INDEX);
1187 	if ( index > 0 && embedIndex >= 0 && embedIndex <= index )
1188 		if ( qmc2MainWindow->tabWidgetMachineList->indexOf(qmc2MainWindow->tabEmbeddedEmus) < 0 )
1189 			index--;
1190 #endif
1191 	int foreignIndex = componentInfo->appliedFeatureList().indexOf(QMC2_FOREIGN_INDEX);
1192 	if ( index > 0 && foreignIndex >= 0 && foreignIndex <= index )
1193 		if ( qmc2MainWindow->tabWidgetMachineList->indexOf(qmc2MainWindow->tabForeignEmulators) < 0 )
1194 			index--;
1195 	switch ( qmc2MainWindow->comboBoxViewSelect->currentIndex() ) {
1196 		case QMC2_VIEWMACHINELIST_INDEX:
1197 			qmc2MainWindow->tabWidgetMachineList->setTabIcon(index, QIcon(QString::fromUtf8(":/data/img/flat.png")));
1198 			break;
1199 		case QMC2_VIEWHIERARCHY_INDEX:
1200 			qmc2MainWindow->tabWidgetMachineList->setTabIcon(index, QIcon(QString::fromUtf8(":/data/img/clone.png")));
1201 			break;
1202 		case QMC2_VIEWCATEGORY_INDEX:
1203 			qmc2MainWindow->tabWidgetMachineList->setTabIcon(index, QIcon(QString::fromUtf8(":/data/img/category.png")));
1204 			break;
1205 		case QMC2_VIEWVERSION_INDEX:
1206 			qmc2MainWindow->tabWidgetMachineList->setTabIcon(index, QIcon(QString::fromUtf8(":/data/img/version.png")));
1207 			break;
1208 		default:
1209 			qmc2MainWindow->tabWidgetMachineList->setTabIcon(index, QIcon(QString::fromUtf8(":/data/img/filtered_view.png")));
1210 			break;
1211 	}
1212 
1213 	// MachineList
1214 	bool showROMStatusIcons = checkBoxShowROMStatusIcons->isChecked();
1215 	needReload |= (config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowROMStatusIcons", true).toBool() != showROMStatusIcons );
1216 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/ShowROMStatusIcons", showROMStatusIcons);
1217 	bool showDeviceSets = checkBoxShowDeviceSets->isChecked();
1218 	needReload |= (config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowDeviceSets", true).toBool() != showDeviceSets );
1219 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/ShowDeviceSets", showDeviceSets);
1220 	bool showBiosSets = checkBoxShowBiosSets->isChecked();
1221 	needReload |= (config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowBiosSets", true).toBool() != showBiosSets );
1222 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/ShowBiosSets", showBiosSets);
1223 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/AutoTriggerROMCheck", checkBoxAutoTriggerROMCheck->isChecked());
1224 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/DoubleClickActivation", checkBoxDoubleClickActivation->isChecked());
1225 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/PlayOnSublistActivation", checkBoxPlayOnSublistActivation->isChecked());
1226 	qmc2CursorPositioningMode = (QAbstractItemView::ScrollHint)comboBoxCursorPosition->currentIndex();
1227 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/CursorPosition", qmc2CursorPositioningMode);
1228 	qmc2DefaultLaunchMode = comboBoxDefaultLaunchMode->currentIndex();
1229 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/DefaultLaunchMode", qmc2DefaultLaunchMode);
1230 	qmc2SoftwareSnapPosition = comboBoxSoftwareSnapPosition->currentIndex();
1231 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/SoftwareSnapPosition", qmc2SoftwareSnapPosition);
1232 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/SoftwareSnapOnMouseHover", checkBoxSoftwareSnapOnMouseHover->isChecked());
1233 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/AutoDisableSoftwareSnap", checkBoxAutoDisableSoftwareSnap->isChecked());
1234 	qmc2MachineListResponsiveness = spinBoxResponsiveness->value();
1235 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/Responsiveness", qmc2MachineListResponsiveness);
1236 	qmc2UpdateDelay = spinBoxUpdateDelay->value();
1237 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/UpdateDelay", qmc2UpdateDelay);
1238 	i = comboBoxSortCriteria->currentIndex();
1239 	needResort = (i != qmc2SortCriteria);
1240 	qmc2SortCriteria = i;
1241 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/SortCriteria", qmc2SortCriteria);
1242 	i = comboBoxSortOrder->currentIndex();
1243 	needResort = needResort || (i == 0 ? qmc2SortOrder != Qt::AscendingOrder : qmc2SortOrder != Qt::DescendingOrder);
1244 	qmc2SortOrder = (i == 0 ? Qt::AscendingOrder : Qt::DescendingOrder);
1245 	config->setValue(QMC2_FRONTEND_PREFIX + "MachineList/SortOrder", qmc2SortOrder);
1246 	QBitArray newFilter(QMC2_ROMSTATE_COUNT);
1247 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowCorrect", toolButtonShowC->isChecked());
1248 	newFilter.setBit(QMC2_ROMSTATE_INT_C, toolButtonShowC->isChecked());
1249 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowMostlyCorrect", toolButtonShowM->isChecked());
1250 	newFilter.setBit(QMC2_ROMSTATE_INT_M, toolButtonShowM->isChecked());
1251 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowIncorrect", toolButtonShowI->isChecked());
1252 	newFilter.setBit(QMC2_ROMSTATE_INT_I, toolButtonShowI->isChecked());
1253 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowNotFound", toolButtonShowN->isChecked());
1254 	newFilter.setBit(QMC2_ROMSTATE_INT_N, toolButtonShowN->isChecked());
1255 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowUnknown", toolButtonShowU->isChecked());
1256 	newFilter.setBit(QMC2_ROMSTATE_INT_U, toolButtonShowU->isChecked());
1257 	needFilter = (qmc2Filter != newFilter);
1258 	qmc2Filter = newFilter;
1259 
1260 	bool oldRSF = config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/Enabled", true).toBool();
1261 	if ( checkBoxRomStateFilter->isChecked() ) {
1262 		if ( qmc2MainWindow->comboBoxViewSelect->currentIndex() == QMC2_VIEWMACHINELIST_INDEX ) {
1263 			qmc2MainWindow->toolButtonSelectRomFilter->setVisible(true);
1264 			qmc2MainWindow->actionTagVisible->setVisible(true);
1265 			qmc2MainWindow->actionUntagVisible->setVisible(true);
1266 			qmc2MainWindow->actionInvertVisibleTags->setVisible(true);
1267 		}
1268 		qmc2MainWindow->romStateFilter->setEnabled(true);
1269 		config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/Enabled", true);
1270 		if ( !oldRSF ) {
1271 			needReload = true;
1272 			needFilter = true;
1273 		}
1274 	} else {
1275 		qmc2MainWindow->toolButtonSelectRomFilter->setVisible(false);
1276 		qmc2MainWindow->actionTagVisible->setVisible(false);
1277 		qmc2MainWindow->actionUntagVisible->setVisible(false);
1278 		qmc2MainWindow->actionInvertVisibleTags->setVisible(false);
1279 		qmc2MainWindow->romStateFilter->setEnabled(false);
1280 		config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/Enabled", false);
1281 		if ( oldRSF ) {
1282 			needReload = true;
1283 			needFilter = false;
1284 		}
1285 	}
1286 	config->setValue(QMC2_FRONTEND_PREFIX + "RomStateFilter/DynamicStateFilter", checkBoxDynamicStateFilter->isChecked());
1287 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/SaveMachineSelection", checkBoxSaveMachineSelection->isChecked());
1288 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/RestoreMachineSelection", checkBoxRestoreMachineSelection->isChecked());
1289 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/SaveSoftwareSelection", checkBoxSaveSoftwareSelection->isChecked());
1290 	config->setValue(QMC2_FRONTEND_PREFIX + "GUI/RestoreSoftwareSelection", checkBoxRestoreSoftwareSelection->isChecked());
1291 
1292 	// Shortcuts / Keys
1293 	QHashIterator<QString, QPair<QString, QAction *> > it(qmc2ShortcutHash);
1294 	while ( it.hasNext() ) {
1295 		it.next();
1296 		QString itShortcut = it.key();
1297 		config->setValue(QString(QMC2_FRONTEND_PREFIX + "Shortcuts/%1").arg(itShortcut), qmc2CustomShortcutHash[itShortcut]);
1298 	}
1299 	setupShortcutActions();
1300 
1301 	// Joystick
1302 #if QMC2_JOYSTICK == 1
1303 	config->setValue(QMC2_FRONTEND_PREFIX + "Joystick/EnableJoystickControl", checkBoxEnableJoystickControl->isChecked());
1304 	config->setValue(QMC2_FRONTEND_PREFIX + "Joystick/Index", comboBoxSelectJoysticks->currentIndex());
1305 	config->setValue(QMC2_FRONTEND_PREFIX + "Joystick/AutoRepeat", checkBoxJoystickAutoRepeat->isChecked());
1306 	config->setValue(QMC2_FRONTEND_PREFIX + "Joystick/AutoRepeatTimeout", spinBoxJoystickAutoRepeatTimeout->value());
1307 	config->setValue(QMC2_FRONTEND_PREFIX + "Joystick/EventTimeout", spinBoxJoystickEventTimeout->value());
1308 
1309 	// Joystick function map
1310 	it.toFront();
1311 	while ( it.hasNext() ) {
1312 		it.next();
1313 		QString itShortcut = it.key();
1314 		QString myKey = qmc2JoystickFunctionHash.key(itShortcut);
1315 		if ( myKey.isEmpty() )
1316 			config->remove(QString(QMC2_FRONTEND_PREFIX + "Joystick/Map/%1").arg(itShortcut));
1317 		else
1318 			config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/Map/%1").arg(itShortcut), myKey);
1319 	}
1320 	if ( joystick ) {
1321 		if ( joystick->isOpen() )
1322 			joystick->close();
1323 		// (re)connect joystick callbacks to main widget
1324 		joystick->disconnect(qmc2MainWindow);
1325 		if ( config->value(QMC2_FRONTEND_PREFIX + "Joystick/EnableJoystickControl").toBool() ) {
1326 			if ( joystick->open(config->value(QMC2_FRONTEND_PREFIX + "Joystick/Index").toInt()) ) {
1327 				connect(joystick, SIGNAL(axisValueChanged(int, int)), qmc2MainWindow, SLOT(joystickAxisValueChanged(int, int)));
1328 				connect(joystick, SIGNAL(buttonValueChanged(int, bool)), qmc2MainWindow, SLOT(joystickButtonValueChanged(int, bool)));
1329 				connect(joystick, SIGNAL(hatValueChanged(int, int)), qmc2MainWindow, SLOT(joystickHatValueChanged(int, int)));
1330 				connect(joystick, SIGNAL(trackballValueChanged(int, int, int)), qmc2MainWindow, SLOT(joystickTrackballValueChanged(int, int, int)));
1331 				qmc2MainWindow->joyIndex = config->value(QMC2_FRONTEND_PREFIX + "Joystick/Index").toInt();
1332 			}
1333 		}
1334 	}
1335 	toolButtonMapJoystick->setChecked(true);
1336 	on_toolButtonMapJoystick_clicked();
1337 #endif
1338 
1339 	// Network / Tools
1340 	CookieJar *cj = 0;
1341 	bool restoreCookies = config->value(QMC2_FRONTEND_PREFIX + "WebBrowser/RestoreCookies", true).toBool();
1342 	config->setValue(QMC2_FRONTEND_PREFIX + "WebBrowser/RestoreCookies", checkBoxRestoreCookies->isChecked());
1343 	needChangeCookieJar = restoreCookies != checkBoxRestoreCookies->isChecked();
1344 	if ( restoreCookies )
1345 		cj = (CookieJar *)qmc2NetworkAccessManager->cookieJar();
1346 	QString cookieDatabase = config->value(QMC2_FRONTEND_PREFIX + "WebBrowser/CookieDatabase", QString()).toString();
1347 	config->setValue(QMC2_FRONTEND_PREFIX + "WebBrowser/CookieDatabase", lineEditCookieDatabase->text());
1348 	needChangeCookieJar |= cookieDatabase != lineEditCookieDatabase->text();
1349 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/ZipTool", lineEditZipTool->text());
1350 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/ZipToolRemovalArguments", lineEditZipToolRemovalArguments->text());
1351 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/SevenZipTool", lineEditSevenZipTool->text());
1352 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/SevenZipToolRemovalArguments", lineEditSevenZipToolRemovalArguments->text());
1353 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/RomTool", lineEditRomTool->text());
1354 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/RomToolArguments", lineEditRomToolArguments->text());
1355 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/RomToolWorkingDirectory", lineEditRomToolWorkingDirectory->text());
1356 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/CopyToolOutput", checkBoxCopyToolOutput->isChecked());
1357 	config->setValue(QMC2_FRONTEND_PREFIX + "Tools/CloseToolDialog", checkBoxCloseToolDialog->isChecked());
1358 	config->setValue("Network/HTTPProxy/Enable", groupBoxHTTPProxy->isChecked());
1359 	config->setValue("Network/HTTPProxy/Host", lineEditHTTPProxyHost->text());
1360 	config->setValue("Network/HTTPProxy/Port", spinBoxHTTPProxyPort->value());
1361 	config->setValue("Network/HTTPProxy/UserID", lineEditHTTPProxyUserID->text());
1362 	CryptedByteArray cpw(lineEditHTTPProxyPassword->text().toLatin1());
1363 	config->setValue("Network/HTTPProxy/Password", cpw.encryptedData());
1364 	if ( groupBoxHTTPProxy->isChecked() ) {
1365 		QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::HttpProxy,
1366 					lineEditHTTPProxyHost->text(),
1367 					spinBoxHTTPProxyPort->value(),
1368 					lineEditHTTPProxyUserID->text().isEmpty() ? QString() : lineEditHTTPProxyUserID->text(),
1369 					lineEditHTTPProxyPassword->text().isEmpty() ? QString() : lineEditHTTPProxyPassword->text()));
1370 	} else
1371 		QNetworkProxy::setApplicationProxy(QNetworkProxy(QNetworkProxy::NoProxy));
1372 
1373 	if ( needChangeCookieJar ) {
1374 		if ( cj )
1375 			cj->db.close();
1376 		if ( checkBoxRestoreCookies->isChecked() )
1377 			qmc2NetworkAccessManager->setCookieJar(new CookieJar(qmc2NetworkAccessManager));
1378 		else
1379 			qmc2NetworkAccessManager->setCookieJar(new QNetworkCookieJar(qmc2NetworkAccessManager));
1380 	}
1381 
1382 	// Emulator
1383 
1384 	// Configuration
1385 	if ( qmc2GuiReady ) {
1386 		if ( qmc2GlobalEmulatorOptions->changed ) {
1387 			if ( qmc2EmulatorOptions ) {
1388 				switch ( QMessageBox::question(this, tr("Confirm"),
1389 							tr("An open machine-specific emulator configuration has been detected.\nUse local machine-settings, overwrite with global settings or don't apply?"),
1390 							tr("&Local"), tr("&Overwrite"), tr("Do&n't apply"), 0, 2) ) {
1391 					case 0:
1392 						qmc2EmulatorOptions->save();
1393 						qmc2GlobalEmulatorOptions->save();
1394 						qmc2GlobalEmulatorOptions->load();
1395 						qmc2EmulatorOptions->load();
1396 						break;
1397 
1398 					case 1:
1399 						qmc2GlobalEmulatorOptions->save();
1400 						qmc2GlobalEmulatorOptions->load();
1401 						qmc2EmulatorOptions->load(true);
1402 						qmc2EmulatorOptions->save();
1403 						break;
1404 
1405 					case 2:
1406 					default:
1407 						break;
1408 				}
1409 			} else {
1410 				qmc2GlobalEmulatorOptions->save();
1411 				qmc2GlobalEmulatorOptions->load();
1412 			}
1413 		}
1414 	}
1415 	m_enableOutputNotifiers = checkBoxEnableOutputNotifiers->isChecked();
1416 	config->setValue(QMC2_EMULATOR_PREFIX + "EnableOutputNotifiers", m_enableOutputNotifiers);
1417 
1418 	QTimer::singleShot(0, qmc2GlobalEmulatorOptions, SLOT(updateAllEmuOptActions()));
1419 
1420 	if ( qmc2EmulatorOptions )
1421 		QTimer::singleShot(0, qmc2EmulatorOptions, SLOT(updateAllEmuOptActions()));
1422 
1423 	// Files and directories
1424 	needReload |= config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/ExecutableFile").toString() != lineEditExecutableFile->text();
1425 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/ExecutableFile", lineEditExecutableFile->text());
1426 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/WorkingDirectory", lineEditWorkingDirectory->text());
1427 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/LogFile", lineEditEmulatorLogFile->text());
1428 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/XmlCacheDatabase", lineEditXmlCacheDatabase->text());
1429 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/UserDataDatabase", lineEditUserDataDatabase->text());
1430 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/MachineListCacheFile", lineEditMachineListCacheFile->text());
1431 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/ROMStateCacheFile", lineEditROMStateCacheFile->text());
1432 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareListCacheDatabase", lineEditSoftwareListCacheDb->text());
1433 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareStateCache", lineEditSoftwareStateCache->text());
1434 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/GeneralSoftwareFolder", lineEditGeneralSoftwareFolder->text());
1435 	s = lineEditOptionsTemplateFile->text();
1436 	needRecreateTemplateMap = needRecreateTemplateMap || (config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/OptionsTemplateFile").toString() != s );
1437 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/OptionsTemplateFile", s);
1438 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/FavoritesFile", lineEditFavoritesFile->text());
1439 	config->setValue(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/HistoryFile", lineEditHistoryFile->text());
1440 	config->setValue(QMC2_EMULATOR_PREFIX + "AutoClearEmuCaches", checkBoxAutoClearEmuCaches->isChecked());
1441 	config->setValue(QMC2_EMULATOR_PREFIX + "SkipEmuIdent", checkBoxSkipEmuIdent->isChecked());
1442 
1443 	// Additional emulators
1444 	tableWidgetRegisteredEmulators->setSortingEnabled(false);
1445 	config->remove(QMC2_EMULATOR_PREFIX + "RegisteredEmulators");
1446 	for (i = 0; i < tableWidgetRegisteredEmulators->rowCount(); i++) {
1447 		if ( tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_NAME) ) {
1448 			QString emuIcon, emuName, emuCommand, emuWorkDir, emuArgs;
1449 			emuName = tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_NAME)->text();
1450 			if ( tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_EXEC) )
1451 				emuCommand = tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_EXEC)->text();
1452 			if ( tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_WDIR) )
1453 				emuWorkDir = tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_WDIR)->text();
1454 			if ( tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_ARGS) )
1455 				emuArgs = tableWidgetRegisteredEmulators->item(i, QMC2_ADDTLEMUS_COLUMN_ARGS)->text();
1456 			config->setValue(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/Executable").arg(emuName), emuCommand);
1457 			config->setValue(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/WorkingDirectory").arg(emuName), emuWorkDir);
1458 			config->setValue(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/Arguments").arg(emuName), emuArgs);
1459 			QToolButton *tb = (QToolButton *)tableWidgetRegisteredEmulators->cellWidget(i, QMC2_ADDTLEMUS_COLUMN_ICON);
1460 			if ( tb )
1461 				emuIcon = tb->whatsThis();
1462 			if ( !emuIcon.startsWith(":") && !emuIcon.isEmpty() )
1463 				config->setValue(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/Icon").arg(emuName), emuIcon);
1464 			else
1465 				config->remove(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/Icon").arg(emuName));
1466 		}
1467 	}
1468 	tableWidgetRegisteredEmulators->setSortingEnabled(true);
1469 
1470 	// remove custom ID lists, if applicable
1471 	foreach (QString emuName, registeredEmulatorsToBeRemoved)
1472 		config->remove(QString(QMC2_EMULATOR_PREFIX + "CustomIDs/%1").arg(emuName));
1473 	registeredEmulatorsToBeRemoved.clear();
1474 
1475 	// sync settings (write settings to disk) and apply
1476 	apply();
1477 
1478 	if ( invalidateGameInfoDB )
1479 		qmc2MachineList->datInfoDb()->recreateMachineInfoTable();
1480 
1481 	if ( invalidateEmuInfoDB )
1482 		qmc2MachineList->datInfoDb()->recreateEmuInfoTable();
1483 
1484 	if ( invalidateSoftwareInfoDB )
1485 		qmc2MachineList->datInfoDb()->recreateSoftwareInfoTable();
1486 
1487 	if ( needManualReload && !qmc2MachineList->initialLoad )
1488 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("please reload machine list for some changes to take effect"));
1489 
1490 	if ( needRestart )
1491 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("please restart QMC2 for some changes to take effect"));
1492 
1493 	if ( needRecreateTemplateMap )
1494 		qmc2MainWindow->on_actionRecreateTemplateMap_triggered();
1495 
1496 	if ( needResort && !needReload ) {
1497 		qmc2SortingActive = true;
1498 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("sorting machine list by %1 in %2 order").arg(qmc2MachineList->sortCriteriaName(qmc2SortCriteria)).arg(qmc2SortOrder == Qt::AscendingOrder ? tr("ascending") : tr("descending")));
1499 		foreach (QTreeWidgetItem *ti, qmc2ExpandedMachineListItems) {
1500 			qmc2MainWindow->treeWidgetMachineList->collapseItem(ti);
1501 			QList<QTreeWidgetItem *> childrenList = ti->takeChildren();
1502 			foreach (QTreeWidgetItem *ci, ti->takeChildren())
1503 				delete ci;
1504 			QTreeWidgetItem *nameItem = new QTreeWidgetItem(ti);
1505 			nameItem->setText(QMC2_MACHINELIST_COLUMN_MACHINE, MachineList::trWaitingForData);
1506 			nameItem->setText(QMC2_MACHINELIST_COLUMN_ICON, ti->text(QMC2_MACHINELIST_COLUMN_NAME));
1507 		}
1508 		qmc2ExpandedMachineListItems.clear();
1509 		qmc2MainWindow->treeWidgetMachineList->setUpdatesEnabled(false);
1510 		qmc2MainWindow->treeWidgetHierarchy->setUpdatesEnabled(false);
1511 		qmc2MainWindow->treeWidgetCategoryView->setUpdatesEnabled(false);
1512 		qmc2MainWindow->treeWidgetVersionView->setUpdatesEnabled(false);
1513 		if ( qmc2SortCriteria == QMC2_SORT_BY_RANK && !qmc2MachineList->userDataDb()->rankCacheComplete() )
1514 			qmc2MachineList->userDataDb()->fillUpRankCache();
1515 		qmc2MainWindow->treeWidgetMachineList->sortItems(qmc2MainWindow->sortCriteriaLogicalIndex(), qmc2SortOrder);
1516 		qmc2MainWindow->treeWidgetHierarchy->sortItems(qmc2MainWindow->sortCriteriaLogicalIndex(), qmc2SortOrder);
1517 		if ( qmc2MainWindow->treeWidgetCategoryView->topLevelItemCount() > 0 )
1518 			qmc2MainWindow->treeWidgetCategoryView->sortItems(qmc2MainWindow->sortCriteriaLogicalIndex(), qmc2SortOrder);
1519 		if ( qmc2MainWindow->treeWidgetVersionView->topLevelItemCount() > 0 )
1520 			qmc2MainWindow->treeWidgetVersionView->sortItems(qmc2MainWindow->sortCriteriaLogicalIndex(), qmc2SortOrder);
1521 		qmc2MainWindow->treeWidgetMachineList->setUpdatesEnabled(true);
1522 		qmc2MainWindow->treeWidgetHierarchy->setUpdatesEnabled(true);
1523 		qmc2MainWindow->treeWidgetCategoryView->setUpdatesEnabled(true);
1524 		qmc2MainWindow->treeWidgetVersionView->setUpdatesEnabled(true);
1525 		qmc2SortingActive = false;
1526 		QTimer::singleShot(0, qmc2MainWindow, SLOT(scrollToCurrentItem()));
1527 	}
1528 
1529 	switch ( qmc2SortCriteria ) {
1530 		case QMC2_SORT_BY_DESCRIPTION:
1531 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MACHINE, qmc2SortOrder);
1532 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MACHINE, qmc2SortOrder);
1533 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1534 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1535 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MACHINE, qmc2SortOrder);
1536 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1537 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MACHINE, qmc2SortOrder);
1538 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1539 			break;
1540 
1541 		case QMC2_SORT_BY_TAG:
1542 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_TAG, qmc2SortOrder);
1543 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_TAG, qmc2SortOrder);
1544 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1545 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1546 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_TAG, qmc2SortOrder);
1547 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1548 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_TAG, qmc2SortOrder);
1549 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1550 			break;
1551 
1552 		case QMC2_SORT_BY_YEAR:
1553 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_YEAR, qmc2SortOrder);
1554 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_YEAR, qmc2SortOrder);
1555 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1556 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1557 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_YEAR, qmc2SortOrder);
1558 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1559 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_YEAR, qmc2SortOrder);
1560 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1561 			break;
1562 
1563 		case QMC2_SORT_BY_MANUFACTURER:
1564 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MANU, qmc2SortOrder);
1565 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MANU, qmc2SortOrder);
1566 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1567 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1568 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MANU, qmc2SortOrder);
1569 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1570 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_MANU, qmc2SortOrder);
1571 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1572 			break;
1573 
1574 		case QMC2_SORT_BY_NAME:
1575 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_NAME, qmc2SortOrder);
1576 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_NAME, qmc2SortOrder);
1577 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1578 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1579 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_NAME, qmc2SortOrder);
1580 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1581 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_NAME, qmc2SortOrder);
1582 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1583 			break;
1584 
1585 		case QMC2_SORT_BY_ROMTYPES:
1586 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RTYPES, qmc2SortOrder);
1587 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RTYPES, qmc2SortOrder);
1588 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1589 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1590 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RTYPES, qmc2SortOrder);
1591 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1592 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RTYPES, qmc2SortOrder);
1593 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1594 			break;
1595 
1596 		case QMC2_SORT_BY_PLAYERS:
1597 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_PLAYERS, qmc2SortOrder);
1598 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_PLAYERS, qmc2SortOrder);
1599 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1600 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1601 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_PLAYERS, qmc2SortOrder);
1602 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1603 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_PLAYERS, qmc2SortOrder);
1604 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1605 			break;
1606 
1607 		case QMC2_SORT_BY_DRVSTAT:
1608 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_DRVSTAT, qmc2SortOrder);
1609 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_DRVSTAT, qmc2SortOrder);
1610 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1611 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1612 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_DRVSTAT, qmc2SortOrder);
1613 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1614 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_DRVSTAT, qmc2SortOrder);
1615 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1616 			break;
1617 
1618 		case QMC2_SORT_BY_SRCFILE:
1619 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_SRCFILE, qmc2SortOrder);
1620 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_SRCFILE, qmc2SortOrder);
1621 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1622 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1623 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_SRCFILE, qmc2SortOrder);
1624 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1625 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_SRCFILE, qmc2SortOrder);
1626 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1627 			break;
1628 
1629 		case QMC2_SORT_BY_RANK:
1630 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RANK, qmc2SortOrder);
1631 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RANK, qmc2SortOrder);
1632 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1633 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1634 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RANK, qmc2SortOrder);
1635 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1636 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_RANK, qmc2SortOrder);
1637 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1638 			break;
1639 
1640 		case QMC2_SORT_BY_CATEGORY:
1641 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_CATEGORY, qmc2SortOrder);
1642 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_CATEGORY, qmc2SortOrder);
1643 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1644 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1645 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_CATEGORY, qmc2SortOrder);
1646 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_CATEGORY, qmc2SortOrder);
1647 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1648 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1649 			break;
1650 
1651 		case QMC2_SORT_BY_VERSION:
1652 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_VERSION, qmc2SortOrder);
1653 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_VERSION, qmc2SortOrder);
1654 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(true);
1655 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(true);
1656 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_VERSION, qmc2SortOrder);
1657 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicator(QMC2_MACHINELIST_COLUMN_VERSION, qmc2SortOrder);
1658 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(true);
1659 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(true);
1660 			break;
1661 
1662 		default:
1663 			qmc2MainWindow->treeWidgetMachineList->header()->setSortIndicatorShown(false);
1664 			qmc2MainWindow->treeWidgetHierarchy->header()->setSortIndicatorShown(false);
1665 			qmc2MainWindow->treeWidgetCategoryView->header()->setSortIndicatorShown(false);
1666 			qmc2MainWindow->treeWidgetVersionView->header()->setSortIndicatorShown(false);
1667 			break;
1668 	}
1669 
1670 	if ( needFilter && !needReload ) {
1671 		qmc2StatesTogglesEnabled = false;
1672 		qmc2MainWindow->romStateFilter->toolButtonCorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_C]);
1673 		qmc2MainWindow->romStateFilter->toolButtonMostlyCorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_M]);
1674 		qmc2MainWindow->romStateFilter->toolButtonIncorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_I]);
1675 		qmc2MainWindow->romStateFilter->toolButtonNotFound->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_N]);
1676 		qmc2MainWindow->romStateFilter->toolButtonUnknown->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_U]);
1677 		qmc2MachineList->filter();
1678 	}
1679 
1680 	QList<ImageWidget *> iwl;
1681 	iwl << qmc2Preview << qmc2Flyer << qmc2Cabinet << qmc2Controller << qmc2Marquee << qmc2Title << qmc2PCB;
1682 	foreach (ImageWidget *iw, iwl) {
1683 		if ( iw ) {
1684 			bool needReopenFile = false;
1685 			switch ( iw->imageTypeNumeric() ) {
1686 				case QMC2_IMGTYPE_PREVIEW:
1687 					needReopenFile |= needReopenPreviewFile;
1688 					break;
1689 				case QMC2_IMGTYPE_FLYER:
1690 					needReopenFile |= needReopenFlyerFile;
1691 					break;
1692 				case QMC2_IMGTYPE_CABINET:
1693 					needReopenFile |= needReopenCabinetFile;
1694 					break;
1695 				case QMC2_IMGTYPE_CONTROLLER:
1696 					needReopenFile |= needReopenControllerFile;
1697 					break;
1698 				case QMC2_IMGTYPE_MARQUEE:
1699 					needReopenFile |= needReopenMarqueeFile;
1700 					break;
1701 				case QMC2_IMGTYPE_TITLE:
1702 					needReopenFile |= needReopenTitleFile;
1703 					break;
1704 				case QMC2_IMGTYPE_PCB:
1705 					needReopenFile |= needReopenPCBFile;
1706 					break;
1707 			}
1708 			if ( needReopenFile )
1709 				iw->reopenSource();
1710 			iw->update();
1711 		}
1712 	}
1713 
1714 	if ( qmc2SoftwareSnap ) {
1715 		if ( needReopenSoftwareSnapFile )
1716 			qmc2SoftwareSnap->reopenSource();
1717 		qmc2SoftwareSnap->update();
1718 	}
1719 
1720 	if ( needReopenIconFile ) {
1721 		foreach (unzFile iconFile, qmc2IconFileMap)
1722 			unzClose(iconFile);
1723 		qmc2IconFileMap.clear();
1724 		foreach (SevenZipFile *iconFile, qmc2IconFileMap7z) {
1725 			iconFile->close();
1726 			delete iconFile;
1727 		}
1728 		qmc2IconFileMap7z.clear();
1729 #if defined(QMC2_LIBARCHIVE_ENABLED)
1730 		foreach (ArchiveFile *iconFile, qmc2IconArchiveMap) {
1731 			iconFile->close();
1732 			delete iconFile;
1733 		}
1734 		qmc2IconArchiveMap.clear();
1735 #endif
1736 		switch ( iconFileType() ) {
1737 			case QMC2_ICON_FILETYPE_ZIP:
1738 				foreach (QString filePath, config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/IconFile").toString().split(";", QString::SkipEmptyParts)) {
1739 					unzFile iconFile = unzOpen(filePath.toUtf8().constData());
1740 					if ( iconFile == 0 )
1741 						qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("FATAL: can't open icon file, please check access permissions for %1").arg(filePath));
1742 					else
1743 						qmc2IconFileMap.insert(filePath, iconFile);
1744 				}
1745 				break;
1746 			case QMC2_ICON_FILETYPE_7Z:
1747 				foreach (QString filePath, config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/IconFile").toString().split(";", QString::SkipEmptyParts)) {
1748 					SevenZipFile *iconFile = new SevenZipFile(filePath);
1749 					if ( !iconFile->open() ) {
1750 						qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("FATAL: can't open icon file %1").arg(filePath) + " - " + tr("7z error") + ": " + iconFile->lastError());
1751 						delete iconFile;
1752 					} else
1753 						qmc2IconFileMap7z.insert(filePath, iconFile);
1754 				}
1755 				break;
1756 #if defined(QMC2_LIBARCHIVE_ENABLED)
1757 			case QMC2_ICON_FILETYPE_ARCHIVE:
1758 				foreach (QString filePath, qmc2Config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/IconFile").toString().split(";", QString::SkipEmptyParts)) {
1759 					ArchiveFile *archiveFile = new ArchiveFile(filePath, true);
1760 					if ( !archiveFile->open() ) {
1761 						qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("FATAL: can't open icon file %1").arg(filePath) + " - " + tr("libarchive error") + ": " + archiveFile->errorString());
1762 						delete archiveFile;
1763 					} else
1764 						qmc2IconArchiveMap.insert(filePath, archiveFile);
1765 				}
1766 			break;
1767 #endif
1768 		}
1769 	}
1770 	if ( needReload ) {
1771 		qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("triggering automatic reload of machine list"));
1772 		qmc2AutomaticReload = true;
1773 		QTimer::singleShot(0, qmc2MainWindow->actionReload, SLOT(trigger()));
1774 	}
1775 	pushButtonApply->setEnabled(true);
1776 	pushButtonRestore->setEnabled(true);
1777 	pushButtonDefault->setEnabled(true);
1778 	pushButtonOk->setEnabled(true);
1779 	pushButtonCancel->setEnabled(true);
1780 	QTimer::singleShot(0, this, SLOT(applyDelayed()));
1781 	initialCall = false;
1782 }
1783 
on_pushButtonDefault_clicked()1784 void Options::on_pushButtonDefault_clicked()
1785 {
1786 	restoreCurrentConfig(true);
1787 }
1788 
restoreCurrentConfig(bool useDefaultSettings)1789 void Options::restoreCurrentConfig(bool useDefaultSettings)
1790 {
1791 	treeWidgetShortcuts->clear();
1792 
1793 	if ( useDefaultSettings ) {
1794 		QString fn = config->fileName();
1795 		delete config;
1796 		QFile f(fn);
1797 		f.copy(fn + ".bak");
1798 		f.remove();
1799 		config = new Settings(QSettings::IniFormat, QSettings::UserScope, "qmc2");
1800 		qmc2Config = config;
1801 	}
1802 
1803 	QString userScopePath = configPath();
1804 
1805 	// Frontend
1806 
1807 	// GUI
1808 	checkBoxToolbar->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/Toolbar", true).toBool());
1809 #if defined(QMC2_OS_MAC)
1810 	checkBoxUnifiedTitleAndToolBarOnMac->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/UnifiedTitleAndToolBarOnMac", false).toBool());
1811 #endif
1812 	checkBoxStatusbar->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/Statusbar", true).toBool());
1813 	checkBoxStandardColorPalette->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/StandardColorPalette", true).toBool());
1814 	checkBoxProgressTexts->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ProgressTexts", false).toBool());
1815 	checkBoxProcessMameHistoryDat->setChecked(config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat", false).toBool());
1816 	checkBoxProcessMessSysinfoDat->setChecked(config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat", false).toBool());
1817 	checkBoxProcessMameInfoDat->setChecked(config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat", false).toBool());
1818 	checkBoxProcessMessInfoDat->setChecked(config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat", false).toBool());
1819 	checkBoxProcessSoftwareInfoDB->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ProcessSoftwareInfoDB", false).toBool());
1820 	qmc2ScaledPreview = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledPreview", true).toBool();
1821 	checkBoxScaledPreview->setChecked(qmc2ScaledPreview);
1822 	qmc2ScaledFlyer = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledFlyer", true).toBool();
1823 	checkBoxScaledFlyer->setChecked(qmc2ScaledFlyer);
1824 	qmc2ScaledCabinet = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledCabinet", true).toBool();
1825 	checkBoxScaledCabinet->setChecked(qmc2ScaledCabinet);
1826 	qmc2ScaledController = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledController", true).toBool();
1827 	checkBoxScaledController->setChecked(qmc2ScaledController);
1828 	qmc2ScaledMarquee = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledMarquee", true).toBool();
1829 	checkBoxScaledMarquee->setChecked(qmc2ScaledMarquee);
1830 	qmc2ScaledTitle = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledTitle", true).toBool();
1831 	checkBoxScaledTitle->setChecked(qmc2ScaledTitle);
1832 	qmc2ScaledPCB = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledPCB", true).toBool();
1833 	checkBoxScaledPCB->setChecked(qmc2ScaledPCB);
1834 	qmc2ScaledSoftwareSnapshot = config->value(QMC2_FRONTEND_PREFIX + "GUI/ScaledSoftwareSnapshot", true).toBool();
1835 	checkBoxScaledSoftwareSnapshot->setChecked(qmc2ScaledSoftwareSnapshot);
1836 	qmc2SmoothScaling = config->value(QMC2_FRONTEND_PREFIX + "GUI/SmoothScaling", true).toBool();
1837 	checkBoxSmoothScaling->setChecked(qmc2SmoothScaling);
1838 	qmc2RetryLoadingImages = config->value(QMC2_FRONTEND_PREFIX + "GUI/RetryLoadingImages", true).toBool();
1839 	checkBoxRetryLoadingImages->setChecked(qmc2RetryLoadingImages);
1840 	qmc2ParentImageFallback = config->value(QMC2_FRONTEND_PREFIX + "GUI/ParentImageFallback", true).toBool();
1841 	checkBoxParentImageFallback->setChecked(qmc2ParentImageFallback);
1842 	comboBoxLanguage->setCurrentIndex(comboBoxLanguage->findText(config->value(QMC2_FRONTEND_PREFIX + "GUI/Language", "us").toString().toUpper(), Qt::MatchContains | Qt::MatchCaseSensitive));
1843 	comboBoxStyle->clear();
1844 	comboBoxStyle->addItem(QObject::tr("Default"));
1845 	comboBoxStyle->addItems(QStyleFactory::keys());
1846 	QString myStyle = QObject::tr((const char *)config->value(QMC2_FRONTEND_PREFIX + "GUI/Style", "Default").toString().toUtf8());
1847 	int styleIndex = comboBoxStyle->findText(myStyle, Qt::MatchFixedString);
1848 	if ( styleIndex < 0 )
1849 		styleIndex = 0;
1850 	comboBoxStyle->setCurrentIndex(styleIndex);
1851 	lineEditStyleSheet->setText(config->value(QMC2_FRONTEND_PREFIX + "GUI/StyleSheet", QString()).toString());
1852 	lineEditFont->setText(config->value(QMC2_FRONTEND_PREFIX + "GUI/Font").toString());
1853 	QFont f;
1854 	f.fromString(lineEditFont->text());
1855 	lineEditFont->setFont(f);
1856 	lineEditLogFont->setText(config->value(QMC2_FRONTEND_PREFIX + "GUI/LogFont").toString());
1857 	f.fromString(lineEditLogFont->text());
1858 	lineEditLogFont->setFont(f);
1859 	int pixmapCacheSize = config->value(QMC2_FRONTEND_PREFIX + "GUI/PixmapCacheSize", 64).toInt();
1860 	spinBoxPixmapCacheSize->setValue(pixmapCacheSize);
1861 	checkBoxMinimizeOnEmuLaunch->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/MinimizeOnEmuLaunch", false).toBool());
1862 	checkBoxKillEmulatorsOnExit->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/KillEmulatorsOnExit", true).toBool());
1863 	checkBoxOneEmulatorOnly->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/OneEmulatorOnly", false).toBool());
1864 	checkBoxShowMenuBar->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ShowMenuBar", true).toBool());
1865 	checkBoxCheckSingleInstance->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/CheckSingleInstance", true).toBool());
1866 	qmc2SuppressQtMessages = config->value(QMC2_FRONTEND_PREFIX + "GUI/SuppressQtMessages", false).toBool();
1867 	checkBoxSuppressQtMessages->setChecked(qmc2SuppressQtMessages);
1868 	checkBoxShowSplashScreen->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ShowSplashScreen", true).toBool());
1869 	checkBoxShowLoadingAnimation->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ShowLoadingAnimation", true).toBool());
1870 	checkBoxSetWorkDirFromExec->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/SetWorkDirFromExec", false).toBool());
1871 	if ( checkBoxSetWorkDirFromExec->isChecked() )
1872 		QDir::setCurrent(QCoreApplication::applicationDirPath());
1873 	else
1874 		QDir::setCurrent(standardWorkDir());
1875 	checkBoxMachineStatusIndicator->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicator", true).toBool());
1876 	checkBoxMachineStatusIndicatorOnlyWhenRequired->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/MachineStatusIndicatorOnlyWhenRequired", false).toBool());
1877 	checkBoxShowMachineName->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ShowMachineName", true).toBool());
1878 	qmc2ShowMachineName = checkBoxShowMachineName->isChecked();
1879 	checkBoxShowMachineNameOnlyWhenRequired->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/ShowMachineNameOnlyWhenRequired", false).toBool());
1880 	qmc2ShowMachineNameOnlyWhenRequired = checkBoxShowMachineNameOnlyWhenRequired->isChecked();
1881 	spinBoxFrontendLogSize->setValue(config->value(QMC2_FRONTEND_PREFIX + "GUI/FrontendLogSize", 0).toInt());
1882 	spinBoxEmulatorLogSize->setValue(config->value(QMC2_FRONTEND_PREFIX + "GUI/EmulatorLogSize", 0).toInt());
1883 #if defined(QMC2_OS_MAC)
1884 	checkBoxNativeFileDialogs->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/NativeFileDialogs", true).toBool());
1885 #else
1886 	checkBoxNativeFileDialogs->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/NativeFileDialogs", false).toBool());
1887 #endif
1888 
1889 	// Files / Directories
1890 	int curIdx;
1891 #if defined(QMC2_YOUTUBE_ENABLED)
1892 	QDir youTubeCacheDir(config->value(QMC2_FRONTEND_PREFIX + "YouTubeWidget/CacheDirectory", userScopePath + "/youtube/").toString());
1893 	if ( !youTubeCacheDir.exists() )
1894 		youTubeCacheDir.mkdir(youTubeCacheDir.absolutePath());
1895 	config->setValue(QMC2_FRONTEND_PREFIX + "YouTubeWidget/CacheDirectory", QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "YouTubeWidget/CacheDirectory", userScopePath + "/youtube/").toString());
1896 #endif
1897 	lineEditDataDirectory->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/DataDirectory", QMC2_DEFAULT_DATA_PATH + "/").toString());
1898 	lineEditDatInfoDatabase->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/DatInfoDatabase", QString(userScopePath + "/%1-dat-info.db").arg(QMC2_EMU_NAME.toLower())).toString());
1899 #if defined(QMC2_SDLMAME)
1900 	lineEditFrontendLogFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/LogFile", userScopePath + "/qmc2-sdlmame.log").toString());
1901 #elif defined(QMC2_MAME)
1902 	lineEditFrontendLogFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/LogFile", userScopePath + "/qmc2-mame.log").toString());
1903 #endif
1904 	lineEditPreviewDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PreviewDirectory", QMC2_DEFAULT_DATA_PATH + "/prv/").toString());
1905 	lineEditPreviewFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PreviewFile", QMC2_DEFAULT_DATA_PATH + "/prv/previews.zip").toString());
1906 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PreviewFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1907 #if defined(QMC2_LIBARCHIVE_ENABLED)
1908 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1909 #else
1910 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1911 #endif
1912 	comboBoxPreviewFileType->setCurrentIndex(curIdx);
1913 	qmc2UsePreviewFile = config->value("MAME/FilesAndDirectories/UsePreviewFile", false).toBool();
1914 	stackedWidgetPreview->setCurrentIndex(qmc2UsePreviewFile ? 1 : 0);
1915 	radioButtonPreviewSelect->setText(qmc2UsePreviewFile ? tr("Preview file") : tr("Preview directory"));
1916 	lineEditFlyerDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/FlyerDirectory", QMC2_DEFAULT_DATA_PATH + "/fly/").toString());
1917 	lineEditFlyerFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/FlyerFile", QMC2_DEFAULT_DATA_PATH + "/fly/flyers.zip").toString());
1918 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/FlyerFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1919 #if defined(QMC2_LIBARCHIVE_ENABLED)
1920 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1921 #else
1922 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1923 #endif
1924 	comboBoxFlyerFileType->setCurrentIndex(curIdx);
1925 	qmc2UseFlyerFile = config->value("MAME/FilesAndDirectories/UseFlyerFile", false).toBool();
1926 	stackedWidgetFlyer->setCurrentIndex(qmc2UseFlyerFile ? 1 : 0);
1927 	radioButtonFlyerSelect->setText(qmc2UseFlyerFile ? tr("Flyer file") : tr("Flyer directory"));
1928 	lineEditIconDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/IconDirectory", QMC2_DEFAULT_DATA_PATH + "/ico/").toString());
1929 	lineEditIconFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/IconFile", QMC2_DEFAULT_DATA_PATH + "/ico/icons.zip").toString());
1930 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/IconFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1931 #if defined(QMC2_LIBARCHIVE_ENABLED)
1932 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1933 #else
1934 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1935 #endif
1936 	comboBoxIconFileType->setCurrentIndex(curIdx);
1937 	qmc2UseIconFile = config->value("MAME/FilesAndDirectories/UseIconFile", false).toBool();
1938 	stackedWidgetIcon->setCurrentIndex(qmc2UseIconFile ? 1 : 0);
1939 	radioButtonIconSelect->setText(qmc2UseIconFile ? tr("Icon file") : tr("Icon directory"));
1940 	lineEditCabinetDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CabinetDirectory", QMC2_DEFAULT_DATA_PATH + "/cab/").toString());
1941 	lineEditCabinetFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CabinetFile", QMC2_DEFAULT_DATA_PATH + "/cab/cabinets.zip").toString());
1942 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CabinetFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1943 #if defined(QMC2_LIBARCHIVE_ENABLED)
1944 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1945 #else
1946 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1947 #endif
1948 	comboBoxCabinetFileType->setCurrentIndex(curIdx);
1949 	qmc2UseCabinetFile = config->value("MAME/FilesAndDirectories/UseCabinetFile", false).toBool();
1950 	stackedWidgetCabinet->setCurrentIndex(qmc2UseCabinetFile ? 1 : 0);
1951 	radioButtonCabinetSelect->setText(qmc2UseCabinetFile ? tr("Cabinet file") : tr("Cabinet directory"));
1952 	lineEditControllerDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/ControllerDirectory", QMC2_DEFAULT_DATA_PATH + "/ctl/").toString());
1953 	lineEditControllerFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/ControllerFile", QMC2_DEFAULT_DATA_PATH + "/ctl/controllers.zip").toString());
1954 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/ControllerFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1955 #if defined(QMC2_LIBARCHIVE_ENABLED)
1956 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1957 #else
1958 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1959 #endif
1960 	comboBoxControllerFileType->setCurrentIndex(curIdx);
1961 	qmc2UseControllerFile = config->value("MAME/FilesAndDirectories/UseControllerFile", false).toBool();
1962 	stackedWidgetController->setCurrentIndex(qmc2UseControllerFile ? 1 : 0);
1963 	radioButtonControllerSelect->setText(qmc2UseControllerFile ? tr("Controller file") : tr("Controller directory"));
1964 	lineEditMarqueeDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/MarqueeDirectory", QMC2_DEFAULT_DATA_PATH + "/mrq/").toString());
1965 	lineEditMarqueeFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/MarqueeFile", QMC2_DEFAULT_DATA_PATH + "/mrq/marquees.zip").toString());
1966 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/MarqueeFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1967 #if defined(QMC2_LIBARCHIVE_ENABLED)
1968 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1969 #else
1970 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1971 #endif
1972 	comboBoxMarqueeFileType->setCurrentIndex(curIdx);
1973 	qmc2UseMarqueeFile = config->value("MAME/FilesAndDirectories/UseMarqueeFile", false).toBool();
1974 	stackedWidgetMarquee->setCurrentIndex(qmc2UseMarqueeFile ? 1 : 0);
1975 	radioButtonMarqueeSelect->setText(qmc2UseMarqueeFile ? tr("Marquee file") : tr("Marquee directory"));
1976 	lineEditTitleDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/TitleDirectory", QMC2_DEFAULT_DATA_PATH + "/ttl/").toString());
1977 	lineEditTitleFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/TitleFile", QMC2_DEFAULT_DATA_PATH + "/ttl/titles.zip").toString());
1978 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/TitleFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1979 #if defined(QMC2_LIBARCHIVE_ENABLED)
1980 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1981 #else
1982 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1983 #endif
1984 	comboBoxTitleFileType->setCurrentIndex(curIdx);
1985 	qmc2UseTitleFile = config->value("MAME/FilesAndDirectories/UseTitleFile", false).toBool();
1986 	stackedWidgetTitle->setCurrentIndex(qmc2UseTitleFile ? 1 : 0);
1987 	radioButtonTitleSelect->setText(qmc2UseTitleFile ? tr("Title file") : tr("Title directory"));
1988 	lineEditPCBDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PCBDirectory", QMC2_DEFAULT_DATA_PATH + "/pcb/").toString());
1989 	lineEditPCBFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PCBFile", QMC2_DEFAULT_DATA_PATH + "/pcb/pcbs.zip").toString());
1990 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/PCBFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
1991 #if defined(QMC2_LIBARCHIVE_ENABLED)
1992 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
1993 #else
1994 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
1995 #endif
1996 	comboBoxPCBFileType->setCurrentIndex(curIdx);
1997 	qmc2UsePCBFile = config->value("MAME/FilesAndDirectories/UsePCBFile", false).toBool();
1998 	stackedWidgetPCB->setCurrentIndex(qmc2UsePCBFile ? 1 : 0);
1999 	radioButtonPCBSelect->setText(qmc2UsePCBFile ? tr("PCB file") : tr("PCB directory"));
2000 	lineEditSoftwareSnapDirectory->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareSnapDirectory", QMC2_DEFAULT_DATA_PATH + "/sws/").toString());
2001 	lineEditSoftwareSnapFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareSnapFile", QMC2_DEFAULT_DATA_PATH + "/sws/swsnaps.zip").toString());
2002 	curIdx = QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareSnapFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
2003 #if defined(QMC2_LIBARCHIVE_ENABLED)
2004 	if ( curIdx < 0 || curIdx > 2 ) curIdx = 0;
2005 #else
2006 	if ( curIdx < 0 || curIdx > 1 ) curIdx = 0;
2007 #endif
2008 	comboBoxSoftwareSnapFileType->setCurrentIndex(curIdx);
2009 	qmc2UseSoftwareSnapFile = config->value("MAME/FilesAndDirectories/UseSoftwareSnapFile", false).toBool();
2010 	stackedWidgetSWSnap->setCurrentIndex(qmc2UseSoftwareSnapFile ? 1 : 0);
2011 	radioButtonSoftwareSnapSelect->setText(qmc2UseSoftwareSnapFile ? tr("SW snap file") : tr("SW snap folder"));
2012 	lineEditSoftwareNotesFolder->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareNotesFolder", QMC2_DEFAULT_DATA_PATH + "/swn/").toString());
2013 	lineEditSoftwareNotesTemplate->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareNotesTemplate", QMC2_DEFAULT_DATA_PATH + "/swn/template.html").toString());
2014 	checkBoxUseSoftwareNotesTemplate->setChecked(config->value("MAME/FilesAndDirectories/UseSoftwareNotesTemplate", false).toBool());
2015 	lineEditSystemNotesFolder->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SystemNotesFolder", QMC2_DEFAULT_DATA_PATH + "/gmn/").toString());
2016 	lineEditSystemNotesTemplate->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SystemNotesTemplate", QMC2_DEFAULT_DATA_PATH + "/gmn/template.html").toString());
2017 	lineEditVideoSnapFolder->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/VideoSnapFolder", QMC2_DEFAULT_DATA_PATH + "/vdo/").toString());
2018 	lineEditSystemManualFolder->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SystemManualFolder", QMC2_DEFAULT_DATA_PATH + "/man/systems/").toString());
2019 	lineEditSoftwareManualFolder->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/SoftwareManualFolder", QMC2_DEFAULT_DATA_PATH + "/man/software/").toString());
2020 	checkBoxUseSystemNotesTemplate->setChecked(config->value("MAME/FilesAndDirectories/UseSystemNotesTemplate", false).toBool());
2021 	lineEditMameHistoryDat->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat", QMC2_DEFAULT_DATA_PATH + "/cat/history.dat").toString());
2022 	lineEditMessSysinfoDat->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat", QMC2_DEFAULT_DATA_PATH + "/cat/sysinfo.dat").toString());
2023 	lineEditMameInfoDat->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat", QMC2_DEFAULT_DATA_PATH + "/cat/mameinfo.dat").toString());
2024 	lineEditMessInfoDat->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat", QMC2_DEFAULT_DATA_PATH + "/cat/messinfo.dat").toString());
2025 	lineEditCatverIniFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CatverIni", QMC2_DEFAULT_DATA_PATH + "/cat/catver.ini").toString());
2026 	checkBoxUseCatverIni->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/UseCatverIni", false).toBool());
2027 	lineEditCategoryIniFile->setText(QMC2_QSETTINGS_CAST(config)->value("MAME/FilesAndDirectories/CategoryIni", QMC2_DEFAULT_DATA_PATH + "/cat/category.ini").toString());
2028 	checkBoxUseCategoryIni->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/UseCategoryIni", false).toBool());
2029 	lineEditSoftwareInfoDB->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareInfoDB", QMC2_DEFAULT_DATA_PATH + "/cat/history.dat").toString());
2030 
2031 	// MachineList
2032 	checkBoxShowROMStatusIcons->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowROMStatusIcons", true).toBool());
2033 	checkBoxShowDeviceSets->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowDeviceSets", true).toBool());
2034 	checkBoxShowBiosSets->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/ShowBiosSets", true).toBool());
2035 	checkBoxAutoTriggerROMCheck->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/AutoTriggerROMCheck", false).toBool());
2036 	checkBoxDoubleClickActivation->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/DoubleClickActivation", true).toBool());
2037 	checkBoxPlayOnSublistActivation->setChecked(config->value(QMC2_FRONTEND_PREFIX + "MachineList/PlayOnSublistActivation", false).toBool());
2038 	qmc2CursorPositioningMode = (QAbstractItemView::ScrollHint)config->value(QMC2_FRONTEND_PREFIX + "MachineList/CursorPosition", QMC2_CURSOR_POS_TOP).toInt();
2039 	comboBoxCursorPosition->setCurrentIndex((int)qmc2CursorPositioningMode);
2040 	qmc2DefaultLaunchMode = config->value(QMC2_FRONTEND_PREFIX + "MachineList/DefaultLaunchMode", QMC2_LAUNCH_MODE_INDEPENDENT).toInt();
2041 	comboBoxDefaultLaunchMode->setCurrentIndex(qmc2DefaultLaunchMode);
2042 	qmc2SoftwareSnapPosition = config->value(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/SoftwareSnapPosition", QMC2_SWSNAP_POS_BELOW_LEFT).toInt();
2043 	comboBoxSoftwareSnapPosition->setCurrentIndex(qmc2SoftwareSnapPosition);
2044 	checkBoxSoftwareSnapOnMouseHover->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/SoftwareSnapOnMouseHover", false).toBool());
2045 	checkBoxAutoDisableSoftwareSnap->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Layout/SoftwareList/AutoDisableSoftwareSnap", true).toBool());
2046 	spinBoxResponsiveness->setValue(config->value(QMC2_FRONTEND_PREFIX + "MachineList/Responsiveness", QMC2_DEFAULT_MACHINELIST_RESPONSE).toInt());
2047 	qmc2MachineListResponsiveness = spinBoxResponsiveness->value();
2048 	spinBoxUpdateDelay->setValue(config->value(QMC2_FRONTEND_PREFIX + "MachineList/UpdateDelay", 10).toInt());
2049 	qmc2UpdateDelay = spinBoxUpdateDelay->value();
2050 	comboBoxSortCriteria->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "MachineList/SortCriteria", 0).toInt());
2051 	qmc2SortCriteria = comboBoxSortCriteria->currentIndex();
2052 	comboBoxSortOrder->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "MachineList/SortOrder", 0).toInt());
2053 	qmc2SortOrder = comboBoxSortOrder->currentIndex() == 0 ? Qt::AscendingOrder : Qt::DescendingOrder;
2054 	qmc2Filter.setBit(QMC2_ROMSTATE_INT_C, config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowCorrect", true).toBool());
2055 	toolButtonShowC->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_C]);
2056 	qmc2Filter.setBit(QMC2_ROMSTATE_INT_M, config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowMostlyCorrect", true).toBool());
2057 	toolButtonShowM->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_M]);
2058 	qmc2Filter.setBit(QMC2_ROMSTATE_INT_I, config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowIncorrect", true).toBool());
2059 	toolButtonShowI->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_I]);
2060 	qmc2Filter.setBit(QMC2_ROMSTATE_INT_N, config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowNotFound", true).toBool());
2061 	toolButtonShowN->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_N]);
2062 	qmc2Filter.setBit(QMC2_ROMSTATE_INT_U, config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/ShowUnknown", true).toBool());
2063 	toolButtonShowU->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_U]);
2064 	bool rsf = config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/Enabled", true).toBool();
2065 	checkBoxRomStateFilter->setChecked(rsf);
2066 	if ( !qmc2EarlyStartup ) {
2067 		qmc2MainWindow->toolButtonSelectRomFilter->setVisible(rsf);
2068 		qmc2MainWindow->romStateFilter->setEnabled(rsf);
2069 	}
2070 	if ( qmc2MainWindow ) {
2071 		qmc2StatesTogglesEnabled = false;
2072 		qmc2MainWindow->romStateFilter->toolButtonCorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_C]);
2073 		qmc2MainWindow->romStateFilter->toolButtonMostlyCorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_M]);
2074 		qmc2MainWindow->romStateFilter->toolButtonIncorrect->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_I]);
2075 		qmc2MainWindow->romStateFilter->toolButtonNotFound->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_N]);
2076 		qmc2MainWindow->romStateFilter->toolButtonUnknown->setChecked(qmc2Filter[QMC2_ROMSTATE_INT_U]);
2077 		if ( !qmc2EarlyStartup )
2078 			qmc2StatesTogglesEnabled = true;
2079 	}
2080 	checkBoxDynamicStateFilter->setChecked(config->value(QMC2_FRONTEND_PREFIX + "RomStateFilter/DynamicStateFilter", false).toBool());
2081 	checkBoxDynamicStateFilter->setEnabled(rsf);
2082 	checkBoxSaveMachineSelection->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/SaveMachineSelection", true).toBool());
2083 	checkBoxRestoreMachineSelection->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/RestoreMachineSelection", true).toBool());
2084 	checkBoxSaveSoftwareSelection->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/SaveSoftwareSelection", true).toBool());
2085 	checkBoxRestoreSoftwareSelection->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/RestoreSoftwareSelection", true).toBool());
2086 
2087 	// Shortcuts / Keys
2088 	QHashIterator<QString, QPair<QString, QAction *> > it(qmc2ShortcutHash);
2089 	while ( it.hasNext() ) {
2090 		it.next();
2091 		QString itShortcut = it.key();
2092 		QString itFunction = it.value().first;
2093 		QTreeWidgetItem *item = new QTreeWidgetItem(treeWidgetShortcuts);
2094 		item->setText(0, itFunction);
2095 		QStringList words = itShortcut.split("+");
2096 		QString itemText;
2097 		for (int i = 0; i < words.count(); i++) {
2098 			if ( i > 0 )
2099 				itemText += "+";
2100 			itemText += QObject::tr(words[i].toUtf8().constData());
2101 		}
2102 		item->setText(1, itemText);
2103 		QString customSC = config->value(QString(QMC2_FRONTEND_PREFIX + "Shortcuts/%1").arg(itShortcut), itShortcut).toString();
2104 		qmc2CustomShortcutHash[itShortcut] = customSC;
2105 		if ( customSC != itShortcut ) {
2106 			words = customSC.split("+");
2107 			customSC = "";
2108 			for (int i = 0; i < words.count(); i++) {
2109 				if ( i > 0 )
2110 					customSC += "+";
2111 				customSC += QObject::tr(words[i].toUtf8().constData());
2112 			}
2113 			item->setText(2, customSC);
2114 		}
2115 	}
2116 	if ( !qmc2EarlyStartup )
2117 		QTimer::singleShot(0, this, SLOT(checkShortcuts()));
2118 
2119 	// Joystick
2120 #if QMC2_JOYSTICK == 1
2121 	checkBoxEnableJoystickControl->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Joystick/EnableJoystickControl", false).toBool());
2122 	checkBoxJoystickAutoRepeat->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Joystick/AutoRepeat", true).toBool());
2123 	spinBoxJoystickAutoRepeatTimeout->setValue(config->value(QMC2_FRONTEND_PREFIX + "Joystick/AutoRepeatTimeout", 250).toInt());
2124 	spinBoxJoystickEventTimeout->setValue(config->value(QMC2_FRONTEND_PREFIX + "Joystick/EventTimeout", 25).toInt());
2125 	on_pushButtonRescanJoysticks_clicked();
2126 
2127 	// Recreate joystick function map
2128 	treeWidgetJoystickMappings->clear();
2129 	it.toFront();
2130 	while ( it.hasNext() ) {
2131 		it.next();
2132 		QString itShortcut = it.key();
2133 		QString itFunction = it.value().first;
2134 		QTreeWidgetItem *item = new QTreeWidgetItem(treeWidgetJoystickMappings);
2135 		item->setText(0, itFunction);
2136 		item->setWhatsThis(0, itShortcut);
2137 		QString joyMapFunction = config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/Map/%1").arg(itShortcut), "").toString();
2138 		if ( !joyMapFunction.isEmpty() ) {
2139 			qmc2JoystickFunctionHash.insertMulti(joyMapFunction, itShortcut);
2140 			item->setText(1, joyMapFunction);
2141 		}
2142 	}
2143 	if ( !qmc2EarlyStartup )
2144 		QTimer::singleShot(0, this, SLOT(checkJoystickMappings()));
2145 #endif
2146 
2147 	// Network / Tools
2148 	checkBoxRestoreCookies->setChecked(config->value(QMC2_FRONTEND_PREFIX + "WebBrowser/RestoreCookies", true).toBool());
2149 	lineEditCookieDatabase->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "WebBrowser/CookieDatabase", userScopePath + "/qmc2-" + QMC2_EMU_NAME_VARIANT.toLower() + "-cookies.db").toString());
2150 	lineEditZipTool->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "Tools/ZipTool", "zip").toString());
2151 	lineEditZipToolRemovalArguments->setText(config->value(QMC2_FRONTEND_PREFIX + "Tools/ZipToolRemovalArguments", "$ARCHIVE$ -d $FILELIST$").toString());
2152 	lineEditSevenZipTool->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "Tools/SevenZipTool", "7za").toString());
2153 	lineEditSevenZipToolRemovalArguments->setText(config->value(QMC2_FRONTEND_PREFIX + "Tools/SevenZipToolRemovalArguments", "-mhc=off -ms=off d $ARCHIVE$ $FILELIST$").toString());
2154 	lineEditRomTool->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "Tools/RomTool", "").toString());
2155 	lineEditRomToolArguments->setText(config->value(QMC2_FRONTEND_PREFIX + "Tools/RomToolArguments", "$ID$ \"$DESCRIPTION$\"").toString());
2156 	lineEditRomToolWorkingDirectory->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_FRONTEND_PREFIX + "Tools/RomToolWorkingDirectory", "").toString());
2157 	checkBoxCopyToolOutput->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Tools/CopyToolOutput", true).toBool());
2158 	checkBoxCloseToolDialog->setChecked(config->value(QMC2_FRONTEND_PREFIX + "Tools/CloseToolDialog", false).toBool());
2159 
2160 	groupBoxHTTPProxy->setChecked(config->value("Network/HTTPProxy/Enable", false).toBool());
2161 	lineEditHTTPProxyHost->setText(config->value("Network/HTTPProxy/Host", QString()).toString());
2162 	spinBoxHTTPProxyPort->setValue(config->value("Network/HTTPProxy/Port", 80).toInt());
2163 	lineEditHTTPProxyUserID->setText(config->value("Network/HTTPProxy/UserID", QString()).toString());
2164 	CryptedByteArray cpw(config->value("Network/HTTPProxy/Password", QString()).toByteArray());
2165 	lineEditHTTPProxyPassword->setText(QString(cpw.decryptedData()));
2166 
2167 	// Emulator
2168 
2169 	// Configuration
2170 	if ( qmc2GuiReady )
2171 		qmc2GlobalEmulatorOptions->load();
2172 
2173 	// Files and directories
2174 	lineEditExecutableFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/ExecutableFile", "").toString());
2175 	lineEditWorkingDirectory->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/WorkingDirectory", "").toString());
2176 	lineEditEmulatorLogFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/LogFile", userScopePath + "/mame.log").toString());
2177 	lineEditXmlCacheDatabase->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/XmlCacheDatabase", userScopePath + "/mame-xml-cache.db").toString());
2178 	lineEditUserDataDatabase->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/UserDataDatabase", userScopePath + "/mame-user-data.db").toString());
2179 	lineEditMachineListCacheFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/MachineListCacheFile", userScopePath + "/mame.mlc").toString());
2180 	lineEditMachineListDatabase->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/MachineListDatabase", userScopePath + "/mame-machine-list.db").toString());
2181 	lineEditROMStateCacheFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/ROMStateCacheFile", userScopePath + "/mame.rsc").toString());
2182 	lineEditSoftwareListCacheDb->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareListCacheDatabase", userScopePath + "/mame-swl-cache.db").toString());
2183 #if defined(QMC2_SDLMAME)
2184 	lineEditOptionsTemplateFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/OptionsTemplateFile", QMC2_DEFAULT_DATA_PATH + "/opt/SDLMAME/template-SDL2.xml").toString());
2185 #elif defined(QMC2_MAME)
2186 	lineEditOptionsTemplateFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/OptionsTemplateFile", QMC2_DEFAULT_DATA_PATH + "/opt/MAME/template.xml").toString());
2187 #endif
2188 	lineEditFavoritesFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/FavoritesFile", userScopePath + "/mame.fav").toString());
2189 	lineEditHistoryFile->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/HistoryFile", userScopePath + "/mame.hst").toString());
2190 	QDir swStateCacheDir(config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareStateCache", userScopePath + "/sw-state-cache/").toString());
2191 	if ( !swStateCacheDir.exists() )
2192 		swStateCacheDir.mkdir(swStateCacheDir.absolutePath());
2193 	lineEditSoftwareStateCache->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareStateCache", userScopePath + "/sw-state-cache/").toString());
2194 	lineEditGeneralSoftwareFolder->setText(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/GeneralSoftwareFolder", QString()).toString());
2195 	checkBoxAutoClearEmuCaches->setChecked(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "AutoClearEmuCaches", true).toBool());
2196 	checkBoxSkipEmuIdent->setChecked(QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "SkipEmuIdent", true).toBool());
2197 
2198 	// Additional emulators
2199 	tableWidgetRegisteredEmulators->clearContents();
2200 	tableWidgetRegisteredEmulators->setRowCount(0);
2201 
2202 	config->beginGroup(QMC2_EMULATOR_PREFIX + "RegisteredEmulators");
2203 	QStringList additionalEmulators = config->childGroups();
2204 	tableWidgetRegisteredEmulators->setSortingEnabled(false);
2205 	QFontMetrics fm(qApp->font());
2206 	QSize iconSize(fm.height(), fm.height());
2207 	foreach (QString emuName, additionalEmulators) {
2208 		QString emuCommand = config->value(QString("%1/Executable").arg(emuName), QString()).toString();
2209 		QString emuWorkDir = config->value(QString("%1/WorkingDirectory").arg(emuName), QString()).toString();
2210 		QString emuArgs = config->value(QString("%1/Arguments").arg(emuName), QString()).toString();
2211 		QString emuIcon = config->value(QString("%1/Icon").arg(emuName), QString()).toString();
2212 		int row = tableWidgetRegisteredEmulators->rowCount();
2213 		tableWidgetRegisteredEmulators->insertRow(row);
2214 		tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_NAME, new QTableWidgetItem(emuName));
2215 		tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_EXEC, new QTableWidgetItem(emuCommand));
2216 		tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_WDIR, new QTableWidgetItem(emuWorkDir));
2217 		tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_ARGS, new QTableWidgetItem(emuArgs));
2218 		QToolButton *tb = new QToolButton(0);
2219 		tb->setObjectName(emuName);
2220 		tb->setAutoFillBackground(true);
2221 		tb->setText(tr("Custom IDs..."));
2222 		tb->setToolTip(tr("Specify pre-defined foreign IDs for this emulator, launchable from the 'foreign emulators' view"));
2223 		tableWidgetRegisteredEmulators->setCellWidget(row, QMC2_ADDTLEMUS_COLUMN_CUID, tb);
2224 		connect(tb, SIGNAL(clicked()), this, SLOT(setupCustomIDsClicked()));
2225 		tb = new QToolButton(0);
2226 		tb->setAutoFillBackground(true);
2227 		tb->setIconSize(iconSize);
2228 		if ( emuIcon.isEmpty() ) {
2229 			tb->setIcon(QIcon(QString::fromUtf8(":/data/img/alien.png")));
2230 			tb->setWhatsThis(":/data/img/alien.png");
2231 		} else {
2232 			if ( emuIcon == "[none]" ) {
2233 				tb->setIcon(QIcon());
2234 				tb->setWhatsThis("[none]");
2235 			} else {
2236 				tb->setIcon(QIcon(emuIcon));
2237 				tb->setWhatsThis(emuIcon);
2238 			}
2239 		}
2240 		tb->setToolTip(tr("Choose icon for this foreign emulator (hold down for menu)"));
2241 		QMenu *menu = new QMenu(tb);
2242 		QAction *action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/alien.png")), tr("Default icon"));
2243 		connect(action, SIGNAL(triggered(bool)), this, SLOT(actionDefaultEmuIconTriggered()));
2244 		menu->addSeparator();
2245 		action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/no.png")), tr("No icon"));
2246 		connect(action, SIGNAL(triggered(bool)), this, SLOT(actionNoEmuIconTriggered()));
2247 		tb->setMenu(menu);
2248 		tableWidgetRegisteredEmulators->setCellWidget(row, QMC2_ADDTLEMUS_COLUMN_ICON, tb);
2249 		connect(tb, SIGNAL(clicked()), this, SLOT(chooseEmuIconClicked()));
2250 	}
2251 	config->endGroup();
2252 	tableWidgetRegisteredEmulators->setSortingEnabled(true);
2253 
2254 	// remove custom ID lists, if applicable
2255 	foreach (QString emuName, registeredEmulatorsToBeRemoved)
2256 		config->remove(QString(QMC2_EMULATOR_PREFIX + "CustomIDs/%1").arg(emuName));
2257 	registeredEmulatorsToBeRemoved.clear();
2258 
2259 	if ( useDefaultSettings ) {
2260 		QString fn = config->fileName();
2261 		delete config;
2262 		QFile f0(fn);
2263 		f0.remove();
2264 		QFile f(fn + ".bak");
2265 		f.copy(fn);
2266 		f.remove();
2267 		config = new Settings(QSettings::IniFormat, QSettings::UserScope, "qmc2");
2268 		qmc2Config = config;
2269 	}
2270 
2271 	QTimer::singleShot(0, this, SLOT(applyDelayed()));
2272 }
2273 
configPath()2274 QString Options::configPath()
2275 {
2276 	QDir cd(QMC2_DYNAMIC_DOT_PATH);
2277 	cd.makeAbsolute();
2278 	return cd.absolutePath();
2279 }
2280 
iconFileType()2281 int Options::iconFileType()
2282 {
2283 	if ( qmc2UseIconFile )
2284 		return config->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/IconFileType", QMC2_IMG_FILETYPE_ZIP).toInt();
2285 	else
2286 		return QMC2_ICON_FILETYPE_NONE;
2287 }
2288 
applyDelayed()2289 void Options::applyDelayed()
2290 {
2291 	// paranoia :)
2292 	if ( !qmc2MainWindow ) {
2293 		QTimer::singleShot(0, this, SLOT(applyDelayed()));
2294 		return;
2295 	}
2296 
2297 	static bool firstTime = true;
2298 
2299 	if ( firstTime ) {
2300 #if defined(QMC2_OS_WIN)
2301 		setParent(qmc2MainWindow, Qt::Dialog);
2302 #else
2303 		setParent(qmc2MainWindow, Qt::Dialog | Qt::SubWindow);
2304 #endif
2305 		// restore layout
2306 		tabWidgetFrontendSettings->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/FrontendTab", 0).toInt());
2307 		tabWidgetGlobalMAMESetup->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/MAMETab", 0).toInt());
2308 		tabWidgetOptions->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/OptionsTab", 0).toInt());
2309 		QStringList cl(config->allKeys());
2310 		if ( cl.contains(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Size") )
2311 			resize(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Size").toSize());
2312 		if ( cl.contains(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Position") )
2313 			move(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Position").toPoint());
2314 		treeWidgetShortcuts->header()->restoreState(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/ShortcutsHeaderState").toByteArray());
2315 #if QT_VERSION < 0x050000
2316 		treeWidgetShortcuts->header()->setClickable(true);
2317 #else
2318 		treeWidgetShortcuts->header()->setSectionsClickable(true);
2319 #endif
2320 		treeWidgetShortcuts->header()->setSortIndicatorShown(true);
2321 #if QMC2_JOYSTICK == 1
2322 		treeWidgetJoystickMappings->header()->restoreState(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/JoyMapHeaderState").toByteArray());
2323 #if QT_VERSION < 0x050000
2324 		treeWidgetJoystickMappings->header()->setClickable(true);
2325 #else
2326 		treeWidgetJoystickMappings->header()->setSectionsClickable(true);
2327 #endif
2328 		treeWidgetJoystickMappings->header()->setSortIndicatorShown(true);
2329 #endif
2330 		tableWidgetRegisteredEmulators->horizontalHeader()->restoreState(config->value(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/RegisteredEmulatorsHeaderState").toByteArray());
2331 		firstTime = false;
2332 	}
2333 
2334 	// adjust row-sizes of foreign emulator table-widget items
2335 	tableWidgetRegisteredEmulators->resizeRowsToContents();
2336 
2337 	// redraw detail if setup changed
2338 	qmc2MainWindow->on_tabWidgetMachineDetail_currentChanged(qmc2MainWindow->tabWidgetMachineDetail->currentIndex());
2339 
2340 	if ( !cancelClicked ) {
2341 		if ( qmc2GuiReady ) {
2342 			// style
2343 			if ( qmc2StandardPalettes.contains(currentStyleName()) )
2344 				qApp->setPalette(qmc2StandardPalettes[currentStyleName()]);
2345 			QString styleName(comboBoxStyle->currentText());
2346 			if ( styleName == tr("Default") )
2347 				styleName = "Default";
2348 			config->setValue(QMC2_FRONTEND_PREFIX + "GUI/Style", styleName);
2349 			qmc2MainWindow->signalStyleSetupRequested(styleName);
2350 			// style sheet
2351 			QString styleSheetName(lineEditStyleSheet->text());
2352 			config->setValue(QMC2_FRONTEND_PREFIX + "GUI/StyleSheet", styleSheetName);
2353 			qmc2MainWindow->signalStyleSheetSetupRequested(styleSheetName);
2354 			// palette
2355 			qmc2MainWindow->signalPaletteSetupRequested(styleName);
2356 		}
2357 		qmc2MainWindow->treeWidgetForeignIDs->setUpdatesEnabled(false);
2358 		if ( !qmc2EarlyStartup ) {
2359 			// save foreign ID selection
2360 			QTreeWidgetItem *foreignItem = qmc2MainWindow->treeWidgetForeignIDs->currentItem();
2361 			if ( foreignItem && foreignItem->isSelected() ) {
2362 				QTreeWidgetItem *parentItem = foreignItem;
2363 				if ( foreignItem->parent() )
2364 					parentItem = foreignItem->parent();
2365 				QStringList foreignIdState;
2366 				if ( parentItem == foreignItem )
2367 					foreignIdState << QString::number(qmc2MainWindow->treeWidgetForeignIDs->indexOfTopLevelItem(parentItem));
2368 				else
2369 					foreignIdState << QString::number(qmc2MainWindow->treeWidgetForeignIDs->indexOfTopLevelItem(parentItem)) << QString::number(parentItem->indexOfChild(foreignItem));
2370 				qmc2Config->setValue(QMC2_EMULATOR_PREFIX + "SelectedForeignID", foreignIdState);
2371 			} else
2372 				qmc2Config->remove(QMC2_EMULATOR_PREFIX + "SelectedForeignID");
2373 		}
2374 		// (re)create foreign IDs tree-widget, if applicable
2375 		qmc2MainWindow->treeWidgetForeignIDs->clear();
2376 		QString displayFormat(qmc2Config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomIDSetup/DisplayFormat", "$ID$ - $DESCRIPTION$").toString());
2377 		config->beginGroup(QMC2_EMULATOR_PREFIX + "RegisteredEmulators");
2378 		QStringList registeredEmus(config->childGroups());
2379 		config->endGroup();
2380 		if ( !registeredEmus.isEmpty() ) {
2381 			QList<QTreeWidgetItem *> itemList;
2382 			foreach (QString emuName, registeredEmus) {
2383 				QTreeWidgetItem *emuItem = new QTreeWidgetItem();
2384 				emuItem->setText(0, emuName);
2385 				QString emuIcon = config->value(QString(QMC2_EMULATOR_PREFIX + "RegisteredEmulators/%1/Icon").arg(emuName), QString()).toString();
2386 				if ( emuIcon.isEmpty() )
2387 					emuItem->setIcon(0, QIcon(QString::fromUtf8(":/data/img/alien.png")));
2388 				else {
2389 					QIcon icon = QIcon(emuIcon);
2390 					if ( !icon.isNull() )
2391 						emuItem->setIcon(0, icon);
2392 					else
2393 						emuItem->setIcon(0, QIcon(QString::fromUtf8(":/data/img/alien.png")));
2394 				}
2395 				emuItem->setWhatsThis(0, emuName + "\t" + tr("N/A") + "\t" + tr("N/A"));
2396 				itemList << emuItem;
2397 				QStringList idList(config->value(QMC2_EMULATOR_PREFIX + QString("CustomIDs/%1/IDs").arg(emuName), QStringList()).toStringList());
2398 				if ( !idList.isEmpty() ) {
2399 					QStringList descriptionList(config->value(QMC2_EMULATOR_PREFIX + QString("CustomIDs/%1/Descriptions").arg(emuName), QStringList()).toStringList());
2400 					while ( descriptionList.count() < idList.count() )
2401 						descriptionList << QString();
2402 					QStringList iconList(config->value(QMC2_EMULATOR_PREFIX + QString("CustomIDs/%1/Icons").arg(emuName), QStringList()).toStringList());
2403 					while ( iconList.count() < idList.count() )
2404 						iconList << QString();
2405 					for (int i = 0; i < idList.count(); i++) {
2406 						QString id(idList.at(i));
2407 						if ( !id.isEmpty() ) {
2408 							QString description(descriptionList.at(i));
2409 							QString idIcon(iconList.at(i));
2410 							QString itemText(displayFormat);
2411 							itemText.replace("$ID$", id).replace("$DESCRIPTION$", description);
2412 							QTreeWidgetItem *idItem = new QTreeWidgetItem(emuItem);
2413 							idItem->setText(0, itemText);
2414 							idItem->setWhatsThis(0, emuName + "\t" + id + "\t" + description);
2415 							if ( idIcon.isEmpty() )
2416 								idItem->setIcon(0, QIcon(QString::fromUtf8(":/data/img/pacman.png")));
2417 							else {
2418 								QIcon icon(idIcon);
2419 								if ( !icon.isNull() )
2420 									idItem->setIcon(0, icon);
2421 								else
2422 									idItem->setIcon(0, QIcon(QString::fromUtf8(":/data/img/pacman.png")));
2423 							}
2424 						}
2425 					}
2426 				}
2427 			}
2428 			qmc2MainWindow->treeWidgetForeignIDs->insertTopLevelItems(0, itemList);
2429 			ComponentInfo *componentInfo = qmc2ComponentSetup->componentInfoHash().value("Component1");
2430 			if ( componentInfo->appliedFeatureList().contains(QMC2_FOREIGN_INDEX) ) {
2431 				int index = qmc2MainWindow->tabWidgetMachineList->indexOf(qmc2MainWindow->tabForeignEmulators);
2432 				int foreignIndex = componentInfo->appliedFeatureList().indexOf(QMC2_FOREIGN_INDEX);
2433 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
2434 				int embedIndex = componentInfo->appliedFeatureList().indexOf(QMC2_EMBED_INDEX);
2435 				if ( embedIndex >= 0 && embedIndex < foreignIndex )
2436 					if ( qmc2MainWindow->tabWidgetMachineList->indexOf(qmc2MainWindow->tabEmbeddedEmus) < 0 )
2437 						foreignIndex--;
2438 #endif
2439 				if ( index == -1 ) {
2440 					qmc2MainWindow->tabWidgetMachineList->insertTab(foreignIndex, qmc2MainWindow->tabForeignEmulators, tr("&Foreign emulators"));
2441 					qmc2MainWindow->tabWidgetMachineList->setTabIcon(foreignIndex, QIcon(QString::fromUtf8(":/data/img/alien.png")));
2442 				}
2443 			}
2444 		} else {
2445 			int index = qmc2MainWindow->tabWidgetMachineList->indexOf(qmc2MainWindow->tabForeignEmulators);
2446 			if ( index >= 0 )
2447 				qmc2MainWindow->tabWidgetMachineList->removeTab(index);
2448 		}
2449 		// restore foreign ID selection
2450 		QStringList foreignIdState(qmc2Config->value(QMC2_EMULATOR_PREFIX + "SelectedForeignID", QStringList()).toStringList());
2451 		if ( !foreignIdState.isEmpty() ) {
2452 			int parentIndex = foreignIdState[0].toInt();
2453 			int childIndex = -1;
2454 			if ( foreignIdState.count() > 1 )
2455 				childIndex = foreignIdState[1].toInt();
2456 			if ( parentIndex >= 0 && parentIndex < qmc2MainWindow->treeWidgetForeignIDs->topLevelItemCount() ) {
2457 				QTreeWidgetItem *parentItem = qmc2MainWindow->treeWidgetForeignIDs->topLevelItem(parentIndex);
2458 				if ( childIndex >= 0 && childIndex < parentItem->childCount() ) {
2459 					parentItem->setExpanded(true);
2460 					QTreeWidgetItem *childItem = parentItem->child(childIndex);
2461 					childItem->setSelected(true);
2462 					qmc2MainWindow->treeWidgetForeignIDs->setCurrentItem(childItem);
2463 					qmc2MainWindow->treeWidgetForeignIDs->scrollToItem(childItem, qmc2CursorPositioningMode);
2464 				} else {
2465 					parentItem->setSelected(true);
2466 					qmc2MainWindow->treeWidgetForeignIDs->setCurrentItem(parentItem);
2467 					qmc2MainWindow->treeWidgetForeignIDs->scrollToItem(parentItem, qmc2CursorPositioningMode);
2468 				}
2469 			}
2470 		}
2471 		qmc2MainWindow->treeWidgetForeignIDs->setUpdatesEnabled(true);
2472 		tableWidgetRegisteredEmulators->resizeRowsToContents();
2473 	}
2474 	checkPlaceholderStatus();
2475 	// hide / show the menu bar
2476 #if (defined(QMC2_OS_UNIX) && QT_VERSION < 0x050000) || defined(QMC2_OS_WIN)
2477 	if ( qmc2MainWindow->tabWidgetMachineList->currentIndex() != QMC2_EMBED_INDEX || !qmc2MainWindow->toolButtonEmbedderMaximizeToggle->isChecked() )
2478 		qmc2MainWindow->menuBar()->setVisible(checkBoxShowMenuBar->isChecked());
2479 #else
2480 	qmc2MainWindow->menuBar()->setVisible(checkBoxShowMenuBar->isChecked());
2481 #endif
2482 	if ( checkBoxShowLoadingAnimation->isChecked() ) {
2483 		qmc2MainWindow->labelLoadingMachineList->setMovie(qmc2MainWindow->loadAnimMovie);
2484 		qmc2MainWindow->labelLoadingHierarchy->setMovie(qmc2MainWindow->loadAnimMovie);
2485 		qmc2MainWindow->labelCreatingCategoryView->setMovie(qmc2MainWindow->loadAnimMovie);
2486 		qmc2MainWindow->labelCreatingVersionView->setMovie(qmc2MainWindow->loadAnimMovie);
2487 		if ( qmc2SoftwareList )
2488 			qmc2SoftwareList->labelLoadingSoftwareLists->setMovie(qmc2SoftwareList->loadAnimMovie);
2489 	} else {
2490 		qmc2MainWindow->labelLoadingMachineList->setMovie(qmc2MainWindow->nullMovie);
2491 		qmc2MainWindow->labelLoadingHierarchy->setMovie(qmc2MainWindow->nullMovie);
2492 		qmc2MainWindow->labelCreatingCategoryView->setMovie(qmc2MainWindow->nullMovie);
2493 		qmc2MainWindow->labelCreatingVersionView->setMovie(qmc2MainWindow->nullMovie);
2494 		if ( qmc2SoftwareList )
2495 			qmc2SoftwareList->labelLoadingSoftwareLists->setMovie(qmc2MainWindow->nullMovie);
2496 	}
2497 	cancelClicked = false;
2498 }
2499 
on_pushButtonClearCookieDatabase_clicked()2500 void Options::on_pushButtonClearCookieDatabase_clicked()
2501 {
2502 	if ( qmc2NetworkAccessManager ) {
2503 		CookieJar *cj = (CookieJar *)qmc2NetworkAccessManager->cookieJar();
2504 		cj->recreateDatabase();
2505 	}
2506 }
2507 
on_pushButtonManageCookies_clicked()2508 void Options::on_pushButtonManageCookies_clicked()
2509 {
2510 	CookieManager cm(this);
2511 	cm.exec();
2512 }
2513 
on_pushButtonAdditionalArtworkSetup_clicked()2514 void Options::on_pushButtonAdditionalArtworkSetup_clicked()
2515 {
2516 	AdditionalArtworkSetup as(this);
2517 	as.exec();
2518 }
2519 
on_pushButtonImageFormats_clicked()2520 void Options::on_pushButtonImageFormats_clicked()
2521 {
2522 	ImageFormatSetup ifs(this);
2523 	ifs.exec();
2524 }
2525 
on_toolButtonImportGameInfo_clicked()2526 void Options::on_toolButtonImportGameInfo_clicked()
2527 {
2528 	QStringList pathList;
2529 	QStringList emulatorList;
2530 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat").toBool() ) {
2531 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat").toString();
2532 		emulatorList << "MAME";
2533 	}
2534 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat").toBool() ) {
2535 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat").toString();
2536 		if ( !pathList.last().toLower().endsWith("sysinfo.dat") )
2537 			emulatorList << "MAME";
2538 		else
2539 			emulatorList << "MESS";
2540 	}
2541 
2542 	qmc2LoadingMachineInfoDB = true;
2543 	qmc2Options->toolButtonImportGameInfo->setEnabled(false);
2544 	qmc2Options->toolButtonImportMachineInfo->setEnabled(false);
2545 	qApp->processEvents();
2546 	qmc2MachineList->datInfoDb()->importMachineInfo(pathList, emulatorList);
2547 	qmc2Options->toolButtonImportGameInfo->setEnabled(true);
2548 	qmc2Options->toolButtonImportMachineInfo->setEnabled(true);
2549 	qmc2LoadingMachineInfoDB = false;
2550 }
2551 
on_toolButtonImportMachineInfo_clicked()2552 void Options::on_toolButtonImportMachineInfo_clicked()
2553 {
2554 	QStringList pathList;
2555 	QStringList emulatorList;
2556 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameHistoryDat").toBool() ) {
2557 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameHistoryDat").toString();
2558 		emulatorList << "MAME";
2559 	}
2560 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessSysinfoDat").toBool() ) {
2561 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessSysinfoDat").toString();
2562 		if ( !pathList.last().toLower().endsWith("sysinfo.dat") )
2563 			emulatorList << "MAME";
2564 		else
2565 			emulatorList << "MESS";
2566 	}
2567 
2568 	qmc2LoadingMachineInfoDB = true;
2569 	qmc2Options->toolButtonImportGameInfo->setEnabled(false);
2570 	qmc2Options->toolButtonImportMachineInfo->setEnabled(false);
2571 	qApp->processEvents();
2572 	qmc2MachineList->datInfoDb()->importMachineInfo(pathList, emulatorList);
2573 	qmc2Options->toolButtonImportGameInfo->setEnabled(true);
2574 	qmc2Options->toolButtonImportMachineInfo->setEnabled(true);
2575 	qmc2LoadingMachineInfoDB = false;
2576 }
2577 
on_toolButtonImportMameInfo_clicked()2578 void Options::on_toolButtonImportMameInfo_clicked()
2579 {
2580 	QStringList pathList;
2581 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat").toBool() )
2582 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat").toString();
2583 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat").toBool() )
2584 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat").toString();
2585 
2586 	qmc2LoadingEmuInfoDB = true;
2587 	toolButtonImportMameInfo->setEnabled(false);
2588 	toolButtonImportMessInfo->setEnabled(false);
2589 	qApp->processEvents();
2590 	qmc2MachineList->datInfoDb()->importEmuInfo(pathList);
2591 	toolButtonImportMameInfo->setEnabled(true);
2592 	toolButtonImportMessInfo->setEnabled(true);
2593 	qmc2LoadingEmuInfoDB = false;
2594 }
2595 
on_toolButtonImportMessInfo_clicked()2596 void Options::on_toolButtonImportMessInfo_clicked()
2597 {
2598 	QStringList pathList;
2599 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMameInfoDat").toBool() )
2600 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MameInfoDat").toString();
2601 	if ( qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/ProcessMessInfoDat").toBool() )
2602 		pathList << qmc2Config->value(QMC2_FRONTEND_PREFIX + "FilesAndDirectories/MessInfoDat").toString();
2603 
2604 	qmc2LoadingEmuInfoDB = true;
2605 	toolButtonImportMameInfo->setEnabled(false);
2606 	toolButtonImportMessInfo->setEnabled(false);
2607 	qApp->processEvents();
2608 	qmc2MachineList->datInfoDb()->importEmuInfo(pathList);
2609 	toolButtonImportMameInfo->setEnabled(true);
2610 	toolButtonImportMessInfo->setEnabled(true);
2611 	qmc2LoadingEmuInfoDB = false;
2612 }
2613 
on_toolButtonImportSoftwareInfo_clicked()2614 void Options::on_toolButtonImportSoftwareInfo_clicked()
2615 {
2616 	qmc2LoadingSoftwareInfoDB = true;
2617 	toolButtonImportSoftwareInfo->setEnabled(false);
2618 	qApp->processEvents();
2619 	QStringList pathList = QStringList() << QMC2_QSETTINGS_CAST(config)->value(QMC2_EMULATOR_PREFIX + "FilesAndDirectories/SoftwareInfoDB").toString();
2620 	qmc2MachineList->datInfoDb()->importSoftwareInfo(pathList);
2621 	toolButtonImportSoftwareInfo->setEnabled(true);
2622 	qmc2LoadingSoftwareInfoDB = false;
2623 }
2624 
on_toolButtonOptimizeCatverIni_clicked()2625 void Options::on_toolButtonOptimizeCatverIni_clicked()
2626 {
2627 	CatverIniOptimizer optimizer(lineEditCatverIniFile->text(), this);
2628 	optimizer.exec();
2629 }
2630 
on_toolButtonSetupIconDatabase_clicked()2631 void Options::on_toolButtonSetupIconDatabase_clicked()
2632 {
2633 	IconCacheSetupDialog icsd(this);
2634 	icsd.exec();
2635 }
2636 
on_toolButtonScanSystemManuals_clicked()2637 void Options::on_toolButtonScanSystemManuals_clicked()
2638 {
2639 	ManualScanner manualScanner(QMC2_MANUALSCANNER_MODE_SYSTEMS, this);
2640 	manualScanner.exec();
2641 }
2642 
on_toolButtonScanSoftwareManuals_clicked()2643 void Options::on_toolButtonScanSoftwareManuals_clicked()
2644 {
2645 	ManualScanner manualScanner(QMC2_MANUALSCANNER_MODE_SOFTWARE, this);
2646 	manualScanner.exec();
2647 }
2648 
on_toolButtonBrowseStyleSheet_clicked()2649 void Options::on_toolButtonBrowseStyleSheet_clicked()
2650 {
2651 	QString s = QFileDialog::getOpenFileName(this, tr("Choose Qt style sheet file"), lineEditStyleSheet->text(), tr("Qt Style Sheets (*.qss)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2652 	if ( !s.isNull() )
2653 		lineEditStyleSheet->setText(s);
2654 	raise();
2655 }
2656 
on_toolButtonBrowsePreviewDirectory_clicked()2657 void Options::on_toolButtonBrowsePreviewDirectory_clicked()
2658 {
2659 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose preview directory"), lineEditPreviewDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2660 	if ( !s.isNull() ) {
2661 		if ( !s.endsWith("/") )
2662 			s += "/";
2663 		lineEditPreviewDirectory->setText(s);
2664 	}
2665 	raise();
2666 }
2667 
on_toolButtonBrowseFlyerDirectory_clicked()2668 void Options::on_toolButtonBrowseFlyerDirectory_clicked()
2669 {
2670 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose flyer directory"), lineEditFlyerDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2671 	if ( !s.isNull() ) {
2672 		if ( !s.endsWith("/") )
2673 			s += "/";
2674 		lineEditFlyerDirectory->setText(s);
2675 	}
2676 	raise();
2677 }
2678 
on_toolButtonBrowseIconDirectory_clicked()2679 void Options::on_toolButtonBrowseIconDirectory_clicked()
2680 {
2681 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose icon directory"), lineEditIconDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2682 	if ( !s.isNull() ) {
2683 		if ( !s.endsWith("/") )
2684 			s += "/";
2685 		lineEditIconDirectory->setText(s);
2686 	}
2687 	raise();
2688 }
2689 
on_toolButtonBrowseCabinetDirectory_clicked()2690 void Options::on_toolButtonBrowseCabinetDirectory_clicked()
2691 {
2692 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose cabinet directory"), lineEditCabinetDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2693 	if ( !s.isNull() ) {
2694 		if ( !s.endsWith("/") )
2695 			s += "/";
2696 		lineEditCabinetDirectory->setText(s);
2697 	}
2698 	raise();
2699 }
2700 
on_toolButtonBrowseControllerDirectory_clicked()2701 void Options::on_toolButtonBrowseControllerDirectory_clicked()
2702 {
2703 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose controller directory"), lineEditControllerDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2704 	if ( !s.isNull() ) {
2705 		if ( !s.endsWith("/") )
2706 			s += "/";
2707 		lineEditControllerDirectory->setText(s);
2708 	}
2709 	raise();
2710 }
2711 
on_toolButtonBrowseMarqueeDirectory_clicked()2712 void Options::on_toolButtonBrowseMarqueeDirectory_clicked()
2713 {
2714 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose marquee directory"), lineEditMarqueeDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2715 	if ( !s.isNull() ) {
2716 		if ( !s.endsWith("/") )
2717 			s += "/";
2718 		lineEditMarqueeDirectory->setText(s);
2719 	}
2720 	raise();
2721 }
2722 
on_toolButtonBrowseTitleDirectory_clicked()2723 void Options::on_toolButtonBrowseTitleDirectory_clicked()
2724 {
2725 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose title directory"), lineEditTitleDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2726 	if ( !s.isNull() ) {
2727 		if ( !s.endsWith("/") )
2728 			s += "/";
2729 		lineEditTitleDirectory->setText(s);
2730 	}
2731 	raise();
2732 }
2733 
on_toolButtonBrowsePCBDirectory_clicked()2734 void Options::on_toolButtonBrowsePCBDirectory_clicked()
2735 {
2736 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose PCB directory"), lineEditPCBDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2737 	if ( !s.isNull() ) {
2738 		if ( !s.endsWith("/") )
2739 			s += "/";
2740 		lineEditPCBDirectory->setText(s);
2741 	}
2742 	raise();
2743 }
2744 
on_toolButtonBrowseOptionsTemplateFile_clicked()2745 void Options::on_toolButtonBrowseOptionsTemplateFile_clicked()
2746 {
2747 	QString s = QFileDialog::getOpenFileName(this, tr("Choose options template file"), lineEditOptionsTemplateFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2748 	if ( !s.isNull() )
2749 		lineEditOptionsTemplateFile->setText(s);
2750 	raise();
2751 }
2752 
on_toolButtonBrowseExecutableFile_clicked()2753 void Options::on_toolButtonBrowseExecutableFile_clicked()
2754 {
2755 	QString s = QFileDialog::getOpenFileName(this, tr("Choose emulator executable file"), lineEditExecutableFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2756 	if ( !s.isNull() )
2757 		lineEditExecutableFile->setText(s);
2758 	raise();
2759 }
2760 
on_toolButtonBrowseEmulatorLogFile_clicked()2761 void Options::on_toolButtonBrowseEmulatorLogFile_clicked()
2762 {
2763 	QString s = QFileDialog::getOpenFileName(this, tr("Choose emulator log file"), lineEditEmulatorLogFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2764 	if ( !s.isNull() )
2765 		lineEditEmulatorLogFile->setText(s);
2766 	raise();
2767 }
2768 
on_toolButtonBrowseXmlCacheDatabase_clicked()2769 void Options::on_toolButtonBrowseXmlCacheDatabase_clicked()
2770 {
2771 	QString s = QFileDialog::getOpenFileName(this, tr("Choose XML cache database file"), lineEditXmlCacheDatabase->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2772 	if ( !s.isNull() )
2773 		lineEditXmlCacheDatabase->setText(s);
2774 	raise();
2775 }
2776 
on_toolButtonClearUserDataDatabase_clicked()2777 void Options::on_toolButtonClearUserDataDatabase_clicked()
2778 {
2779 	if ( qmc2MachineList->userDataDb()->userDataRowCount() > 0 ) {
2780 		switch ( QMessageBox::question(this, tr("Confirm"), tr("This will remove <b>all</b> existing user data and recreate the database.\nAre you sure you want to do this?"), tr("&Yes"), tr("&No"), QString(), 0, 1) ) {
2781 			case 0:
2782 				break;
2783 
2784 			default:
2785 			case 1:
2786 				return;
2787 		}
2788 	}
2789 
2790 	qmc2MachineList->userDataDb()->clearRankCache();
2791 	qmc2MachineList->userDataDb()->clearCommentCache();
2792 	qmc2MachineList->userDataDb()->recreateDatabase();
2793 	qmc2MachineList->userDataDb()->setEmulatorVersion(qmc2MachineList->emulatorVersion);
2794 	qmc2MachineList->userDataDb()->setQmc2Version(XSTR(QMC2_VERSION));
2795 	qmc2MachineList->userDataDb()->setUserDataVersion(QMC2_USERDATA_VERSION);
2796 	QTimer::singleShot(0, qmc2MainWindow, SLOT(updateUserData()));
2797 }
2798 
on_toolButtonCleanupUserDataDatabase_clicked()2799 void Options::on_toolButtonCleanupUserDataDatabase_clicked()
2800 {
2801 	qmc2MachineList->userDataDb()->cleanUp();
2802 }
2803 
on_toolButtonBrowseUserDataDatabase_clicked()2804 void Options::on_toolButtonBrowseUserDataDatabase_clicked()
2805 {
2806 	QString s = QFileDialog::getOpenFileName(this, tr("Choose user data database file"), lineEditUserDataDatabase->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2807 	if ( !s.isNull() )
2808 		lineEditUserDataDatabase->setText(s);
2809 	raise();
2810 }
2811 
on_toolButtonBrowseCookieDatabase_clicked()2812 void Options::on_toolButtonBrowseCookieDatabase_clicked()
2813 {
2814 	QString s = QFileDialog::getSaveFileName(this, tr("Choose cookie database file"), lineEditCookieDatabase->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2815 	if ( !s.isNull() )
2816 		lineEditCookieDatabase->setText(s);
2817 	raise();
2818 }
2819 
on_toolButtonBrowseZipTool_clicked()2820 void Options::on_toolButtonBrowseZipTool_clicked()
2821 {
2822 	QString s = QFileDialog::getOpenFileName(this, tr("Choose zip tool"), lineEditZipTool->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2823 	if ( !s.isNull() )
2824 		lineEditZipTool->setText(s);
2825 	raise();
2826 }
2827 
on_toolButtonBrowseSevenZipTool_clicked()2828 void Options::on_toolButtonBrowseSevenZipTool_clicked()
2829 {
2830 	QString s = QFileDialog::getOpenFileName(this, tr("Choose 7-zip tool"), lineEditSevenZipTool->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2831 	if ( !s.isNull() )
2832 		lineEditSevenZipTool->setText(s);
2833 	raise();
2834 }
2835 
on_toolButtonBrowseRomTool_clicked()2836 void Options::on_toolButtonBrowseRomTool_clicked()
2837 {
2838 	QString s = QFileDialog::getOpenFileName(this, tr("Choose ROM tool"), lineEditRomTool->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2839 	if ( !s.isNull() )
2840 		lineEditRomTool->setText(s);
2841 	raise();
2842 }
2843 
on_toolButtonBrowseRomToolWorkingDirectory_clicked()2844 void Options::on_toolButtonBrowseRomToolWorkingDirectory_clicked()
2845 {
2846 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose working directory"), lineEditRomToolWorkingDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2847 	if ( !s.isNull() )
2848 		lineEditRomToolWorkingDirectory->setText(s);
2849 	raise();
2850 }
2851 
on_toolButtonBrowseFavoritesFile_clicked()2852 void Options::on_toolButtonBrowseFavoritesFile_clicked()
2853 {
2854 	QString s = QFileDialog::getOpenFileName(this, tr("Choose machine favorites file"), lineEditFavoritesFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2855 	if ( !s.isNull() )
2856 		lineEditFavoritesFile->setText(s);
2857 	raise();
2858 }
2859 
on_toolButtonBrowseHistoryFile_clicked()2860 void Options::on_toolButtonBrowseHistoryFile_clicked()
2861 {
2862 	QString s = QFileDialog::getOpenFileName(this, tr("Choose play history file"), lineEditHistoryFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2863 	if ( !s.isNull() )
2864 		lineEditHistoryFile->setText(s);
2865 	raise();
2866 }
2867 
on_toolButtonBrowseMachineListCacheFile_clicked()2868 void Options::on_toolButtonBrowseMachineListCacheFile_clicked()
2869 {
2870 	QString s = QFileDialog::getOpenFileName(this, tr("Choose machine list cache file"), lineEditMachineListCacheFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2871 	if ( !s.isNull() )
2872 		lineEditMachineListCacheFile->setText(s);
2873 	raise();
2874 }
2875 
on_toolButtonBrowseMachineListDatabase_clicked()2876 void Options::on_toolButtonBrowseMachineListDatabase_clicked()
2877 {
2878 	QString s = QFileDialog::getOpenFileName(this, tr("Choose machine list database file"), lineEditMachineListDatabase->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2879 	if ( !s.isNull() )
2880 		lineEditMachineListDatabase->setText(s);
2881 	raise();
2882 }
2883 
on_toolButtonBrowseROMStateCacheFile_clicked()2884 void Options::on_toolButtonBrowseROMStateCacheFile_clicked()
2885 {
2886 	QString s = QFileDialog::getOpenFileName(this, tr("Choose ROM state cache file"), lineEditROMStateCacheFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2887 	if ( !s.isNull() )
2888 		lineEditROMStateCacheFile->setText(s);
2889 	raise();
2890 }
2891 
on_toolButtonBrowseWorkingDirectory_clicked()2892 void Options::on_toolButtonBrowseWorkingDirectory_clicked()
2893 {
2894 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose working directory"), lineEditWorkingDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2895 	if ( !s.isNull() ) {
2896 		if ( !s.endsWith("/") )
2897 			s += "/";
2898 		lineEditWorkingDirectory->setText(s);
2899 	}
2900 	raise();
2901 }
2902 
on_toolButtonBrowseSoftwareListCacheDb_clicked()2903 void Options::on_toolButtonBrowseSoftwareListCacheDb_clicked()
2904 {
2905 	QString s = QFileDialog::getOpenFileName(this, tr("Choose software list cache database file"), lineEditSoftwareListCacheDb->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2906 	if ( !s.isNull() )
2907 		lineEditSoftwareListCacheDb->setText(s);
2908 	raise();
2909 }
2910 
on_toolButtonBrowseSoftwareStateCache_clicked()2911 void Options::on_toolButtonBrowseSoftwareStateCache_clicked()
2912 {
2913 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose software state cache directory"), lineEditSoftwareStateCache->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2914 	if ( !s.isEmpty() ) {
2915 		if ( !s.endsWith("/") )
2916 			s += "/";
2917 		lineEditSoftwareStateCache->setText(s);
2918 	}
2919 	raise();
2920 }
2921 
on_toolButtonBrowseGeneralSoftwareFolder_clicked()2922 void Options::on_toolButtonBrowseGeneralSoftwareFolder_clicked()
2923 {
2924 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose general software folder"), lineEditGeneralSoftwareFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2925 	if ( !s.isNull() ) {
2926 		if ( !s.endsWith("/") )
2927 			s += "/";
2928 		lineEditGeneralSoftwareFolder->setText(s);
2929 	}
2930 	raise();
2931 }
2932 
on_toolButtonBrowseFrontendLogFile_clicked()2933 void Options::on_toolButtonBrowseFrontendLogFile_clicked()
2934 {
2935 	QString s = QFileDialog::getOpenFileName(this, tr("Choose front end log file"), lineEditFrontendLogFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2936 	if ( !s.isNull() )
2937 		lineEditFrontendLogFile->setText(s);
2938 	raise();
2939 }
2940 
on_toolButtonBrowseDataDirectory_clicked()2941 void Options::on_toolButtonBrowseDataDirectory_clicked()
2942 {
2943 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose data directory"), lineEditDataDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
2944 	if ( !s.isNull() ) {
2945 		if ( !s.endsWith("/") )
2946 			s += "/";
2947 		lineEditDataDirectory->setText(s);
2948 	}
2949 	raise();
2950 }
2951 
on_toolButtonBrowseDatInfoDatabase_clicked()2952 void Options::on_toolButtonBrowseDatInfoDatabase_clicked()
2953 {
2954 	QString s = QFileDialog::getOpenFileName(this, tr("Choose dat-info database file"), lineEditDatInfoDatabase->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2955 	if ( !s.isNull() )
2956 		lineEditDatInfoDatabase->setText(s);
2957 	raise();
2958 }
2959 
on_toolButtonBrowseMameHistoryDat_clicked()2960 void Options::on_toolButtonBrowseMameHistoryDat_clicked()
2961 {
2962 	QString s = QFileDialog::getOpenFileName(this, tr("Choose MAME machine info DB"), lineEditMameHistoryDat->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2963 	if ( !s.isNull() )
2964 		lineEditMameHistoryDat->setText(s);
2965 	raise();
2966 }
2967 
on_toolButtonBrowseMessSysinfoDat_clicked()2968 void Options::on_toolButtonBrowseMessSysinfoDat_clicked()
2969 {
2970 	QString s = QFileDialog::getOpenFileName(this, tr("Choose MESS machine info DB"), lineEditMessSysinfoDat->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2971 	if ( !s.isNull() )
2972 		lineEditMessSysinfoDat->setText(s);
2973 	raise();
2974 }
2975 
on_toolButtonBrowseMameInfoDat_clicked()2976 void Options::on_toolButtonBrowseMameInfoDat_clicked()
2977 {
2978 	QString s = QFileDialog::getOpenFileName(this, tr("Choose MAME emulator info DB"), lineEditMameInfoDat->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2979 	if ( !s.isNull() )
2980 		lineEditMameInfoDat->setText(s);
2981 	raise();
2982 }
2983 
on_toolButtonBrowseMessInfoDat_clicked()2984 void Options::on_toolButtonBrowseMessInfoDat_clicked()
2985 {
2986 	QString s = QFileDialog::getOpenFileName(this, tr("Choose MESS emulator info DB"), lineEditMessInfoDat->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2987 	if ( !s.isNull() )
2988 		lineEditMessInfoDat->setText(s);
2989 	raise();
2990 }
2991 
on_toolButtonBrowseSoftwareInfoDB_clicked()2992 void Options::on_toolButtonBrowseSoftwareInfoDB_clicked()
2993 {
2994 	QString s = QFileDialog::getOpenFileName(this, tr("Choose software info DB"), lineEditSoftwareInfoDB->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
2995 	if ( !s.isNull() )
2996 		lineEditSoftwareInfoDB->setText(s);
2997 	raise();
2998 }
2999 
on_toolButtonBrowseCatverIniFile_clicked()3000 void Options::on_toolButtonBrowseCatverIniFile_clicked()
3001 {
3002 	QString s = QFileDialog::getOpenFileName(this, tr("Choose catver.ini file"), lineEditCatverIniFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3003 	if ( !s.isNull() )
3004 		lineEditCatverIniFile->setText(s);
3005 	raise();
3006 }
3007 
on_toolButtonBrowseCategoryIniFile_clicked()3008 void Options::on_toolButtonBrowseCategoryIniFile_clicked()
3009 {
3010 	QString s = QFileDialog::getOpenFileName(this, tr("Choose category.ini file"), lineEditCategoryIniFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3011 	if ( !s.isNull() )
3012 		lineEditCategoryIniFile->setText(s);
3013 	raise();
3014 }
3015 
on_toolButtonBrowseFont_clicked()3016 void Options::on_toolButtonBrowseFont_clicked()
3017 {
3018 	bool ok;
3019 	QFont currentFont;
3020 	if ( lineEditFont->text().isEmpty() )
3021 #if defined(QMC2_OS_MAC)
3022 		currentFont.fromString("Arial,10,-1,5,50,0,0,0,0,0");
3023 #else
3024 		currentFont = QApplication::font();
3025 #endif
3026 	else
3027 		currentFont.fromString(lineEditFont->text());
3028 	QFont f = QFontDialog::getFont(&ok, currentFont, 0);
3029 	if ( ok ) {
3030 		lineEditFont->setFont(f);
3031 		lineEditFont->setText(f.toString());
3032 	}
3033 	raise();
3034 }
3035 
on_toolButtonBrowseLogFont_clicked()3036 void Options::on_toolButtonBrowseLogFont_clicked()
3037 {
3038 	bool ok;
3039 	QFont currentFont;
3040 	if ( lineEditLogFont->text().isEmpty() )
3041 #if defined(QMC2_OS_MAC)
3042 		currentFont.fromString("Courier New,10,-1,5,50,0,0,0,0,0");
3043 #else
3044 		currentFont = QApplication::font();
3045 #endif
3046 	else
3047 		currentFont.fromString(lineEditLogFont->text());
3048 	QFont f = QFontDialog::getFont(&ok, currentFont, 0);
3049 	if ( ok ) {
3050 		lineEditLogFont->setFont(f);
3051 		lineEditLogFont->setText(f.toString());
3052 	}
3053 	raise();
3054 }
3055 
moveEvent(QMoveEvent * e)3056 void Options::moveEvent(QMoveEvent *e)
3057 {
3058 	if ( !qmc2CleaningUp && !qmc2EarlyStartup )
3059 		config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Position", pos());
3060 
3061 	e->accept();
3062 }
3063 
resizeEvent(QResizeEvent * e)3064 void Options::resizeEvent(QResizeEvent *e)
3065 {
3066 	if ( !qmc2CleaningUp && !qmc2EarlyStartup )
3067 		config->setValue(QMC2_FRONTEND_PREFIX + "Layout/OptionsWidget/Size", size());
3068 
3069 	e->accept();
3070 }
3071 
on_radioButtonPreviewSelect_clicked()3072 void Options::on_radioButtonPreviewSelect_clicked()
3073 {
3074 	bool currentUsePreviewFile = (stackedWidgetPreview->currentIndex() == 1);
3075 	stackedWidgetPreview->setCurrentIndex(!currentUsePreviewFile);
3076 	radioButtonPreviewSelect->setText(!currentUsePreviewFile ? tr("Preview file") : tr("Preview directory"));
3077 }
3078 
on_radioButtonFlyerSelect_clicked()3079 void Options::on_radioButtonFlyerSelect_clicked()
3080 {
3081 	bool currentUseFlyerFile = (stackedWidgetFlyer->currentIndex() == 1);
3082 	stackedWidgetFlyer->setCurrentIndex(!currentUseFlyerFile);
3083 	radioButtonFlyerSelect->setText(!currentUseFlyerFile ? tr("Flyer file") : tr("Flyer directory"));
3084 }
3085 
on_radioButtonIconSelect_clicked()3086 void Options::on_radioButtonIconSelect_clicked()
3087 {
3088 	bool currentUseIconFile = (stackedWidgetIcon->currentIndex() == 1);
3089 	stackedWidgetIcon->setCurrentIndex(!currentUseIconFile);
3090 	radioButtonIconSelect->setText(!currentUseIconFile ? tr("Icon file") : tr("Icon directory"));
3091 }
3092 
on_radioButtonCabinetSelect_clicked()3093 void Options::on_radioButtonCabinetSelect_clicked()
3094 {
3095 	bool currentUseCabinetFile = (stackedWidgetCabinet->currentIndex() == 1);
3096 	stackedWidgetCabinet->setCurrentIndex(!currentUseCabinetFile);
3097 	radioButtonCabinetSelect->setText(!currentUseCabinetFile ? tr("Cabinet file") : tr("Cabinet directory"));
3098 }
3099 
on_radioButtonControllerSelect_clicked()3100 void Options::on_radioButtonControllerSelect_clicked()
3101 {
3102 	bool currentUseControllerFile = (stackedWidgetController->currentIndex() == 1);
3103 	stackedWidgetController->setCurrentIndex(!currentUseControllerFile);
3104 	radioButtonControllerSelect->setText(!currentUseControllerFile ? tr("Controller file") : tr("Controller directory"));
3105 }
3106 
on_radioButtonMarqueeSelect_clicked()3107 void Options::on_radioButtonMarqueeSelect_clicked()
3108 {
3109 	bool currentUseMarqueeFile = (stackedWidgetMarquee->currentIndex() == 1);
3110 	stackedWidgetMarquee->setCurrentIndex(!currentUseMarqueeFile);
3111 	radioButtonMarqueeSelect->setText(!currentUseMarqueeFile ? tr("Marquee file") : tr("Marquee directory"));
3112 }
3113 
on_radioButtonTitleSelect_clicked()3114 void Options::on_radioButtonTitleSelect_clicked()
3115 {
3116 	bool currentUseTitleFile = (stackedWidgetTitle->currentIndex() == 1);
3117 	stackedWidgetTitle->setCurrentIndex(!currentUseTitleFile);
3118 	radioButtonTitleSelect->setText(!currentUseTitleFile ? tr("Title file") : tr("Title directory"));
3119 }
3120 
on_radioButtonPCBSelect_clicked()3121 void Options::on_radioButtonPCBSelect_clicked()
3122 {
3123 	bool currentUsePCBFile = (stackedWidgetPCB->currentIndex() == 1);
3124 	stackedWidgetPCB->setCurrentIndex(!currentUsePCBFile);
3125 	radioButtonPCBSelect->setText(!currentUsePCBFile ? tr("PCB file") : tr("PCB directory"));
3126 }
3127 
on_radioButtonSoftwareSnapSelect_clicked()3128 void Options::on_radioButtonSoftwareSnapSelect_clicked()
3129 {
3130 	bool currentUseSoftwareSnapFile = (stackedWidgetSWSnap->currentIndex() == 1);
3131 	stackedWidgetSWSnap->setCurrentIndex(!currentUseSoftwareSnapFile);
3132 	radioButtonSoftwareSnapSelect->setText(!currentUseSoftwareSnapFile ? tr("SW snap file") : tr("SW snap folder"));
3133 }
3134 
on_toolButtonBrowsePreviewFile_clicked()3135 void Options::on_toolButtonBrowsePreviewFile_clicked()
3136 {
3137 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed preview file"), lineEditPreviewFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3138 	if ( !s.isNull() ) {
3139 		lineEditPreviewFile->setText(s);
3140 		if ( s.toLower().endsWith(".zip") )
3141 			comboBoxPreviewFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3142 		else if ( s.toLower().endsWith(".7z") )
3143 			comboBoxPreviewFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3144 #if defined(QMC2_LIBARCHIVE_ENABLED)
3145 		else
3146 			comboBoxPreviewFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3147 #endif
3148 	}
3149 	raise();
3150 }
3151 
on_toolButtonBrowseFlyerFile_clicked()3152 void Options::on_toolButtonBrowseFlyerFile_clicked()
3153 {
3154 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed flyer file"), lineEditFlyerFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3155 	if ( !s.isNull() ) {
3156 		lineEditFlyerFile->setText(s);
3157 		if ( s.toLower().endsWith(".zip") )
3158 			comboBoxFlyerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3159 		else if ( s.toLower().endsWith(".7z") )
3160 			comboBoxFlyerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3161 #if defined(QMC2_LIBARCHIVE_ENABLED)
3162 		else
3163 			comboBoxFlyerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3164 #endif
3165 	}
3166 	raise();
3167 }
3168 
on_toolButtonBrowseIconFile_clicked()3169 void Options::on_toolButtonBrowseIconFile_clicked()
3170 {
3171 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed icon file"), lineEditIconFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3172 	if ( !s.isNull() ) {
3173 		lineEditIconFile->setText(s);
3174 		if ( s.toLower().endsWith(".zip") )
3175 			comboBoxIconFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3176 		else if ( s.toLower().endsWith(".7z") )
3177 			comboBoxIconFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3178 #if defined(QMC2_LIBARCHIVE_ENABLED)
3179 		else
3180 			comboBoxIconFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3181 #endif
3182 	}
3183 	raise();
3184 }
3185 
on_toolButtonBrowseCabinetFile_clicked()3186 void Options::on_toolButtonBrowseCabinetFile_clicked()
3187 {
3188 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed cabinet file"), lineEditCabinetFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3189 	if ( !s.isNull() ) {
3190 		lineEditCabinetFile->setText(s);
3191 		if ( s.toLower().endsWith(".zip") )
3192 			comboBoxCabinetFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3193 		else if ( s.toLower().endsWith(".7z") )
3194 			comboBoxCabinetFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3195 #if defined(QMC2_LIBARCHIVE_ENABLED)
3196 		else
3197 			comboBoxCabinetFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3198 #endif
3199 	}
3200 	raise();
3201 }
3202 
on_toolButtonBrowseControllerFile_clicked()3203 void Options::on_toolButtonBrowseControllerFile_clicked()
3204 {
3205 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed controller file"), lineEditControllerFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3206 	if ( !s.isNull() ) {
3207 		lineEditControllerFile->setText(s);
3208 		if ( s.toLower().endsWith(".zip") )
3209 			comboBoxControllerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3210 		else if ( s.toLower().endsWith(".7z") )
3211 			comboBoxControllerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3212 #if defined(QMC2_LIBARCHIVE_ENABLED)
3213 		else
3214 			comboBoxControllerFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3215 #endif
3216 	}
3217 	raise();
3218 }
3219 
on_toolButtonBrowseMarqueeFile_clicked()3220 void Options::on_toolButtonBrowseMarqueeFile_clicked()
3221 {
3222 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed marquee file"), lineEditMarqueeFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3223 	if ( !s.isNull() ) {
3224 		lineEditMarqueeFile->setText(s);
3225 		if ( s.toLower().endsWith(".zip") )
3226 			comboBoxMarqueeFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3227 		else if ( s.toLower().endsWith(".7z") )
3228 			comboBoxMarqueeFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3229 #if defined(QMC2_LIBARCHIVE_ENABLED)
3230 		else
3231 			comboBoxMarqueeFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3232 #endif
3233 	}
3234 	raise();
3235 }
3236 
on_toolButtonBrowseTitleFile_clicked()3237 void Options::on_toolButtonBrowseTitleFile_clicked()
3238 {
3239 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed title file"), lineEditTitleFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3240 	if ( !s.isNull() ) {
3241 		lineEditTitleFile->setText(s);
3242 		if ( s.toLower().endsWith(".zip") )
3243 			comboBoxTitleFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3244 		else if ( s.toLower().endsWith(".7z") )
3245 			comboBoxTitleFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3246 #if defined(QMC2_LIBARCHIVE_ENABLED)
3247 		else
3248 			comboBoxTitleFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3249 #endif
3250 	}
3251 	raise();
3252 }
3253 
on_toolButtonBrowsePCBFile_clicked()3254 void Options::on_toolButtonBrowsePCBFile_clicked()
3255 {
3256 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed PCB file"), lineEditPCBFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3257 	if ( !s.isNull() ) {
3258 		lineEditPCBFile->setText(s);
3259 		if ( s.toLower().endsWith(".zip") )
3260 			comboBoxPCBFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3261 		else if ( s.toLower().endsWith(".7z") )
3262 			comboBoxPCBFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3263 #if defined(QMC2_LIBARCHIVE_ENABLED)
3264 		else
3265 			comboBoxPCBFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3266 #endif
3267 	}
3268 	raise();
3269 }
3270 
on_toolButtonBrowseSoftwareSnapDirectory_clicked()3271 void Options::on_toolButtonBrowseSoftwareSnapDirectory_clicked()
3272 {
3273 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose software snap directory"), lineEditSoftwareSnapDirectory->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3274 	if ( !s.isNull() ) {
3275 		if ( !s.endsWith("/") )
3276 			s += "/";
3277 		lineEditSoftwareSnapDirectory->setText(s);
3278 	}
3279 	raise();
3280 }
3281 
on_toolButtonBrowseSoftwareSnapFile_clicked()3282 void Options::on_toolButtonBrowseSoftwareSnapFile_clicked()
3283 {
3284 	QString s = QFileDialog::getOpenFileName(this, tr("Choose compressed software snap file"), lineEditSoftwareSnapFile->text(), tr("Supported archives") + " (*.[zZ][iI][pP] *.7[zZ]);;" + tr("ZIP archives") + " (*.[zZ][iI][pP]);;" + tr("7z archives") + " (*.7[zZ]);;" + tr("All files") + " (*)", 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3285 	if ( !s.isNull() ) {
3286 		lineEditSoftwareSnapFile->setText(s);
3287 		if ( s.toLower().endsWith(".zip") )
3288 			comboBoxSoftwareSnapFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ZIP);
3289 		else if ( s.toLower().endsWith(".7z") )
3290 			comboBoxSoftwareSnapFileType->setCurrentIndex(QMC2_IMG_FILETYPE_7Z);
3291 #if defined(QMC2_LIBARCHIVE_ENABLED)
3292 		else
3293 			comboBoxSoftwareSnapFileType->setCurrentIndex(QMC2_IMG_FILETYPE_ARCHIVE);
3294 #endif
3295 	}
3296 	raise();
3297 }
3298 
on_toolButtonBrowseSoftwareNotesFolder_clicked()3299 void Options::on_toolButtonBrowseSoftwareNotesFolder_clicked()
3300 {
3301 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose software notes folder"), lineEditSoftwareNotesFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3302 	if ( !s.isNull() ) {
3303 		if ( !s.endsWith("/") )
3304 			s += "/";
3305 		lineEditSoftwareNotesFolder->setText(s);
3306 	}
3307 	raise();
3308 }
3309 
on_toolButtonBrowseSoftwareNotesTemplate_clicked()3310 void Options::on_toolButtonBrowseSoftwareNotesTemplate_clicked()
3311 {
3312 	QString s = QFileDialog::getOpenFileName(this, tr("Choose software notes template"), lineEditSoftwareNotesTemplate->text(), tr("HTML files (*.html *.htm)") + ";;" + tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3313 	if ( !s.isNull() )
3314 		lineEditSoftwareNotesTemplate->setText(s);
3315 	raise();
3316 }
3317 
on_toolButtonBrowseSystemNotesFolder_clicked()3318 void Options::on_toolButtonBrowseSystemNotesFolder_clicked()
3319 {
3320 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose system notes folder"), lineEditSystemNotesFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3321 	if ( !s.isNull() ) {
3322 		if ( !s.endsWith("/") )
3323 			s += "/";
3324 		lineEditSystemNotesFolder->setText(s);
3325 	}
3326 	raise();
3327 }
3328 
on_toolButtonBrowseSystemNotesTemplate_clicked()3329 void Options::on_toolButtonBrowseSystemNotesTemplate_clicked()
3330 {
3331 	QString s = QFileDialog::getOpenFileName(this, tr("Choose system notes template"), lineEditSystemNotesTemplate->text(), tr("HTML files (*.html *.htm)") + ";;" + tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3332 	if ( !s.isNull() )
3333 		lineEditSystemNotesTemplate->setText(s);
3334 	raise();
3335 }
3336 
on_toolButtonBrowseVideoSnapFolder_clicked()3337 void Options::on_toolButtonBrowseVideoSnapFolder_clicked()
3338 {
3339 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose video snap folder"), lineEditVideoSnapFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3340 	if ( !s.isNull() ) {
3341 		if ( !s.endsWith("/") )
3342 			s += "/";
3343 		lineEditVideoSnapFolder->setText(s);
3344 	}
3345 	raise();
3346 }
3347 
on_toolButtonBrowseSystemManualFolder_clicked()3348 void Options::on_toolButtonBrowseSystemManualFolder_clicked()
3349 {
3350 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose system manual folder"), lineEditSystemManualFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3351 	if ( !s.isNull() ) {
3352 		if ( !s.endsWith("/") )
3353 			s += "/";
3354 		lineEditSystemManualFolder->setText(s);
3355 	}
3356 	raise();
3357 }
3358 
on_toolButtonBrowseSoftwareManualFolder_clicked()3359 void Options::on_toolButtonBrowseSoftwareManualFolder_clicked()
3360 {
3361 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose software manual folder"), lineEditSoftwareManualFolder->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3362 	if ( !s.isNull() ) {
3363 		if ( !s.endsWith("/") )
3364 			s += "/";
3365 		lineEditSoftwareManualFolder->setText(s);
3366 	}
3367 	raise();
3368 }
3369 
on_treeWidgetShortcuts_itemActivated(QTreeWidgetItem * item)3370 void Options::on_treeWidgetShortcuts_itemActivated(QTreeWidgetItem *item)
3371 {
3372 	if ( !item )
3373 		return;
3374 
3375 	qApp->removeEventFilter(qmc2MainEventFilter);
3376 
3377 	KeySequenceScanner keySeqScanner(this, qmc2QtKeyHash.contains(item->text(1)));
3378 	if ( keySeqScanner.exec() == QDialog::Accepted ) {
3379 		QStringList words = item->text(1).split("+");
3380 		QString nativeShortcut = "";
3381 		for (int i = 0; i < words.count(); i++) {
3382 			if ( i > 0 )
3383 				nativeShortcut += "+";
3384 			nativeShortcut += QObject::tr(words[i].toUtf8().constData());
3385 		}
3386 
3387 		bool found = false;
3388 		QHashIterator<QString, QPair<QString, QAction *> > it(qmc2ShortcutHash);
3389 		while ( it.hasNext() && !found ) {
3390 			it.next();
3391 			words = it.key().split("+");
3392 			QString itShortcut;
3393 			for (int i = 0; i < words.count(); i++) {
3394 				if ( i > 0 )
3395 					itShortcut += "+";
3396 				itShortcut += QObject::tr(words[i].toUtf8().constData());
3397 			}
3398 
3399 			if ( itShortcut == nativeShortcut ) {
3400 				found = true;
3401 				nativeShortcut = it.key();
3402 			}
3403 		}
3404 
3405 		if ( found ) {
3406 			qmc2CustomShortcutHash[nativeShortcut] = keySeqScanner.currentKeySequence;
3407 			item->setText(2, keySeqScanner.labelKeySequence->text());
3408 			QTimer::singleShot(0, this, SLOT(checkShortcuts()));
3409 		}
3410 
3411 		pushButtonResetShortcut->setEnabled(true);
3412 	}
3413 
3414 	qApp->installEventFilter(qmc2MainEventFilter);
3415 }
3416 
on_treeWidgetShortcuts_itemSelectionChanged()3417 void Options::on_treeWidgetShortcuts_itemSelectionChanged()
3418 {
3419 	QList<QTreeWidgetItem *> selItems = treeWidgetShortcuts->selectedItems();
3420 	if ( selItems.count() > 0 ) {
3421 		pushButtonRedefineKeySequence->setEnabled(true);
3422 		pushButtonResetShortcut->setEnabled(selItems[0]->text(2).length() > 0);
3423 	} else {
3424 		pushButtonRedefineKeySequence->setEnabled(false);
3425 		pushButtonResetShortcut->setEnabled(false);
3426 	}
3427 }
3428 
on_pushButtonRedefineKeySequence_clicked()3429 void Options::on_pushButtonRedefineKeySequence_clicked()
3430 {
3431 	QList<QTreeWidgetItem *> selItems = treeWidgetShortcuts->selectedItems();
3432 	if ( selItems.count() > 0 )
3433 		on_treeWidgetShortcuts_itemActivated(selItems[0]);
3434 }
3435 
on_pushButtonResetShortcut_clicked()3436 void Options::on_pushButtonResetShortcut_clicked()
3437 {
3438 	QList<QTreeWidgetItem *> selItems = treeWidgetShortcuts->selectedItems();
3439 	if ( selItems.count() > 0 ) {
3440 		QStringList words = selItems[0]->text(1).split("+");
3441 		QString nativeShortcut = "";
3442 		for (int i = 0; i < words.count(); i++) {
3443 			if ( i > 0 )
3444 				nativeShortcut += "+";
3445 			nativeShortcut += QObject::tr(words[i].toUtf8().constData());
3446 		}
3447 
3448 		bool found = false;
3449 		QHashIterator<QString, QPair<QString, QAction *> > it(qmc2ShortcutHash);
3450 		while ( it.hasNext() && !found ) {
3451 			it.next();
3452 			words = it.key().split("+");
3453 			QString itShortcut;
3454 			for (int i = 0; i < words.count(); i++) {
3455 				if ( i > 0 )
3456 					itShortcut += "+";
3457 				itShortcut += QObject::tr(words[i].toUtf8().constData());
3458 			}
3459 
3460 			if ( itShortcut == nativeShortcut ) {
3461 				found = true;
3462 				nativeShortcut = it.key();
3463 			}
3464 		}
3465 
3466 		if ( found ) {
3467 			qmc2CustomShortcutHash[nativeShortcut] = nativeShortcut;
3468 			selItems[0]->setText(2, "");
3469 			QTimer::singleShot(0, this, SLOT(checkShortcuts()));
3470 		}
3471 
3472 		pushButtonResetShortcut->setEnabled(false);
3473 	}
3474 }
3475 
on_pushButtonComponentSetup_clicked()3476 void Options::on_pushButtonComponentSetup_clicked()
3477 {
3478 	if ( !qmc2ComponentSetup )
3479 		return;
3480 	qmc2ComponentSetup->adjustIconSizes();
3481 	qmc2ComponentSetup->setParent(this);
3482 	qmc2ComponentSetup->setWindowFlags(Qt::Dialog);
3483 	if ( qmc2ComponentSetup->isHidden() )
3484 		qmc2ComponentSetup->show();
3485 	else if ( qmc2ComponentSetup->isMinimized() )
3486 		qmc2ComponentSetup->showNormal();
3487 	QTimer::singleShot(0, qmc2ComponentSetup, SLOT(raise()));
3488 }
3489 
on_pushButtonCustomizeToolBar_clicked()3490 void Options::on_pushButtonCustomizeToolBar_clicked()
3491 {
3492 	if ( !qmc2ToolBarCustomizer )
3493 		qmc2ToolBarCustomizer = new ToolBarCustomizer(this);
3494 
3495 	qmc2ToolBarCustomizer->exec();
3496 }
3497 
on_pushButtonIndividualFallbackSettings_clicked()3498 void Options::on_pushButtonIndividualFallbackSettings_clicked()
3499 {
3500 	IndividualFallbackSettings ifs(this);
3501 	ifs.exec();
3502 }
3503 
on_pushButtonEditPalette_clicked()3504 void Options::on_pushButtonEditPalette_clicked()
3505 {
3506 	QPalette currentPalette = qApp->palette();
3507 	if ( !qmc2PaletteEditor )
3508 		qmc2PaletteEditor = new PaletteEditor(this);
3509 	loadCustomPalette(currentStyleName());
3510 	qmc2PaletteEditor->activePalette = qmc2CustomPalette;
3511 	bool wasChecked = qmc2PaletteEditor->toolButtonPreview->isChecked();
3512 	qmc2PaletteEditor->toolButtonPreview->blockSignals(true);
3513 	qmc2PaletteEditor->toolButtonPreview->setChecked(false);
3514 	qmc2PaletteEditor->on_pushButtonRestore_clicked();
3515 	qmc2PaletteEditor->toolButtonPreview->setChecked(wasChecked);
3516 	qmc2PaletteEditor->toolButtonPreview->blockSignals(false);
3517 	qmc2PaletteEditor->activePalette = currentPalette;
3518 	qmc2PaletteEditor->show();
3519 	if ( qmc2PaletteEditor->toolButtonPreview->isChecked() ) {
3520 		qApp->setPalette(qmc2PaletteEditor->customPalette);
3521 		QTimer::singleShot(0, qmc2MainWindow, SLOT(updateUserData()));
3522 	} else
3523 		qApp->setPalette(currentPalette);
3524 	if ( qmc2PaletteEditor->exec() == QDialog::Accepted ) {
3525 		config->setValue(QMC2_FRONTEND_PREFIX + "GUI/StandardColorPalette", false);
3526 		qmc2CustomPalette = qmc2PaletteEditor->customPalette;
3527 		saveCustomPalette();
3528 	} else {
3529 		checkBoxStandardColorPalette->setChecked(config->value(QMC2_FRONTEND_PREFIX + "GUI/StandardColorPalette", true).toBool());
3530 		if ( checkBoxStandardColorPalette->isChecked() )
3531 			qApp->setPalette(qmc2StandardPalettes[currentStyleName()]);
3532 		else
3533 			qApp->setPalette(qmc2CustomPalette);
3534 	}
3535 	QTimer::singleShot(0, qmc2MainWindow, SLOT(updateUserData()));
3536 }
3537 
checkShortcuts()3538 void Options::checkShortcuts()
3539 {
3540 	static char lastShortcutsState = -1;
3541 	char shortcutsState = 1;
3542 	int itemCount = treeWidgetShortcuts->topLevelItemCount();
3543 	for (int i = 0; i < itemCount; i++) {
3544 		QTreeWidgetItem *iItem = treeWidgetShortcuts->topLevelItem(i);
3545 		if ( iItem->text(2).isEmpty() )
3546 			iItem->setForeground(1, greenBrush);
3547 		else
3548 			iItem->setForeground(1, greyBrush);
3549 		iItem->setForeground(2, greenBrush);
3550 	}
3551 	for (int i = 0; i < itemCount; i++) {
3552 		QTreeWidgetItem *iItem = treeWidgetShortcuts->topLevelItem(i);
3553 		int iColumn = 1;
3554 		if ( !iItem->text(2).isEmpty() )
3555 			iColumn = 2;
3556 		QString iShortcut(iItem->text(iColumn));
3557 		for (int j = i + 1; j < itemCount; j++) {
3558 			QTreeWidgetItem *jItem = treeWidgetShortcuts->topLevelItem(j);
3559 			int jColumn = 1;
3560 			if ( !jItem->text(2).isEmpty() )
3561 				jColumn = 2;
3562 			QString jShortcut(jItem->text(jColumn));
3563 			if ( iShortcut.compare(jShortcut) == 0 ) {
3564 				iItem->setForeground(iColumn, redBrush);
3565 				jItem->setForeground(jColumn, redBrush);
3566 				shortcutsState = 0;
3567 			}
3568 		}
3569 	}
3570 	if ( shortcutsState != lastShortcutsState || lastShortcutsState == -1 ) {
3571 		if ( shortcutsState == 1 )
3572 			qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("shortcut map is clean"));
3573 		else
3574 			qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("WARNING: shortcut map contains duplicates"));
3575 	}
3576 	lastShortcutsState = shortcutsState;
3577 }
3578 
setupShortcutActions()3579 void Options::setupShortcutActions()
3580 {
3581 	QHashIterator<QString, QPair<QString, QAction *> > it(qmc2ShortcutHash);
3582 	while ( it.hasNext() ) {
3583 		it.next();
3584 		QAction *action = it.value().second;
3585 		if ( action ) {
3586 			action->setShortcut(QKeySequence(qmc2CustomShortcutHash[it.key()]));
3587 			action->setShortcutContext(Qt::ApplicationShortcut);
3588 		}
3589 	}
3590 }
3591 
on_toolButtonBrowseAdditionalEmulatorExecutable_clicked()3592 void Options::on_toolButtonBrowseAdditionalEmulatorExecutable_clicked()
3593 {
3594 	QString s = QFileDialog::getOpenFileName(this, tr("Choose emulator executable file"), lineEditAdditionalEmulatorExecutableFile->text(), tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3595 	if ( !s.isNull() )
3596 		lineEditAdditionalEmulatorExecutableFile->setText(s);
3597 	raise();
3598 }
3599 
on_toolButtonBrowseAdditionalEmulatorWorkingDirectory_clicked()3600 void Options::on_toolButtonBrowseAdditionalEmulatorWorkingDirectory_clicked()
3601 {
3602 	QString startPath = lineEditAdditionalEmulatorWorkingDirectory->text();
3603 	if ( startPath.isEmpty() ) {
3604 		QString exePath = lineEditAdditionalEmulatorExecutableFile->text();
3605 		if ( !exePath.isEmpty() ) {
3606 			QFileInfo fi(exePath);
3607 			startPath = fi.absolutePath();
3608 		}
3609 	}
3610 	QString s = QFileDialog::getExistingDirectory(this, tr("Choose working directory"), startPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks | (useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog));
3611 	if ( !s.isNull() ) {
3612 		if ( !s.endsWith("/") )
3613 			s += "/";
3614 		lineEditAdditionalEmulatorWorkingDirectory->setText(s);
3615 	}
3616 	raise();
3617 }
3618 
on_toolButtonAddEmulator_clicked()3619 void Options::on_toolButtonAddEmulator_clicked()
3620 {
3621 	tableWidgetRegisteredEmulators->setSortingEnabled(false);
3622 	int row = tableWidgetRegisteredEmulators->rowCount();
3623 	tableWidgetRegisteredEmulators->insertRow(row);
3624 	tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_NAME, new QTableWidgetItem(lineEditAdditionalEmulatorName->text()));
3625 	tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_EXEC, new QTableWidgetItem(lineEditAdditionalEmulatorExecutableFile->text()));
3626 	tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_WDIR, new QTableWidgetItem(lineEditAdditionalEmulatorWorkingDirectory->text()));
3627 	tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_ARGS, new QTableWidgetItem(lineEditAdditionalEmulatorArguments->text()));
3628 	QToolButton *tb = new QToolButton(0);
3629 	tb->setObjectName(lineEditAdditionalEmulatorName->text());
3630 	tb->setAutoFillBackground(true);
3631 	tb->setText(tr("Custom IDs..."));
3632 	tb->setToolTip(tr("Specify pre-defined foreign IDs for this emulator, launchable from the 'foreign emulators' view"));
3633 	tableWidgetRegisteredEmulators->setCellWidget(row, QMC2_ADDTLEMUS_COLUMN_CUID, tb);
3634 	connect(tb, SIGNAL(clicked()), this, SLOT(setupCustomIDsClicked()));
3635 	tb = new QToolButton(0);
3636 	QFontMetrics fm(qApp->font());
3637 	tb->setIconSize(QSize(fm.height(), fm.height()));
3638 	tb->setIcon(QIcon(QString::fromUtf8(":/data/img/alien.png")));
3639 	tb->setWhatsThis(":/data/img/alien.png");
3640 	tb->setToolTip(tr("Choose icon for this foreign emulator (hold down for menu)"));
3641 	QMenu *menu = new QMenu(tb);
3642 	QAction *action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/alien.png")), tr("Default icon"));
3643 	connect(action, SIGNAL(triggered(bool)), this, SLOT(actionDefaultEmuIconTriggered()));
3644 	menu->addSeparator();
3645 	action = menu->addAction(QIcon(QString::fromUtf8(":/data/img/no.png")), tr("No icon"));
3646 	connect(action, SIGNAL(triggered(bool)), this, SLOT(actionNoEmuIconTriggered()));
3647 	tb->setMenu(menu);
3648 	tableWidgetRegisteredEmulators->setCellWidget(row, QMC2_ADDTLEMUS_COLUMN_ICON, tb);
3649 	connect(tb, SIGNAL(clicked()), this, SLOT(chooseEmuIconClicked()));
3650 	tableWidgetRegisteredEmulators->resizeRowsToContents();
3651 	on_lineEditAdditionalEmulatorName_textChanged(lineEditAdditionalEmulatorName->text());
3652 	tableWidgetRegisteredEmulators->setSortingEnabled(true);
3653 }
3654 
on_toolButtonSaveEmulator_clicked()3655 void Options::on_toolButtonSaveEmulator_clicked()
3656 {
3657 	tableWidgetRegisteredEmulators->setSortingEnabled(false);
3658 	QString name = lineEditAdditionalEmulatorName->text();
3659 	if ( !name.isEmpty() ) {
3660 		QList<QTableWidgetItem *> il = tableWidgetRegisteredEmulators->findItems(name, Qt::MatchExactly);
3661 		if ( !il.isEmpty() ) {
3662 			int row = il[0]->row();
3663 			if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME) )
3664 				tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME)->setText(name);
3665 			else
3666 				tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_NAME, new QTableWidgetItem(lineEditAdditionalEmulatorName->text()));
3667 			if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_EXEC) )
3668 				tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_EXEC)->setText(lineEditAdditionalEmulatorExecutableFile->text());
3669 			else
3670 				tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_EXEC, new QTableWidgetItem(lineEditAdditionalEmulatorExecutableFile->text()));
3671 			if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_WDIR) )
3672 				tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_WDIR)->setText(lineEditAdditionalEmulatorWorkingDirectory->text());
3673 			else
3674 				tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_WDIR, new QTableWidgetItem(lineEditAdditionalEmulatorWorkingDirectory->text()));
3675 			if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_ARGS) )
3676 				tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_ARGS)->setText(lineEditAdditionalEmulatorArguments->text());
3677 			else
3678 				tableWidgetRegisteredEmulators->setItem(row, QMC2_ADDTLEMUS_COLUMN_ARGS, new QTableWidgetItem(lineEditAdditionalEmulatorArguments->text()));
3679 		}
3680 	}
3681 	tableWidgetRegisteredEmulators->setSortingEnabled(true);
3682 }
3683 
on_toolButtonRemoveEmulator_clicked()3684 void Options::on_toolButtonRemoveEmulator_clicked()
3685 {
3686 	QList<QTableWidgetItem *> sl = tableWidgetRegisteredEmulators->selectedItems();
3687 	if ( !sl.isEmpty() ) {
3688 		int row = sl[0]->row();
3689 		registeredEmulatorsToBeRemoved << tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME)->text();
3690 		tableWidgetRegisteredEmulators->removeRow(row);
3691 	}
3692 }
3693 
on_toolButtonCustomIDs_clicked()3694 void Options::on_toolButtonCustomIDs_clicked()
3695 {
3696 	QList<QTableWidgetItem *> sl = tableWidgetRegisteredEmulators->selectedItems();
3697 	if ( !sl.isEmpty() ) {
3698 		int row = sl[0]->row();
3699 		if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME) ) {
3700 			CustomIDSetup cidSetup(tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME)->text(), this);
3701 			if ( cidSetup.exec() == QDialog::Accepted )
3702 				cidSetup.save();
3703 		}
3704 	}
3705 }
3706 
checkPlaceholderStatus()3707 void Options::checkPlaceholderStatus()
3708 {
3709 	QPalette pal(labelIDStatus->palette());
3710 	QString text(lineEditAdditionalEmulatorArguments->text());
3711 	if ( lineEditAdditionalEmulatorName->text().isEmpty() )
3712 		pal.setBrush(QPalette::Window, Options::lightgreyBrush);
3713 	else if ( text.isEmpty() )
3714 		pal.setBrush(QPalette::Window, Options::yellowBrush);
3715 	else if ( text.contains("$ID$") )
3716 		pal.setBrush(QPalette::Window, Options::greenBrush);
3717 	else
3718 		pal.setBrush(QPalette::Window, Options::yellowBrush);
3719 	labelIDStatus->setPalette(pal);
3720 }
3721 
on_tableWidgetRegisteredEmulators_itemSelectionChanged()3722 void Options::on_tableWidgetRegisteredEmulators_itemSelectionChanged()
3723 {
3724 	QList<QTableWidgetItem *> sl = tableWidgetRegisteredEmulators->selectedItems();
3725 	if ( !sl.isEmpty() ) {
3726 		int row = sl[0]->row();
3727 		if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME) ) {
3728 			lineEditAdditionalEmulatorName->setText(tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_NAME)->text());
3729 			toolButtonRemoveEmulator->setEnabled(true);
3730 			toolButtonCustomIDs->setEnabled(true);
3731 		} else {
3732 			lineEditAdditionalEmulatorName->clear();
3733 			toolButtonRemoveEmulator->setEnabled(false);
3734 			toolButtonCustomIDs->setEnabled(false);
3735 		}
3736 		if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_EXEC) )
3737 			lineEditAdditionalEmulatorExecutableFile->setText(tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_EXEC)->text());
3738 		else
3739 			lineEditAdditionalEmulatorExecutableFile->clear();
3740 		if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_WDIR) )
3741 			lineEditAdditionalEmulatorWorkingDirectory->setText(tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_WDIR)->text());
3742 		else
3743 			lineEditAdditionalEmulatorWorkingDirectory->clear();
3744 		if ( tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_ARGS) )
3745 			lineEditAdditionalEmulatorArguments->setText(tableWidgetRegisteredEmulators->item(row, QMC2_ADDTLEMUS_COLUMN_ARGS)->text());
3746 		else
3747 			lineEditAdditionalEmulatorArguments->clear();
3748 	} else {
3749 		lineEditAdditionalEmulatorName->clear();
3750 		lineEditAdditionalEmulatorExecutableFile->clear();
3751 		lineEditAdditionalEmulatorWorkingDirectory->clear();
3752 		lineEditAdditionalEmulatorArguments->clear();
3753 		toolButtonRemoveEmulator->setEnabled(false);
3754 		toolButtonCustomIDs->setEnabled(false);
3755 	}
3756 	checkPlaceholderStatus();
3757 }
3758 
on_lineEditAdditionalEmulatorName_textChanged(const QString & text)3759 void Options::on_lineEditAdditionalEmulatorName_textChanged(const QString &text)
3760 {
3761 	if ( !text.isEmpty() ) {
3762 		if ( text == tr("Default") ) {
3763 			// this name isn't allowed!
3764 			toolButtonAddEmulator->setEnabled(false);
3765 			toolButtonSaveEmulator->setEnabled(false);
3766 			toolButtonRemoveEmulator->setEnabled(false);
3767 			toolButtonCustomIDs->setEnabled(false);
3768 		} else {
3769 			QList<QTableWidgetItem *> il = tableWidgetRegisteredEmulators->findItems(text, Qt::MatchExactly);
3770 			toolButtonAddEmulator->setEnabled(il.isEmpty());
3771 			toolButtonSaveEmulator->setEnabled(!il.isEmpty());
3772 			toolButtonRemoveEmulator->setEnabled(!il.isEmpty());
3773 			toolButtonCustomIDs->setEnabled(!il.isEmpty());
3774 		}
3775 	} else {
3776 		toolButtonAddEmulator->setEnabled(false);
3777 		toolButtonSaveEmulator->setEnabled(false);
3778 		toolButtonRemoveEmulator->setEnabled(false);
3779 		toolButtonCustomIDs->setEnabled(false);
3780 	}
3781 	checkPlaceholderStatus();
3782 }
3783 
on_lineEditAdditionalEmulatorArguments_textChanged(const QString &)3784 void Options::on_lineEditAdditionalEmulatorArguments_textChanged(const QString &)
3785 {
3786 	checkPlaceholderStatus();
3787 }
3788 
setupCustomIDsClicked()3789 void Options::setupCustomIDsClicked()
3790 {
3791 	QToolButton *tb = (QToolButton *)sender();
3792 	if ( tb ) {
3793 		if ( !tb->objectName().isEmpty() ) {
3794 			CustomIDSetup cidSetup(tb->objectName(), this);
3795 			if ( cidSetup.exec() == QDialog::Accepted )
3796 				cidSetup.save();
3797 		}
3798 	}
3799 }
3800 
chooseEmuIconClicked()3801 void Options::chooseEmuIconClicked()
3802 {
3803 	QToolButton *tb = (QToolButton *)sender();
3804 	if ( tb ) {
3805 		QString emuIcon = tb->whatsThis();
3806 		if ( emuIcon.startsWith(":") )
3807 			emuIcon.clear();
3808 		QStringList imageFileTypes;
3809 		foreach (QByteArray imageFormat, QImageReader::supportedImageFormats())
3810 			imageFileTypes << "*." + QString(imageFormat).toLower();
3811 		QString fileName = QFileDialog::getOpenFileName(this, tr("Choose image file"), emuIcon, tr("Supported image files (%1)").arg(imageFileTypes.join(" ")) + ";;" + tr("All files (*)"), 0, useNativeFileDialogs() ? (QFileDialog::Options)0 : QFileDialog::DontUseNativeDialog);
3812 		if ( !fileName.isEmpty() ) {
3813 			QIcon icon = QIcon(fileName);
3814 			if ( !icon.isNull() ) {
3815 				tb->setIcon(icon);
3816 				tb->setWhatsThis(fileName);
3817 			}
3818 		}
3819 	}
3820 }
3821 
actionDefaultEmuIconTriggered()3822 void Options::actionDefaultEmuIconTriggered()
3823 {
3824 	QAction *action = (QAction *)sender();
3825 	if ( action ) {
3826 		QToolButton *tb = (QToolButton *)action->parentWidget()->parentWidget();
3827 		if ( tb ) {
3828 			tb->setIcon(QIcon(QString::fromUtf8(":/data/img/alien.png")));
3829 			tb->setWhatsThis(":/data/img/alien.png");
3830 		}
3831 	}
3832 }
3833 
actionNoEmuIconTriggered()3834 void Options::actionNoEmuIconTriggered()
3835 {
3836 	QAction *action = (QAction *)sender();
3837 	if ( action ) {
3838 		QToolButton *tb = (QToolButton *)action->parentWidget()->parentWidget();
3839 		if ( tb ) {
3840 			tb->setIcon(QIcon());
3841 			tb->setWhatsThis("[none]");
3842 		}
3843 	}
3844 }
3845 
loadCustomPalette(QString styleName)3846 void Options::loadCustomPalette(QString styleName)
3847 {
3848 	qmc2CustomPalette = qmc2StandardPalettes[styleName];
3849 	QStringList activeColors, inactiveColors, disabledColors;
3850 	if ( config->contains(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/ActiveColors") )
3851 		activeColors = config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/ActiveColors").toStringList();
3852 	for (int i = 0; i < activeColors.count(); i++) {
3853 		QPalette::ColorRole colorRole = PaletteEditor::colorNameToRole(PaletteEditor::colorNames[i]);
3854 		qmc2CustomPalette.setColor(QPalette::Active, colorRole, QColor(activeColors[i]));
3855 	}
3856 	if ( config->contains(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/InactiveColors") )
3857 		inactiveColors = config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/InactiveColors").toStringList();
3858 	for (int i = 0; i < inactiveColors.count(); i++) {
3859 		QPalette::ColorRole colorRole = PaletteEditor::colorNameToRole(PaletteEditor::colorNames[i]);
3860 		qmc2CustomPalette.setColor(QPalette::Inactive, colorRole, QColor(inactiveColors[i]));
3861 	}
3862 	if ( config->contains(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/DisabledColors") )
3863 		disabledColors = config->value(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/DisabledColors").toStringList();
3864 	for (int i = 0; i < disabledColors.count(); i++) {
3865 		QPalette::ColorRole colorRole = PaletteEditor::colorNameToRole(PaletteEditor::colorNames[i]);
3866 		qmc2CustomPalette.setColor(QPalette::Disabled, colorRole, QColor(disabledColors[i]));
3867 	}
3868 }
3869 
saveCustomPalette()3870 void Options::saveCustomPalette()
3871 {
3872 	QStringList activeColors, inactiveColors, disabledColors;
3873 	for (int i = 0; i < PaletteEditor::colorNames.count(); i++) {
3874 		QPalette::ColorRole colorRole = PaletteEditor::colorNameToRole(PaletteEditor::colorNames[i]);
3875 		activeColors << qmc2CustomPalette.color(QPalette::Active, colorRole).name();
3876 		inactiveColors << qmc2CustomPalette.color(QPalette::Inactive, colorRole).name();
3877 		disabledColors << qmc2CustomPalette.color(QPalette::Disabled, colorRole).name();
3878 	}
3879 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/ActiveColors", activeColors);
3880 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/InactiveColors", inactiveColors);
3881 	config->setValue(QMC2_FRONTEND_PREFIX + "Layout/CustomPalette/DisabledColors", disabledColors);
3882 }
3883 
enableWidgets(bool enable)3884 void Options::enableWidgets(bool enable)
3885 {
3886 	toolButtonBrowseStyleSheet->setEnabled(enable);
3887 	toolButtonBrowseFont->setEnabled(enable);
3888 	toolButtonBrowseLogFont->setEnabled(enable);
3889 	toolButtonBrowseFrontendLogFile->setEnabled(enable);
3890 	toolButtonBrowsePreviewDirectory->setEnabled(enable);
3891 	toolButtonBrowsePreviewFile->setEnabled(enable);
3892 	toolButtonBrowseDataDirectory->setEnabled(enable);
3893 	toolButtonBrowseDatInfoDatabase->setEnabled(enable);
3894 	toolButtonBrowseMameHistoryDat->setEnabled(enable);
3895 	toolButtonBrowseMessSysinfoDat->setEnabled(enable);
3896 	checkBoxProcessMameHistoryDat->setEnabled(enable);
3897 	checkBoxProcessMessSysinfoDat->setEnabled(enable);
3898 	toolButtonBrowseMameInfoDat->setEnabled(enable);
3899 	toolButtonBrowseMessInfoDat->setEnabled(enable);
3900 	checkBoxProcessMameInfoDat->setEnabled(enable);
3901 	checkBoxProcessMessInfoDat->setEnabled(enable);
3902 	toolButtonBrowseSoftwareInfoDB->setEnabled(enable);
3903 	checkBoxProcessSoftwareInfoDB->setEnabled(enable);
3904 	toolButtonImportGameInfo->setEnabled(enable);
3905 	toolButtonImportMachineInfo->setEnabled(enable);
3906 	toolButtonImportMameInfo->setEnabled(enable);
3907 	toolButtonImportMessInfo->setEnabled(enable);
3908 	toolButtonImportSoftwareInfo->setEnabled(enable);
3909 	toolButtonOptimizeCatverIni->setEnabled(enable);
3910 	toolButtonSetupIconDatabase->setEnabled(enable);
3911 	toolButtonBrowseCatverIniFile->setEnabled(enable);
3912 	checkBoxUseCatverIni->setEnabled(enable);
3913 	toolButtonBrowseCategoryIniFile->setEnabled(enable);
3914 	checkBoxUseCategoryIni->setEnabled(enable);
3915 	checkBoxShowROMStatusIcons->setEnabled(enable);
3916 	checkBoxRomStateFilter->setEnabled(enable);
3917 	checkBoxDynamicStateFilter->setEnabled(checkBoxRomStateFilter->isChecked() && enable);
3918 	checkBoxShowBiosSets->setEnabled(enable);
3919 	checkBoxShowDeviceSets->setEnabled(enable);
3920 	toolButtonBrowseSoftwareListCacheDb->setEnabled(enable);
3921 	toolButtonBrowseSoftwareStateCache->setEnabled(enable);
3922 	toolButtonBrowseGeneralSoftwareFolder->setEnabled(enable);
3923 	toolButtonBrowseExecutableFile->setEnabled(enable);
3924 	lineEditExecutableFile->setEnabled(enable);
3925 	toolButtonBrowseWorkingDirectory->setEnabled(enable);
3926 	toolButtonBrowseEmulatorLogFile->setEnabled(enable);
3927 	toolButtonBrowseOptionsTemplateFile->setEnabled(enable);
3928 	toolButtonBrowseXmlCacheDatabase->setEnabled(enable);
3929 	toolButtonBrowseUserDataDatabase->setEnabled(enable);
3930 	toolButtonCleanupUserDataDatabase->setEnabled(enable);
3931 	toolButtonClearUserDataDatabase->setEnabled(enable);
3932 	toolButtonBrowseFavoritesFile->setEnabled(enable);
3933 	toolButtonBrowseHistoryFile->setEnabled(enable);
3934 	toolButtonBrowseMachineListCacheFile->setEnabled(enable);
3935 	toolButtonBrowseMachineListDatabase->setEnabled(enable);
3936 	toolButtonBrowseROMStateCacheFile->setEnabled(enable);
3937 	toolButtonBrowseFlyerDirectory->setEnabled(enable);
3938 	toolButtonBrowseFlyerFile->setEnabled(enable);
3939 	toolButtonBrowseIconDirectory->setEnabled(enable);
3940 	toolButtonBrowseIconFile->setEnabled(enable);
3941 	toolButtonBrowseCabinetDirectory->setEnabled(enable);
3942 	toolButtonBrowseCabinetFile->setEnabled(enable);
3943 	toolButtonBrowseControllerDirectory->setEnabled(enable);
3944 	toolButtonBrowseControllerFile->setEnabled(enable);
3945 	toolButtonBrowseMarqueeDirectory->setEnabled(enable);
3946 	toolButtonBrowseMarqueeFile->setEnabled(enable);
3947 	toolButtonBrowseTitleDirectory->setEnabled(enable);
3948 	toolButtonBrowseTitleFile->setEnabled(enable);
3949 	toolButtonBrowsePCBDirectory->setEnabled(enable);
3950 	toolButtonBrowsePCBFile->setEnabled(enable);
3951 	comboBoxIconFileType->setEnabled(enable);
3952 	comboBoxPreviewFileType->setEnabled(enable);
3953 	comboBoxFlyerFileType->setEnabled(enable);
3954 	comboBoxCabinetFileType->setEnabled(enable);
3955 	comboBoxControllerFileType->setEnabled(enable);
3956 	comboBoxMarqueeFileType->setEnabled(enable);
3957 	comboBoxTitleFileType->setEnabled(enable);
3958 	comboBoxPCBFileType->setEnabled(enable);
3959 	comboBoxSoftwareSnapFileType->setEnabled(enable);
3960 	toolButtonBrowseSoftwareSnapDirectory->setEnabled(enable);
3961 	toolButtonBrowseSoftwareSnapFile->setEnabled(enable);
3962 	toolButtonBrowseSoftwareNotesFolder->setEnabled(enable);
3963 	toolButtonBrowseSoftwareNotesTemplate->setEnabled(enable);
3964 	toolButtonBrowseSystemNotesFolder->setEnabled(enable);
3965 	toolButtonBrowseSystemNotesTemplate->setEnabled(enable);
3966 	toolButtonBrowseVideoSnapFolder->setEnabled(enable);
3967 	toolButtonScanSystemManuals->setEnabled(enable);
3968 	toolButtonBrowseSystemManualFolder->setEnabled(enable);
3969 	toolButtonScanSoftwareManuals->setEnabled(enable);
3970 	toolButtonBrowseSoftwareManualFolder->setEnabled(enable);
3971 	toolButtonShowC->setEnabled(enable);
3972 	toolButtonShowM->setEnabled(enable);
3973 	toolButtonShowI->setEnabled(enable);
3974 	toolButtonShowN->setEnabled(enable);
3975 	toolButtonShowU->setEnabled(enable);
3976 	treeWidgetShortcuts->clearSelection();
3977 	treeWidgetShortcuts->setEnabled(enable);
3978 	treeWidgetJoystickMappings->clearSelection();
3979 	treeWidgetJoystickMappings->setEnabled(enable);
3980 	toolButtonBrowseCookieDatabase->setEnabled(enable);
3981 	pushButtonManageCookies->setEnabled(enable ? checkBoxRestoreCookies->isChecked() : false);
3982 	toolButtonBrowseZipTool->setEnabled(enable);
3983 	toolButtonBrowseSevenZipTool->setEnabled(enable);
3984 	toolButtonBrowseRomTool->setEnabled(enable);
3985 	toolButtonBrowseRomToolWorkingDirectory->setEnabled(enable);
3986 	toolButtonBrowseAdditionalEmulatorExecutable->setEnabled(enable);
3987 	toolButtonBrowseAdditionalEmulatorWorkingDirectory->setEnabled(enable);
3988 	pushButtonCustomizeToolBar->setEnabled(enable);
3989 	checkBoxParentImageFallback->setEnabled(enable);
3990 	pushButtonIndividualFallbackSettings->setEnabled(enable && checkBoxParentImageFallback->isChecked());
3991 	checkBoxStandardColorPalette->setEnabled(enable);
3992 	pushButtonEditPalette->setEnabled(enable && !checkBoxStandardColorPalette->isChecked());
3993 	pushButtonAdditionalArtworkSetup->setEnabled(enable);
3994 	pushButtonImageFormats->setEnabled(enable);
3995 	for (int row = 0; row < tableWidgetRegisteredEmulators->rowCount(); row++) {
3996 		QWidget *w = tableWidgetRegisteredEmulators->cellWidget(row, QMC2_ADDTLEMUS_COLUMN_ICON);
3997 		if ( w )
3998 			w->setEnabled(enable);
3999 		w = tableWidgetRegisteredEmulators->cellWidget(row, QMC2_ADDTLEMUS_COLUMN_CUID);
4000 		if ( w )
4001 			w->setEnabled(enable);
4002 	}
4003 }
4004 
4005 #if QMC2_JOYSTICK == 1
on_pushButtonRescanJoysticks_clicked()4006 void Options::on_pushButtonRescanJoysticks_clicked()
4007 {
4008 	toolButtonMapJoystick->setChecked(true);
4009 	on_toolButtonMapJoystick_clicked();
4010 
4011 	if ( !cancelClicked ) {
4012 		QStringList joystickNames;
4013 		joystickNames << tr("No joysticks found");
4014 
4015 		if ( joystick )
4016 			delete joystick;
4017 
4018 		joystick = new Joystick(0, spinBoxJoystickEventTimeout->value(), checkBoxJoystickAutoRepeat->isChecked(), spinBoxJoystickAutoRepeatTimeout->value());
4019 
4020 		if ( joystick ) {
4021 			if ( joystick->joystickNames.count() > 0 )
4022 				joystickNames = joystick->joystickNames;
4023 		} else
4024 			qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("ERROR: couldn't initialize SDL joystick support"));
4025 
4026 		comboBoxSelectJoysticks->clear();
4027 		comboBoxSelectJoysticks->insertItems(0, joystickNames);
4028 		comboBoxSelectJoysticks->setCurrentIndex(config->value(QMC2_FRONTEND_PREFIX + "Joystick/Index", 0).toInt());
4029 	}
4030 }
4031 
on_toolButtonCalibrateAxes_clicked()4032 void Options::on_toolButtonCalibrateAxes_clicked()
4033 {
4034 	qmc2JoystickIsCalibrating = false;
4035 
4036 	if ( comboBoxSelectJoysticks->currentText() == tr("No joysticks found") || comboBoxSelectJoysticks->currentIndex() < 0 ) {
4037 		toolButtonMapJoystick->setChecked(true);
4038 		on_toolButtonMapJoystick_clicked();
4039 		return;
4040 	}
4041 
4042 	if ( joystick ) {
4043 		if ( joystick->isOpen() )
4044 			joystick->close();
4045 		if ( joystick->open(comboBoxSelectJoysticks->currentIndex()) ) {
4046 			// create joystick calibration widget
4047 			QGridLayout *myLayout = (QGridLayout *)qmc2Options->frameCalibrationAndTest->layout();
4048 			if ( joystickTestWidget ) {
4049 				myLayout->removeWidget(scrollArea);
4050 				scrollArea->takeWidget();
4051 				scrollArea->hide();
4052 				delete joystickTestWidget;
4053 				joystickTestWidget = 0;
4054 			} else if ( joystickCalibrationWidget ) {
4055 				myLayout->removeWidget(scrollArea);
4056 				scrollArea->takeWidget();
4057 				scrollArea->hide();
4058 				delete joystickCalibrationWidget;
4059 				joystickCalibrationWidget = 0;
4060 			} else {
4061 				myLayout->removeWidget(pushButtonRemapJoystickFunction);
4062 				myLayout->removeWidget(pushButtonRemoveJoystickMapping);
4063 				myLayout->removeWidget(treeWidgetJoystickMappings);
4064 				pushButtonRemapJoystickFunction->hide();
4065 				pushButtonRemoveJoystickMapping->hide();
4066 				treeWidgetJoystickMappings->hide();
4067 			}
4068 			joystickCalibrationWidget = new JoystickCalibrationWidget(joystick, frameCalibrationAndTest);
4069 			myLayout->addWidget(scrollArea);
4070 			scrollArea->setWidget(joystickCalibrationWidget);
4071 			scrollArea->show();
4072 			joystickCalibrationWidget->show();
4073 			qmc2JoystickIsCalibrating = true;
4074 		} else {
4075 			toolButtonMapJoystick->setChecked(true);
4076 			on_toolButtonMapJoystick_clicked();
4077 		}
4078 	} else {
4079 		toolButtonMapJoystick->setChecked(true);
4080 		on_toolButtonMapJoystick_clicked();
4081 	}
4082 }
4083 
on_toolButtonTestJoystick_clicked()4084 void Options::on_toolButtonTestJoystick_clicked()
4085 {
4086 	qmc2JoystickIsCalibrating = false;
4087 
4088 	if ( comboBoxSelectJoysticks->currentText() == tr("No joysticks found") || comboBoxSelectJoysticks->currentIndex() < 0 ) {
4089 		toolButtonMapJoystick->setChecked(true);
4090 		on_toolButtonMapJoystick_clicked();
4091 		return;
4092 	}
4093 
4094 	if ( joystick ) {
4095 		if ( joystick->isOpen() )
4096 			joystick->close();
4097 		if ( joystick->open(comboBoxSelectJoysticks->currentIndex()) ) {
4098 			// create joystick test widget
4099 			QGridLayout *myLayout = (QGridLayout *)qmc2Options->frameCalibrationAndTest->layout();
4100 			if ( joystickTestWidget ) {
4101 				myLayout->removeWidget(scrollArea);
4102 				scrollArea->takeWidget();
4103 				scrollArea->hide();
4104 				delete joystickTestWidget;
4105 				joystickTestWidget = 0;
4106 			} else if ( joystickCalibrationWidget ) {
4107 				myLayout->removeWidget(scrollArea);
4108 				scrollArea->takeWidget();
4109 				scrollArea->hide();
4110 				delete joystickCalibrationWidget;
4111 				joystickCalibrationWidget = 0;
4112 			} else {
4113 				myLayout->removeWidget(pushButtonRemapJoystickFunction);
4114 				myLayout->removeWidget(pushButtonRemoveJoystickMapping);
4115 				myLayout->removeWidget(treeWidgetJoystickMappings);
4116 				pushButtonRemapJoystickFunction->hide();
4117 				pushButtonRemoveJoystickMapping->hide();
4118 				treeWidgetJoystickMappings->hide();
4119 			}
4120 			joystickTestWidget = new JoystickTestWidget(joystick, frameCalibrationAndTest);
4121 			myLayout->addWidget(scrollArea);
4122 			scrollArea->setWidget(joystickTestWidget);
4123 			scrollArea->show();
4124 			joystickTestWidget->show();
4125 		} else {
4126 			toolButtonMapJoystick->setChecked(true);
4127 			on_toolButtonMapJoystick_clicked();
4128 		}
4129 	} else {
4130 		toolButtonMapJoystick->setChecked(true);
4131 		on_toolButtonMapJoystick_clicked();
4132 	}
4133 }
4134 
on_toolButtonMapJoystick_clicked()4135 void Options::on_toolButtonMapJoystick_clicked()
4136 {
4137 	qmc2JoystickIsCalibrating = false;
4138 
4139 	bool relayout = ( joystickCalibrationWidget || joystickTestWidget );
4140 
4141 	if ( joystickCalibrationWidget ) {
4142 		frameCalibrationAndTest->layout()->removeWidget(scrollArea);
4143 		scrollArea->takeWidget();
4144 		scrollArea->hide();
4145 		delete joystickCalibrationWidget;
4146 		joystickCalibrationWidget = 0;
4147 	}
4148 	if ( joystickTestWidget ) {
4149 		frameCalibrationAndTest->layout()->removeWidget(scrollArea);
4150 		scrollArea->takeWidget();
4151 		scrollArea->hide();
4152 		delete joystickTestWidget;
4153 		joystickTestWidget = 0;
4154 	}
4155 
4156 	if ( relayout ) {
4157 		QGridLayout *myLayout = (QGridLayout *)qmc2Options->frameCalibrationAndTest->layout();
4158 		myLayout->addWidget(pushButtonRemapJoystickFunction, 0, 0);
4159 		myLayout->addWidget(pushButtonRemoveJoystickMapping, 0, 1);
4160 		myLayout->addWidget(treeWidgetJoystickMappings, 1, 0, 1, 2);
4161 		pushButtonRemapJoystickFunction->show();
4162 		pushButtonRemoveJoystickMapping->show();
4163 		treeWidgetJoystickMappings->show();
4164 	}
4165 }
4166 
on_comboBoxSelectJoysticks_currentIndexChanged(int index)4167 void Options::on_comboBoxSelectJoysticks_currentIndexChanged(int index)
4168 {
4169 	if ( comboBoxSelectJoysticks->currentText() == tr("No joysticks found") || index < 0 ) {
4170 		labelJoystickAxesNum->setText("0");
4171 		labelJoystickButtonsNum->setText("0");
4172 		labelJoystickHatsNum->setText("0");
4173 		labelJoystickTrackballsNum->setText("0");
4174 		return;
4175 	}
4176 
4177 	if ( joystick )
4178 		if ( joystick->open(index) ) {
4179 			labelJoystickAxesNum->setText(QString::number(joystick->numAxes));
4180 			labelJoystickButtonsNum->setText(QString::number(joystick->numButtons));
4181 			labelJoystickHatsNum->setText(QString::number(joystick->numHats));
4182 			labelJoystickTrackballsNum->setText(QString::number(joystick->numTrackballs));
4183 			if ( qmc2MainWindow ) {
4184 				// (re)connect joystick callbacks to main widget
4185 				joystick->disconnect(qmc2MainWindow);
4186 				connect(joystick, SIGNAL(axisValueChanged(int, int)), qmc2MainWindow, SLOT(joystickAxisValueChanged(int, int)));
4187 				connect(joystick, SIGNAL(buttonValueChanged(int, bool)), qmc2MainWindow, SLOT(joystickButtonValueChanged(int, bool)));
4188 				connect(joystick, SIGNAL(hatValueChanged(int, int)), qmc2MainWindow, SLOT(joystickHatValueChanged(int, int)));
4189 				connect(joystick, SIGNAL(trackballValueChanged(int, int, int)), qmc2MainWindow, SLOT(joystickTrackballValueChanged(int, int, int)));
4190 			}
4191 		}
4192 }
4193 
on_checkBoxEnableJoystickControl_toggled(bool enable)4194 void Options::on_checkBoxEnableJoystickControl_toggled(bool enable)
4195 {
4196 	toolButtonMapJoystick->setChecked(true);
4197 	on_toolButtonMapJoystick_clicked();
4198 }
4199 
on_checkBoxJoystickAutoRepeat_toggled(bool repeat)4200 void Options::on_checkBoxJoystickAutoRepeat_toggled(bool repeat)
4201 {
4202 	if ( joystick )
4203 		joystick->autoRepeat = repeat;
4204 }
4205 
on_spinBoxJoystickAutoRepeatTimeout_valueChanged(int value)4206 void Options::on_spinBoxJoystickAutoRepeatTimeout_valueChanged(int value)
4207 {
4208 	if ( joystick )
4209 		joystick->autoRepeatDelay = value;
4210 }
4211 
on_spinBoxJoystickEventTimeout_valueChanged(int value)4212 void Options::on_spinBoxJoystickEventTimeout_valueChanged(int value)
4213 {
4214 	if ( joystick ) {
4215 		joystick->eventTimeout = value;
4216 		if ( joystick->isOpen() )
4217 			joystick->joystickTimer.start(joystick->eventTimeout);
4218 	}
4219 }
4220 
on_treeWidgetJoystickMappings_itemActivated(QTreeWidgetItem * item)4221 void Options::on_treeWidgetJoystickMappings_itemActivated(QTreeWidgetItem *item)
4222 {
4223 	if ( !item )
4224 		return;
4225 
4226 	if ( joystick ) {
4227 		if ( joystick->isOpen() )
4228 			joystick->close();
4229 		if ( joystick->open(comboBoxSelectJoysticks->currentIndex()) ) {
4230 			// suppress strange Qt warning messages (this works - basta! :)
4231 			bool saveSQM = qmc2SuppressQtMessages;
4232 			qmc2SuppressQtMessages = true;
4233 			JoystickFunctionScanner joyFuncScanner(joystick, false, this);
4234 			if ( joyFuncScanner.exec() == QDialog::Accepted ) {
4235 				item->setText(1, joyFuncScanner.labelJoystickFunction->text());
4236 				qmc2JoystickFunctionHash.insertMulti(joyFuncScanner.labelJoystickFunction->text(), item->whatsThis(0));
4237 				pushButtonRemoveJoystickMapping->setEnabled(item->text(1).length() > 0);
4238 				QTimer::singleShot(0, this, SLOT(checkJoystickMappings()));
4239 			}
4240 			qmc2SuppressQtMessages = saveSQM;
4241 		}
4242 	}
4243 }
4244 
on_treeWidgetJoystickMappings_itemSelectionChanged()4245 void Options::on_treeWidgetJoystickMappings_itemSelectionChanged()
4246 {
4247 	QList<QTreeWidgetItem *> selItems = treeWidgetJoystickMappings->selectedItems();
4248 	if ( selItems.count() > 0 ) {
4249 		pushButtonRemapJoystickFunction->setEnabled(true);
4250 		pushButtonRemoveJoystickMapping->setEnabled(selItems[0]->text(1).length() > 0);
4251 	} else {
4252 		pushButtonRemapJoystickFunction->setEnabled(false);
4253 		pushButtonRemoveJoystickMapping->setEnabled(false);
4254 	}
4255 }
4256 
on_pushButtonRemapJoystickFunction_clicked()4257 void Options::on_pushButtonRemapJoystickFunction_clicked()
4258 {
4259 	QList<QTreeWidgetItem *> selItems = treeWidgetJoystickMappings->selectedItems();
4260 	if ( selItems.count() > 0 )
4261 		on_treeWidgetJoystickMappings_itemActivated(selItems[0]);
4262 }
4263 
on_pushButtonRemoveJoystickMapping_clicked()4264 void Options::on_pushButtonRemoveJoystickMapping_clicked()
4265 {
4266 	QList<QTreeWidgetItem *> selItems = treeWidgetJoystickMappings->selectedItems();
4267 	if ( selItems.count() > 0 ) {
4268 		QList<QString> valueList = qmc2JoystickFunctionHash.values(selItems[0]->text(1));
4269 		qmc2JoystickFunctionHash.remove(selItems[0]->text(1));
4270 		if ( valueList.count() > 1 ) {
4271 			int i;
4272 			QString valueToRemove = selItems[0]->whatsThis(0);
4273 			for (i = 0; i < valueList.count(); i++)
4274 				if ( valueList[i] != valueToRemove )
4275 					qmc2JoystickFunctionHash.insertMulti(selItems[0]->text(1), valueList[i]);
4276 		}
4277 		selItems[0]->setText(1, "");
4278 		pushButtonRemoveJoystickMapping->setEnabled(false);
4279 		QTimer::singleShot(0, this, SLOT(checkJoystickMappings()));
4280 	}
4281 }
4282 
checkJoystickMappings()4283 void Options::checkJoystickMappings()
4284 {
4285 	static char lastJoystickMappingsState = -1;
4286 	char joystickMappingsState = 1;
4287 	int itemCount = treeWidgetJoystickMappings->topLevelItemCount();
4288 	for (int i = 0; i < itemCount; i++) {
4289 		QTreeWidgetItem *iItem = treeWidgetJoystickMappings->topLevelItem(i);
4290 		if ( !iItem->text(1).isEmpty() )
4291 			iItem->setForeground(1, greenBrush);
4292 	}
4293 	for (int i = 0; i < itemCount; i++) {
4294 		QTreeWidgetItem *iItem = treeWidgetJoystickMappings->topLevelItem(i);
4295 		QString iMapping(iItem->text(1));
4296 		for (int j = i + 1; j < itemCount; j++) {
4297 			QTreeWidgetItem *jItem = treeWidgetJoystickMappings->topLevelItem(j);
4298 			QString jMapping(jItem->text(1));
4299 			if ( iMapping.compare(jMapping) == 0 && !jMapping.isEmpty() ) {
4300 				iItem->setForeground(1, redBrush);
4301 				jItem->setForeground(1, redBrush);
4302 				joystickMappingsState = 0;
4303 			}
4304 		}
4305 	}
4306 	if ( joystickMappingsState != lastJoystickMappingsState || lastJoystickMappingsState == -1 ) {
4307 		if ( joystickMappingsState == 1 )
4308 			qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("joystick map is clean"));
4309 		else
4310 			qmc2MainWindow->log(QMC2_LOG_FRONTEND, tr("WARNING: joystick map contains duplicates"));
4311 	}
4312 	lastJoystickMappingsState = joystickMappingsState;
4313 }
4314 
JoystickCalibrationWidget(Joystick * joystick,QWidget * parent)4315 JoystickCalibrationWidget::JoystickCalibrationWidget(Joystick *joystick, QWidget *parent)
4316 	: QWidget(parent)
4317 {
4318 	myJoystick = joystick;
4319 
4320 	int i;
4321 	int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4322 
4323 	myLayout = new QGridLayout(this);
4324 
4325 	int minButtonWidth = 0;
4326 	for (i = 0; i < myJoystick->numAxes; i++) {
4327 		QHBoxLayout *hLayout = new QHBoxLayout();
4328 
4329 		bool enabled = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Enabled").arg(joyIndex).arg(i), true).toBool();
4330 		int minValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Minimum").arg(joyIndex).arg(i), 0).toInt();
4331 		axesMinimums[i] = minValue;
4332 		int maxValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Maximum").arg(joyIndex).arg(i), 0).toInt();
4333 		axesMaximums[i] = maxValue;
4334 		int dzValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Deadzone").arg(joyIndex).arg(i), 0).toInt();
4335 		int sValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Sensitivity").arg(joyIndex).arg(i), 0).toInt();
4336 
4337 		axesEnablers[i] = new QCheckBox(this);
4338 		axesEnablers[i]->setChecked(enabled);
4339 		axesEnablers[i]->setToolTip(tr("Enable/disable axis %1").arg(i));
4340 		axesEnablers[i]->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
4341 		connect(axesEnablers[i], SIGNAL(stateChanged(int)), this, SLOT(on_axisEnablerStateChanged(int)));
4342 		axesButtons[i] = new QToolButton(this);
4343 		axesButtons[i]->setText(tr("Axis %1:").arg(i));
4344 		axesButtons[i]->setToolTip(tr("Reset calibration of axis %1").arg(i));
4345 		axesButtons[i]->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
4346 		axesButtons[i]->setEnabled(enabled);
4347 		connect(axesButtons[i], SIGNAL(clicked()), this, SLOT(on_resetAxisCalibration()));
4348 		if ( minButtonWidth < axesButtons[i]->sizeHint().width() )
4349 			minButtonWidth = axesButtons[i]->sizeHint().width();
4350 		axesRanges[i] = new QProgressBar(this);
4351 		axesRanges[i]->setFormat("%v");
4352 		axesRanges[i]->setToolTip(tr("Current value of axis %1").arg(i));
4353 		axesRanges[i]->setRange(minValue, maxValue);
4354 		axesRanges[i]->setValue(myJoystick->getAxisValue(i));
4355 		axesRanges[i]->setEnabled(enabled);
4356 		deadzoneLabels[i] = new QLabel(tr("DZ:"), this);
4357 		axesDeadzones[i] = new QSpinBox(this);
4358 		axesDeadzones[i]->setToolTip(tr("Deadzone of axis %1").arg(i));
4359 		axesDeadzones[i]->setRange(0, 32767);
4360 		axesDeadzones[i]->setSingleStep(1000);
4361 		axesDeadzones[i]->setValue(dzValue);
4362 		axesDeadzones[i]->setEnabled(enabled);
4363 		connect(axesDeadzones[i], SIGNAL(valueChanged(int)), this, SLOT(on_deadzoneValueChanged(int)));
4364 		sensitivityLabels[i] = new QLabel(tr("S:"), this);
4365 		axesSensitivities[i] = new QSpinBox(this);
4366 		axesSensitivities[i]->setToolTip(tr("Sensitivity of axis %1").arg(i));
4367 		axesSensitivities[i]->setRange(0, 32767);
4368 		axesSensitivities[i]->setSingleStep(100);
4369 		axesSensitivities[i]->setValue(sValue);
4370 		axesSensitivities[i]->setEnabled(enabled);
4371 		connect(axesSensitivities[i], SIGNAL(valueChanged(int)), this, SLOT(on_sensitivityValueChanged(int)));
4372 
4373 		hLayout->addWidget(axesEnablers[i]);
4374 		hLayout->addWidget(axesButtons[i]);
4375 		hLayout->addWidget(axesRanges[i]);
4376 		hLayout->addWidget(deadzoneLabels[i]);
4377 		hLayout->addWidget(axesDeadzones[i]);
4378 		hLayout->addWidget(sensitivityLabels[i]);
4379 		hLayout->addWidget(axesSensitivities[i]);
4380 
4381 		myLayout->addLayout(hLayout, i, 0);
4382 	}
4383 	for (i = 0; i < myJoystick->numAxes; i++)
4384 		axesButtons[i]->setMinimumWidth(minButtonWidth);
4385 	// add spacer
4386 	myLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding), i, 0);
4387 
4388 	// connect joystick callbacks
4389 	connect(myJoystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(on_joystickAxisValueChanged(int, int)));
4390 	connect(myJoystick, SIGNAL(buttonValueChanged(int, bool)), this, SLOT(on_joystickButtonValueChanged(int, bool)));
4391 	connect(myJoystick, SIGNAL(hatValueChanged(int, int)), this, SLOT(on_joystickHatValueChanged(int, int)));
4392 	connect(myJoystick, SIGNAL(trackballValueChanged(int, int, int)), this, SLOT(on_joystickTrackballValueChanged(int, int, int)));
4393 }
4394 
~JoystickCalibrationWidget()4395 JoystickCalibrationWidget::~JoystickCalibrationWidget()
4396 {
4397 	// ignore destruction when we are already cleaning up the application...
4398 	if ( !qmc2Options->frameCalibrationAndTest->layout() )
4399 		return;
4400 
4401 	// remove spacer item first
4402 	QLayoutItem *layoutItem = (QLayoutItem *)myLayout->takeAt(myJoystick->numAxes);
4403 	delete layoutItem;
4404 	for (int i = myJoystick->numAxes - 1; i >= 0; i--) {
4405 		QLayout *hLayout = (QLayout *)myLayout->takeAt(i);
4406 		hLayout->removeWidget(axesSensitivities[i]);
4407 		delete axesSensitivities[i];
4408 		hLayout->removeWidget(sensitivityLabels[i]);
4409 		delete sensitivityLabels[i];
4410 		hLayout->removeWidget(axesDeadzones[i]);
4411 		delete axesDeadzones[i];
4412 		hLayout->removeWidget(deadzoneLabels[i]);
4413 		delete deadzoneLabels[i];
4414 		hLayout->removeWidget(axesRanges[i]);
4415 		delete axesRanges[i];
4416 		hLayout->removeWidget(axesButtons[i]);
4417 		delete axesButtons[i];
4418 		hLayout->removeWidget(axesEnablers[i]);
4419 		delete axesEnablers[i];
4420 		delete hLayout;
4421 	}
4422 }
4423 
on_joystickAxisValueChanged(int axis,int value)4424 void JoystickCalibrationWidget::on_joystickAxisValueChanged(int axis, int value)
4425 {
4426 	int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4427 
4428 	if ( value > axesMaximums[axis] ) {
4429 		axesMaximums[axis] = value;
4430 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Maximum").arg(joyIndex).arg(axis), value);
4431 	}
4432 
4433 	if ( value < axesMinimums[axis] ) {
4434 		axesMinimums[axis] = value;
4435 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Minimum").arg(joyIndex).arg(axis), value);
4436 	}
4437 
4438 	axesRanges[axis]->setRange(axesMinimums[axis], axesMaximums[axis]);
4439 	axesRanges[axis]->setValue(value);
4440 }
4441 
on_joystickButtonValueChanged(int button,bool value)4442 void JoystickCalibrationWidget::on_joystickButtonValueChanged(int button, bool value)
4443 {
4444 }
4445 
on_joystickHatValueChanged(int hat,int value)4446 void JoystickCalibrationWidget::on_joystickHatValueChanged(int hat, int value)
4447 {
4448 }
4449 
on_joystickTrackballValueChanged(int trackball,int deltaX,int deltaY)4450 void JoystickCalibrationWidget::on_joystickTrackballValueChanged(int trackball, int deltaX, int deltaY)
4451 {
4452 }
4453 
on_resetAxisCalibration()4454 void JoystickCalibrationWidget::on_resetAxisCalibration()
4455 {
4456 	QToolButton *pressedButton = (QToolButton *)sender();
4457 	QList<QToolButton *> buttonList = axesButtons.values();
4458 	int i;
4459 	for (i = 0; i < buttonList.count() && buttonList[i] != pressedButton; i++) ;
4460 	if ( pressedButton == buttonList[i] ) {
4461 		int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4462 		axesMinimums[i] = 0;
4463 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Minimum").arg(joyIndex).arg(i), 0);
4464 		axesMaximums[i] = 0;
4465 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Maximum").arg(joyIndex).arg(i), 0);
4466 		axesRanges[i]->setRange(0, 0);
4467 		axesRanges[i]->setValue(0);
4468 		axesDeadzones[i]->setValue(0);
4469 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Deadzone").arg(joyIndex).arg(i), 0);
4470 		axesSensitivities[i]->setValue(0);
4471 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Sensitivity").arg(joyIndex).arg(i), 0);
4472 	}
4473 }
4474 
on_deadzoneValueChanged(int value)4475 void JoystickCalibrationWidget::on_deadzoneValueChanged(int value)
4476 {
4477 	QSpinBox *spinBox = (QSpinBox *)sender();
4478 	QList<QSpinBox *> spinBoxList = axesDeadzones.values();
4479 	int i;
4480 	for (i = 0; i < spinBoxList.count() && spinBoxList[i] != spinBox; i++) ;
4481 	if ( spinBox == spinBoxList[i] ) {
4482 		int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4483 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Deadzone").arg(joyIndex).arg(i), value);
4484 		myJoystick->deadzones[i] = value;
4485 	}
4486 }
4487 
on_sensitivityValueChanged(int value)4488 void JoystickCalibrationWidget::on_sensitivityValueChanged(int value)
4489 {
4490 	QSpinBox *spinBox = (QSpinBox *)sender();
4491 	QList<QSpinBox *> spinBoxList = axesSensitivities.values();
4492 	int i;
4493 	for (i = 0; i < spinBoxList.count() && spinBoxList[i] != spinBox; i++) ;
4494 	if ( spinBox == spinBoxList[i] ) {
4495 		int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4496 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Sensitivity").arg(joyIndex).arg(i), value);
4497 		myJoystick->sensitivities[i] = value;
4498 	}
4499 }
4500 
on_axisEnablerStateChanged(int state)4501 void JoystickCalibrationWidget::on_axisEnablerStateChanged(int state)
4502 {
4503 	QCheckBox *checkBox = (QCheckBox *)sender();
4504 	QList<QCheckBox *> checkBoxList = axesEnablers.values();
4505 	int i;
4506 	for (i = 0; i < checkBoxList.count() && checkBoxList[i] != checkBox; i++) ;
4507 	if ( checkBox == checkBoxList[i] ) {
4508 		bool enabled = (state == 0 ? false : true);
4509 		int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4510 		qmc2Config->setValue(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Enabled").arg(joyIndex).arg(i), enabled);
4511 
4512 		axesButtons[i]->setEnabled(enabled);
4513 		axesRanges[i]->setEnabled(enabled);
4514 		axesDeadzones[i]->setEnabled(enabled);
4515 		axesSensitivities[i]->setEnabled(enabled);
4516 	}
4517 }
4518 
JoystickTestWidget(Joystick * joystick,QWidget * parent)4519 JoystickTestWidget::JoystickTestWidget(Joystick *joystick, QWidget *parent)
4520 	: QWidget(parent)
4521 {
4522 	myJoystick = joystick;
4523 
4524 	int joyIndex = qmc2Options->comboBoxSelectJoysticks->currentIndex();
4525 	int maxRows = QMC2_MAX(QMC2_MAX(QMC2_MAX(myJoystick->numAxes, myJoystick->numButtons), myJoystick->numHats), myJoystick->numTrackballs);
4526 
4527 	myLayout = new QGridLayout(this);
4528 
4529 	for (int i = 0; i < myJoystick->numAxes; i++) {
4530 		int minValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Minimum").arg(joyIndex).arg(i), 0).toInt();
4531 		int maxValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Maximum").arg(joyIndex).arg(i), 0).toInt();
4532 		int dzValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Deadzone").arg(joyIndex).arg(i), 0).toInt();
4533 		myJoystick->deadzones[i] = dzValue;
4534 		int sValue = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Sensitivity").arg(joyIndex).arg(i), 0).toInt();
4535 		myJoystick->sensitivities[i] = sValue;
4536 		bool enabled = qmc2Config->value(QString(QMC2_FRONTEND_PREFIX + "Joystick/%1/Axis%2Enabled").arg(joyIndex).arg(i), true).toBool();
4537 
4538 		axesRanges[i] = new QProgressBar(this);
4539 		axesRanges[i]->setFormat(tr("A%1: %v").arg(i));
4540 		axesRanges[i]->setToolTip(tr("Current value of axis %1").arg(i));
4541 		axesRanges[i]->setRange(minValue, maxValue);
4542 		axesRanges[i]->setValue(myJoystick->getAxisValue(i));
4543 		axesRanges[i]->setSizePolicy(QSizePolicy::Expanding, myJoystick->numAxes < maxRows ? QSizePolicy::Ignored : QSizePolicy::Minimum);
4544 		axesRanges[i]->setEnabled(enabled);
4545 
4546 		myLayout->addWidget(axesRanges[i], i, 0);
4547 	}
4548 
4549 	for (int i = 0; i < myJoystick->numButtons; i++) {
4550 		buttonLabels[i] = new QLabel(tr("B%1").arg(i), this);
4551 		buttonLabels[i]->setToolTip(tr("Current state of button %1").arg(i));
4552 		buttonLabels[i]->setAlignment(Qt::AlignCenter);
4553 		buttonLabels[i]->setAutoFillBackground(true);
4554 		buttonLabels[i]->setFrameShape(QFrame::Box);
4555 		buttonLabels[i]->setSizePolicy(QSizePolicy::Expanding, myJoystick->numButtons < maxRows ? QSizePolicy::Ignored : QSizePolicy::Minimum);
4556 
4557 		myLayout->addWidget(buttonLabels[i], i, 1);
4558 	}
4559 
4560 	for (int i = 0; i < myJoystick->numHats; i++) {
4561 		hatValueLabels[i] = new QLabel(tr("H%1: 0").arg(i), this);
4562 		hatValueLabels[i]->setToolTip(tr("Current value of hat %1").arg(i));
4563 		hatValueLabels[i]->setAlignment(Qt::AlignCenter);
4564 		hatValueLabels[i]->setAutoFillBackground(true);
4565 		hatValueLabels[i]->setFrameShape(QFrame::Box);
4566 		hatValueLabels[i]->setSizePolicy(QSizePolicy::Expanding, myJoystick->numHats < maxRows ? QSizePolicy::Ignored : QSizePolicy::Minimum);
4567 
4568 		myLayout->addWidget(hatValueLabels[i], i, 2);
4569 	}
4570 
4571 	for (int i = 0; i < myJoystick->numTrackballs; i++) {
4572 		trackballDeltaXLabels[i] = new QLabel(tr("T%1 DX: 0").arg(i), this);
4573 		trackballDeltaXLabels[i]->setToolTip(tr("Current X-delta of trackball %1").arg(i));
4574 		trackballDeltaXLabels[i]->setAlignment(Qt::AlignCenter);
4575 		trackballDeltaXLabels[i]->setAutoFillBackground(true);
4576 		trackballDeltaXLabels[i]->setFrameShape(QFrame::Box);
4577 		trackballDeltaXLabels[i]->setSizePolicy(QSizePolicy::Expanding, myJoystick->numTrackballs < maxRows ? QSizePolicy::Ignored : QSizePolicy::Minimum);
4578 
4579 		myLayout->addWidget(trackballDeltaXLabels[i], i, 3);
4580 	}
4581 
4582 	for (int i = 0; i < myJoystick->numTrackballs; i++) {
4583 		trackballDeltaYLabels[i] = new QLabel(tr("T%1 DY: 0").arg(i), this);
4584 		trackballDeltaYLabels[i]->setToolTip(tr("Current Y-delta of trackball %1").arg(i));
4585 		trackballDeltaYLabels[i]->setAlignment(Qt::AlignCenter);
4586 		trackballDeltaYLabels[i]->setAutoFillBackground(true);
4587 		trackballDeltaYLabels[i]->setFrameShape(QFrame::Box);
4588 		trackballDeltaYLabels[i]->setSizePolicy(QSizePolicy::Expanding, myJoystick->numTrackballs < maxRows ? QSizePolicy::Ignored : QSizePolicy::Minimum);
4589 
4590 		myLayout->addWidget(trackballDeltaYLabels[i], i, 4);
4591 	}
4592 
4593 	// add spacer
4594 	myLayout->addItem(new QSpacerItem(10, 10, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding), maxRows, 1);
4595 
4596 	// connect joystick callbacks
4597 	connect(myJoystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(on_joystickAxisValueChanged(int, int)));
4598 	connect(myJoystick, SIGNAL(buttonValueChanged(int, bool)), this, SLOT(on_joystickButtonValueChanged(int, bool)));
4599 	connect(myJoystick, SIGNAL(hatValueChanged(int, int)), this, SLOT(on_joystickHatValueChanged(int, int)));
4600 	connect(myJoystick, SIGNAL(trackballValueChanged(int, int, int)), this, SLOT(on_joystickTrackballValueChanged(int, int, int)));
4601 }
4602 
~JoystickTestWidget()4603 JoystickTestWidget::~JoystickTestWidget()
4604 {
4605 	// ignore destruction when we are already cleaning up the application...
4606 	if ( !qmc2Options->frameCalibrationAndTest->layout() )
4607 		return;
4608 
4609 	QLayoutItem *childItem;
4610 	while ((childItem = myLayout->takeAt(0)) != 0) {
4611 		delete childItem->widget();
4612 		delete childItem;
4613 	}
4614 }
4615 
on_joystickAxisValueChanged(int axis,int value)4616 void JoystickTestWidget::on_joystickAxisValueChanged(int axis, int value)
4617 {
4618 	axesRanges[axis]->setValue(value);
4619 }
4620 
on_joystickButtonValueChanged(int button,bool value)4621 void JoystickTestWidget::on_joystickButtonValueChanged(int button, bool value)
4622 {
4623 	if ( qApp->styleSheet().isEmpty() ) {
4624 		QPalette greenPalette(QApplication::palette());
4625 		greenPalette.setBrush(QPalette::Window, QColor(0, 255, 0));
4626 
4627 		if ( value )
4628 			buttonLabels[button]->setPalette(greenPalette);
4629 		else
4630 			buttonLabels[button]->setPalette(QApplication::palette());
4631 	} else {
4632 		if ( value )
4633 			buttonLabels[button]->setStyleSheet("background: #00ff00; color: black");
4634 		else
4635 			buttonLabels[button]->setStyleSheet("");
4636 	}
4637 }
4638 
on_joystickHatValueChanged(int hat,int value)4639 void JoystickTestWidget::on_joystickHatValueChanged(int hat, int value)
4640 {
4641 	if ( qApp->styleSheet().isEmpty() ) {
4642 		QPalette greenPalette(QApplication::palette());
4643 		greenPalette.setBrush(QPalette::Window, QColor(0, 255, 0));
4644 
4645 		if ( value != 0 )
4646 			hatValueLabels[hat]->setPalette(greenPalette);
4647 		else
4648 			hatValueLabels[hat]->setPalette(QApplication::palette());
4649 	} else {
4650 		if ( value != 0 )
4651 			hatValueLabels[hat]->setStyleSheet("background: #00ff00; color: black");
4652 		else
4653 			hatValueLabels[hat]->setStyleSheet("");
4654 	}
4655 
4656 	hatValueLabels[hat]->setText(tr("H%1: %2").arg(hat).arg(value));
4657 }
4658 
on_joystickTrackballValueChanged(int trackball,int deltaX,int deltaY)4659 void JoystickTestWidget::on_joystickTrackballValueChanged(int trackball, int deltaX, int deltaY)
4660 {
4661 	if ( qApp->styleSheet().isEmpty() ) {
4662 		QPalette greenPalette(QApplication::palette());
4663 		greenPalette.setBrush(QPalette::Window, QColor(0, 255, 0));
4664 
4665 		if ( deltaX != 0 )
4666 			trackballDeltaXLabels[trackball]->setPalette(greenPalette);
4667 		else
4668 			trackballDeltaXLabels[trackball]->setPalette(QApplication::palette());
4669 
4670 		if ( deltaY != 0 )
4671 			trackballDeltaYLabels[trackball]->setPalette(greenPalette);
4672 		else
4673 			trackballDeltaYLabels[trackball]->setPalette(QApplication::palette());
4674 	} else {
4675 		if ( deltaX != 0 )
4676 			trackballDeltaXLabels[trackball]->setStyleSheet("background: #00ff00; color: black");
4677 		else
4678 			trackballDeltaXLabels[trackball]->setStyleSheet("");
4679 
4680 		if ( deltaY != 0 )
4681 			trackballDeltaYLabels[trackball]->setStyleSheet("background: #00ff00; color: black");
4682 		else
4683 			trackballDeltaYLabels[trackball]->setStyleSheet("");
4684 	}
4685 
4686 	trackballDeltaXLabels[trackball]->setText(tr("T%1 DX: %2").arg(trackball).arg(deltaX));
4687 	trackballDeltaYLabels[trackball]->setText(tr("T%1 DY: %2").arg(trackball).arg(deltaY));
4688 }
4689 
cleanupPalette()4690 void JoystickTestWidget::cleanupPalette()
4691 {
4692 	if ( qApp->styleSheet().isEmpty() ) {
4693 		for (int i = 0; i < buttonLabels.count(); i++)
4694 			buttonLabels[i]->setPalette(QApplication::palette());
4695 		for (int i = 0; i < hatValueLabels.count(); i++)
4696 			hatValueLabels[i]->setPalette(QApplication::palette());
4697 		for (int i = 0; i < trackballDeltaXLabels.count(); i++)
4698 			trackballDeltaXLabels[i]->setPalette(QApplication::palette());
4699 		for (int i = 0; i < trackballDeltaYLabels.count(); i++)
4700 			trackballDeltaYLabels[i]->setPalette(QApplication::palette());
4701 	} else {
4702 		for (int i = 0; i < buttonLabels.count(); i++)
4703 			buttonLabels[i]->setStyleSheet("");
4704 		for (int i = 0; i < hatValueLabels.count(); i++)
4705 			hatValueLabels[i]->setStyleSheet("");
4706 		for (int i = 0; i < trackballDeltaXLabels.count(); i++)
4707 			trackballDeltaXLabels[i]->setStyleSheet("");
4708 		for (int i = 0; i < trackballDeltaYLabels.count(); i++)
4709 			trackballDeltaYLabels[i]->setStyleSheet("");
4710 	}
4711 }
4712 #endif
4713