optionsWidget.cc 32.9 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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
*                           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/>.                                       *
*                                                                            *
33 34 35
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36 37 38 39 40
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
41
\*===========================================================================*/
42 43 44 45 46 47 48




#include "optionsWidget.hh"
#include <iostream>
#include <OpenFlipper/common/GlobalOptions.hh>
Dirk Wilden's avatar
Dirk Wilden committed
49 50
#include <ACG/Scenegraph/DrawModes.hh>
#include <OpenFlipper/ACGHelper/DrawModeConverter.hh>
51
#include <OpenFlipper/INIFile/INIFile.hh>
52
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Dirk Wilden's avatar
Dirk Wilden committed
53

54
#include <QColorDialog>
55
#include <QMessageBox>
56

Dirk Wilden's avatar
Dirk Wilden committed
57
OptionsWidget::OptionsWidget(std::vector<PluginInfo>& _plugins, std::vector<KeyBinding>& _core, InverseKeyMap& _invKeys, QWidget *parent)
Jan Möbius's avatar
Jan Möbius committed
58 59
  : QWidget(parent),
    plugins_(_plugins),
Dirk Wilden's avatar
Dirk Wilden committed
60
    coreKeys_(_core),
61
    keys_(_invKeys),
62
    restartRequired_(false),
63
    exitOnClose_(false)
64 65
{
  setupUi(this);
Dirk Wilden's avatar
Dirk Wilden committed
66

Dirk Wilden's avatar
Dirk Wilden committed
67
  connect(okButton,SIGNAL(clicked()),this,SLOT(slotOk()));
68 69
  connect(applyButton,SIGNAL(clicked()),this,SLOT(slotApply()));
  connect(cancelButton,SIGNAL(clicked()),this,SLOT(slotCancel()));
Jan Möbius's avatar
Jan Möbius committed
70
  connect(checkUpdateButton,SIGNAL(clicked()),this,SLOT(slotCheckUpdates()));
Jan Möbius's avatar
Jan Möbius committed
71 72
  connect(updateButton,SIGNAL(clicked()),this,SLOT(slotGetUpdates()));
  updateButton->setEnabled(false);
73 74

  // Viewer Settings
Dirk Wilden's avatar
Dirk Wilden committed
75
  connect( restrictFPS, SIGNAL(toggled(bool)), FPS, SLOT(setEnabled(bool)) );
76 77 78 79
  connect( viewerList, SIGNAL(currentRowChanged(int)), this, SLOT(updateViewerSettings(int)) );
  connect( availDrawModes, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(viewerSettingsChanged(QListWidgetItem*)) );
  connect( projectionBox, SIGNAL(currentIndexChanged(int)), this, SLOT(viewerSettingsChanged(int)));
  connect( directionBox, SIGNAL(currentIndexChanged(int)), this, SLOT(viewerSettingsChanged(int)));
80
  connect( lockRotationBox, SIGNAL(stateChanged(int)), this, SLOT(viewerSettingsChanged(int)));
81

82 83 84 85 86 87 88
  // Switch stacked widget of stereo settings
  connect(stereoOpengl, SIGNAL(clicked()),
          this, SLOT(switchStackedWidget()));
  connect(stereoAnaglyph, SIGNAL(clicked()),
          this, SLOT(switchStackedWidget()));
  connect(stereoCustomAnaglyph, SIGNAL(clicked()),
          this, SLOT(switchStackedWidget()));
89 90 91 92 93 94
  
  connect(focalDistance, SIGNAL(sliderReleased()),
          this, SLOT(slotPreviewStereoSettings()));
  connect(eyeDistance, SIGNAL(editingFinished()),
          this, SLOT(slotPreviewStereoSettings()));

95
  ACG::SceneGraph::DrawModes::ModeFlagSet mode(2);
Dirk Wilden's avatar
Dirk Wilden committed
96
  for (uint i=1; i < 22; i++) {
97
    std::vector< QString > dm = drawModeToDescriptions( mode );
Jan Möbius's avatar
Jan Möbius committed
98

99
    if ( !dm.empty() && dm[0].trimmed() != ""){
Dirk Wilden's avatar
Dirk Wilden committed
100
      QListWidgetItem* item = new QListWidgetItem(dm[0]);
Jan Möbius's avatar
Jan Möbius committed
101

Dirk Wilden's avatar
Dirk Wilden committed
102
      item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
103

104
      item->setCheckState(Qt::Unchecked);
Dirk Wilden's avatar
Dirk Wilden committed
105 106 107

      availDrawModes->addItem( item );
    }
108

Dirk Wilden's avatar
Dirk Wilden committed
109
    mode = mode<<1;
110
  }
Dirk Wilden's avatar
Dirk Wilden committed
111

112 113 114 115
  defaultProjectionMode_.resize(4);
  defaultViewingDirections_.resize(4);
  defaultRotationLocks_.resize(4);

116 117
  for ( int i=0; i < PluginFunctions::viewers(); i++ ){
    viewerList->addItem("Viewer " + QString::number(i+1) );
118
    defaultDrawModes_.push_back( ACG::SceneGraph::DrawModes::DEFAULT );
119
  }
Jan Möbius's avatar
Jan Möbius committed
120

Dirk Wilden's avatar
Dirk Wilden committed
121 122 123
  pluginOptionsLayout = new QVBoxLayout;
  pluginOptions->setLayout( pluginOptionsLayout );

Jan Möbius's avatar
Jan Möbius committed
124
  http = new QHttp(this);
Jan Möbius's avatar
Jan Möbius committed
125

Jan Möbius's avatar
Jan Möbius committed
126 127 128 129 130 131 132
  // http specific connections
  connect(http, SIGNAL(requestFinished(int, bool)),
        this, SLOT(httpRequestFinished(int, bool)));
  connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)),
        this, SLOT(readResponseHeader(const QHttpResponseHeader &)));
  connect(http, SIGNAL(dataReadProgress(int, int)),
          this, SLOT(updateDataReadProgress(int, int)));
