ParseIni.cc 29.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  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 with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  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 LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83




//=============================================================================
//
//  CLASS Core - IMPLEMENTATION
//
//=============================================================================


//== INCLUDES =================================================================

// -------------------- mview
#include "Core.hh"
// -------------------- ACG
#include <ACG/Scenegraph/DrawModes.hh>

#include <OpenFlipper/INIFile/INIFile.hh>
#include <OpenFlipper/common/GlobalOptions.hh>
#include <OpenFlipper/common/RecentFiles.hh>

#include <OpenFlipper/BasePlugin/PluginFunctions.hh>

#include <QFile>

#include <OpenFlipper/ACGHelper/DrawModeConverter.hh>

//== IMPLEMENTATION ==========================================================


/** Load the standard options from the given Ini File
* @param _ini Inifile to use
*/
void Core::readApplicationOptions(INIFile& _ini) {
  // Parse standard options
  if ( _ini.section_exists("Options") ) {

    // load ViewModes
    int viewModeCount;
    if (_ini.get_entry(viewModeCount,"Options","ViewModeCount") )
      for (int i=0; i < viewModeCount; i++){
84

Jan Möbius's avatar
Jan Möbius committed
85 86
        QString entryToolbars;
        QString entryToolboxes;
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
87
        QString entryContextMenus;
Jan Möbius's avatar
Jan Möbius committed
88
        QString entryIcon;
89

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
90 91 92 93
        QString keyToolbars     = "ViewModeToolbars"     + QString::number(i);
        QString keyToolboxes    = "ViewModeToolboxes"    + QString::number(i);
        QString keyContextMenus = "ViewModeContextMenus" + QString::number(i);
        QString keyIcon         = "ViewModeIcon"         + QString::number(i);
Jan Möbius's avatar
Jan Möbius committed
94 95

        // Read the entries
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
96 97 98 99
        if ( !_ini.get_entry( entryToolbars     , "Options" , keyToolbars ) )     continue;
        if ( !_ini.get_entry( entryToolboxes    , "Options" , keyToolboxes ) )    continue;
        if ( !_ini.get_entry( entryContextMenus , "Options" , keyContextMenus ) ) continue;
        if ( !_ini.get_entry( entryIcon         , "Options" , keyIcon ) )         continue;
Jan Möbius's avatar
Jan Möbius committed
100

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
101 102 103
        QStringList toolBars     = entryToolbars.split(";");
        QStringList toolBoxes    = entryToolboxes.split(";");
        QStringList contextMenus = entryContextMenus.split(";");
104

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
105
        // Get Mode name ( prepended to all toolbox/toolbar/context menu lists )
Jan Möbius's avatar
Jan Möbius committed
106
        QString mode = toolBoxes.first();
107

Jan Möbius's avatar
Jan Möbius committed
108 109 110
        // Remove leading Modes
        toolBoxes.removeFirst();
        toolBars.removeFirst();
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
111
        contextMenus.removeFirst();
Jan Möbius's avatar
Jan Möbius committed
112 113

        // Check if the mode already exists
Jan Möbius's avatar
 
Jan Möbius committed
114 115 116 117
        bool found = false;
        for (int i=0; i < viewModes_.size(); i++)
          if (viewModes_[i]->name == mode)
            found = true;
118

Jan Möbius's avatar
 
Jan Möbius committed
119 120 121 122
        if (!found){
          ViewMode* vm = new ViewMode();
          vm->name = mode;
          vm->custom = true;
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
123 124 125 126
          vm->visibleToolbars     = toolBars;
          vm->visibleToolboxes    = toolBoxes;
          vm->visibleContextMenus = contextMenus;
          vm->icon                = entryIcon;
Jan Möbius's avatar
 
Jan Möbius committed
127 128 129 130 131 132 133 134 135
          viewModes_.push_back(vm);
        }

      }

    //load default dataType
    QString type;
    if (_ini.get_entry(type, "Options" , "default_DataType" ))
      OpenFlipper::Options::lastDataType(type);
Jan Möbius's avatar
Jan Möbius committed
136

Jan Möbius's avatar
 
Jan Möbius committed
137 138 139 140 141
    //============================================================================
    // Load the startup dir for file dialogs
    //============================================================================
    QString startup_dir;
    if( _ini.get_entry(startup_dir, "Options", "StartupDir") )
142
      OpenFlipperSettings().setValue("Core/CurrentDir", startup_dir );
Jan Möbius's avatar
 
Jan Möbius committed
143

Dirk Wilden's avatar
Dirk Wilden committed
144 145 146 147
    //============================================================================
    // Load the default script directory
    //============================================================================
    QString script_dir;
148
    if( _ini.get_entry(script_dir, "Options", "CurrentScriptDir") )
Dirk Wilden's avatar
Dirk Wilden committed
149 150
      OpenFlipper::Options::currentScriptDir(script_dir);

151 152 153 154 155 156 157
    //============================================================================
    // Load the default texture directory
    //============================================================================
    QString current_texture_dir;
    if( _ini.get_entry(current_texture_dir, "Options", "CurrentTextureDir") )
      OpenFlipper::Options::currentTextureDir(current_texture_dir);

Jan Möbius's avatar
 
Jan Möbius committed
158 159 160
    //============================================================================
    // Load the random base color setting
    //============================================================================
161 162 163
    bool random_base_color = false;
    if ( _ini.get_entry( random_base_color, "Options" , "RandomBaseColor") )
      OpenFlipper::Options::randomBaseColor( random_base_color );
Jan Möbius's avatar
 
Jan Möbius committed
164

Dirk Wilden's avatar
 
Dirk Wilden committed
165 166 167 168 169 170 171
    //============================================================================
    // Load the synchronization setting
    //============================================================================
    bool synchronization = false;
    if ( _ini.get_entry( synchronization, "Options" , "Synchronization") )
      OpenFlipper::Options::synchronization(synchronization);

Jan Möbius's avatar
 
Jan Möbius committed
172 173 174
    //============================================================================
    // Load the stereo mode setting
    //============================================================================
Jan Möbius's avatar
Jan Möbius committed
175 176 177
    //bool stereo = false;
    //if ( _ini.get_entry( stereo, "Options" , "Stereo") )
    //  OpenFlipper::Options::stereo(stereo);
Jan Möbius's avatar
 
Jan Möbius committed
178

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
    //============================================================================
    // Load the stereo mode setting
    //============================================================================
    int stereoMode = 0;
    if ( _ini.get_entry( stereoMode, "Options" , "StereoMode") )
      OpenFlipper::Options::stereoMode(static_cast<OpenFlipper::Options::StereoMode> (stereoMode));

    //============================================================================
    // Load the custom anaglyph stereo mode color matrices
    //============================================================================
    std::vector<float> mat;
    if ( _ini.get_entry( mat, "Options" , "CustomAnaglyphLeftEye") && mat.size () == 9)
    {
      OpenFlipper::Options::anaglyphLeftEyeColorMatrix(mat);
    }
    else
    {
      std::vector<float> set (9,0.0);
      set[0] = 0.299;
      set[3] = 0.587;
      set[6] = 0.114;
      OpenFlipper::Options::anaglyphLeftEyeColorMatrix(set);
    }

    if ( _ini.get_entry( mat, "Options" , "CustomAnaglyphRightEye") && mat.size () == 9)
    {
      OpenFlipper::Options::anaglyphRightEyeColorMatrix(mat);
    }
    else
    {
      std::vector<float> set (9,0.0);
      set[4] = 1.0;
      set[8] = 1.0;
      OpenFlipper::Options::anaglyphRightEyeColorMatrix(set);
    }

215 216 217 218 219 220 221
    //============================================================================
    // Load the setting for the object color option
    //============================================================================
    uint baseColor = 0;
    if ( _ini.get_entry( baseColor, "Options" , "DefaultBaseColor") )
      OpenFlipper::Options::defaultBaseColor(QRgb(baseColor));

Jan Möbius's avatar
 
Jan Möbius committed
222 223 224
    //============================================================================
    // Load the setting for the default Toolbox mode
    //============================================================================
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
225 226 227
    QString viewmode = false;
    if ( _ini.get_entry( viewmode, "Options" , "CurrentViewMode") )
      OpenFlipper::Options::currentViewMode(viewmode);
Jan Möbius's avatar
 
Jan Möbius committed
228

229 230 231 232 233 234 235
    //============================================================================
    // Load the setting for the translation language
    //============================================================================
    QString translation = false;
    if ( _ini.get_entry( translation, "Options" , "Translation") )
      OpenFlipper::Options::translation(translation);

236 237 238 239 240 241 242
    //============================================================================
    // Load the setting for the gridVisibility
    //============================================================================
    bool visible = false;
    if ( _ini.get_entry( visible, "Options" , "GridVisible") )
      OpenFlipper::Options::gridVisible(visible);

243 244 245 246 247 248 249
    //============================================================================
    // Load the setting for the viewer layout
    //============================================================================
    int viewerLayout = 0;
    if ( _ini.get_entry( viewerLayout, "Options" , "DefaultViewerLayout") )
      OpenFlipper::Options::defaultViewerLayout(viewerLayout);

Jan Möbius's avatar
 
Jan Möbius committed
250
    //============================================================================
251
    // Load the viewer settings
Jan Möbius's avatar
 
Jan Möbius committed
252 253
    //============================================================================
    std::vector< QString > draw_modes;
254 255 256 257 258
    int mode;

    for (int i=0; i < 4/*PluginFunctions::viewers()*/; i++ ){

      if( _ini.get_entry(draw_modes, "Options", "DefaultDrawModes" + QString::number(i) ) )
Jan Möbius's avatar
Jan Möbius committed
259
        OpenFlipper::Options::defaultDrawMode( listToDrawMode(draw_modes), i );
260 261

      if( _ini.get_entry(mode, "Options", "DefaultProjectionMode" + QString::number(i) ) )
262
        OpenFlipper::Options::defaultProjectionMode( mode, i );
263 264

      if( _ini.get_entry(mode, "Options", "DefaultViewingDirection" + QString::number(i) ) )
265
        OpenFlipper::Options::defaultViewingDirection( mode, i );
266
    }
Dirk Wilden's avatar
Dirk Wilden committed
267

Jan Möbius's avatar
Jan Möbius committed
268 269 270 271 272 273 274
    //============================================================================
    // Load slotDebugging state
    //============================================================================
    bool doSlotDebugging = false;
    if( _ini.get_entry(doSlotDebugging, "Options", "SlotDebugging") )
      OpenFlipper::Options::doSlotDebugging(doSlotDebugging);

Dirk Wilden's avatar
Dirk Wilden committed
275 276 277 278
    //============================================================================
    // ViewerProperties
    //============================================================================

Dirk Wilden's avatar
Dirk Wilden committed
279
    uint viewerCount = 0;
Dirk Wilden's avatar
Dirk Wilden committed
280 281 282
    if( _ini.get_entry(viewerCount, "Options", "ViewerCount") ){
    }

Dirk Wilden's avatar
Dirk Wilden committed
283 284
    if ( _ini.section_exists("ViewerProperties") ){
      for ( unsigned int i = 0 ; i < viewerCount; ++i ) {
Jan Möbius's avatar
Jan Möbius committed
285

Dirk Wilden's avatar
Dirk Wilden committed
286 287
        if (OpenFlipper::Options::examinerWidgets() < i)
          break;
Jan Möbius's avatar
Jan Möbius committed
288

Dirk Wilden's avatar
Dirk Wilden committed
289 290 291 292
        // Load the animation setting
        bool animation = false;
        if ( _ini.get_entry( animation, "ViewerProperties" , "Animation" + QString::number(i) ) )
          PluginFunctions::viewerProperties(i).animation(animation);
Jan Möbius's avatar
Jan Möbius committed
293

Dirk Wilden's avatar
Dirk Wilden committed
294 295 296 297
        // Load the twoSidedLighting setting
        bool twoSidedLighting = false;
        if ( _ini.get_entry( twoSidedLighting, "ViewerProperties" , "TwoSidedLighting" + QString::number(i)) )
          PluginFunctions::viewerProperties(i).twoSidedLighting(twoSidedLighting);
Jan Möbius's avatar
Jan Möbius committed
298

Dirk Wilden's avatar
Dirk Wilden committed
299 300 301 302
        // Load the backface culling setting
        bool backface_culling = false;
        if ( _ini.get_entry( backface_culling, "ViewerProperties" , "BackfaceCulling" + QString::number(i)) )
          PluginFunctions::viewerProperties(i).backFaceCulling(backface_culling);
Jan Möbius's avatar
Jan Möbius committed
303

Dirk Wilden's avatar
Dirk Wilden committed
304 305 306 307 308 309
        // Load the setting for the background color option
        uint viewerBackground = 0;
        if ( _ini.get_entry( viewerBackground, "ViewerProperties" , "BackgroundColor" + QString::number(i)) )
          PluginFunctions::viewerProperties(i).backgroundColor( QRgb(viewerBackground) );
      }
    }
Dirk Wilden's avatar
Dirk Wilden committed
310

Dirk Wilden's avatar
Dirk Wilden committed
311 312 313 314 315 316
    //============================================================================
    // Update information
    //============================================================================
    QString updateUrl = "";
    if( _ini.get_entry(updateUrl, "Options", "UpdateURL") )
      OpenFlipper::Options::updateUrl(updateUrl);
Dirk Wilden's avatar
Dirk Wilden committed
317

Dirk Wilden's avatar
Dirk Wilden committed
318 319 320
    QString updateUsername = "";
    if( _ini.get_entry(updateUsername, "Options", "UpdateUsername") )
      OpenFlipper::Options::updateUsername(updateUsername);
Dirk Wilden's avatar
Dirk Wilden committed
321

Dirk Wilden's avatar
Dirk Wilden committed
322 323 324
    QString updatePassword = "";
    if( _ini.get_entry(updatePassword, "Options", "UpdatePassword") )
      OpenFlipper::Options::updatePassword(updatePassword);
Jan Möbius's avatar
 
Jan Möbius committed
325 326 327
  }
}

