optionsWidget.cc 17.3 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//=============================================================================
//
//                               OpenFlipper
//        Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen
//                           www.openflipper.org
//
//-----------------------------------------------------------------------------
//
//                                License
//
//  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.
Jan Möbius's avatar
Jan Möbius committed
15
//
16
17
18
19
//  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.
Jan Möbius's avatar
Jan Möbius committed
20
//
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//  You should have received a copy of the GNU Lesser General Public License
//  along with OpenFlipper.  If not, see <http://www.gnu.org/licenses/>.
//
//-----------------------------------------------------------------------------
//
//   $Revision: 1909 $
//   $Author: wilden $
//   $Date: 2008-06-03 18:45:21 +0200 (Tue, 03 Jun 2008) $
//
//=============================================================================




#include "optionsWidget.hh"
#include <iostream>
#include <OpenFlipper/common/GlobalOptions.hh>
Dirk Wilden's avatar
Dirk Wilden committed
38
39
#include <ACG/Scenegraph/DrawModes.hh>
#include <OpenFlipper/ACGHelper/DrawModeConverter.hh>
40
#include <OpenFlipper/INIFile/INIFile.hh>
Dirk Wilden's avatar
Dirk Wilden committed
41

42
43
#include <QColorDialog>

Dirk Wilden's avatar
Dirk Wilden committed
44
OptionsWidget::OptionsWidget(std::vector<PluginInfo>& _plugins, std::vector<KeyBinding>& _core, InverseKeyMap& _invKeys, QWidget *parent)
Jan Möbius's avatar
Jan Möbius committed
45
46
  : QWidget(parent),
    plugins_(_plugins),
Dirk Wilden's avatar
Dirk Wilden committed
47
48
    coreKeys_(_core),
    keys_(_invKeys)
Jan Möbius's avatar
Jan Möbius committed
49

50
51
{
  setupUi(this);
Dirk Wilden's avatar
Dirk Wilden committed
52

Dirk Wilden's avatar
Dirk Wilden committed
53
  connect(okButton,SIGNAL(clicked()),this,SLOT(slotOk()));
54
55
  connect(applyButton,SIGNAL(clicked()),this,SLOT(slotApply()));
  connect(cancelButton,SIGNAL(clicked()),this,SLOT(slotCancel()));
Jan Möbius's avatar
Jan Möbius committed
56
  connect(checkUpdateButton,SIGNAL(clicked()),this,SLOT(slotCheckUpdates()));
57
58
  connect(updateButton,SIGNAL(clicked()),this,SLOT(slotGetUpdates()));
  updateButton->setEnabled(false);
Dirk Wilden's avatar
Dirk Wilden committed
59
  connect( restrictFPS, SIGNAL(toggled(bool)), FPS, SLOT(setEnabled(bool)) );
Dirk Wilden's avatar
Dirk Wilden committed
60
61
  uint mode = 2;
  for (uint i=1; i < 22; i++) {
62
    std::vector< QString > dm = drawModeToDescriptions( mode );
Jan Möbius's avatar
Jan Möbius committed
63

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

Dirk Wilden's avatar
Dirk Wilden committed
67
      item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable);
68
69
70
71
72

//       if (OpenFlipper::Options::standardDrawMode() )
//         item->setCheckState(Qt::Checked);
//       else
        item->setCheckState(Qt::Unchecked);
Dirk Wilden's avatar
Dirk Wilden committed
73
74
75

      availDrawModes->addItem( item );
    }
76

Dirk Wilden's avatar
Dirk Wilden committed
77
78
    mode = mode<<1;

79
  }
Jan Möbius's avatar
Jan Möbius committed
80

Dirk Wilden's avatar
Dirk Wilden committed
81
82
83
  pluginOptionsLayout = new QVBoxLayout;
  pluginOptions->setLayout( pluginOptionsLayout );

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

Jan Möbius's avatar
Jan Möbius committed
86
87
88
89
90
91
92
  // 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