Jan Möbius's avatar
Jan Möbius committed
133

Jan Möbius's avatar
Jan Möbius committed
134 135 136

  progressDialog = new QProgressDialog(this);
  connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
137 138 139

  //colordialog
  connect(backgroundButton, SIGNAL(clicked()), this, SLOT(getBackgroundColor()) );
140
  connect(baseColorButton, SIGNAL(clicked()), this, SLOT(getBaseColor()) );
141 142 143 144
  
  // Clear settings and ini buttons
  connect(clearSettingsButton, SIGNAL(clicked()), this, SLOT(slotClearSettings()));
  connect(clearINIButton,      SIGNAL(clicked()), this, SLOT(slotClearINI()));
145 146 147 148 149 150

  // Disable update tab if app store compliant build
  #ifdef OPENFLIPPER_BUILD_APP_STORE_COMPLIANT
    //tabWidget->setTabEnabled(tabWidget->count()-1,false);
    tabWidget->removeTab(tabWidget->count()-1);
  #endif
151 152 153
}

void OptionsWidget::getBackgroundColor(){
154
  QColor newColor = QColorDialog::getColor ( OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>() );
Jan Möbius's avatar
Jan Möbius committed
155

156 157
  backgroundColor_ = newColor;
  
158
  QPixmap color(16,16);
159
  color.fill( newColor );
160
  backgroundButton->setIcon( QIcon(color) );
161 162
}

163 164 165 166 167 168 169 170 171 172
void OptionsWidget::getBaseColor(){
  QColor newColor = QColorDialog::getColor ( OpenFlipper::Options::defaultBaseColor() );

  OpenFlipper::Options::defaultBaseColor( newColor) ;

  QPixmap color(16,16);
  color.fill( OpenFlipper::Options::defaultBaseColor() );
  baseColorButton->setIcon( QIcon(color) );
}

173 174 175 176 177 178 179 180 181 182 183 184
void OptionsWidget::viewerSettingsChanged(QListWidgetItem* /*_item*/){
  viewerSettingsChanged(0);
};

void OptionsWidget::viewerSettingsChanged(int /*_index*/){

  if ( !updatingViewerSettings_ ){
    //viewer defaults
    std::vector< QString > mode;

    for (int i=0; i < availDrawModes->count(); i++)
      if (availDrawModes->item(i)->checkState() == Qt::Checked)
185
        mode.push_back( availDrawModes->item(i)->text() );
186 187

    defaultDrawModes_[         viewerList->currentRow() ] = descriptionsToDrawMode(mode);
188
    defaultProjectionMode_[    viewerList->currentRow() ] = projectionBox->currentIndex() ;
189
    defaultViewingDirections_[ viewerList->currentRow() ] = directionBox->currentIndex();
190 191 192 193 194 195
    defaultRotationLocks_[ viewerList->currentRow() ]     = lockRotationBox->isChecked();

    if ( lockRotationBox->isChecked() )
      std::cerr << "locked" << std::endl;
    else
      std::cerr << "unlocked" << std::endl;
196 197 198
  }
};

199 200 201 202 203
void OptionsWidget::switchStackedWidget() {

    // Show right stacked widget of stereo settings
    if (stereoCustomAnaglyph->isChecked()) {
        stackedWidget->setCurrentIndex(0);
204
        customAnaGlyphSettings->setVisible(true);
Jan Möbius's avatar
Typo  
Jan Möbius committed
205
    } else {
206
        stackedWidget->setCurrentIndex(0);
207
        customAnaGlyphSettings->setVisible(false);
208
    }
209 210 211
    
    // Preview new settings
    slotPreviewStereoSettings();
212 213
}

214
void OptionsWidget::slotTranslationIndexChanged(int /*_index*/) {
215
  restartRequired_ = true;
216 217
}

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
void OptionsWidget::updateViewerSettings(int _row){

  updatingViewerSettings_ = true;

  for (int i = 0 ; i < availDrawModes->count(); ++i )
    availDrawModes->item( i )->setCheckState(Qt::Unchecked) ;

  //Check the drawModes from StandardDrawMode
  std::vector< QString > dm = drawModeToDescriptions( defaultDrawModes_[_row] );

  for (uint i=0; i < dm.size(); i++){
    if ( !dm.empty() ) {
      QList< QListWidgetItem* > found = availDrawModes->findItems(dm[i],Qt::MatchExactly);
      for(int k=0; k < found.count(); k++)
        (found[k])->setCheckState(Qt::Checked);
    }
  }

236 237 238 239 240
  if ( defaultProjectionMode_[_row] )
    projectionBox->setCurrentIndex( 1 );
  else
    projectionBox->setCurrentIndex( 0 );

241 242
  directionBox->setCurrentIndex(  defaultViewingDirections_[_row] );

243 244
  lockRotationBox->setChecked( defaultRotationLocks_[_row] );

245 246 247
  updatingViewerSettings_ = false;
}