328 329 330 331 332 333 334 335 336 337 338 339
void Core::readRecentFiles(QString _filename){

  INIFile ini;

  if ( ! ini.connect(_filename,false) ) {
    emit log(LOGERR,"Failed to connect to ini file" + _filename);
    return;
  }

  OpenFlipper::Options::loadingSettings(true);

  // Load maxRecent Setting
340
  int mrecent = 10;
341
  if (ini.get_entry(mrecent,"Options","MaxRecent"))
342
    OpenFlipperSettings().setValue("Core/File/MaxRecent", mrecent);
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

  for ( int j = mrecent-1 ; j >= 0; --j) {
    QString file;
    QString key = "recent" + QString::number(j);

    if ( !ini.get_entry( file , "Options" , key ) )
      continue;

    key = "type" + QString::number(j);
    QString type;

    if ( !ini.get_entry( type , "Options" , key ) )
      continue;

    OpenFlipper::Options::addRecentFile(file, typeId(type) );
  }

  ini.disconnect();

  OpenFlipper::Options::loadingSettings(false);

}


Dirk Wilden's avatar
Dirk Wilden committed
367
/** Write the standard options to the given Ini File
Jan Möbius's avatar
 
Jan Möbius committed
368 369
* @param _ini Inifile to use
*/
Dirk Wilden's avatar
Dirk Wilden committed
370
void Core::writeApplicationOptions(INIFile& _ini) {
Jan Möbius's avatar
 
Jan Möbius committed
371 372

  // Write maximum recent file count to ini
373
  _ini.add_entry("Options","MaxRecent", OpenFlipperSettings().value("Core/File/MaxRecent",10).toInt() );
Jan Möbius's avatar
 
Jan Möbius committed
374 375

  // Write list of recent files to ini
376 377 378
  QStringList recentFiles = OpenFlipperSettings().value("Core/File/RecentFiles").toStringList();
  QStringList recentTypes = OpenFlipperSettings().value("Core/File/RecentTypes").toStringList();
  
Jan Möbius's avatar
 
Jan Möbius committed
379 380 381
  for ( int j = 0 ; j < recentFiles.size(); ++j) {
    // Save filename
    QString key = "recent" + QString::number(j);
382
    QString filename = recentFiles[j];
Jan Möbius's avatar
 
Jan Möbius committed
383 384 385
    _ini.add_entry( "Options" , key , filename );
    // Save DataType
    key = "type" + QString::number(j);
386
    QString type = recentTypes[j];
Jan Möbius's avatar
 
Jan Möbius committed
387 388 389 390
    _ini.add_entry( "Options" , key , type );
  }

  // save ViewModes
Jan Möbius's avatar
Jan Möbius committed
391 392
  QVector< QString > toolboxes;
  QVector< QString > toolbars;
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
393
  QVector< QString > contextmenus;
Jan Möbius's avatar
Jan Möbius committed
394
  QVector< QString > icons;
395

Jan Möbius's avatar
 
Jan Möbius committed
396 397 398 399 400
  if ( OpenFlipper::Options::gui() )
    for (int i=0; i < coreWidget_->viewModes_.size(); i++)
      if (coreWidget_->viewModes_[i]->custom){

        //store name
Jan Möbius's avatar
Jan Möbius committed
401
        QString entryToolboxes = coreWidget_->viewModes_[i]->name;
Jan Möbius's avatar
 
Jan Möbius committed
402 403

        //store widgets
Jan Möbius's avatar
Jan Möbius committed
404
        for (int j=0; j < coreWidget_->viewModes_[i]->visibleToolboxes.size(); j++)
Jan Möbius's avatar
Jan Möbius committed
405 406 407
          entryToolboxes += ";" + coreWidget_->viewModes_[i]->visibleToolboxes[j];

        toolboxes.push_back(entryToolboxes);
Jan Möbius's avatar
 
Jan Möbius committed
408

Jan Möbius's avatar
Jan Möbius committed
409 410
        //store name
        QString entryToolbars = coreWidget_->viewModes_[i]->name;
411

Jan Möbius's avatar
Jan Möbius committed
412 413 414
        //store widgets
        for (int j=0; j < coreWidget_->viewModes_[i]->visibleToolbars.size(); j++)
          entryToolbars += ";" + coreWidget_->viewModes_[i]->visibleToolbars[j];
415

Jan Möbius's avatar
Jan Möbius committed
416
        toolbars.push_back(entryToolbars);
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
417 418
	
	QString entryContextMenus = coreWidget_->viewModes_[i]->name;
419

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
420 421 422
        //store widgets
        for (int j=0; j < coreWidget_->viewModes_[i]->visibleContextMenus.size(); j++)
          entryContextMenus += ";" + coreWidget_->viewModes_[i]->visibleContextMenus[j];
423

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
424 425 426
        contextmenus.push_back(entryContextMenus);

        icons.push_back(coreWidget_->viewModes_[i]->icon);
Jan Möbius's avatar
 
Jan Möbius committed
427 428 429
      }

  //save viewmodes to ini
Jan Möbius's avatar
Jan Möbius committed
430 431
  _ini.add_entry("Options","ViewModeCount" ,toolboxes.size());
  for (int i=0; i < toolboxes.size(); i++) {
Jan Möbius's avatar
Marlin:  
Jan Möbius committed
432 433 434 435
    _ini.add_entry("Options","ViewModeToolboxes"     + QString::number(i) ,toolboxes[i]);
    _ini.add_entry("Options","ViewModeToolbars"      + QString::number(i) ,toolbars[i] );
    _ini.add_entry("Options","ViewModeContextMenus"  + QString::number(i) ,contextmenus[i] );
    _ini.add_entry("Options","ViewModeIcon"          + QString::number(i) ,icons[i] );
Jan Möbius's avatar
Jan Möbius committed
436
  }
Jan Möbius's avatar
 
Jan Möbius committed
437

438 439 440 441
  //save KeyBindings
  if ( OpenFlipper::Options::gui() )
    coreWidget_->saveKeyBindings(_ini);

Jan Möbius's avatar
 
Jan Möbius committed
442 443 444
  //write default dataType to INI
  _ini.add_entry( "Options" , "default_DataType" , OpenFlipper::Options::lastDataType() );

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
445 446
  //write current ViewMode
  _ini.add_entry("Options","CurrentViewMode",OpenFlipper::Options::currentViewMode() );
Jan Möbius's avatar
 
Jan Möbius committed
447

Jan Möbius's avatar
Jan Möbius committed
448 449 450 451 452
  //============================================================================
  // Debugging
  //============================================================================
  _ini.add_entry("Options","SlotDebugging",OpenFlipper::Options::doSlotDebugging() );

453 454 455 456 457 458 459
  //============================================================================
  // Update information
  //============================================================================
  _ini.add_entry("Options","UpdateURL",OpenFlipper::Options::updateUrl() );
  _ini.add_entry("Options","UpdateUsername",OpenFlipper::Options::updateUsername() );
  _ini.add_entry("Options","UpdatePassword",OpenFlipper::Options::updatePassword() );

Jan Möbius's avatar
 
Jan Möbius committed
460 461 462 463 464 465
  if ( !_ini.section_exists("Plugins") )
    _ini.add_section("Plugins");

  if ( !_ini.section_exists("Options") )
    _ini.add_section("Options");

466
  QString dir = OpenFlipperSettings().value("Core/CurrentDir").toString().toUtf8();
Jan Möbius's avatar
 
Jan Möbius committed
467
  _ini.add_entry("Options","StartupDir",dir);
Dirk Wilden's avatar
Dirk Wilden committed
468 469

  QString scriptDir = OpenFlipper::Options::currentScriptDirStr().toUtf8();
470 471 472 473
  _ini.add_entry("Options","CurrentScriptDir",scriptDir);

  QString current_texture_dir = OpenFlipper::Options::currentTextureDirStr().toUtf8();
  _ini.add_entry("Options","CurrentTextureDir",current_texture_dir);
Dirk Wilden's avatar
Dirk Wilden committed
474

475
  _ini.add_entry("Options","RandomBaseColor", OpenFlipper::Options::randomBaseColor() );
Jan Möbius's avatar
 
Jan Möbius committed
476 477 478

  if ( OpenFlipper::Options::gui() ) {

479 480
    _ini.add_entry("Options","DefaultViewerLayout", OpenFlipper::Options::defaultViewerLayout() );
    _ini.add_entry("Options","Translation", OpenFlipper::Options::translation() );
481
    _ini.add_entry("Options","GridVisible", OpenFlipper::Options::gridVisible() );
482

Dirk Wilden's avatar
Dirk Wilden committed
483
    _ini.add_entry("Options","ViewerCount", OpenFlipper::Options::examinerWidgets() );
Jan Möbius's avatar
Jan Möbius committed
484

Dirk Wilden's avatar
Dirk Wilden committed
485 486
    if ( !_ini.section_exists("ViewerProperties") )
      _ini.add_section("ViewerProperties");
Jan Möbius's avatar
 
Jan Möbius committed
487

Dirk Wilden's avatar
Dirk Wilden committed
488
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i ) {
Dirk Wilden's avatar
Dirk Wilden committed
489

Dirk Wilden's avatar
Dirk Wilden committed
490 491 492 493 494 495
      _ini.add_entry("ViewerProperties","Animation" + QString::number(i),       PluginFunctions::viewerProperties(i).animation());
      _ini.add_entry("ViewerProperties","BackfaceCulling" + QString::number(i), PluginFunctions::viewerProperties(i).backFaceCulling());
      _ini.add_entry("ViewerProperties","TwoSidedLighting" + QString::number(i),PluginFunctions::viewerProperties(i).twoSidedLighting());
      _ini.add_entry("ViewerProperties","BackgroundColor" + QString::number(i),
                     (uint)PluginFunctions::viewerProperties(i).backgroundColorRgb() );
    }
Jan Möbius's avatar
 
Jan Möbius committed
496
    //============================================================================
497
    // Save the current viewer properties
Jan Möbius's avatar
 
Jan Möbius committed
498 499
    //============================================================================
    std::vector< QString > draw_modes;
500 501 502 503 504 505 506 507 508

    for (int i=0; i < PluginFunctions::viewers(); i++ ){

      draw_modes = drawModeToList( OpenFlipper::Options::defaultDrawMode(i) );
      _ini.add_entry("Options","DefaultDrawModes" + QString::number(i), draw_modes);

      _ini.add_entry("Options","DefaultProjectionMode" + QString::number(i), OpenFlipper::Options::defaultProjectionMode(i) );
      _ini.add_entry("Options","DefaultViewingDirection" + QString::number(i), OpenFlipper::Options::defaultViewingDirection(i) );
    }
509

510
    _ini.add_entry("Options","DefaultBaseColor", (uint)OpenFlipper::Options::defaultBaseColor().rgba ()  );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
511

512
    _ini.add_entry("Options", "StereoMode",OpenFlipper::Options::stereoMode() );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
513 514 515

    _ini.add_entry("Options" , "CustomAnaglyphLeftEye", OpenFlipper::Options::anaglyphLeftEyeColorMatrix() );
    _ini.add_entry("Options" , "CustomAnaglyphRightEye", OpenFlipper::Options::anaglyphRightEyeColorMatrix() );
Jan Möbius's avatar
 
Jan Möbius committed
516 517
  }