93

Jan Möbius's avatar
Jan Möbius committed
94
95
96

  progressDialog = new QProgressDialog(this);
  connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelDownload()));
97
98
99
100
101
102
103


  //colordialog
  connect(backgroundButton, SIGNAL(clicked()), this, SLOT(getBackgroundColor()) );
}

void OptionsWidget::getBackgroundColor(){
104
  QColor newColor = QColorDialog::getColor ( OpenFlipper::Options::defaultBackgroundColor() );
105

106
  OpenFlipper::Options::defaultBackgroundColor( newColor) ;
107
108

  QPixmap color(16,16);
109
  color.fill( OpenFlipper::Options::defaultBackgroundColor() );
110
  backgroundButton->setIcon( QIcon(color) );
111
112
}

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

Jan Möbius's avatar
Jan Möbius committed
115
  //general
Dirk Wilden's avatar
Dirk Wilden committed
116
117
118
119
  fullscreen->setChecked( OpenFlipper::Options::fullScreen() );
  splash->setChecked( OpenFlipper::Options::splash() );
  toolbox->setChecked( !OpenFlipper::Options::hideToolbox() );
  logger->setChecked( !OpenFlipper::Options::hideLogger() );
Dirk Wilden's avatar
Dirk Wilden committed
120
  enableLogFile->setChecked( OpenFlipper::Options::logFileEnabled() );
Jan Möbius's avatar
Jan Möbius committed
121

Dirk Wilden's avatar
Dirk Wilden committed
122
123
  //paths
  logFile->setText( OpenFlipper::Options::logFile() );
Dirk Wilden's avatar
Dirk Wilden committed
124
125

  //viewer
Dirk Wilden's avatar
   
Dirk Wilden committed
126
  animation->setChecked( OpenFlipper::Options::animation() );
Dirk Wilden's avatar
Dirk Wilden committed
127
128
129
130
  backfaceCulling->setChecked( OpenFlipper::Options::backfaceCulling() );
  wZoomFactor->setText( QString::number(OpenFlipper::Options::wheelZoomFactor(), 'f') );
  wZoomFactorShift->setText( QString::number(OpenFlipper::Options::wheelZoomFactorShift(), 'f') );

131
132
133
  restrictFPS->setChecked( OpenFlipper::Options::restrictFrameRate() );
  FPS->setValue( OpenFlipper::Options::maxFrameRate() );

134
  QPixmap color(16,16);
135
  color.fill( OpenFlipper::Options::defaultBackgroundColor() );
136
137
  backgroundButton->setIcon( QIcon(color) );

Dirk Wilden's avatar
Dirk Wilden committed
138
139
140
  // plugin options
  initPluginOptions();

141
142
143
144
145
  // 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
146
147
148
  // debugging
  slotDebugging->setChecked(OpenFlipper::Options::doSlotDebugging());

Ellen Dekkers's avatar
Ellen Dekkers committed
149
  renderPicking->setChecked(OpenFlipper::Options::renderPicking());
150
151
152
  int itemIndex = pickingRenderMode->findText( OpenFlipper::Options::pickingRenderMode() );
  if (  itemIndex != -1 )
    pickingRenderMode->setCurrentIndex(itemIndex);
153

Dirk Wilden's avatar
Dirk Wilden committed
154
  //keyBindings
Dirk Wilden's avatar
Dirk Wilden committed
155
  initKeyTree();
156

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

Dirk Wilden's avatar
Dirk Wilden committed
159
160
  connect(keyTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
          this,    SLOT(keyTreeItemChanged( QTreeWidgetItem*, QTreeWidgetItem*)) );
Dirk Wilden's avatar
Dirk Wilden committed
161

Dirk Wilden's avatar
Dirk Wilden committed
162
163
  connect(keyTree, SIGNAL(itemDoubleClicked (QTreeWidgetItem*, int)),
          this,    SLOT(keyTreeDoubleClicked( QTreeWidgetItem*, int)) );
Dirk Wilden's avatar
Dirk Wilden committed
164
165


Dirk Wilden's avatar
Dirk Wilden committed
166
  connect(shortcutButton, SIGNAL(keyChanged()), this, SLOT(updateShortcut()) );
167
168
169
170
171
172


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

  //Check the drawModes from StandardDrawMode
Dirk Wilden's avatar
Dirk Wilden committed
173
  std::vector< QString > dm = drawModeToDescriptions( OpenFlipper::Options::standardDrawMode() );
174
175
176
177
178
179
180
181

  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);
    }
  }
Jan Möbius's avatar
Jan Möbius committed
182
183
184
185
186
187
188

  updateVersionsTable();

}

void OptionsWidget::updateVersionsTable() {

189
190
  updatedPlugins_.clear();

Jan Möbius's avatar
Jan Möbius committed
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
  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
227
    if ( isNewer(OpenFlipper::Options::coreVersion(),coreVersion) ) {
Jan Möbius's avatar
Jan Möbius committed
228
      currentBrush.setColor(Qt::red);
229
230
      updatedPlugins_ << "Core";
    } else if ( isNewer(coreVersion , OpenFlipper::Options::coreVersion()) )
231
      currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
    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
264
      if ( isNewer(plugins_[i].version,latestVersion) ) {
265
         currentBrush.setColor(Qt::red);
266
267
268
         QFileInfo pluginFile(plugins_[i].path );
         updatedPlugins_ << pluginFile.fileName();
      } else if ( isNewer(latestVersion,plugins_[i].version) )
269
         currentBrush.setColor(Qt::blue);
Jan Möbius's avatar
Jan Möbius committed
270
      else
271
         currentBrush.setColor(Qt::green);
Jan Möbius's avatar
Jan Möbius committed
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296

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

297
298
  updateButton->setEnabled(!updatedPlugins_.empty());

299
300
}

Dirk Wilden's avatar
Dirk Wilden committed
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
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;
    }
}

342
void OptionsWidget::slotApply() {
Dirk Wilden's avatar
Dirk Wilden committed
343

Jan Möbius's avatar
Jan Möbius committed
344
  //general
Dirk Wilden's avatar
Dirk Wilden committed
345
346
347
348
  OpenFlipper::Options::fullScreen( fullscreen->isChecked() );
  OpenFlipper::Options::splash( splash->isChecked() );
  OpenFlipper::Options::hideToolbox( !toolbox->isChecked() );
  OpenFlipper::Options::hideLogger( !logger->isChecked() );
Dirk Wilden's avatar
Dirk Wilden committed
349
350
351
352
  OpenFlipper::Options::logFileEnabled( enableLogFile->isChecked() );

  //paths
  OpenFlipper::Options::logFile( logFile->text() );
Dirk Wilden's avatar
Dirk Wilden committed
353
354

  //viewer
Dirk Wilden's avatar
   
Dirk Wilden committed
355
  OpenFlipper::Options::animation( animation->isChecked() );
Dirk Wilden's avatar
Dirk Wilden committed
356
357
358
359
  OpenFlipper::Options::backfaceCulling( backfaceCulling->isChecked() );
  OpenFlipper::Options::wheelZoomFactor( wZoomFactor->text().toDouble() );
  OpenFlipper::Options::wheelZoomFactorShift( wZoomFactorShift->text().toDouble() );

360
361
362
  OpenFlipper::Options::restrictFrameRate( restrictFPS->isChecked() );
  OpenFlipper::Options::maxFrameRate( FPS->value() );

363
364
365
366
367
  // 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
368
369
370
  // Debugging
  OpenFlipper::Options::doSlotDebugging(slotDebugging->isChecked());

371
372
373
  OpenFlipper::Options::renderPicking(renderPicking->isChecked());
  OpenFlipper::Options::pickingRenderMode( pickingRenderMode->currentText() );

Dirk Wilden's avatar
Dirk Wilden committed
374
375
376
377
378
379
380
  //standardDrawMode
  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() );