Dirk Wilden's avatar
Dirk Wilden committed
248
void OptionsWidget::showEvent ( QShowEvent * /*event*/ ) {
Dirk Wilden's avatar
Dirk Wilden committed
249

Jan Möbius's avatar
Jan Möbius committed
250
  //general
Jan Möbius's avatar
Jan Möbius committed
251
  fullscreen->setChecked( OpenFlipperSettings().value("Core/Gui/fullscreen",false).toBool() );
252
  splash->setChecked( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() );
Jan Möbius's avatar
Jan Möbius committed
253 254
  toolbox->setChecked( !OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
  
Dirk Wilden's avatar
Dirk Wilden committed
255 256 257 258 259 260 261
  iconSmall->setChecked(false);
  iconNormal->setChecked(false);
  iconDefault->setChecked(false);
  
  switch ( OpenFlipperSettings().value("Core/Toolbar/iconSize",0).toInt() ){
    case 1  : iconSmall->setChecked(true); break;
    case 2  : iconNormal->setChecked(true); break;
Jan Möbius's avatar
Jan Möbius committed
262
    default : iconDefault->setChecked(true); break;
Dirk Wilden's avatar
Dirk Wilden committed
263 264
  }
  
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
265 266 267
  loggerHidden->setChecked( OpenFlipper::Options::loggerState() == OpenFlipper::Options::Hidden);
  loggerNormal->setChecked( OpenFlipper::Options::loggerState() == OpenFlipper::Options::Normal);
  loggerInScene->setChecked( OpenFlipper::Options::loggerState() == OpenFlipper::Options::InScene);
Jan Möbius's avatar
Jan Möbius committed
268
  enableLogFile->setChecked( OpenFlipperSettings().value("Core/Log/logFileEnabled",true).toBool() );
Jan Möbius's avatar
Jan Möbius committed
269

Jan Möbius's avatar
Jan Möbius committed
270
  //Files
Jan Möbius's avatar
Jan Möbius committed
271
  logFile->setText( OpenFlipperSettings().value("Core/Log/logFile").toString()  );
Jan Möbius's avatar
Jan Möbius committed
272
  maxRecentBox->setValue( OpenFlipperSettings().value("Core/File/MaxRecent",15).toInt() );
Dirk Wilden's avatar
Dirk Wilden committed
273

274
  // UI settings
275
  toolBoxOrientation->setCurrentIndex((OpenFlipperSettings().value("Core/Gui/ToolBoxes/ToolBoxOnTheRight",true).toBool() ? 0 : 1));
276
  
277
  pickToolbarInScene->setChecked(OpenFlipperSettings().value("Core/Gui/ToolBars/PickToolbarInScene",true).toBool());
278

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
279
  //stereo
280 281 282 283 284 285 286 287

  // Grey out OpenGL stereo mode option if not available
  if(!OpenFlipper::Options::glStereo()) {
      stereoOpengl->setDisabled(true);
  } else {
      stereoOpengl->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::OpenGL);
  }

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
288 289 290
  stereoAnaglyph->setChecked (OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphRedCyan);
  stereoCustomAnaglyph->setChecked (OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphCustom);

291
  eyeDistance->setValue ( OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() );
292
  focalDistance->setValue ( OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble()  * 1000);
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
293

294
  // Show right stacked widget
295
  customAnaGlyphSettings->setVisible(false);
296 297 298 299 300

  stackedWidget->setCurrentIndex(0);

  if (stereoCustomAnaglyph->isChecked())
    customAnaGlyphSettings->setVisible(true);
301

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
  std::vector<float> mat = OpenFlipper::Options::anaglyphLeftEyeColorMatrix ();
  lcm0->setValue (mat[0]);
  lcm1->setValue (mat[1]);
  lcm2->setValue (mat[2]);
  lcm3->setValue (mat[3]);
  lcm4->setValue (mat[4]);
  lcm5->setValue (mat[5]);
  lcm6->setValue (mat[6]);
  lcm7->setValue (mat[7]);
  lcm8->setValue (mat[8]);

  mat = OpenFlipper::Options::anaglyphRightEyeColorMatrix ();
  rcm0->setValue (mat[0]);
  rcm1->setValue (mat[1]);
  rcm2->setValue (mat[2]);
  rcm3->setValue (mat[3]);
  rcm4->setValue (mat[4]);
  rcm5->setValue (mat[5]);
  rcm6->setValue (mat[6]);
  rcm7->setValue (mat[7]);
  rcm8->setValue (mat[8]);

324
  noMousePick->setChecked ( !OpenFlipperSettings().value("Core/Gui/glViewer/stereoMousePick",true).toBool() );
Jan Möbius's avatar
Jan Möbius committed
325
  nativeMouse->setChecked ( OpenFlipperSettings().value("Core/Gui/glViewer/nativeMouse",false).toBool() );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
326

Dirk Wilden's avatar
Dirk Wilden committed
327 328 329
  // plugin options
  initPluginOptions();

330
  // updates
331 332 333
  updateUser->setText( OpenFlipperSettings().value("Core/Update/UserName","anonymous").toString() );
  updatePass->setText( OpenFlipperSettings().value("Core/Update/Pass","anonymous").toString() );
  updateURL->setText( OpenFlipperSettings().value("Core/Update/URL","http://").toString() );
334

Jan Möbius's avatar
Jan Möbius committed
335 336 337
  // debugging
  slotDebugging->setChecked(OpenFlipper::Options::doSlotDebugging());

Dirk Wilden's avatar
Dirk Wilden committed
338
  //keyBindings
Dirk Wilden's avatar
Dirk Wilden committed
339
  initKeyTree();
340

Dirk Wilden's avatar
Dirk Wilden committed
341
  keyTree->disconnect(); //to be sure..disconnect every slot
Dirk Wilden's avatar
Dirk Wilden committed
342

Dirk Wilden's avatar
Dirk Wilden committed
343 344
  connect(keyTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
          this,    SLOT(keyTreeItemChanged( QTreeWidgetItem*, QTreeWidgetItem*)) );
Dirk Wilden's avatar
Dirk Wilden committed
345

Dirk Wilden's avatar
Dirk Wilden committed
346 347
  connect(keyTree, SIGNAL(itemDoubleClicked (QTreeWidgetItem*, int)),
          this,    SLOT(keyTreeDoubleClicked( QTreeWidgetItem*, int)) );
Dirk Wilden's avatar
Dirk Wilden committed
348 349


Dirk Wilden's avatar
Dirk Wilden committed
350
  connect(shortcutButton, SIGNAL(keyChanged()), this, SLOT(updateShortcut()) );
351
  connect(presetsButton, SIGNAL(clicked()), this, SLOT(restoreKeyPresets()) );
352 353


354
  //Init Viewer Settings
355 356
  wZoomFactor->setValue( OpenFlipperSettings().value("Core/Mouse/Wheel/ZoomFactor").toDouble() );
  wZoomFactorShift->setValue( OpenFlipperSettings().value("Core/Mouse/Wheel/ZoomFactorShift").toDouble() );
357

Jan Möbius's avatar
Jan Möbius committed
358
  wheelBox->setChecked( OpenFlipperSettings().value("Core/Gui/glViewer/showControlWheels").toBool() );
359 360
  
  // Projection settings
361
  fieldOfView->setValue(OpenFlipperSettings().value("Core/Projection/FOVY", 45.0).toDouble() );
362

363 364
  restrictFPS->setChecked( OpenFlipperSettings().value("Core/Gui/glViewer/restrictFrameRate",false).toBool() );
  FPS->setValue( OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
365 366
  
  minimalSceneSize->setValue( OpenFlipperSettings().value("Core/Gui/glViewer/minimalSceneSize",0.1).toDouble());
367 368

  QPixmap color(16,16);
369
  color.fill( OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>() );
370
  backgroundColor_ = OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>();
371 372 373 374 375 376
  backgroundButton->setIcon( QIcon(color) );

  color.fill( OpenFlipper::Options::defaultBaseColor() );
  baseColorButton->setIcon( QIcon(color) );

  randomBaseColor->setChecked( OpenFlipper::Options::randomBaseColor() );
377

378 379 380 381
  viewerList->setCurrentRow(0);

  for ( int i=0; i < PluginFunctions::viewers(); i++ ){
    defaultDrawModes_[i] = OpenFlipper::Options::defaultDrawMode(i);
382
    defaultProjectionMode_[i] = OpenFlipper::Options::defaultPerspectiveProjectionMode(i);
383
    defaultViewingDirections_[i] = OpenFlipper::Options::defaultViewingDirection(i);
384
    defaultRotationLocks_[i] = OpenFlipper::Options::defaultLockRotation(i);
385
  }
Jan Möbius's avatar
Jan Möbius committed
386

387 388
  updateViewerSettings(0);

389
  viewerLayout->setCurrentIndex( OpenFlipper::Options::defaultViewerLayout() );
390

391
  if (OpenFlipperSettings().value("Core/Language/Translation","en_US").toString() == "en_US")
392
    translation->setCurrentIndex(0);
393
  else if (OpenFlipperSettings().value("Core/Language/Translation","en_US").toString() == "de_DE")
394 395 396
    translation->setCurrentIndex(1);
  else
    translation->setCurrentIndex(2);
397 398 399
  
  // Listen to changes...
  connect(translation, SIGNAL(currentIndexChanged(int)), this, SLOT(slotTranslationIndexChanged(int)));
400

Jan Möbius's avatar
Jan Möbius committed
401 402 403 404 405 406
  updateVersionsTable();

}

void OptionsWidget::updateVersionsTable() {

Jan Möbius's avatar
Jan Möbius committed
407 408
  updatedPlugins_.clear();

Jan Möbius's avatar
Jan Möbius committed
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444
  QString fileName = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() +
                     ".OpenFlipper" + OpenFlipper::Options::dirSeparator() + "Versions.ini" ;

  INIFile ini;

  ini.connect(fileName,false);

  QString systemString = "";

  if ( OpenFlipper::Options::isWindows() ) {
    systemString = "VersionWindows";
  } else if (OpenFlipper::Options::isLinux()) {
    systemString = "VersionLinux";
  } else {
    std::cerr << "Unsupported platform for update" << std::endl;
    return;
  }

  updateList->clear();
  updateList->setRowCount( 1 + plugins_.size() );
  updateList->setColumnCount(3);

  QStringList header;

  header << "Component" << "current Version" << "latest Version" ;
  updateList->setHorizontalHeaderLabels(header);

  QBrush currentBrush(Qt::white);

  QTableWidgetItem * newItem = 0;

  QString coreVersion;

  if ( ini.is_connected() && ini.get_entry(coreVersion, "Core" , systemString ) ) {

    // Newer Version available
Jan Möbius's avatar
Jan Möbius committed
445
    if ( isNewer(OpenFlipper::Options::coreVersion(),coreVersion) ) {
Jan Möbius's avatar
Jan Möbius committed
446
      currentBrush.setColor(Qt::red);
Jan Möbius's avatar
Jan Möbius committed
447 448
      updatedPlugins_ << "Core";
    } else if ( isNewer(coreVersion , OpenFlipper::Options::coreVersion()) )
449
      currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
    else
      currentBrush.setColor(Qt::green);

    newItem = new QTableWidgetItem( coreVersion );

  } else {

    // No local Information available
    currentBrush.setColor(Qt::yellow);

    newItem = new QTableWidgetItem( "Not Available" );
  }

  newItem->setBackground(currentBrush);
  updateList->setItem(0, 2, newItem);

  newItem = new QTableWidgetItem( OpenFlipper::Options::coreVersion() );
  newItem->setBackground(currentBrush);
  updateList->setItem(0, 1, newItem);

  newItem = new QTableWidgetItem( "Core" );
  newItem->setBackground(currentBrush);
  updateList->setItem(0, 0, newItem);


  for ( uint i = 0 ; i < plugins_.size(); ++i ) {
    QString latestVersion;

    if ( ini.is_connected() && ini.get_entry(latestVersion, plugins_[i].name , systemString ) ) {


      // Newer Version available
Jan Möbius's avatar
Jan Möbius committed
482
      if ( isNewer(plugins_[i].version,latestVersion) ) {
483
         currentBrush.setColor(Qt::red);
Jan Möbius's avatar
Jan Möbius committed
484 485 486
         QFileInfo pluginFile(plugins_[i].path );
         updatedPlugins_ << pluginFile.fileName();
      } else if ( isNewer(latestVersion,plugins_[i].version) )
487
         currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
488
      else
489
         currentBrush.setColor(Qt::green);
Jan Möbius's avatar
Jan Möbius committed
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514

      newItem = new QTableWidgetItem( latestVersion );

    } else {

      // No local Information available
      currentBrush.setColor(Qt::yellow);

      newItem = new QTableWidgetItem( "Not Available" );
    }

    newItem->setBackground(currentBrush);
    updateList->setItem( i + 1 , 2, newItem);

    newItem = new QTableWidgetItem( plugins_[i].version );
    newItem->setBackground(currentBrush);
    updateList->setItem( i + 1 , 1, newItem);

    newItem = new QTableWidgetItem( plugins_[i].name );
    newItem->setBackground(currentBrush);
    updateList->setItem( i + 1 , 0, newItem);
  }

  updateList->resizeColumnsToContents();

Jan Möbius's avatar
Jan Möbius committed
515 516
  updateButton->setEnabled(!updatedPlugins_.empty());

517 518
}

Dirk Wilden's avatar
Dirk Wilden committed
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
void OptionsWidget::initPluginOptions(){

  pluginList->disconnect();

  connect(pluginList, SIGNAL( currentTextChanged(const QString&) ), this, SLOT( slotShowPluginOptions(const QString&) ) );

  //init list of plugins
  pluginList->clear();

  for ( uint i = 0 ; i < plugins_.size(); ++i )
    if (plugins_[i].optionsWidget != 0){

      pluginList->addItem( plugins_[i].name );
    }

  if ( pluginList->count() > 0)
    pluginList->setCurrentRow(0);
}

void OptionsWidget::slotShowPluginOptions(const QString& _pluginName ){

  //remove old children
  for (int i = 0; i < pluginOptionsLayout->count(); ++i){
    QWidget* w = pluginOptionsLayout->itemAt(i)->widget();

    if (w != 0)
      w->setParent(0);

    pluginOptionsLayout->removeItem( pluginOptionsLayout->itemAt(i) );
  }

  //find the new optionsWidget
  for ( uint i = 0 ; i < plugins_.size(); ++i )
    if (plugins_[i].optionsWidget != 0 && plugins_[i].name == _pluginName){

      pluginOptionsLayout->addWidget( plugins_[i].optionsWidget );
      pluginOptionsLayout->addStretch();
      return;
    }
}

560
void OptionsWidget::slotApply() {
Dirk Wilden's avatar
Dirk Wilden committed
561

Jan Möbius's avatar
Jan Möbius committed
562
  //general
Jan Möbius's avatar
Jan Möbius committed
563
  OpenFlipperSettings().setValue("Core/Gui/fullscreen",fullscreen->isChecked());
564
  OpenFlipperSettings().setValue("Core/Gui/splash",splash->isChecked());
Jan Möbius's avatar
Jan Möbius committed
565 566
  OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/hidden",!toolbox->isChecked());
  
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
567
  if (loggerHidden->isChecked())
Jan Möbius's avatar
Jan Möbius committed
568
    OpenFlipper::Options::loggerState( OpenFlipper::Options::Hidden );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
569 570 571 572
  else if (loggerInScene->isChecked())
    OpenFlipper::Options::loggerState( OpenFlipper::Options::InScene );
  else
    OpenFlipper::Options::loggerState( OpenFlipper::Options::Normal );
Jan Möbius's avatar
Jan Möbius committed
573 574 575
  
  OpenFlipperSettings().setValue("Core/Log/logFileEnabled",enableLogFile->isChecked());
  OpenFlipperSettings().setValue("Core/Log/logFile",logFile->text());
Dirk Wilden's avatar
Dirk Wilden committed
576

Jan Möbius's avatar
Jan Möbius committed
577 578
  OpenFlipperSettings().setValue("Core/File/MaxRecent",maxRecentBox->value() ) ;

579 580
  
  // Toolbox orientation
Jan Möbius's avatar
Jan Möbius committed
581
  OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/ToolBoxOnTheRight", (toolBoxOrientation->currentIndex() == 0));
582 583
  
  // Render picking toolbar into scene
584
  if ( OpenFlipperSettings().value("Core/Gui/ToolBars/PickToolbarInScene",true).toBool() != pickToolbarInScene->isChecked() )  {
585 586 587
    OpenFlipperSettings().setValue("Core/Gui/ToolBars/PickToolbarInScene", pickToolbarInScene->isChecked());
    restartRequired_ = true;
  }
588

Dirk Wilden's avatar
Dirk Wilden committed
589 590 591 592 593 594 595
  if ( iconDefault->isChecked() )
    OpenFlipperSettings().setValue("Core/Toolbar/iconSize", 0);
  else if ( iconSmall->isChecked() )
    OpenFlipperSettings().setValue("Core/Toolbar/iconSize", 1);
  else if ( iconNormal->isChecked() )
    OpenFlipperSettings().setValue("Core/Toolbar/iconSize", 2);
  
Dirk Wilden's avatar
Dirk Wilden committed
596
  //viewer
Jan Möbius's avatar
Jan Möbius committed
597 598
  OpenFlipperSettings().setValue("Core/Mouse/Wheel/ZoomFactor", wZoomFactor->text().toDouble());
  OpenFlipperSettings().setValue("Core/Mouse/Wheel/ZoomFactorShift", wZoomFactorShift->text().toDouble());
599 600
  
  // Projection settings
601 602
  OpenFlipperSettings().setValue("Core/Projection/FOVY", fieldOfView->value());
  OpenFlipperSettings().setValue("Core/Gui/glViewer/minimalSceneSize",minimalSceneSize->value());
Dirk Wilden's avatar
Dirk Wilden committed
603

Jan Möbius's avatar
Jan Möbius committed
604
  OpenFlipperSettings().setValue("Core/Gui/glViewer/showControlWheels", wheelBox->isChecked() );
605

606 607
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate", restrictFPS->isChecked());
  OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate", FPS->value() );
608

609 610
  OpenFlipper::Options::randomBaseColor( randomBaseColor->isChecked() );

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
611 612 613 614 615
  //stereo
  if (stereoCustomAnaglyph->isChecked ())
     OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphCustom);
  else if (stereoAnaglyph->isChecked ())
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphRedCyan);
616
  else
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
617 618
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL);