518 519
  emit saveOnExit(_ini);

Jan Möbius's avatar
Jan Möbius committed
520
  // _ini.add_entry("Options","Stereo",OpenFlipper::Options::stereo() );
Jan Möbius's avatar
 
Jan Möbius committed
521 522
}

523 524 525 526
void Core::openIniFile( QString _filename,
                        bool    _coreSettings,
                        bool    _perPluginSettings,
                        bool    _loadObjects ){
Jan Möbius's avatar
 
Jan Möbius committed
527 528 529
  INIFile ini;

  if ( ! ini.connect(_filename,false) ) {
530
    emit log(LOGERR,tr("Failed to connect to ini file") + _filename);
Jan Möbius's avatar
 
Jan Möbius committed
531 532
    return;
  }
Jan Möbius's avatar
Jan Möbius committed
533

Jan Möbius's avatar
 
Jan Möbius committed
534
  if ( OpenFlipper::Options::gui() ) {
535
    coreWidget_->statusMessage( tr("Loading ini File ") + _filename + " ...");
Jan Möbius's avatar
 
Jan Möbius committed
536 537 538
    coreWidget_->setStatus(ApplicationStatus::BLOCKED );
  }

539
  // Tell plugins that we are currently reading an ini file
540
  OpenFlipper::Options::loadingSettings(true);
Jan Möbius's avatar
 
Jan Möbius committed
541

542 543 544
  // Load Core settings only if requested
  if ( _coreSettings )
    readApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
545

546 547 548
  // if requested load per Plugin settings from the settings file
  if ( _perPluginSettings )
    emit iniLoadOptions( ini );
Jan Möbius's avatar
 
Jan Möbius committed
549

550
  if ( _loadObjects ) {
Jan Möbius's avatar
 
Jan Möbius committed
551

552
    QStringList openFiles;
Jan Möbius's avatar
 
Jan Möbius committed
553

554 555
    // Parse File section for files to open
    if ( ini.section_exists("OpenFiles") && ini.get_entry(openFiles,"OpenFiles","open") ) {
Jan Möbius's avatar
 
Jan Möbius committed
556

557
      bool newActiveObject = false;
Jan Möbius's avatar
 
Jan Möbius committed
558

559
      for ( int i = 0 ; i < openFiles.size(); ++i ) {
Jan Möbius's avatar
 
Jan Möbius committed
560

561
        QString sectionName = openFiles[i];
562

563 564 565 566 567 568
        // Check if the string read is empty (e.g. colon at the end of the line ...)
        // So skip trying to read files without a filename.
        if ( sectionName.isEmpty() ) {
          emit log(LOGWARN,tr("Warning from ini file parser: OpenFiles list contains empty string.") );
          continue;
        }
569

570 571 572 573 574
        // Check if the specified section exists
        if ( !ini.section_exists(sectionName) ) {
          emit log(LOGERR,tr("Error parsing ini file. OpenFiles section %1 not found in File!").arg(sectionName));
          continue;
        }
575

576
        // Get the path for the file which should be opened
577
        QString path;
578 579 580 581
        if ( !ini.get_entry( path, sectionName , "path" ) ) {
          emit log(LOGERR,tr("Error parsing ini file. Section %1 contains no path description!").arg(sectionName));
          continue;
        }
582

583
        // Check if path is relative ( The path is considered to be relative if the first character is a ".")
584
        if (path.startsWith( "." + OpenFlipper::Options::dirSeparator() )){
585

586
          // check if _filename contains a path by testing if it contains a directory separator
587 588 589 590
          if (_filename.section(OpenFlipper::Options::dirSeparator(), 0, -2) != ""){
            path.remove(0,1); // remove .
            path = _filename.section(OpenFlipper::Options::dirSeparator(), 0, -2) + path;
          }
591

Jan Möbius's avatar
 
Jan Möbius committed
592 593
        }

594
        int tmpType;
595
        DataType type = typeId("TriangleMesh");
596

597
        // First check for old datatype style (Only numbers .. therefore not consistent for runtime added types)
598 599
        if ( ini.get_entry( tmpType, sectionName , "type"  )) {
          type = DataType(tmpType);
600 601
          emit log(LOGWARN, tr("This ini file uses old int style ObjectType fields!") );
          emit log(LOGWARN, tr("Please convert it to new format! ( ... just save it )") );
602
        } else {
603

604
          // Read new style type. The type is represented by its name (as a QString)
605 606 607 608
          QString typeName="";
          if ( ini.get_entry( typeName, sectionName , "type"  )) {
            type = typeId(typeName);
          } else
609
            emit log(LOGWARN, tr("Unable to get DataType for object %1 assuming Triangle Mesh!").arg(sectionName) );
610
        }
Jan Möbius's avatar
 
Jan Möbius committed
611

612
        // Now the object gets loaded based on the given datatype
613
        int newObjectId = loadObject(type, path);
Jan Möbius's avatar
 
Jan Möbius committed
614

615
        // get the new object from the object tree ( If that fails, the object was not loaded correctly)
616 617
        BaseObject* object = objectRoot_->childExists( newObjectId );
        if ( object == 0 )  {
618
          emit log(LOGERR,tr("Unable to open Object ") + path);
619 620 621
          continue;
        }

622
        // Read the target flag setting
623
        bool flag;
624
        if ( ini.get_entry( flag, sectionName , "target" ) )
625 626
          object->target(flag);

627
        // Read the source flag setting
628 629
        if ( ini.get_entry( flag, sectionName , "source" ) )
          object->source(flag);
Jan Möbius's avatar
 
Jan Möbius committed
630

631
        // Tell plugins to load their per object settings
632
        emit iniLoad( ini,object->id() );
Jan Möbius's avatar
 
Jan Möbius committed
633

634
      }
Jan Möbius's avatar
 
Jan Möbius committed
635 636 637 638
    }

  }

639
  // Tell Plugins that all objects are loaded and they should read the remaining parts if necessary
640
  if ( _perPluginSettings )
641
    emit iniLoadOptionsLast( ini );
Jan Möbius's avatar
 
Jan Möbius committed
642

643
  // close ini file
Jan Möbius's avatar
 
Jan Möbius committed
644 645
  ini.disconnect();

646
  // As the reading has been completed, tell plugins that we do not read an ini file anymore.
647
  OpenFlipper::Options::loadingSettings(false);
Jan Möbius's avatar
 
Jan Möbius committed
648

649
  // Reset scenegraph and reset trackball center
650
  // This will also recompute the bounding boxes as well as the near and far plane
651
  resetScenegraph(true);
Jan Möbius's avatar
Jan Möbius committed
652

Dirk Wilden's avatar
Dirk Wilden committed
653 654
  if ( OpenFlipper::Options::gui() ){
    for ( unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i ) {
655
      PluginFunctions::viewerProperties(i).drawMode( OpenFlipper::Options::defaultDrawMode(i) );
Dirk Wilden's avatar
Dirk Wilden committed
656 657
      coreWidget_->examiner_widgets_[i]->viewAll();
    }
Jan Möbius's avatar
Jan Möbius committed
658

659
    coreWidget_->statusMessage( tr("Loading ini File ") + _filename + tr(" ... Done"), 4000);
Jan Möbius's avatar
 
Jan Möbius committed
660 661 662 663 664
    coreWidget_->setStatus(ApplicationStatus::READY );
  }

}

