14
14
#include " researcher/researchermodel.h"
15
15
#include " optionsmodel.h"
16
16
#include " guiutil.h"
17
+ #include " qt/intro.h"
17
18
#include " guiconstants.h"
18
19
#include " init.h"
19
20
#include " ui_interface.h"
@@ -67,7 +68,7 @@ extern bool bGridcoinCoreInitComplete;
67
68
static BitcoinGUI *guiref;
68
69
static QSplashScreen *splashref;
69
70
70
- int StartGridcoinQt (int argc, char *argv[], OptionsModel &optionsModel );
71
+ int StartGridcoinQt (int argc, char *argv[], QApplication& app );
71
72
72
73
static void ThreadSafeMessageBox (const std::string& message, const std::string& caption, int style)
73
74
{
@@ -232,10 +233,86 @@ int main(int argc, char *argv[])
232
233
ParseParameters (argc, argv);
233
234
SelectParams (CBaseChainParams::MAIN);
234
235
235
- // We need to early load the optionsModel to get the dataDir that could be stored there.
236
- OptionsModel optionsModel;
236
+ // Initiate the app here to support choosing the data directory.
237
+ Q_INIT_RESOURCE (bitcoin);
238
+ Q_INIT_RESOURCE (bitcoin_locale);
239
+ QApplication app (argc, argv);
240
+ // uint SEM_FAILCRITICALERRORS= 0x0001;
241
+ // uint SEM_NOGPFAULTERRORBOX = 0x0002;
242
+ #if defined(WIN32) && defined(QT_GUI)
243
+ SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
244
+ #endif
245
+
246
+ // Application identification (must be set before OptionsModel is initialized,
247
+ // as it is used to locate QSettings)
248
+ app.setOrganizationName (" Gridcoin" );
249
+ // XXX app.setOrganizationDomain("");
250
+ if (GetBoolArg (" -testnet" )) // Separate UI settings for testnet
251
+ app.setApplicationName (" Gridcoin-Qt-testnet" );
252
+ else
253
+ app.setApplicationName (" Gridcoin-Qt" );
254
+
255
+ // Install global event filter that makes sure that long tooltips can be word-wrapped
256
+ app.installEventFilter (new GUIUtil::ToolTipToRichTextFilter (TOOLTIP_WRAP_THRESHOLD, &app));
257
+
258
+ // Install global event filter that suppresses help context question mark
259
+ app.installEventFilter (new GUIUtil::WindowContextHelpButtonHintFilter (&app));
260
+
261
+ #if defined(WIN32) && QT_VERSION >= 0x050000
262
+ // Install global event filter for processing Windows session related Windows messages (WM_QUERYENDSESSION and WM_ENDSESSION)
263
+ app.installNativeEventFilter (new WinShutdownMonitor ());
264
+ #endif
265
+
266
+ // Get desired locale (e.g. "de_DE") from command line or use system locale
267
+ QString lang_territory = QString::fromStdString (GetArg (" -lang" , QLocale::system ().name ().toStdString ()));
268
+ QString lang = lang_territory;
269
+ // Convert to "de" only by truncating "_DE"
270
+ lang.truncate (lang_territory.lastIndexOf (' _' ));
271
+
272
+ QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
273
+ // Load language files for configured locale:
274
+ // - First load the translator for the base language, without territory
275
+ // - Then load the more specific locale translator
276
+
277
+ // Load e.g. qt_de.qm
278
+ if (qtTranslatorBase.load (" qt_" + lang, QLibraryInfo::location (QLibraryInfo::TranslationsPath)))
279
+ app.installTranslator (&qtTranslatorBase);
280
+
281
+ // Load e.g. qt_de_DE.qm
282
+ if (qtTranslator.load (" qt_" + lang_territory, QLibraryInfo::location (QLibraryInfo::TranslationsPath)))
283
+ app.installTranslator (&qtTranslator);
284
+
285
+ // Load e.g. bitcoin_de.qm (shortcut "de" needs to be defined in bitcoin.qrc)
286
+ if (translatorBase.load (lang, " :/translations/" ))
287
+ app.installTranslator (&translatorBase);
288
+
289
+ // Load e.g. bitcoin_de_DE.qm (shortcut "de_DE" needs to be defined in bitcoin.qrc)
290
+ if (translator.load (lang_territory, " :/translations/" ))
291
+ app.installTranslator (&translator);
292
+
293
+ // Now that settings and translations are available, ask user for data directory
294
+ bool did_show_intro = false ;
295
+ // Gracefully exit if the user cancels
296
+ if (!Intro::showIfNeeded (did_show_intro)) return EXIT_SUCCESS;
297
+
298
+ // Determine availability of data directory and parse gridcoinresearch.conf
299
+ // Do not call GetDataDir(true) before this step finishes
300
+ if (!CheckDataDirOption ()) {
301
+ ThreadSafeMessageBox (strprintf (" Specified data directory \" %s\" does not exist.\n " , GetArg (" -datadir" , " " )),
302
+ " " , CClientUIInterface::ICON_ERROR | CClientUIInterface::OK | CClientUIInterface::MODAL);
303
+ QMessageBox::critical (nullptr , PACKAGE_NAME,
304
+ QObject::tr (" Error: Specified data directory \" %1\" does not exist." )
305
+ .arg (QString::fromStdString (GetArg (" -datadir" , " " ))));
306
+ return EXIT_FAILURE;
307
+ }
308
+ if (!ReadConfigFile (mapArgs, mapMultiArgs)) {
309
+ ThreadSafeMessageBox (strprintf (" Error reading configuration file.\n " ),
310
+ " " , CClientUIInterface::ICON_ERROR | CClientUIInterface::OK | CClientUIInterface::MODAL);
311
+ QMessageBox::critical (nullptr , PACKAGE_NAME,
312
+ QObject::tr (" Error: Cannot parse configuration file." ));
313
+ return EXIT_FAILURE;
314
+ }
237
315
238
- ReadConfigFile (mapArgs, mapMultiArgs);
239
316
SelectParams (mapArgs.count (" -testnet" ) ? CBaseChainParams::TESTNET : CBaseChainParams::MAIN);
240
317
241
318
// Initialize logging as early as possible.
@@ -279,7 +356,7 @@ int main(int argc, char *argv[])
279
356
}
280
357
281
358
/* * Start Qt as normal before it was moved into this function **/
282
- StartGridcoinQt (argc, argv, optionsModel );
359
+ StartGridcoinQt (argc, argv, app );
283
360
284
361
// We got a request to apply snapshot from GUI Menu selection
285
362
// We got this request and everything should be shutdown now.
@@ -325,28 +402,13 @@ int main(int argc, char *argv[])
325
402
return 0 ;
326
403
}
327
404
328
- int StartGridcoinQt (int argc, char *argv[], OptionsModel& optionsModel )
405
+ int StartGridcoinQt (int argc, char *argv[], QApplication& app )
329
406
{
330
407
// Set global boolean to indicate intended presence of GUI to core.
331
408
fQtActive = true ;
332
409
333
410
std::shared_ptr<ThreadHandler> threads = std::make_shared<ThreadHandler>();
334
411
335
- Q_INIT_RESOURCE (bitcoin);
336
- Q_INIT_RESOURCE (bitcoin_locale);
337
- QApplication app (argc, argv);
338
- // uint SEM_FAILCRITICALERRORS= 0x0001;
339
- // uint SEM_NOGPFAULTERRORBOX = 0x0002;
340
- #if defined(WIN32) && defined(QT_GUI)
341
- SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
342
- #endif
343
-
344
- // Install global event filter that makes sure that long tooltips can be word-wrapped
345
- app.installEventFilter (new GUIUtil::ToolTipToRichTextFilter (TOOLTIP_WRAP_THRESHOLD, &app));
346
-
347
- // Install global event filter that suppresses help context question mark
348
- app.installEventFilter (new GUIUtil::WindowContextHelpButtonHintFilter (&app));
349
-
350
412
#if QT_VERSION < 0x050000
351
413
// Install qDebug() message handler to route to debug.log
352
414
qInstallMsgHandler (DebugMessageHandler);
@@ -355,56 +417,8 @@ int StartGridcoinQt(int argc, char *argv[], OptionsModel& optionsModel)
355
417
qInstallMessageHandler (DebugMessageHandler);
356
418
#endif
357
419
358
- #if defined(WIN32) && QT_VERSION >= 0x050000
359
- // Install global event filter for processing Windows session related Windows messages (WM_QUERYENDSESSION and WM_ENDSESSION)
360
- app.installNativeEventFilter (new WinShutdownMonitor ());
361
- #endif
362
-
363
- if (!fs::is_directory (GetDataDir (false )))
364
- {
365
- QMessageBox::critical (0 , " Gridcoin" ,
366
- QString (" Error: Specified data directory \" %1\" does not exist." ).arg (QString::fromStdString (mapArgs[" -datadir" ])));
367
- return 1 ;
368
- }
369
-
370
- // Application identification (must be set before OptionsModel is initialized,
371
- // as it is used to locate QSettings)
372
- app.setOrganizationName (" Gridcoin" );
373
- // XXX app.setOrganizationDomain("");
374
- if (GetBoolArg (" -testnet" )) // Separate UI settings for testnet
375
- app.setApplicationName (" Gridcoin-Qt-testnet" );
376
- else
377
- app.setApplicationName (" Gridcoin-Qt" );
378
-
379
- // ... then GUI settings:
380
- // OptionsModel optionsModel;
381
-
382
- // Get desired locale (e.g. "de_DE") from command line or use system locale
383
- QString lang_territory = QString::fromStdString (GetArg (" -lang" , QLocale::system ().name ().toStdString ()));
384
- QString lang = lang_territory;
385
- // Convert to "de" only by truncating "_DE"
386
- lang.truncate (lang_territory.lastIndexOf (' _' ));
387
-
388
- QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
389
- // Load language files for configured locale:
390
- // - First load the translator for the base language, without territory
391
- // - Then load the more specific locale translator
392
-
393
- // Load e.g. qt_de.qm
394
- if (qtTranslatorBase.load (" qt_" + lang, QLibraryInfo::location (QLibraryInfo::TranslationsPath)))
395
- app.installTranslator (&qtTranslatorBase);
396
-
397
- // Load e.g. qt_de_DE.qm
398
- if (qtTranslator.load (" qt_" + lang_territory, QLibraryInfo::location (QLibraryInfo::TranslationsPath)))
399
- app.installTranslator (&qtTranslator);
400
-
401
- // Load e.g. bitcoin_de.qm (shortcut "de" needs to be defined in bitcoin.qrc)
402
- if (translatorBase.load (lang, " :/translations/" ))
403
- app.installTranslator (&translatorBase);
404
-
405
- // Load e.g. bitcoin_de_DE.qm (shortcut "de_DE" needs to be defined in bitcoin.qrc)
406
- if (translator.load (lang_territory, " :/translations/" ))
407
- app.installTranslator (&translator);
420
+ // Load the optionsModel.
421
+ OptionsModel optionsModel;
408
422
409
423
// Subscribe to global signals from core
410
424
uiInterface.ThreadSafeMessageBox .connect (ThreadSafeMessageBox);
0 commit comments