619
  OpenFlipperSettings().setValue("Core/Stereo/EyeDistance",eyeDistance->value ());
620
  OpenFlipperSettings().setValue("Core/Stereo/FocalDistance",double(focalDistance->value() / 1000.0));
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
621

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
  std::vector<float> mat (9, 0);
  mat[0] = lcm0->value ();
  mat[1] = lcm1->value ();
  mat[2] = lcm2->value ();
  mat[3] = lcm3->value ();
  mat[4] = lcm4->value ();
  mat[5] = lcm5->value ();
  mat[6] = lcm6->value ();
  mat[7] = lcm7->value ();
  mat[8] = lcm8->value ();

  OpenFlipper::Options::anaglyphLeftEyeColorMatrix (mat);

  mat[0] = rcm0->value ();
  mat[1] = rcm1->value ();
  mat[2] = rcm2->value ();
  mat[3] = rcm3->value ();
  mat[4] = rcm4->value ();
  mat[5] = rcm5->value ();
  mat[6] = rcm6->value ();
  mat[7] = rcm7->value ();
  mat[8] = rcm8->value ();

  OpenFlipper::Options::anaglyphRightEyeColorMatrix (mat);
646 647
  
  OpenFlipperSettings().setValue("Core/Gui/glViewer/stereoMousePick",!noMousePick->isChecked ());
