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()));
Jan Möbius's avatar
Jan Möbius committed
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() );
Jan Möbius's avatar
Jan Möbius committed
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() {

Jan Möbius's avatar
Jan Möbius committed
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
Jan Möbius's avatar
Jan Möbius committed
227
    if ( isNewer(OpenFlipper::Options::coreVersion(),coreVersion) ) {
Jan Möbius's avatar
Jan Möbius committed
228
      currentBrush.setColor(Qt::red);
Jan Möbius's avatar
Jan Möbius committed
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
Jan Möbius's avatar
Jan Möbius committed
264
      if ( isNewer(plugins_[i].version,latestVersion) ) {
265
         currentBrush.setColor(Qt::red);
Jan Möbius's avatar
Jan Möbius committed
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();

Jan Möbius's avatar
Jan Möbius committed
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() {
Jan Möbius's avatar
Jan Möbius committed
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/";
Jan Möbius's avatar
Jan Möbius committed
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;
Jan Möbius's avatar
Jan Möbius committed
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;
Jan Möbius's avatar
Jan Möbius committed
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();
Jan Möbius's avatar
Jan Möbius committed
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_);
Jan Möbius's avatar
Jan Möbius committed
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
}