add custom qt plugin directory support
[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 <boost/scoped_ptr.hpp>
22 #include "MainWindow.hh"
23 #include "PythonPublisher.hh"
24
25 //#include "main.mpp"
26 #define prefix_
27 ///////////////////////////////cc.p////////////////////////////////////////
28
29 extern void qt_drt_overwritePluginDirectories();
30
31 namespace {
32     QSize parseSize(QString const & s)
33     {
34         QStringList coords (s.split(" "));
35         if (coords.size() != 2)
36             return QSize();
37         return QSize(coords[0].toInt(), coords[1].toInt());
38     }
39 }
40
41 int main(int argc, char *argv[])
42 {
43     try {
44         QApplication app (argc, argv);
45
46         QSettings settings ("pykit.ini", QSettings::IniFormat);
47         QStringList arguments (app.arguments());
48         settings.beginGroup("AppData");
49
50         app.setApplicationName(settings.value("name").toString());
51         app.setApplicationVersion(settings.value("version").toString());
52         app.setOrganizationDomain(settings.value("organization").toString());
53         app.setOrganizationName(settings.value("organization").toString());
54         char * pluginsPath (getenv("PYKIT_PLUGIN_PATH"));
55         if (pluginsPath)
56             app.setLibraryPaths(QString(pluginsPath).split(":"));
57
58         QString splashPath (settings.value("splash").toString());
59         boost::scoped_ptr<QSplashScreen> splash;
60         if (!splashPath.isEmpty()) {
61             QPixmap splashPixmap (settings.value("splash").toString());
62             splash.reset(new QSplashScreen (splashPixmap));
63             splash->show();
64         }
65
66         QString iconPath (settings.value("icon").toString());
67
68         settings.endGroup();
69
70         settings.beginGroup("Fonts");
71         QString loadFontDir (settings.value("loaddir").toString());
72         if (!loadFontDir.isEmpty()) {
73             QDir dir (loadFontDir);
74             if (dir.exists()) {
75                 QFileInfoList files (dir.entryInfoList(QDir::Files));
76                 for (QFileInfoList::iterator i (files.begin()), i_end (files.end());
77                      i != i_end; ++i)
78                     QFontDatabase::addApplicationFont(i->absoluteFilePath());
79             }
80             else
81                 std::cerr << "WARNING: Font directory not found" << std::endl;
82         }
83         settings.endGroup();
84
85         settings.beginGroup("Viewer");
86
87         pykit::PythonPublisher publisher;
88         qt_drt_overwritePluginDirectories();
89
90         QString url (settings.value("home").toString());
91         if (arguments.size()>1)
92             url = arguments.at(1);
93         pykit::MainWindow window (QUrl(url), &publisher);
94         window.setWindowTitle(app.applicationName());
95         if (!iconPath.isEmpty())
96             window.setWindowIcon(QIcon(iconPath));
97         window.setWindowIconText(window.windowTitle());
98
99         window.setMinimumSize(parseSize(settings.value("minsize").toString()));
100         window.resize(parseSize(settings.value("size").toString()));
101
102         window.show();
103         if (splash)
104             splash->finish(&window);
105
106         return app.exec();
107     }
108     catch (std::exception & ex) {
109         std::cerr << "Exception:\n" << ex.what() << "\n";
110         throw;
111     }
112 }
113
114 ///////////////////////////////cc.e////////////////////////////////////////
115 #undef prefix_
116 //#include "main.mpp"
117
118 \f
119 // Local Variables:
120 // mode: c++
121 // fill-column: 100
122 // comment-column: 40
123 // c-file-style: "j32"
124 // indent-tabs-mode: nil
125 // ispell-local-dictionary: "american"
126 // compile-command: "make"
127 // End: