optionsWidget.cc 34.8 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
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
*                                                                            *
*                              OpenFlipper                                   *
*      Copyright (C) 2001-2010 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/>.                                       *
*                                                                            *
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
63
    translationIndexChanged_(false),
    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()));
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
80
  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)));

81
82
83
84
85
86
87
88
89
  // 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()));
  connect(stereoPhilips, SIGNAL(clicked()),
          this, SLOT(switchStackedWidget()));
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  
  connect(focalDistance, SIGNAL(sliderReleased()),
          this, SLOT(slotPreviewStereoSettings()));
  connect(eyeDistance, SIGNAL(editingFinished()),
          this, SLOT(slotPreviewStereoSettings()));

  connect(headerContentType, SIGNAL(currentIndexChanged(int)),
          this, SLOT(slotPreviewStereoSettings(int)));
  connect(headerFactor, SIGNAL(sliderReleased()),
          this, SLOT(updateSliderCounter()));
  connect(headerOffsetCC, SIGNAL(sliderReleased()),
          this, SLOT(updateSliderCounter()));
  connect(headerSelect, SIGNAL(currentIndexChanged(int)),
          this, SLOT(slotPreviewStereoSettings(int)));
104

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

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

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

114
      item->setCheckState(Qt::Unchecked);
Dirk Wilden's avatar
Dirk Wilden committed
115
116
117

      availDrawModes->addItem( item );
    }
118

Dirk Wilden's avatar
Dirk Wilden committed
119
    mode = mode<<1;
120
  }
Dirk Wilden's avatar
Dirk Wilden committed
121

122
123
  for ( int i=0; i < PluginFunctions::viewers(); i++ ){
    viewerList->addItem("Viewer " + QString::number(i+1) );
124
    defaultDrawModes_.push_back( ACG::SceneGraph::DrawModes::DEFAULT );
125
126
    defaultProjectionMode_.push_back( 0 );
    defaultViewingDirections_.push_back( 0 );
127
  }
Jan Möbius's avatar
Jan Möbius committed
128

Dirk Wilden's avatar
Dirk Wilden committed
129
130
131
  pluginOptionsLayout = new QVBoxLayout;
  pluginOptions->setLayout( pluginOptionsLayout );

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

Jan Möbius's avatar
Jan Möbius committed
134
135
136
137
138
139
140
  // 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
141

Jan Möbius's avatar
Jan Möbius committed
142
143
144

  progressDialog = new QProgressDialog(this);
  connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
145
146
147

  //colordialog
  connect(backgroundButton, SIGNAL(clicked()), this, SLOT(getBackgroundColor()) );
148
  connect(baseColorButton, SIGNAL(clicked()), this, SLOT(getBaseColor()) );
149
150
151
152
  
  // Clear settings and ini buttons
  connect(clearSettingsButton, SIGNAL(clicked()), this, SLOT(slotClearSettings()));
  connect(clearINIButton,      SIGNAL(clicked()), this, SLOT(slotClearINI()));
153
154
155
}

void OptionsWidget::getBackgroundColor(){
156
  QColor newColor = QColorDialog::getColor ( OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>() );
157

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

165
166
167
168
169
170
171
172
173
174
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) );
}

175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
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)
	mode.push_back( availDrawModes->item(i)->text() );

    defaultDrawModes_[         viewerList->currentRow() ] = descriptionsToDrawMode(mode);
    defaultProjectionMode_[    viewerList->currentRow() ] = projectionBox->currentIndex();
    defaultViewingDirections_[ viewerList->currentRow() ] = directionBox->currentIndex();
  }
};

195
196
197
198
199
void OptionsWidget::switchStackedWidget() {

    // Show right stacked widget of stereo settings
    if (stereoCustomAnaglyph->isChecked()) {
        stackedWidget->setCurrentIndex(0);
200
        customAnaGlyphSettings->setVisible(true);
201
202
    } else if (stereoAnaglyph->isChecked()) {
        stackedWidget->setCurrentIndex(0);
203
        customAnaGlyphSettings->setVisible(false);
204
205
    } else if (stereoPhilips->isChecked()) {
        stackedWidget->setCurrentIndex(1);
206
        customAnaGlyphSettings->setVisible(false);
207
208
    } else {
        stackedWidget->setCurrentIndex(0);
209
        customAnaGlyphSettings->setVisible(false);
210
    }
211
212
213
    
    // Preview new settings
    slotPreviewStereoSettings();
214
215
}

216
217
218
219
void OptionsWidget::slotTranslationIndexChanged(int /*_index*/) {
    translationIndexChanged_ = true;
}

220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
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);
    }
  }

  projectionBox->setCurrentIndex( defaultProjectionMode_[_row] );
  directionBox->setCurrentIndex(  defaultViewingDirections_[_row] );

  updatingViewerSettings_ = false;
}

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

Jan Möbius's avatar
Jan Möbius committed
246
  //general
Jan Möbius's avatar
Jan Möbius committed
247
  fullscreen->setChecked( OpenFlipperSettings().value("Core/Gui/fullscreen",false).toBool() );
248
  splash->setChecked( OpenFlipperSettings().value("Core/Gui/splash",true).toBool() );
Jan Möbius's avatar
Jan Möbius committed
249
250
  toolbox->setChecked( !OpenFlipperSettings().value("Core/Gui/ToolBoxes/hidden",false).toBool() );
  
Dirk Wilden's avatar
Dirk Wilden committed
251
252
253
254
255
256
257
258
259
260
  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;
    default : iconDefault->setChecked(true);
  }
  
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
261
262
263
  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
264
  enableLogFile->setChecked( OpenFlipperSettings().value("Core/Log/logFileEnabled",true).toBool() );
Jan Möbius's avatar
Jan Möbius committed
265

Dirk Wilden's avatar
Dirk Wilden committed
266
  //paths
Jan Möbius's avatar
Jan Möbius committed
267
  logFile->setText( OpenFlipperSettings().value("Core/Log/logFile").toString()  );
Dirk Wilden's avatar
Dirk Wilden committed
268

269
  // UI settings
270
  toolBoxOrientation->setCurrentIndex((OpenFlipperSettings().value("Core/Gui/ToolBoxes/ToolBoxOnTheRight",true).toBool() ? 0 : 1));
271
  
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
272
  //stereo
273
274
275
276
277
278
279
280

  // 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
281
282
  stereoAnaglyph->setChecked (OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphRedCyan);
  stereoCustomAnaglyph->setChecked (OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphCustom);
283
  stereoPhilips->setChecked (OpenFlipper::Options::stereoMode() == OpenFlipper::Options::Philips);
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
284

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

288
289
290
291
292
  // Block signals such that slotApplyStereoSettings
  // won't be called when setting the initial values here...
  headerContentType->blockSignals(true);
  headerSelect->blockSignals(true);
  
293
  // Philips stereo mode part
294
295
296
297
298
299
  headerContentType->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Content").toInt());
  headerFactor->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt());
  headerOffsetCC->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt());
  factorCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt());
  offsetCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt());
  headerSelect->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Select").toInt());
300
301
302
303
304
305
  
  // Unblock signals
  headerContentType->blockSignals(false);
  headerSelect->blockSignals(false);
  
  // Show right stacked widget
306
  customAnaGlyphSettings->setVisible(false);
307
308
309
310
  if (stereoPhilips->isChecked()) {
      stackedWidget->setCurrentIndex(1);
  } else {
      stackedWidget->setCurrentIndex(0);
311
312
313
      
      if (stereoCustomAnaglyph->isChecked())
          customAnaGlyphSettings->setVisible(true);
314
  }
315

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
  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]);

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

Dirk Wilden's avatar
Dirk Wilden committed
341
342
343
  // plugin options
  initPluginOptions();

344
345
346
347
348
  // updates
  updateUser->setText( OpenFlipper::Options::updateUsername() );
  updatePass->setText( OpenFlipper::Options::updatePassword() );
  updateURL->setText( OpenFlipper::Options::updateUrl( ) );

Jan Möbius's avatar
Jan Möbius committed
349
350
351
  // debugging
  slotDebugging->setChecked(OpenFlipper::Options::doSlotDebugging());

352
353
  renderPicking->setChecked( OpenFlipperSettings().value("Core/Debug/Picking/RenderPicking",false).toBool() );
  int itemIndex = pickingRenderMode->findText( OpenFlipperSettings().value("Core/Debug/Picking/RenderPickingMode",QString("PICK_ANYTHING")).toString() );
354
355
  if (  itemIndex != -1 )
    pickingRenderMode->setCurrentIndex(itemIndex);
356

Dirk Wilden's avatar
Dirk Wilden committed
357
  //keyBindings
Dirk Wilden's avatar
Dirk Wilden committed
358
  initKeyTree();
359

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

Dirk Wilden's avatar
Dirk Wilden committed
362
363
  connect(keyTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
          this,    SLOT(keyTreeItemChanged( QTreeWidgetItem*, QTreeWidgetItem*)) );
Dirk Wilden's avatar
Dirk Wilden committed
364

Dirk Wilden's avatar
Dirk Wilden committed
365
366
  connect(keyTree, SIGNAL(itemDoubleClicked (QTreeWidgetItem*, int)),
          this,    SLOT(keyTreeDoubleClicked( QTreeWidgetItem*, int)) );
Dirk Wilden's avatar
Dirk Wilden committed
367
368


Dirk Wilden's avatar
Dirk Wilden committed
369
  connect(shortcutButton, SIGNAL(keyChanged()), this, SLOT(updateShortcut()) );
370
  connect(presetsButton, SIGNAL(clicked()), this, SLOT(restoreKeyPresets()) );
371
372


373
  //Init Viewer Settings
374
375
  wZoomFactor->setValue( OpenFlipperSettings().value("Core/Mouse/Wheel/ZoomFactor").toDouble() );
  wZoomFactorShift->setValue( OpenFlipperSettings().value("Core/Mouse/Wheel/ZoomFactorShift").toDouble() );
376

Jan Möbius's avatar
Jan Möbius committed
377
  wheelBox->setChecked( OpenFlipperSettings().value("Core/Gui/glViewer/showControlWheels").toBool() );
378
379
380
381
  
  // Projection settings
  
  // Get field of view in radiant
382
383
  double fovy = OpenFlipperSettings().value("Core/Projection/FOVY", 45.0).toDouble();
  fieldOfView->setValue(fovy);
384

385
386
  restrictFPS->setChecked( OpenFlipperSettings().value("Core/Gui/glViewer/restrictFrameRate",false).toBool() );
  FPS->setValue( OpenFlipperSettings().value("Core/Gui/glViewer/maxFrameRate",35).toInt() );
387
388

  QPixmap color(16,16);
389
  color.fill( OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>() );
390
  backgroundColor_ = OpenFlipperSettings().value("Core/Gui/glViewer/defaultBackgroundColor").value<QColor>();
391
392
393
394
395
396
  backgroundButton->setIcon( QIcon(color) );

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

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

398
399
400
401
402
403
  viewerList->setCurrentRow(0);

  for ( int i=0; i < PluginFunctions::viewers(); i++ ){
    defaultDrawModes_[i] = OpenFlipper::Options::defaultDrawMode(i);
    defaultProjectionMode_[i] = OpenFlipper::Options::defaultProjectionMode(i);
    defaultViewingDirections_[i] = OpenFlipper::Options::defaultViewingDirection(i);
404
  }
Jan Möbius's avatar
Jan Möbius committed
405

406
407
  updateViewerSettings(0);

408
  viewerLayout->setCurrentIndex( OpenFlipper::Options::defaultViewerLayout() );
409

410
411
412
413
414
415
  if (OpenFlipper::Options::translation() == "en_US")
    translation->setCurrentIndex(0);
  else if (OpenFlipper::Options::translation() == "de_DE")
    translation->setCurrentIndex(1);
  else
    translation->setCurrentIndex(2);
416
417
418
  
  // Listen to changes...
  connect(translation, SIGNAL(currentIndexChanged(int)), this, SLOT(slotTranslationIndexChanged(int)));
419

Jan Möbius's avatar
Jan Möbius committed
420
421
422
423
424
425
  updateVersionsTable();

}

void OptionsWidget::updateVersionsTable() {

426
427
  updatedPlugins_.clear();

Jan Möbius's avatar
Jan Möbius committed
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
  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
464
    if ( isNewer(OpenFlipper::Options::coreVersion(),coreVersion) ) {
Jan Möbius's avatar
Jan Möbius committed
465
      currentBrush.setColor(Qt::red);
466
467
      updatedPlugins_ << "Core";
    } else if ( isNewer(coreVersion , OpenFlipper::Options::coreVersion()) )
468
      currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
    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
501
      if ( isNewer(plugins_[i].version,latestVersion) ) {
502
         currentBrush.setColor(Qt::red);
503
504
505
         QFileInfo pluginFile(plugins_[i].path );
         updatedPlugins_ << pluginFile.fileName();
      } else if ( isNewer(latestVersion,plugins_[i].version) )
506
         currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
507
      else
508
         currentBrush.setColor(Qt::green);
Jan Möbius's avatar
Jan Möbius committed
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533

      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();

534
535
  updateButton->setEnabled(!updatedPlugins_.empty());

536
537
}

Dirk Wilden's avatar
Dirk Wilden committed
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
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;
    }
}

579
void OptionsWidget::slotApply() {
Dirk Wilden's avatar
Dirk Wilden committed
580

Jan Möbius's avatar
Jan Möbius committed
581
  //general
Jan Möbius's avatar
Jan Möbius committed
582
  OpenFlipperSettings().setValue("Core/Gui/fullscreen",fullscreen->isChecked());
583
  OpenFlipperSettings().setValue("Core/Gui/splash",splash->isChecked());
Jan Möbius's avatar
Jan Möbius committed
584
585
  OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/hidden",!toolbox->isChecked());
  
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
586
  if (loggerHidden->isChecked())
Jan Möbius's avatar
Jan Möbius committed
587
    OpenFlipper::Options::loggerState( OpenFlipper::Options::Hidden );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
588
589
590
591
  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
592
593
594
  
  OpenFlipperSettings().setValue("Core/Log/logFileEnabled",enableLogFile->isChecked());
  OpenFlipperSettings().setValue("Core/Log/logFile",logFile->text());
Dirk Wilden's avatar
Dirk Wilden committed
595

596
597
  
  // Toolbox orientation
Jan Möbius's avatar
Jan Möbius committed
598
  OpenFlipperSettings().setValue("Core/Gui/ToolBoxes/ToolBoxOnTheRight", (toolBoxOrientation->currentIndex() == 0));
599
600
   
  
Dirk Wilden's avatar
Dirk Wilden committed
601
602
603
604
605
606
607
  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
608
  //viewer
Jan Möbius's avatar
Jan Möbius committed
609
610
  OpenFlipperSettings().setValue("Core/Mouse/Wheel/ZoomFactor", wZoomFactor->text().toDouble());
  OpenFlipperSettings().setValue("Core/Mouse/Wheel/ZoomFactorShift", wZoomFactorShift->text().toDouble());
611
612
613
  
  // Projection settings
  double fovy = fieldOfView->value();
614
  double old_fovy = OpenFlipperSettings().value("Core/Projection/FOVY", 45.0).toDouble();
615
616
  
  if(fovy != old_fovy) {
617
      OpenFlipperSettings().setValue("Core/Projection/FOVY", fovy);
618
  }
Dirk Wilden's avatar
Dirk Wilden committed
619

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

622
623
  OpenFlipperSettings().setValue("Core/Gui/glViewer/restrictFrameRate", restrictFPS->isChecked());
  OpenFlipperSettings().setValue("Core/Gui/glViewer/maxFrameRate", FPS->value() );
624

625
626
  OpenFlipper::Options::randomBaseColor( randomBaseColor->isChecked() );

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
627
628
629
630
631
  //stereo
  if (stereoCustomAnaglyph->isChecked ())
     OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphCustom);
  else if (stereoAnaglyph->isChecked ())
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphRedCyan);
632
633
  else if (stereoPhilips->isChecked() )
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::Philips);
634
  else
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
635
636
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL);

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

640
  // Set option entries for philips stereo mode
641
642
643
644
645
646
  // Set option entries
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Content",headerContentType->currentIndex());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Factor",headerFactor->value());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Offset",headerOffsetCC->value());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Select",headerSelect->currentIndex());
  
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
  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);
671
672
  
  OpenFlipperSettings().setValue("Core/Gui/glViewer/stereoMousePick",!noMousePick->isChecked ());
Jan Möbius's avatar
Jan Möbius committed
673
  OpenFlipperSettings().setValue("Core/Gui/glViewer/nativeMouse",nativeMouse->isChecked ());
674

675
676
677
678
679
  // updates
  OpenFlipper::Options::updateUrl( updateURL->text() );
  OpenFlipper::Options::updateUsername( updateUser->text() );
  OpenFlipper::Options::updatePassword( updatePass->text() );

Jan Möbius's avatar
Jan Möbius committed
680
681
682
  // Debugging
  OpenFlipper::Options::doSlotDebugging(slotDebugging->isChecked());

683
684
  OpenFlipperSettings().setValue("Core/Debug/Picking/RenderPicking",renderPicking->isChecked() );
  OpenFlipperSettings().setValue("Core/Debug/Picking/RenderPickingMode",pickingRenderMode->currentText()  );
685

686
687
688
689
690
691
  //viewer defaults
  for (int i=0; i < PluginFunctions::viewers(); i++){
    OpenFlipper::Options::defaultDrawMode(         defaultDrawModes_[i],         i );
    OpenFlipper::Options::defaultProjectionMode(   defaultProjectionMode_[i],    i );
    OpenFlipper::Options::defaultViewingDirection( defaultViewingDirections_[i], i );
  }
Dirk Wilden's avatar
Dirk Wilden committed
692

693
  OpenFlipper::Options::defaultViewerLayout( viewerLayout->currentIndex() );
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
  
  // 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));
711

712
713
714
715
716
717
  // Show warning message that restart is required if language has been changed...
  if(translationIndexChanged_) {
    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);
                    
718
    if(restart == QMessageBox::Yes) exitOnClose_ = true;
719
720
  }
  
721
722
723
724
725
726
  switch ( translation->currentIndex() ){
    case 0 : OpenFlipper::Options::translation("en_US");  break;
    case 1 : OpenFlipper::Options::translation("de_DE");  break;
    default: OpenFlipper::Options::translation("locale"); break;
  }

Dirk Wilden's avatar
Dirk Wilden committed
727
728
  applyShortcuts();

729
  emit applyOptions();
Dirk Wilden's avatar
Dirk Wilden committed
730
  emit saveOptions();
731
732
733
  
  // Close OpenFlipper if demanded
  if(exitOnClose_)  emit exit(0);
Dirk Wilden's avatar
Dirk Wilden committed
734
}
735

Dirk Wilden's avatar
Dirk Wilden committed
736
737
void OptionsWidget::slotOk(){
  slotApply();
738
739
740
741
742
743
  hide();
}

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

Jan Möbius's avatar
Jan Möbius committed
745
746
747
748
749
void OptionsWidget::slotCheckUpdates() {

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

  downloadType = VERSIONS_FILE;
750
751
752
  QString ServerMainURL = updateURL->text();
  if ( !ServerMainURL.endsWith("/") )
     ServerMainURL += "/";
Jan Möbius's avatar
Jan Möbius committed
753

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

756
  startDownload(ServerMainURL);
Jan Möbius's avatar
Jan Möbius committed
757
758
759
}

void OptionsWidget::slotGetUpdates() {
760
761
762
763
764
765
766
767
   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
768
   pluginPath_ = "Plugins/";
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799

   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
800
      downloadType = PLUGIN;
801
802
803
804
805
806
807
808
809
810

      startDownload(url + pluginPath_ + currentUpdateName_);
   }

}

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


Jan Möbius's avatar
Jan Möbius committed
811
812
813
814
815
816
817
818
819
820
821
822
823

   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() ) {
824
      statusLabel->setText(tr("Download failed!"));
Jan Möbius's avatar
Jan Möbius committed
825
      slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
826
      return;
827
   } else {
Jan Möbius's avatar
Jan Möbius committed
828
      if ( ! targetFileInfo.exists() ) {
829
         statusLabel->setText(tr("plugin target does not exist"));
Jan Möbius's avatar
Jan Möbius committed
830
         slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
831
832
833
         return;
      }

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

Jan Möbius's avatar
Jan Möbius committed
836
      // Remove the old plugin
Jan Möbius's avatar
Jan Möbius committed
837
838
      QFile targetFile(targetName);
      targetFile.remove();
839

Jan Möbius's avatar
Jan Möbius committed
840
      // copy new to old
Jan Möbius's avatar
Jan Möbius committed
841
842
      QFile::copy(sourceName,targetName);

Jan Möbius's avatar
Jan Möbius committed
843
844
845
846
      // remove downloaded file
      QFile sourceFile(sourceName);
      sourceFile.remove();

847
      statusLabel->setText(tr("updated ") + currentUpdateName_);
848
   }
Jan Möbius's avatar
Jan Möbius committed
849
850

   slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
851
852
}

853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
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;
  }

896
  statusLabel->setText(tr("Checking for new versions"));
897
898
899

  bool newerVersionsAvailable = false;

900
  QString systemString = "";
901
  if ( OpenFlipper::Options::isWindows() ) {
902
903
904
905
906
907
908
909
910
911
912
913
914
    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
915
    }
916
917
918
919
920
  }

  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
921
      if ( isNewer(  plugins_[i].version, latestVersion ) )
922
        newerVersionsAvailable = true;
923
    }
924
925
926
  }

  if ( newerVersionsAvailable ) {
927
    statusLabel->setText(tr("Updates found"));
928
  } else {
929
    statusLabel->setText(tr("No updates found"));
930
931
932
  }

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

  updateVersionsTable();
935
}
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968

void OptionsWidget::updateSliderCounter() {
    // Update labels that display the current values
    factorCounter->setNum(headerFactor->value());
    offsetCounter->setNum(headerOffsetCC->value());
    
    // Preview settings
    slotPreviewStereoSettings();
}

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 if (stereoPhilips->isChecked() )
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::Philips);
  else
    OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL);

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

  // Set option entries for philips stereo mode
  // Set option entries
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Content", headerContentType->currentIndex());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Factor", headerFactor->value());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Offset", headerOffsetCC->value());
  OpenFlipperSettings().setValue("Core/Stereo/Philips/Select", headerSelect->currentIndex());
  
  // Update all views
 emit applyOptions();
969
970
971
972
973
974
975
976
977
}

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

void OptionsWidget::slotClearINI() {
    
978
979
    QMessageBox::information(this, tr("Restart required!"),
                             tr("The changes will take effect after next restart."));
980
    
981
    OpenFlipper::Options::deleteIniFile(true);
982
}