381
  OpenFlipper::Options::standardDrawMode( descriptionsToDrawMode(mode) );
Dirk Wilden's avatar
Dirk Wilden committed
382

Dirk Wilden's avatar
Dirk Wilden committed
383
384
  applyShortcuts();

385
  emit applyOptions();
Dirk Wilden's avatar
Dirk Wilden committed
386
  emit saveOptions();
Dirk Wilden's avatar
Dirk Wilden committed
387
}
388

Dirk Wilden's avatar
Dirk Wilden committed
389
390
void OptionsWidget::slotOk(){
  slotApply();
391
392
393
394
395
396
  hide();
}

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

Jan Möbius's avatar
Jan Möbius committed
398
399
400
401
402
void OptionsWidget::slotCheckUpdates() {

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

  downloadType = VERSIONS_FILE;
403
404
405
  QString ServerMainURL = updateURL->text();
  if ( !ServerMainURL.endsWith("/") )
     ServerMainURL += "/";
Jan Möbius's avatar
Jan Möbius committed
406

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

409
  startDownload(ServerMainURL);
Jan Möbius's avatar
Jan Möbius committed
410
411
412
}

void OptionsWidget::slotGetUpdates() {
413
414
415
416
417
418
419
420
   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
421
   pluginPath_ = "Plugins/";
422
423
424
425
426
427
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

   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
453
      downloadType = PLUGIN;
454
455
456
457
458
459
460
461
462
463

      startDownload(url + pluginPath_ + currentUpdateName_);
   }

}

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


Jan Möbius's avatar
Jan Möbius committed
464
465
466
467
468
469
470
471
472
473
474
475
476
477

   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() ) {
      statusLabel->setText("Download failed!");
Jan Möbius's avatar
Jan Möbius committed
478
      slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
479
      return;
480
   } else {
Jan Möbius's avatar
Jan Möbius committed
481
482
      if ( ! targetFileInfo.exists() ) {
         statusLabel->setText("plugin target does not exist");
Jan Möbius's avatar
Jan Möbius committed
483
         slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
484
485
486
487
488
         return;
      }

      statusLabel->setText("Installing new file");

Jan Möbius's avatar
Jan Möbius committed
489
      // Remove the old plugin
Jan Möbius's avatar
Jan Möbius committed
490
491
      QFile targetFile(targetName);
      targetFile.remove();
492

Jan Möbius's avatar
Jan Möbius committed
493
      // copy new to old
Jan Möbius's avatar
Jan Möbius committed
494
495
      QFile::copy(sourceName,targetName);

Jan Möbius's avatar
Jan Möbius committed
496
497
498
499
      // remove downloaded file
      QFile sourceFile(sourceName);
      sourceFile.remove();

Jan Möbius's avatar
Jan Möbius committed
500
      statusLabel->setText("updated " + currentUpdateName_);
501
   }
Jan Möbius's avatar
Jan Möbius committed
502
503

   slotGetUpdates();
Jan Möbius's avatar
Jan Möbius committed
504
505
}

506
507
508
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
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
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;
  }

  statusLabel->setText("Checking for new versions");

  bool newerVersionsAvailable = false;

553
  QString systemString = "";
554
  if ( OpenFlipper::Options::isWindows() ) {
555
556
557
558
559
560
561
562
563
564
565
566
567
    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
568
    }
569
570
571
572
573
  }

  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
574
      if ( isNewer(  plugins_[i].version, latestVersion ) )
575
        newerVersionsAvailable = true;
576
    }
577
578
579
  }

  if ( newerVersionsAvailable ) {
Jan Möbius's avatar
Jan Möbius committed
580
    statusLabel->setText("Updates found");
581
582
  } else {
    statusLabel->setText("No updates found");
583
584
585
  }

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

  updateVersionsTable();
588
}