Jan Möbius's avatar
Jan Möbius committed
648
  OpenFlipperSettings().setValue("Core/Gui/glViewer/nativeMouse",nativeMouse->isChecked ());
649

650
  // updates
651 652 653
  OpenFlipperSettings().setValue("Core/Update/UserName", updateUser->text());
  OpenFlipperSettings().setValue("Core/Update/Pass",updatePass->text());
  OpenFlipperSettings().setValue("Core/Update/URL",updateURL->text());
654

Jan Möbius's avatar
Jan Möbius committed
655 656 657
  // Debugging
  OpenFlipper::Options::doSlotDebugging(slotDebugging->isChecked());

658 659 660
  //viewer defaults
  for (int i=0; i < PluginFunctions::viewers(); i++){
    OpenFlipper::Options::defaultDrawMode(         defaultDrawModes_[i],         i );
661
    OpenFlipper::Options::defaultPerspectiveProjectionMode(   defaultProjectionMode_[i],    i );
662
    OpenFlipper::Options::defaultViewingDirection( defaultViewingDirections_[i], i );
663
    OpenFlipper::Options::defaultLockRotation( defaultRotationLocks_[i], i );
664
  }
Dirk Wilden's avatar
Dirk Wilden committed
665

666
  OpenFlipper::Options::defaultViewerLayout( viewerLayout->currentIndex() );
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
  
  // Restrict fps if desired
  if(restrictFPS->isChecked()) {
      OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate", true);
      OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate",FPS->value());
  } else {
      OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate", false);
  }
  
  // Set background color
  OpenFlipperSettings().setValue("Core/Gui/glViewer/defaultBackgroundColor", backgroundColor_);
  
  for ( uint i = 0 ; i < OpenFlipper::Options::examinerWidgets(); ++i )
      PluginFunctions::viewerProperties(i).backgroundColor(ACG::Vec4f(((double) backgroundColor_.redF()),
                                                                      ((double) backgroundColor_.greenF()),
                                                                      ((double) backgroundColor_.blueF()),
                                                                        1.0));
