viewMode.cc 16.4 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper is free software: you can redistribute it and/or modify      *
 *  it under the terms of the GNU Lesser General Public License as           *
 *  published by the Free Software Foundation, either version 3 of           *
 *  the License, or (at your option) any later version with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper is distributed in the hope that it will be useful,           *
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            *
 *  GNU Lesser General Public License for more details.                      *
 *                                                                           *
 *  You should have received a copy of the GNU LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
34

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



#include "CoreWidget.hh"

#include <OpenFlipper/widgets/viewModeWidget/viewModeWidget.hh>
Jan Möbius's avatar
Jan Möbius committed
48
#include <OpenFlipper/widgets/viewModeWidget/viewModeChangeWidget.hh>
Jan Möbius's avatar
 
Jan Möbius committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89

#include "OpenFlipper/common/GlobalOptions.hh"

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

/// init ViewModes that were loaded via ini-file
void CoreWidget::initViewModes(){
  //init viewMode subMenu
  if (!viewModeMenu_){
    viewModeMenu_ = new QMenu(tr("View Modes"));
    viewMenu_->addMenu(viewModeMenu_);
    viewGroup_ = new QActionGroup(0);
    viewGroup_->setExclusive(true);
    connect( viewGroup_, SIGNAL( triggered( QAction* ) ), this, SLOT( slotSetViewMode( QAction* ) ) );
  }

  viewModeMenu_->clear();

  bool seenCustom = false;

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

    //Add Separator above the custom widgets
    if (viewModes_[i]->custom && !seenCustom){
      viewModeMenu_->addSeparator();
      seenCustom = true;
    }

    //add Action to viewMenu
    QAction* acViewMode = new QAction(viewModes_[i]->name, this);
    acViewMode->setStatusTip(tr("Change ViewMode"));
    viewGroup_->addAction(acViewMode);
    viewModeMenu_->addAction(acViewMode);

    //add Separator after viewMode 'all'
    if (viewModes_[i]->name == "All")
      viewModeMenu_->addSeparator();
  }

}

Jan Möbius's avatar
Jan Möbius committed
90
91
void CoreWidget::slotAddViewModeToolboxes(QString _mode, QStringList _usedWidgets){
  slotAddViewModeToolboxes(_mode, false, _usedWidgets);
Jan Möbius's avatar
 
Jan Möbius committed
92
93
}

Jan Möbius's avatar
Jan Möbius committed
94
void CoreWidget::slotAddViewModeToolboxes(QString _mode, bool _custom, QStringList _usedWidgets){
95
  int id = -1;
96

97
98
99
100
101
102
103
  // Check if it already exists
  for ( int i = 0 ; i < viewModes_.size(); i++) {
    if ( viewModes_[i]->name == _mode ) {
      id = i;
      break;
    }
  }
104

105
106
  ViewMode* vm = 0;
  if ( id == -1 ) {
Jan Möbius's avatar
Jan Möbius committed
107
108
    vm         = new ViewMode();
    vm->name   = _mode;
109
    vm->custom = _custom;
Jan Möbius's avatar
Jan Möbius committed
110
    vm->icon   = "Unknown.png";
111

112
113
    vm->visibleToolbars = QString("Main Toolbar;Viewer Toolbar").split(";");
    
114
115
116
117
118
119
120
121
122
123
124
    if (_custom) {
      viewModes_.push_back(vm);
    } else {
      //insert before custom viewModes
      int i = viewModes_.size();
      for (int k=0; k < viewModes_.size(); k++)
        if (viewModes_[k]->custom == true){
          i = k;
          break;
        }
      viewModes_.insert(i,vm);
125
    }
126

127
128
  } else {
    vm = viewModes_[id];
Jan Möbius's avatar
 
Jan Möbius committed
129
  }
130

131
132
  vm->visibleToolboxes = _usedWidgets;

Jan Möbius's avatar
 
Jan Möbius committed
133
134
135
  initViewModes();
}

136
137
138
139
140
void CoreWidget::slotAddViewModeToolbars(QString _mode, QStringList _usedToolbars) {
  slotAddViewModeToolbars(_mode,false,_usedToolbars);
}