665 666 667 668 669 670
void Core::writeIniFile(QString _filename,
                        bool _relativePaths,
                        bool _targetOnly,
                        bool _saveSystemSettings,
                        bool _savePluginSettings ,
                        bool _saveObjectInfo ) {
Jan Möbius's avatar
Jan Möbius committed
671

Jan Möbius's avatar
 
Jan Möbius committed
672 673 674
  INIFile ini;

  if ( ! ini.connect(_filename,true) ) {
675
    emit log(LOGERR,tr("Failed to connect to _ini file") + _filename);
Jan Möbius's avatar
 
Jan Möbius committed
676 677
      return;
  }
Jan Möbius's avatar
Jan Möbius committed
678

Jan Möbius's avatar
 
Jan Möbius committed
679
  if ( OpenFlipper::Options::gui() ) {
680
    coreWidget_->statusMessage( tr("Saving ini File ") + _filename + " ...");
Jan Möbius's avatar
 
Jan Möbius committed
681 682 683
    coreWidget_->setStatus(ApplicationStatus::BLOCKED );
  }

684
  // Only save application settings when requested
685
  if ( _saveSystemSettings )
686
    writeApplicationOptions(ini);
Jan Möbius's avatar
 
Jan Möbius committed
687

688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
  if ( _savePluginSettings )
    emit iniSaveOptions( ini );

  if ( _saveObjectInfo ) {
    // This vector will hold the file sections to open
    QStringList openFiles;


    PluginFunctions::IteratorRestriction restriction;
    if ( _targetOnly )
      restriction = PluginFunctions::TARGET_OBJECTS;
    else
      restriction = PluginFunctions::ALL_OBJECTS;

    QString keyName;
    QString sectionName;
    for ( PluginFunctions::ObjectIterator o_it(restriction) ;
Jan Möbius's avatar
 
Jan Möbius committed
705
                                          o_it != PluginFunctions::objectsEnd(); ++o_it) {
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723
      QString file = o_it->path() + OpenFlipper::Options::dirSeparator() + o_it->name();
      if (QFile(file).exists()){
        // Add a section for this object
        sectionName = o_it->name();
        ini.add_section( sectionName );
        openFiles.push_back( sectionName );

        //modify filename if relativePaths are wanted
        if (_relativePaths){
          int prefixLen = _filename.section(OpenFlipper::Options::dirSeparator(),0,-2).length();
          file.remove(0, prefixLen);
          file = "." + file;
        }
        // Add the path of this object to the section
        ini.add_entry( sectionName , "path" , file );
        ini.add_entry( sectionName , "type" , typeName(o_it->dataType() ) );
        ini.add_entry( sectionName , "target" , o_it->target() );
        ini.add_entry( sectionName , "source" , o_it->source() );
Jan Möbius's avatar
 
Jan Möbius committed
724

725
      }
Jan Möbius's avatar
 
Jan Möbius committed
726 727
    }

728
    ini.add_entry("OpenFiles","open",openFiles);
Jan Möbius's avatar
 
Jan Möbius committed
729

730 731
    // Tell plugins to save their information for the given object
    for ( PluginFunctions::ObjectIterator o_it(PluginFunctions::ALL_OBJECTS) ;
Jan Möbius's avatar
 
Jan Möbius committed
732
                                          o_it != PluginFunctions::objectsEnd(); ++o_it)
733 734
      emit iniSave(  ini , o_it->id() );
  }
Jan Möbius's avatar
 
Jan Möbius committed
735 736 737 738



  ini.disconnect();
Jan Möbius's avatar
Jan Möbius committed
739

Jan Möbius's avatar
 
Jan Möbius committed
740
  if ( OpenFlipper::Options::gui() ) {
741
    coreWidget_->statusMessage( tr("Saving ini File ") + _filename + tr(" ... Done"), 4000);
Jan Möbius's avatar
 
Jan Möbius committed
742 743 744 745 746 747
    coreWidget_->setStatus(ApplicationStatus::READY );
  }
}


//=============================================================================