684

685 686 687 688 689 690 691 692
  switch ( translation->currentIndex() ){
    case 0 : OpenFlipperSettings().setValue("Core/Language/Translation","en_US");  break;
    case 1 : OpenFlipperSettings().setValue("Core/Language/Translation","de_DE");  break;
    default: OpenFlipperSettings().setValue("Core/Language/Translation","locale"); break;
  }

  // Show warning message that restart is required if language or in scene toolbar has been changed...
  if(restartRequired_) {
693 694 695 696
    int restart = QMessageBox::information(this, tr("Restart required!"),
                      tr("The changes will take effect after next restart. Do you want to close OpenFlipper now?"),
                      QMessageBox::Yes | QMessageBox::No);
                    
697
    if(restart == QMessageBox::Yes) exitOnClose_ = true;
698
  }
699

Dirk Wilden's avatar
Dirk Wilden committed
700 701
  applyShortcuts();

702
  emit applyOptions();
Dirk Wilden's avatar
Dirk Wilden committed
703
  emit saveOptions();
704 705 706 707

  // Make sure all settings are written before we quit!
  OpenFlipperSettings().sync();

708
  // Close OpenFlipper if demanded
709
  if(exitOnClose_)  QCoreApplication::quit();
Dirk Wilden's avatar
Dirk Wilden committed
710
}
711