void CoreWidget::slotAddViewModeToolbars(QString _mode, bool _custom, QStringList _usedToolbars) {
141
  int id = -1;
142

143
144
145
146
147
148
149
  // Check if it already exists
  for ( int i = 0 ; i < viewModes_.size(); i++) {
    if ( viewModes_[i]->name == _mode ) {
      id = i;
      break;
    }
  }
150

151
152
  ViewMode* vm = 0;
  if ( id == -1 ) {
Jan Möbius's avatar
Jan Möbius committed
153
154
    vm         = new ViewMode();
    vm->name   = _mode;
155
    vm->custom = _custom;
Jan Möbius's avatar
Jan Möbius committed
156
    vm->icon   = "Unknown.png";
157

158
159
160
161
162
163
164
165
166
167
168
    if (_custom) {
      viewModes_.push_back(vm);
    } else {
      //insert before custom viewModes
      int i = viewModes_.size();
      for (int k=0; k < viewModes_.size(); k++)
        if (viewModes_[k]->custom == true){
          i = k;
          break;
        }
        viewModes_.insert(i,vm);
169
    }
170
171
172
  } else {
    vm = viewModes_[id];
  }
173
174
175
176
177
178
179
180
181
  
  // Always add the viewer Toolbar
  if ( ! _usedToolbars.contains("Viewer Toolbar") )
  _usedToolbars.prepend("Viewer Toolbar");
  
  // Always add the main Toolbar
  if ( ! _usedToolbars.contains("Main Toolbar") )
    _usedToolbars.prepend("Main Toolbar");
  
182
  vm->visibleToolbars = _usedToolbars;
183

184
185
186
187
188
  initViewModes();
}

/// Sets the Icon for a given View Mode
void CoreWidget::slotSetViewModeIcon(QString _mode, QString _iconName) {
Jan Möbius's avatar
Jan Möbius committed
189
190
191
192
193
  slotSetViewModeIcon(_mode,false,_iconName);
}

/// Sets the Icon for a given View Mode
void CoreWidget::slotSetViewModeIcon(QString _mode, bool _custom, QString _iconName) {
194

Jan Möbius's avatar
Jan Möbius committed
195
  int id = -1;
196

Jan Möbius's avatar
Jan Möbius committed
197
198
199
200
201
202
203
  // Check if it already exists
  for ( int i = 0 ; i < viewModes_.size(); i++) {
    if ( viewModes_[i]->name == _mode ) {
      id = i;
      break;
    }
  }
204

Jan Möbius's avatar
Jan Möbius committed
205
206
207
208
209
210
  ViewMode* vm = 0;
  if ( id == -1 ) {
    vm         = new ViewMode();
    vm->name   = _mode;
    vm->custom = _custom;
    vm->icon   = _iconName;
211

Jan Möbius's avatar
Jan Möbius committed
212
213
214
215
216
217
218
219
220
221
222
    if (_custom) {
      viewModes_.push_back(vm);
    } else {
      //insert before custom viewModes
      int i = viewModes_.size();
      for (int k=0; k < viewModes_.size(); k++)
        if (viewModes_[k]->custom == true){
          i = k;
          break;
        }
        viewModes_.insert(i,vm);
223
    }
Jan Möbius's avatar
Jan Möbius committed
224
225
226
  } else {
    vm = viewModes_[id];
  }
227

Jan Möbius's avatar
Jan Möbius committed
228
  vm->icon = _iconName;
229
230

  initViewModes();
231
232
}

Jan Möbius's avatar
 
Jan Möbius committed
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
/// Remove a viewMode
void CoreWidget::slotRemoveViewMode(QString _name){
  for (int i=0; i < viewModes_.size(); i++)
    if (viewModes_[i]->name == _name && viewModes_[i]->custom == true){ //remove only userdefined viewModes
      viewModes_.remove(i);
      //remove action from menu
      for (int a=0; a < viewModeMenu_->actions().size(); a++)
        if (viewModeMenu_->actions()[a]->text() == _name){
          QAction* action = viewModeMenu_->actions()[a];
          viewModeMenu_->removeAction(action);
          viewGroup_->removeAction(action);
          delete action;
        }
      break;

    }
}

/// Slot for setting the viewMode from menu
void CoreWidget::slotSetViewMode( QAction* action){
  setViewMode( action->text() );
}

/// Slot for setting the viewMode from menu
void CoreWidget::setViewMode( QString _mode ){
258
  slotChangeView(_mode, QStringList(), QStringList());
Jan Möbius's avatar
 
Jan Möbius committed
259
260
}

261
262
263
264
void CoreWidget::slotAddViewModeComplete(QString _mode , bool _custom, QStringList _toolboxes, QStringList _toolbars) {
  slotAddViewModeToolbars(_mode,_custom,_toolbars);
  slotAddViewModeToolboxes(_mode,_custom,_toolboxes);
}
Jan Möbius's avatar
 
Jan Möbius committed
265
266
267
268
269
270
271

