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