Dirk Wilden's avatar
Dirk Wilden committed
712 713
void OptionsWidget::slotOk(){
  slotApply();
714 715 716 717 718 719
  hide();
}

void OptionsWidget::slotCancel() {
  hide();
}
Jan Möbius's avatar
Jan Möbius committed
720

Jan Möbius's avatar
Jan Möbius committed
721 722 723 724 725
void OptionsWidget::slotCheckUpdates() {

   // http://www.graphics.rwth-aachen.de/restricted/OpenFlipper-SIL/

  downloadType = VERSIONS_FILE;
726 727 728
  QString ServerMainURL = updateURL->text();
  if ( !ServerMainURL.endsWith("/") )
     ServerMainURL += "/";
Jan Möbius's avatar
Jan Möbius committed
729

730
  ServerMainURL += "Versions.ini";
Jan Möbius's avatar
Jan Möbius committed
731

732
  startDownload(ServerMainURL);
Jan Möbius's avatar
Jan Möbius committed
733 734 735
}

void OptionsWidget::slotGetUpdates() {
Jan Möbius's avatar
Jan Möbius committed
736 737 738 739 740 741 742 743
   std::cerr << "Not implemented yet: Get updates" << std::endl;
   QString url = updateURL->text();

   if ( !url.endsWith("/") )
     url += "/";


   pluginPath_.clear();
Jan Möbius's avatar
Jan Möbius committed
744
   pluginPath_ = "Plugins/";
Jan Möbius's avatar
Jan Möbius committed
745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775

   if ( OpenFlipper::Options::isWindows() ) {
      pluginPath_ += "Windows/";
   } else if ( OpenFlipper::Options::isLinux() ) {
      pluginPath_ += "Linux/";
   } else {
      std::cerr << "Unknown operating system type, aborting update" << std::endl;
      return;
   }

   if ( OpenFlipper::Options::is64bit() ) {
      pluginPath_ += "64/";
   } else if ( OpenFlipper::Options::is32bit() ) {
      pluginPath_ += "32/";
   } else {
      std::cerr << "Unknown architecture type, aborting update" << std::endl;
      return;
   }

   pluginPath_ += "Release/";

   if ( !updatedPlugins_.empty() && updatedPlugins_[0] == "Core" ) {
      std::cerr << "Core update not supported!" << std::endl;
      return;
   }

   if ( !updatedPlugins_.empty() ) {
      currentUpdateName_ = updatedPlugins_[0];
      std::cerr << "Downloading " << (url + pluginPath_ + currentUpdateName_).toStdString() << std::endl;
      updatedPlugins_.pop_front();

Jan Möbius's avatar
Jan Möbius committed
776
      downloadType = PLUGIN;
Jan Möbius's avatar
Jan Möbius committed
777 778 779 780 781 782 783 784 785 786

      startDownload(url + pluginPath_ + currentUpdateName_);
   }

}