/// show dialog for changing ViewMode
void CoreWidget::slotViewModeDialog(){
  //init widget
  static viewModeWidget* widget = 0;
  if ( !widget ){
    widget = new viewModeWidget(viewModes_);
272
    widget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );
273
274
    connect(widget, SIGNAL(changeView(QString, QStringList, QStringList)), this, SLOT(slotChangeView(QString, QStringList, QStringList)) );
    connect(widget, SIGNAL(saveMode(QString, bool, QStringList, QStringList)), this, SLOT(slotAddViewModeComplete(QString, bool, QStringList, QStringList)) );
Jan Möbius's avatar
 
Jan Möbius committed
275
276
277
278
279
    connect(widget, SIGNAL(removeMode(QString)), this, SLOT(slotRemoveViewMode(QString)) );
  }
  widget->show( OpenFlipper::Options::defaultToolboxMode() );
}

280
void CoreWidget::slotViewChangeDialog() {
Jan Möbius's avatar
Jan Möbius committed
281
282
  //init widget
  static viewModeChangeWidget* modeChangeWidget = 0;
283

Jan Möbius's avatar
Jan Möbius committed
284
285
286
287
288
  if ( !modeChangeWidget ){
    modeChangeWidget = new viewModeChangeWidget(viewModes_, this);
    modeChangeWidget->setWindowIcon( OpenFlipper::Options::OpenFlipperIcon() );
    connect(modeChangeWidget, SIGNAL(changeView(QString, QStringList, QStringList)), this, SLOT(slotChangeView(QString, QStringList, QStringList)) );
  }
289

Jan Möbius's avatar
Jan Möbius committed
290
291
  // Make it look like a dialog
  modeChangeWidget->setWindowFlags(Qt::Popup);
292
293
  modeChangeWidget->show( OpenFlipper::Options::defaultToolboxMode() );

Jan Möbius's avatar
Jan Möbius committed
294
295
296
297
298
299
  // Move it to the position of the push button
  QPoint posButton = vmChangeButton_->mapToGlobal(vmChangeButton_->pos());
  modeChangeWidget->move( posButton);

}

Jan Möbius's avatar
 
Jan Möbius committed
300
/// Slot for Changing visible toolWidgets
301
void CoreWidget::slotChangeView(QString _mode, QStringList _toolboxWidgets, QStringList _toolbars ){
Jan Möbius's avatar
 
Jan Möbius committed
302
303

  //try to find Widgets if they aren't given
304
  if (_mode != "" && _toolboxWidgets.size() == 0 && _toolbars.size() == 0)
Jan Möbius's avatar
 
Jan Möbius committed
305
    for (int i=0; i < viewModes_.size(); i++)
306
      if (viewModes_[i]->name == _mode) {
307
        _toolboxWidgets = viewModes_[i]->visibleToolboxes;
308
309
        _toolbars       = viewModes_[i]->visibleToolbars;
      }
310
  
Jan Möbius's avatar
Jan Möbius committed
311
  // Remove all toolbox entries
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
312
  toolBox_->clear ();
313
314

  //find all widgets that should be visible
315
  for (int i=0; i < _toolboxWidgets.size(); i++)
316
    for (uint p=0; p < plugins_.size(); p++){
317
318
319
      for ( uint j = 0 ; j < plugins_[p].toolboxWidgets.size(); ++j )
        if (_toolboxWidgets[i] == plugins_[p].toolboxWidgets[j].first )
          toolBox_->addItem (plugins_[p].toolboxWidgets[j].second, plugins_[p].toolboxWidgets[j].first);
320
    }
Jan Möbius's avatar
Jan Möbius committed
321

Jan Möbius's avatar
Jan Möbius committed
322
323
324
325
326
327
328
  //find all Toolbars that should be visible and hide the others
  for (uint p=0; p < plugins_.size(); p++)
    for ( uint j = 0 ; j < plugins_[p].toolbars.size(); ++j )
      if (_toolbars.contains( plugins_[p].toolbars[j].first ) )
        plugins_[p].toolbars[j].second->show();
      else
        plugins_[p].toolbars[j].second->hide();
329
330
331


  // Check the Main Toolbar:
Jan Möbius's avatar
Jan Möbius committed
332
333
334
335
  if ( _toolbars.contains(tr("Main Toolbar")) )
    mainToolbar_->show();
  else
    mainToolbar_->hide();
336
337

  // Check the Main Toolbar:
Jan Möbius's avatar
Jan Möbius committed
338
339
340
  if ( _toolbars.contains(tr("Viewer Toolbar")) )
    viewerToolbar_->show();
  else
341
342
343
    viewerToolbar_->hide();


344
345
  if (_mode != "")
    OpenFlipper::Options::defaultToolboxMode(_mode);
Jan Möbius's avatar
 
Jan Möbius committed
346
347
348

}

349
350
void CoreWidget::stereoButtonContextMenu(const QPoint& _pos) {

351
352
353
354
355
356
357
358
    // Grey out OpenGL stereo mode option if not available
    if(!OpenFlipper::Options::glStereo()) {
        stereoSettingsWidget_->stereoOpengl->setDisabled(true);
    } else {
        stereoSettingsWidget_->stereoOpengl->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::OpenGL);
    }

    // Set values
