WQt4Gui.cpp 5.64 KB
Newer Older
1 2
//---------------------------------------------------------------------------
//
3
// Project: OpenWalnut ( http://www.openwalnut.org )
4
//
5 6
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
7
//
wiebel's avatar
wiebel committed
8
// This file is part of OpenWalnut.
9
//
wiebel's avatar
wiebel committed
10
// OpenWalnut is free software: you can redistribute it and/or modify
11 12 13 14
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
wiebel's avatar
wiebel committed
15
// OpenWalnut is distributed in the hope that it will be useful,
16 17 18 19 20
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
wiebel's avatar
wiebel committed
21
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 23 24
//
//---------------------------------------------------------------------------

ebaum's avatar
ebaum committed
25
#include <iostream>
26
#include <fstream>
27 28
#include <string>
#include <vector>
29

30 31
#include <boost/program_options.hpp>

32
#include <QtGui/QApplication>
33 34 35
#include <QtGui/QFileDialog>

#include "WMainWindow.h"
36 37
#include "../../kernel/WKernel.h"
#include "../../graphicsEngine/WGraphicsEngine.h"
38

39
#include "WQt4Gui.h"
ebaum's avatar
ebaum committed
40

41 42
WQt4Gui::WQt4Gui( int argc, char** argv ):
    WGUI( argc, argv )
ebaum's avatar
ebaum committed
43 44 45
{
}

46
WQt4Gui::~WQt4Gui()
47
{
ebaum's avatar
ebaum committed
48 49
}

50
bool WQt4Gui::parseOptions( int argc, char** argv )
51 52 53 54 55 56 57 58 59 60 61 62
{
    // since the namespace is far to big we use a shortcut here
    namespace po = boost::program_options;

    po::options_description desc( "Allowed options" );
    desc.add_options()
        ( "help,h", "Prints this help message" )
        ( "input,i", po::value< std::vector< std::string > >(), "Input data files that should be loaded automatically" );

    po::positional_options_description p;
    p.add( "input", -1 );

63 64
    try
    {
65
        po::store( po::command_line_parser( argc, argv ).options( desc ).positional( p ).run(), m_optionsMap );
66 67 68 69
    }
    catch( boost::program_options::unknown_option e )
    {
        std::cout << e.what() << std::endl;
70
        return false;
71
    }
72 73 74
    catch( boost::program_options::invalid_command_line_syntax e )
    {
        std::cout << e.what() << std::endl;
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
        return false;
    }

    po::notify( m_optionsMap );

    //=====================
    // CONFIGURATION FILE
    po::options_description guiConfigurationDescription( "GUI configuration" );
    guiConfigurationDescription.add_options()
        ( "ge.bgColor.r", po::value< float >() )
        ( "ge.bgColor.g", po::value< float >() )
        ( "ge.bgColor.b", po::value< float >() );

    std::ifstream ifs;
    ifs.open( "walnut.cfg", std::ifstream::in );

    po::variables_map guiConfiguration;

    try
    {
        po::store( po::parse_config_file( ifs, guiConfigurationDescription ), m_guiConfiguration );
    }
    catch( boost::program_options::unknown_option e )
    {
        std::cout << "Syntax error in configuration file \"walnut.cfg\"." << std::endl;
        return false;
    }

    po::notify( m_guiConfiguration );

    // print usage information if command line asks for help.
    if( m_optionsMap.count( "help" ) )
    {
        std::cout << desc << std::endl;
    }
    return true;
}

int WQt4Gui::run()
{
    bool parsingSuccessful = false;
    parsingSuccessful = parseOptions( argc, argv );

    if( !parsingSuccessful )
    {
120 121
        return 1;
    }
122

123
    // exit as fast as possible if command line asked for help. The ,essage has been printed by parseOptions().
124 125
    if( m_optionsMap.count( "help" ) )
    {
126
        return 1;
127 128
    }

129
    WLogger::getLogger()->run();
130
    WLogger::getLogger()->addLogMessage( "Bringing up GUI", "GUI", LL_INFO );
131

132
    QApplication appl( argc, argv, true );
133

134 135
    // startup graphics engine
    m_ge = boost::shared_ptr< WGraphicsEngine >( new WGraphicsEngine() );
136

137 138 139 140
    // and startup kernel
    m_kernel = boost::shared_ptr< WKernel >( new WKernel( m_ge, shared_from_this() ) );
    m_kernel->run();
    // create the window
141
    m_gui = new WMainWindow( m_guiConfiguration );
142
    m_gui->show();
143

144 145
    // connect out loader signal with krnel
    getLoadButtonSignal()->connect( boost::bind( &WKernel::doLoadDataSets, m_kernel, _1 ) );
146

147 148 149 150 151
    // bind the GUI's slot with the ready signal
    t_ModuleGenericSignalHandlerType f = boost::bind( &WGUI::slotAddDatasetToBrowser, this, _1 );
    m_kernel->getRootContainer()->addDefaultNotifier( READY, f );

    // now we are initialized
152
    m_isInitialized( true );
153

154 155 156 157 158 159
    // check if we want to load data due to command line and call the respective function
    if( m_optionsMap.count("input") )
    {
        m_kernel->doLoadDataSets( m_optionsMap["input"].as< std::vector< std::string > >() );
    }

160
    // run
161 162 163 164 165 166 167
    int qtRetCode = appl.exec();

    // signal everybody to shut down properly.
    WKernel::getRunningKernel()->wait( true );
    WKernel::getRunningKernel()->getGraphicsEngine()->wait( true );

    return qtRetCode;
168 169
}

170
void WQt4Gui::addDatasetToBrowser( boost::shared_ptr< WModule > module, int subjectId )
171
{
172
    m_gui->getDatasetBrowser()->addDataset( module, subjectId );
173 174
}

175 176 177 178 179 180
void WQt4Gui::addModuleToBrowser( boost::shared_ptr< WModule > module )
{
    m_gui->getDatasetBrowser()->addModule( module );
}


181 182 183 184
std::vector< boost::shared_ptr< WModule > >WQt4Gui::getDataSetList( int subjectId )
{
    return m_gui->getDatasetBrowser()->getDataSetList( subjectId );
}
185

186 187 188 189 190
boost::signal1< void, std::vector< std::string > >* WQt4Gui::getLoadButtonSignal()
{
    return m_gui->getLoaderSignal();
}

191
void WQt4Gui::connectProperties( boost::shared_ptr<WProperties> properties )
192
{
193
    m_gui->getPropertyManager()->connectProperties( properties );
194
}