void OptionsWidget::updateComponent() {
   std::cerr << "Todo : Update component" << std::endl;


Jan Möbius's avatar
Jan Möbius committed
787 788 789 790 791 792 793 794 795 796 797 798 799

   QString sourceName = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() +
                                     ".OpenFlipper" + OpenFlipper::Options::dirSeparator() + currentUpdateName_ ;

   QString targetName = OpenFlipper::Options::applicationDirStr() + "/" + pluginPath_ + currentUpdateName_;

   QFileInfo sourceFileInfo(sourceName);
   QFileInfo targetFileInfo(targetName);

   std::cerr << sourceName.toStdString() << std::endl;
   std::cerr << targetName.toStdString() << std::endl;

   if ( ! sourceFileInfo.exists() ) {
800
      statusLabel->setText(tr("Download failed!"));
Jan Möbius's avatar
Jan Möbius committed
801
      slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
802
      return;
Jan Möbius's avatar
Jan Möbius committed
803
   } else {
Jan Möbius's avatar
Jan Möbius committed
804
      if ( ! targetFileInfo.exists() ) {
805
         statusLabel->setText(tr("plugin target does not exist"));
Jan Möbius's avatar
Jan Möbius committed
806
         slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
807 808 809
         return;
      }

810
      statusLabel->setText(tr("Installing new file"));
Jan Möbius's avatar
Jan Möbius committed
811

Jan Möbius's avatar
Jan Möbius committed
812
      // Remove the old plugin
Jan Möbius's avatar
Jan Möbius committed
813 814
      QFile targetFile(targetName);
      targetFile.remove();
Jan Möbius's avatar
Jan Möbius committed
815

Jan Möbius's avatar
Jan Möbius committed
816
      // copy new to old
Jan Möbius's avatar
Jan Möbius committed
817 818
      QFile::copy(sourceName,targetName);

Jan Möbius's avatar
Jan Möbius committed
819 820 821 822
      // remove downloaded file
      QFile sourceFile(sourceName);
      sourceFile.remove();

823
      statusLabel->setText(tr("updated ") + currentUpdateName_);
Jan Möbius's avatar
Jan Möbius committed
824
   }
Jan Möbius's avatar
Jan Möbius committed
825 826

   slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
827 828
}

829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871
bool OptionsWidget::isNewer(QString _current, QString _latest) {

  QStringList latestVersionParts  = _latest.split('.');
  QStringList currentVersionParts = _current.split('.');

  bool newer = false;

  for ( int i = 0 ; i < latestVersionParts.size(); ++i ) {

    if ( i+1 > currentVersionParts.size() ) {
      // Versions are identical up to now. But latest version has additional version => updated
      newer = true;
      break;
    }

    bool ok = false;
    double latest  = latestVersionParts[i].toInt(&ok);
    double current = currentVersionParts[i].toInt(&ok);

    if ( !ok )
      std::cerr << "Error when parsing version strings!" << std::endl;

    if ( latest > current ) {
      newer = true;
      break;
    }
  }

  return newer;

}

void OptionsWidget::compareVersions() {

  QString fileName = QDir::home().absolutePath() + OpenFlipper::Options::dirSeparator() +
                     ".OpenFlipper" + OpenFlipper::Options::dirSeparator() + "Versions.ini" ;

  INIFile ini;
  if ( ! ini.connect(fileName,false) ) {
    std::cerr << "Failed to connect to Versions ini file" << std::endl;
    return;
  }

872
  statusLabel->setText(tr("Checking for new versions"));
873 874 875

  bool newerVersionsAvailable = false;

876
  QString systemString = "";
877
  if ( OpenFlipper::Options::isWindows() ) {
878 879 880 881 882 883 884 885 886 887 888 889 890
    systemString = "VersionWindows";
  } else if (OpenFlipper::Options::isLinux()) {
    systemString = "VersionLinux";
  } else {
    std::cerr << "Unsupported platform for update" << std::endl;
    return;
  }

  QString coreVersion;

  if ( ini.get_entry(coreVersion, "Core" , systemString )) {
    if ( isNewer( OpenFlipper::Options::coreVersion(), coreVersion ) ) {
      newerVersionsAvailable = true;
Jan Möbius's avatar
Jan Möbius committed
891
    }
892 893 894 895 896
  }

  for ( uint i = 0 ; i < plugins_.size(); ++i ) {
    QString latestVersion;
    if ( ini.get_entry(latestVersion, plugins_[i].name , systemString )) {
Jan Möbius's avatar
Jan Möbius committed
897
      if ( isNewer(  plugins_[i].version, latestVersion ) )
898
        newerVersionsAvailable = true;
899
    }
900 901 902
  }

  if ( newerVersionsAvailable ) {
903
    statusLabel->setText(tr("Updates found"));
904
  } else {
905
    statusLabel->setText(tr("No updates found"));
906 907 908
  }

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

  updateVersionsTable();
911
}
912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927

void OptionsWidget::slotPreviewStereoSettings(int /*_tmpParam*/) {
    
  if (stereoCustomAnaglyph->isChecked ())
     OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphCustom);
  else if (stereoAnaglyph->isChecked ())
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphRedCyan);
  else
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL);

  OpenFlipperSettings().setValue("Core/Stereo/EyeDistance", eyeDistance->value());
  OpenFlipperSettings().setValue("Core/Stereo/FocalDistance", double(focalDistance->value() / 1000.0));

  
  // Update all views
 emit applyOptions();
928 929 930 931 932 933 934 935 936
}

void OptionsWidget::slotClearSettings() {
    
    OpenFlipperSettings().clear();
}

void OptionsWidget::slotClearINI() {
    
937 938
    QMessageBox::information(this, tr("Restart required!"),
                             tr("The changes will take effect after next restart."));
939
    
940
    OpenFlipper::Options::deleteIniFile(true);
941
}