359
360
361
362
    stereoSettingsWidget_->stereoAnaglyph->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphRedCyan);
    stereoSettingsWidget_->stereoCustomAnaglyph->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::AnaglyphCustom);
    stereoSettingsWidget_->stereoPhilips->setChecked(OpenFlipper::Options::stereoMode() == OpenFlipper::Options::Philips);

363
    stereoSettingsWidget_->eyeDistance->setValue( OpenFlipperSettings().value("Core/Stereo/EyeDistance").toDouble() );
364
    stereoSettingsWidget_->focalDistance->setValue( OpenFlipperSettings().value("Core/Stereo/FocalDistance").toDouble() * 1000);
365

366
    // Philips stereo mode part
367
368
369
370
371
372

    // Block signals such that slotApplyStereoSettings
    // won't be called when setting the initial values here...
    stereoSettingsWidget_->headerContentType->blockSignals(true);
    stereoSettingsWidget_->headerSelect->blockSignals(true);

373
374
375
376
377
378
    stereoSettingsWidget_->headerContentType->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Content").toInt());
    stereoSettingsWidget_->headerFactor->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt());
    stereoSettingsWidget_->headerOffsetCC->setValue(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt());
    stereoSettingsWidget_->factorCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Factor").toInt());
    stereoSettingsWidget_->offsetCounter->setNum(OpenFlipperSettings().value("Core/Stereo/Philips/Offset").toInt());
    stereoSettingsWidget_->headerSelect->setCurrentIndex(OpenFlipperSettings().value("Core/Stereo/Philips/Select").toInt());
379

380
381
382
    // Unblock signals
    stereoSettingsWidget_->headerContentType->blockSignals(false);
    stereoSettingsWidget_->headerSelect->blockSignals(false);
383
384
385
386
387
388
389
390

    // Show right stacked widget
    if (stereoSettingsWidget_->stereoPhilips->isChecked()) {
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(1);
    } else {
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(0);
    }

391
    // Move widget to the position of the cursor
392
    stereoSettingsWidget_->move(stereoButton_->mapToGlobal(_pos) - QPoint((int)(stereoSettingsWidget_->width()/2), 0));
393
394
395
396
    // Show widget
    stereoSettingsWidget_->show();
}

397
void CoreWidget::slotApplyStereoSettings(int /*_tmpParam*/) {
398
399
400

    // Update values
    if (stereoSettingsWidget_->stereoCustomAnaglyph->isChecked()) {
401
        // Update option entry
402
        OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphCustom);
403
404
        // Show right stacked widget
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(0);
405
406
    } else if (stereoSettingsWidget_->stereoAnaglyph->isChecked()) {
        OpenFlipper::Options::stereoMode(OpenFlipper::Options::AnaglyphRedCyan);
407
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(0);
408
409
    } else if (stereoSettingsWidget_->stereoPhilips->isChecked()) {
        OpenFlipper::Options::stereoMode(OpenFlipper::Options::Philips);
410
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(1);
411
412
    } else {
        OpenFlipper::Options::stereoMode(OpenFlipper::Options::OpenGL);
413
        stereoSettingsWidget_->stackedWidget->setCurrentIndex(0);
414
415
    }

416
    // Save everything
417
    OpenFlipperSettings().setValue("Core/Stereo/EyeDistance",stereoSettingsWidget_->eyeDistance->value());
418
    OpenFlipperSettings().setValue("Core/Stereo/FocalDistance",double(stereoSettingsWidget_->focalDistance->value()/1000.0));
419
420
421
422
423
424

    // Update labels that display the current values
    stereoSettingsWidget_->factorCounter->setNum(stereoSettingsWidget_->headerFactor->value());
    stereoSettingsWidget_->offsetCounter->setNum(stereoSettingsWidget_->headerOffsetCC->value());

    // Set option entries
425
426
427
428
    OpenFlipperSettings().setValue("Core/Stereo/Philips/Content",stereoSettingsWidget_->headerContentType->currentIndex());
    OpenFlipperSettings().setValue("Core/Stereo/Philips/Factor",stereoSettingsWidget_->headerFactor->value());
    OpenFlipperSettings().setValue("Core/Stereo/Philips/Offset",stereoSettingsWidget_->headerOffsetCC->value());
    OpenFlipperSettings().setValue("Core/Stereo/Philips/Select",stereoSettingsWidget_->headerSelect->currentIndex());
429

430
431
432
433
    // Update all views
    for (unsigned int i = 0 ; i < OpenFlipper::Options::examinerWidgets() ; ++i) {
        examiner_widgets_[i]->updateGL();
    }
434
}