typo fix
[pykit.git] / main.cc
1 // $Id$
2 //
3 // Copyright (C) 2010
4 //     Stefan Bund <info@j32.de>
5
6 /** \file
7     \brief main non-inline non-template implementation */
8
9 //#include "main.hh"
10 //#include "main.ih"
11
12 // Custom includes
13 #include <stdlib.h>
14 #include <iostream>
15 #include <QApplication>
16 #include <QSplashScreen>
17 #include <QSettings>
18 #include <QDir>
19 #include <QFileInfo>
20 #include <QFontDatabase>
21 #include <QWebSettings>
22 #include <QMessageBox>
23 #include <boost/scoped_ptr.hpp>
24 #include "MainWindow.hh"
25 #include "PythonPublisher.hh"
26
27 //#include "main.mpp"
28 #define prefix_
29 ///////////////////////////////cc.p////////////////////////////////////////
30
31 extern void qt_drt_overwritePluginDirectories();
32
33 namespace {
34     QSize parseSize(QString const & s)
35     {
36         QStringList coords (s.split(" "));
37         if (coords.size() != 2)
38             return QSize();
39         return QSize(coords[0].toInt(), coords[1].toInt());
40     }
41
42     void showPlatformError(char const * reason)
43     {
44         QMessageBox msgBox;
45         msgBox.setText("Es ist ein interner Fehler bei der Initialisierung"
46                        " aufgetreten. Bitte notieren sie die folgende"
47                        " Fehlermeldung und wenden sie sich an den technischen"
48                        " Support.");
49         msgBox.setDetailedText(reason);
50         msgBox.setInformativeText(QString("%1 wird beendet.").arg(QApplication::applicationName()));
51         msgBox.setWindowTitle(QApplication::applicationName());
52         msgBox.exec();
53     }
54 }
55
56 int main(int argc, char *argv[])
57 {
58     QApplication app (argc, argv);
59     try {
60         QSettings settings ("pykit.ini", QSettings::IniFormat);
61         QStringList arguments (app.arguments());
62         settings.beginGroup("AppData");
63
64         app.setApplicationName(settings.value("name").toString());
65         app.setApplicationVersion(settings.value("version").toString());
66         app.setOrganizationDomain(settings.value("organization").toString());
67         app.setOrganizationName(settings.value("organization").toString());
68         char * pluginsPath (getenv("PYKIT_PLUGIN_PATH"));
69         if (pluginsPath)
70             app.setLibraryPaths(QString(pluginsPath).split(":"));
71
72         QString splashPath (settings.value("splash").toString());
73         boost::scoped_ptr<QSplashScreen> splash;
74         if (!splashPath.isEmpty()) {
75             QPixmap splashPixmap (settings.value("splash").toString());
76             splash.reset(new QSplashScreen (splashPixmap));
77             splash->show();
78         }
79
80         QString iconPath (settings.value("icon").toString());
81
82         settings.endGroup();
83
84         settings.beginGroup("Fonts");
85         QString loadFontDir (settings.value("loaddir").toString());
86         if (!loadFontDir.isEmpty()) {
87             QDir dir (loadFontDir);
88             if (dir.exists()) {
89                 QFileInfoList files (dir.entryInfoList(QDir::Files));
90                 for (QFileInfoList::iterator i (files.begin()), i_end (files.end());
91                      i != i_end; ++i)
92                     QFontDatabase::addApplicationFont(i->absoluteFilePath());
93             }
94             else
95                 std::cerr << "WARNING: Font directory not found" << std::endl;
96         }
97         settings.endGroup();
98
99         settings.beginGroup("Viewer");
100
101         pykit::PythonPublisher publisher;
102         qt_drt_overwritePluginDirectories();
103
104         QString url (settings.value("home").toString());
105         if (arguments.size()>1)
106             url = arguments.at(1);
107
108         if (settings.value("debug").toBool())
109             QWebSettings::globalSettings()->setAttribute(
110                 QWebSettings::DeveloperExtrasEnabled, true);
111         pykit::MainWindow window (QUrl(url), &publisher);
112         window.setWindowTitle(app.applicationName());
113         if (!iconPath.isEmpty())
114             window.setWindowIcon(QIcon(iconPath));
115         window.setWindowIconText(window.windowTitle());
116
117         window.setMinimumSize(parseSize(settings.value("minsize").toString()));
118         window.resize(parseSize(settings.value("size").toString()));
119
120         window.show();
121         if (splash)
122             splash->finish(&window);
123
124         return app.exec();
125     }
126     catch (std::exception const & ex) {
127         std::cerr << "Exception:\n" << ex.what() << "\n";
128         showPlatformError(ex.what());
129         return 1;
130     }
131     catch (...) {
132         std::cerr << "Exception: <undefined>\n";
133         showPlatformError("undefined error condition");
134         return 1;
135     }
136 }
137
138 ///////////////////////////////cc.e////////////////////////////////////////
139 #undef prefix_
140 //#include "main.mpp"
141
142 \f
143 // Local Variables:
144 // mode: c++
145 // fill-column: 100
146 // comment-column: 40
147 // c-file-style: "j32"
148 // indent-tabs-mode: nil
149 // ispell-local-dictionary: "american"
150 // compile-command: "make"
151 // End: