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

35
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36
37
*                                                                            *
*   $Revision$                                                       *
38
39
*   $LastChangedBy$                                                 *
*   $Date$                    *
Jan Möbius's avatar
Jan Möbius committed
40
*                                                                            *
41
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60


//=============================================================================
//
//  CLASS CoreWidget
//
//=============================================================================

/**
 * \file CoreWidget.hh
 * This File contains the header of the frameworks main widget
*/

#ifndef COREWIDGET_HH
#define COREWIDGET_HH


//== INCLUDES =================================================================

61
62
#include <set>

Jan Möbius's avatar
 
Jan Möbius committed
63
#include "OpenFlipper/common/Types.hh"
Jan Möbius's avatar
Jan Möbius committed
64
#include <OpenFlipper/common/GlobalOptions.hh>
Jan Möbius's avatar
 
Jan Möbius committed
65
66
67
68
69
70
#include <OpenFlipper/BasePlugin/ContextMenuInterface.hh>
#include <OpenFlipper/BasePlugin/LoggingInterface.hh>
#include <OpenFlipper/BasePlugin/MenuInterface.hh>
#include <OpenFlipper/BasePlugin/ViewInterface.hh>
#include <OpenFlipper/BasePlugin/StatusbarInterface.hh>

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
71
#include <OpenFlipper/widgets/coreWidget/SideArea.hh>
Dirk Wilden's avatar
Dirk Wilden committed
72
#include <OpenFlipper/widgets/coreWidget/ColorStatusBar.hh>
Jan Möbius's avatar
 
Jan Möbius committed
73

74
#include <OpenFlipper/widgets/glWidget/QtBaseViewer.hh>
Jan Möbius's avatar
   
Jan Möbius committed
75
76
#include <OpenFlipper/widgets/glWidget/QtGLGraphicsScene.hh>
#include <OpenFlipper/widgets/glWidget/QtGLGraphicsView.hh>
Jan Möbius's avatar
Jan Möbius committed
77
#include <OpenFlipper/widgets/glWidget/QtMultiViewLayout.hh>
78
#include <OpenFlipper/widgets/glWidget/QtSlideWindow.hh>
Jan Möbius's avatar
 
Jan Möbius committed
79
80
81
82
83
84
85
86

// QT INCLUDES
#include <QMainWindow>
#include <QStackedWidget>
#include <QTextEdit>
#include <QToolBar>
#include <QStatusBar>

87
88
89
#include <QFuture>
#include <QFutureWatcher>

Jan Möbius's avatar
 
Jan Möbius committed
90
91
#include <QDockWidget>

Jan Möbius's avatar
Jan Möbius committed
92
#include <OpenFlipper/widgets/aboutWidget/aboutWidget.hh>
93
#include <OpenFlipper/widgets/loggerWidget/loggerWidget.hh>
94
#include <OpenFlipper/widgets/optionsWidget/optionsWidget.hh>
95
#include <OpenFlipper/widgets/helpWidget/helpWidget.hh>
96
#include <OpenFlipper/widgets/stereoSettingsWidget/stereoSettingsWidget.hh>
97
#include <OpenFlipper/widgets/postProcessorWidget/postProcessorWidget.hh>
Jan Möbius's avatar
Jan Möbius committed
98
#include <OpenFlipper/widgets/rendererWidget/rendererWidget.hh>
Jan Möbius's avatar
 
Jan Möbius committed
99

Dirk Wilden's avatar
Dirk Wilden committed
100
#include <OpenFlipper/Core/PluginInfo.hh>
Jan Möbius's avatar
 
Jan Möbius committed
101

102
103
#include <ACG/QtWidgets/QtSceneGraphWidget.hh>

Jan Möbius's avatar
Jan Möbius committed
104
#include <ACG/Scenegraph/DrawModes.hh>
105
#include <ACG/Scenegraph/CoordsysNode.hh>
Jan Möbius's avatar
Jan Möbius committed
106

107
#include <OpenFlipper/INIFile/INIFile.hh>
108
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Jan Möbius's avatar
Jan Möbius committed
109

Jan Möbius's avatar
Jan Möbius committed
110
111
112
113
/** \brief ViewMode struct
* This struct contains a ViewMode and its status information such as used widgets,toolbars or context menus
*
*/
Marcel Campen's avatar
Marcel Campen committed
114
115
116
117
118





Jan Möbius's avatar
 
Jan Möbius committed
119
struct ViewMode{
120

Jan Möbius's avatar
Jan Möbius committed
121
122
  /// Name of the View Mode
  QString name;
123

124
125
126
  /// Icon of the View Mode
  /// TODO Specify size for Icons
  QString icon;
127

Jan Möbius's avatar
Jan Möbius committed
128
129
  /// Is this a user defined custom view mode or a plugin generated one
  bool custom;
130

Jan Möbius's avatar
Jan Möbius committed
131
132
  /// List of Visible Toolboxes in this view mode
  QStringList visibleToolboxes;
133

Jan Möbius's avatar
Jan Möbius committed
134
135
  /// List of Toolbars in this view mode
  QStringList visibleToolbars;
136

Jan Möbius's avatar
Jan Möbius committed
137
138
  /// List of context Menus in this view mode
  QStringList visibleContextMenus;
Jan Möbius's avatar
 
Jan Möbius committed
139
140
141
142
143
144
145
146
147
148
149
150
151
};

class StackWidgetInfo {
  public:
    StackWidgetInfo(bool _editable,QString _name,QWidget* _widget);

    bool editable;
    QString name;
    QWidget* widget;
};

/** Info struct containing information about custom context menus
 */
152
153
154
class MenuInfo {
  public:
    MenuInfo():
Jan Möbius's avatar
Jan Möbius committed
155
156
      action(0),
      type(CONTEXTBACKGROUNDMENU)
157
158
159
160
    {}

    /// The context item
    QAction*          action;
Jan Möbius's avatar
 
Jan Möbius committed
161

162
163
    /// Type of objects for which the context Menu should be visible
    DataType        contextType;
Jan Möbius's avatar
 
Jan Möbius committed
164

165
    /// Type of the context Menu ( Context for what type .. Background,Object,Node)
Jan Möbius's avatar
Jan Möbius committed
166
    ContextMenuType type;
Jan Möbius's avatar
 
Jan Möbius committed
167
168
};

Jan Möbius's avatar
Jan Möbius committed
169
170
171
172
/** \brief Struct containing information about pickModes
 *
 * This is an internal DataStructure! Don't use it. It's used to
 * manage the pickmode information internally.
173
174
175
176
177
178
179
*/
class PickMode
{
  public:
    /// Constructor
    PickMode(const std::string& _n, const bool _t, const bool _v, QCursor _c, QToolBar *_tb = 0 );

Jan Möbius's avatar
Jan Möbius committed
180
    /// Destructor
181
182
183
    ~PickMode() {};


Jan Möbius's avatar
Jan Möbius committed
184
185
186
187
    /** \brief PickMode visible
     *
     * @param _visible Should this be a visible or a hidden pick mode?
     */
188
189
    void visible(const bool _visible);

Jan Möbius's avatar
Jan Möbius committed
190
191
192
193
    /** \brief PickMode visible
     *
     * Visible or hidden pick mode
     */
194
195
    bool visible() const;

Jan Möbius's avatar
Jan Möbius committed
196
197
198
199
    /** \brief PickMode Name
    *
    * Name of the pick mode
    */
200
201
    std::string name() const;

Jan Möbius's avatar
Jan Möbius committed
202
203
204
205
206
207
208
    /** \brief PickMode mouse tracking
     *
     * If the pick mode has mouse tracking enabled, it will emit
     * mouse events with every movement and not only on button events.
     *
     * @param _tracking mouse tracking enabled or not
     */
209
    void tracking(const bool _tracking);
Jan Möbius's avatar
Jan Möbius committed
210
211
212
213
214
215

    /** \brief PickMode mouse tracking
    *
    * If the pick mode has mouse tracking enabled, it will emit
    * mouse events with every movement and not only on button events.
    */
216
217
    bool tracking() const;

Jan Möbius's avatar
Jan Möbius committed
218
219
220
221
222
    /** \brief PickMode cursor
    *
    * The cursor associated with this pick mode. You can define a non standard
    * cursor that is visible, if this pick mode is active.
    */
223
224
    QCursor cursor() const;

225
226
227
228
229
230
231
232
233
    /** \brief PickMode cursor
    *
    * The cursor associated with this pick mode. You can define a non standard
    * cursor that is visible, if this pick mode is active.
    *
    * @param _cursor The cursor to be used in this pickmode
    */
    void cursor(const QCursor _cursor);

Jan Möbius's avatar
Jan Möbius committed
234
235
236
237
238
239
240
    /** \brief PickMode toolbar
    *
    * Each pickmode can have a toolbar that will be visible at the top of the screen.
    * This toolbar is stored here.
    *
    * @param _toolbar The used toolbar
    */
241
    void toolbar(QToolBar* _toolbar);
Jan Möbius's avatar
Jan Möbius committed
242
243
244
245
246
247

    /** \brief PickMode toolbar
    *
    * Each pickmode can have a toolbar that will be visible at the top of the screen.
    * This toolbar is stored here.
    */
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
    QToolBar* toolbar() const;

  private:

    /// Name of the pickMode
    std::string  name_;

    /** MouseTracking enabled for this mode?
    */
    bool         tracking_;

    /** Defines if the Mode will be visible in the popup Menu
    */
    bool         visible_;

    /** Cursor used in  this pickMode
    */
    QCursor      cursor_;

    /** Additional toolbar showed in this pickMode
    */
    QToolBar *   toolbar_;
};

Jan Möbius's avatar
 
Jan Möbius committed
272
273
274
275
276
277
278
279
/** Core Widget of the Application
 */
class CoreWidget : public QMainWindow
{
  Q_OBJECT

public:

280
281
  friend class Core;

Jan Möbius's avatar
 
Jan Möbius committed
282
  /// constructor
Dirk Wilden's avatar
Dirk Wilden committed
283
  CoreWidget( QVector<ViewMode*>& _viewModes, std::vector<PluginInfo>& _plugins, QList< SlotInfo >& _coreSlots );
Jan Möbius's avatar
 
Jan Möbius committed
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299

  /// destructor
  ~CoreWidget();

  signals:
    void clearAll();
    void loadMenu();
    void addEmptyObjectMenu();
    void saveMenu();
    void saveToMenu();
    void loadIniMenu();
    void saveIniMenu();
    void recentOpen(QAction*);
    void exit();

    void loadPlugin();
Dirk Wilden's avatar
Dirk Wilden committed
300
    void showPlugins();
Jan Möbius's avatar
 
Jan Möbius committed
301
302
303
304
305
306

  private slots:

    /// Called on applications close
    void closeEvent ( QCloseEvent * event );

Dirk Wilden's avatar
Dirk Wilden committed
307
308
309
310
311
312
313
314
315
316
317
   //===========================================================================
  /** @name Logger
  * @{ */
  //===========================================================================

  signals :
      void log(Logtype _type, QString _message);
      void log(QString _message);

   /** @} */

Jan Möbius's avatar
 
Jan Möbius committed
318
319
320
321
322
323
324
325
326
327
328
   //===========================================================================
  /** @name Keys
  * @{ */
  //===========================================================================

  protected :

    //! Handle key events
    virtual void keyPressEvent (QKeyEvent* _e);
    virtual void keyReleaseEvent(QKeyEvent* _e);

Jan Möbius's avatar
   
Jan Möbius committed
329
330
331
    // Filter alt key events under windows
    //bool eventFilter(QObject *obj, QEvent *ev);

332
333
  private:
    //event handling
334
335
    bool event( QEvent *event );

336
337
    bool eventFilter(QObject *_obj, QEvent *_event);

Jan Möbius's avatar
 
Jan Möbius committed
338
339
  signals :

340
341
342
343
344
345
346
347
348
349
350
351
352
    /** When this Signal is emitted when a Keyevent Event occures
     *  The signal is connected to all Plugins implementing KeyInterface by the pluginLoader
     */
    void PluginKeyEvent(QKeyEvent* );

    /** When this Signal is emitted when a Keyevent Release occures
     *  The signal is connected to all Plugins implementing KeyInterface by the pluginLoader
     */
    void PluginKeyReleaseEvent(QKeyEvent* );

    /// internal signal to register CoreWidget keys
    void registerKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description,
                     bool _multiUse = false);
Jan Möbius's avatar
 
Jan Möbius committed
353

Dirk Wilden's avatar
Dirk Wilden committed
354
355
    ///call a scripting function
    void call( QString _expression , bool& _success  );
Dirk Wilden's avatar
Dirk Wilden committed
356
357

  private:
Dirk Wilden's avatar
Dirk Wilden committed
358
359
    ///typedefs
    typedef std::multimap<  std::pair< int, Qt::KeyboardModifiers >  ,  std::pair< QObject*, int > > KeyMap;
Dirk Wilden's avatar
Dirk Wilden committed
360

Dirk Wilden's avatar
Dirk Wilden committed
361
362
    typedef std::pair< KeyMap::iterator, KeyMap::iterator > KeyRange;

363
364
365
366
367
368
369
370
    /** \brief Register all events related to the core
     */
    void registerCoreKeys();

    /** \brief handle key events for the core
     *
     * This function is called to handle key events which are registered to the core
     */
371
372
    void coreKeyPressEvent();

Dirk Wilden's avatar
Dirk Wilden committed
373
374
375
376
377
    /// Handle core key events
    void coreKeyPressEvent  (QKeyEvent* _e);
    void coreKeyReleaseEvent(QKeyEvent* _e);

    KeyBinding getKeyBinding(QObject* _plugin, int _keyIndex );
Dirk Wilden's avatar
Dirk Wilden committed
378
    QString    getRPCName(QObject* _plugin );
Dirk Wilden's avatar
Dirk Wilden committed
379
380

    ///vector of keys registered to the core
Dirk Wilden's avatar
Dirk Wilden committed
381
382
    std::vector<KeyBinding> coreKeys_;

Dirk Wilden's avatar
Dirk Wilden committed
383
384
385
386
387
388
    ///mapping of all keys to registered keys and the corresponding plugins
    KeyMap keys_;

    ///mapping of all registered keys and the corresponding plugins to currently assigned keys
    InverseKeyMap invKeys_;

Dirk Wilden's avatar
Dirk Wilden committed
389
390
391
    ///list of scripting slots from core
    QList< SlotInfo >& coreSlots_;

Dirk Wilden's avatar
Dirk Wilden committed
392
  private slots:
393
394
395
396
397
     /** \brief key registration
     *
     * internal slot that registers a keyCombination to the sender() who emitted the registerKey() signal
     * only after registering keyCombinations plugins receive keyEvents to the corresponding keyCombinations via KeyInterface.
     */
Dirk Wilden's avatar
Dirk Wilden committed
398
399
400
401
    void slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description,
                         bool _multiUse = false);

  public slots:
402
403
404
405
     /** \brief add a new key Mapping
     *
     * internal function that stores a new keyCombination assignment for an existing keyBinding
     */
Dirk Wilden's avatar
Dirk Wilden committed
406
    void slotAddKeyMapping(int _key, Qt::KeyboardModifiers _modifiers, QObject* _plugin, int _keyBindingID);
Dirk Wilden's avatar
Dirk Wilden committed
407

408
409
410
411
412
     /** \brief register scripting slots to allow keyBindings
     *
     * internal function that registers all public slots without parameters of each plugin (or core)
     * to the key management system. This allows the assignment of keyBindings for each of these slots.
     */
Dirk Wilden's avatar
Dirk Wilden committed
413
414
    void slotRegisterSlotKeyBindings();

415
416
417
418
419
420
421
  public:
    ///Load key assignments from a given INI file
    void loadKeyBindings(INIFile& _ini);

    ///Store current key assignments to a given INI file
    void saveKeyBindings(INIFile& _ini);

Dirk Wilden's avatar
Dirk Wilden committed
422
423
424
425
  private:
    /// Store the state of the shift key
    bool shiftPressed_;

Jan Möbius's avatar
 
Jan Möbius committed
426
427
428
429
430
431
432
433
434
   /** @} */

  //===========================================================================
  /** @name GUI creation
  * @{ */
  //===========================================================================

  public:

435
436
    /// Setup the main menubar
    void setupMenuBar();
437

Dirk Wilden's avatar
Dirk Wilden committed
438
439
440
441
442
443
444
445
446
447
   /** @} */

  //===========================================================================
  /** @name Video Capturing
  * @{ */
  //===========================================================================

  signals:
    void startVideoCapture(QString _baseName, int _fps, bool _captureViewers);
    void stopVideoCapture();
448
449
450
451

    void resizeViewers(int _width, int _height);
    void resizeApplication(int _width, int _height);

Dirk Wilden's avatar
Dirk Wilden committed
452
453
  private slots:
    void startVideoCaptureDialog();
454

Jan Möbius's avatar
Jan Möbius committed
455
  /** @} */
456

Jan Möbius's avatar
Jan Möbius committed
457
458
459
460
  //===========================================================================
  /** @name Recent File Menu handling
   * @{ */
  //===========================================================================
461

Dirk Wilden's avatar
Dirk Wilden committed
462
463
  public:

Jan Möbius's avatar
 
Jan Möbius committed
464
465
466
467
468
469
470
  /// Add a recent file and update menu
  void addRecent(QString _filename, DataType _type);

  /// Update the recent files menu
  void updateRecent();

  /** @} */
Jan Möbius's avatar
Jan Möbius committed
471

Jan Möbius's avatar
 
Jan Möbius committed
472
473
474
475
  //===========================================================================
  /** @name GUI Controls
  * @{ */
  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
476

Jan Möbius's avatar
 
Jan Möbius committed
477
  public :
478
479
480
481
482
483
484
485
486
487
488
489
490
491

    /// Show logger in splitter or not
    void showLoggerInSplitView(bool _show);

    /// Set in-scene logger geometry right
    void updateInSceneLoggerGeometry();

    /// Use native or gl painted cursor
    void setForceNativeCursor ( bool _state );

    QSize defaultIconSize();

  public slots:

Jan Möbius's avatar
 
Jan Möbius committed
492
493
    /// Set application to Fullscreen and back
    void toggleFullscreen();
Jan Möbius's avatar
Jan Möbius committed
494

495
496
497
    /// Enable or disable fullscreen mode
    void setFullscreen(bool _state );

Jan Möbius's avatar
 
Jan Möbius committed
498
499
    /// Hide or show logging area
    void toggleLogger();
500
501

    /// Change visibility of the logger
Jan Möbius's avatar
Jan Möbius committed
502
    void showLogger(OpenFlipper::Options::LoggerState _state);
Jan Möbius's avatar
Jan Möbius committed
503

Jan Möbius's avatar
 
Jan Möbius committed
504
505
    /// Hide or show toolbox area
    void toggleToolbox();
506
507
508
    
    /// Show or hide toolbox
    void showToolbox( bool _state );
509

510
511
512
    /// Change visibility of the Status Bar
    void toggleStatusBar();

513
514
    /// Show or hide status bar
    void showStatusBar( bool _state );
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
515

516
517
    /// Show or hide menubar
    void showMenuBar( bool _state );
518

519
520
    /// Hide or show menu bar
    void toggleMenuBar();
Dirk Wilden's avatar
Dirk Wilden committed
521

522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
    /// Hide or show current toolbar
    void toggleToolBar();

    /// Show or hide toolbar, emits toolBarToggled( bool _state )
    void showToolBar( bool _state );
  signals:
    /// will be emitted if the visibility of the toolbar is changed
    void toolBarVisChanged( bool _state );

    /// will be emitted if the visibility of the toolbox is changed
    void toolBoxVisChanged( bool _state );

    /// will be emitted if the visibility of the statusbar is changed
    void statusBarVisChanged( bool _state );

    /// will be emitted if the visibility of the menubar is changed
    void menuBarVisChanged( bool _state );
539

540
541
542
    /// will be emitted if the fullscreen state is changed (_state = true => in fullscreen)
    void fullScreenChanged( bool _state );

Jan Möbius's avatar
Jan Möbius committed
543
544
  private:
    OpenFlipper::Options::LoggerState loggerState_;
Dirk Wilden's avatar
Dirk Wilden committed
545
546
    
    QSize defaultIconSize_;
547

Jan Möbius's avatar
 
Jan Möbius committed
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
  /** @} */

  //===========================================================================
    /** @name Tool Widgets / View Modes
    * @{ */
  //===========================================================================

    private:
      /// a List of all widgets in the toolbar
      QVector<QWidget*> toolWidgets_;

    public:
      /// List of currently available viewModes
      QVector<ViewMode*>& viewModes_;

    private:

      QPushButton* viewModeButton_;

      /// Submenu holding all ViewMode actions
      QMenu* viewModeMenu_;

    public slots:

      /// init ViewModes that were loaded via ini-file
      void initViewModes(  );

575
      /// Add or change Toolboxes for a ViewMode (non-userdefined viewMode)
Jan Möbius's avatar
Jan Möbius committed
576
      void slotAddViewModeToolboxes(QString _mode, QStringList _usedWidgets);
Jan Möbius's avatar
 
Jan Möbius committed
577

578
      /// Add or change Toolboxes for a ViewMode (_custom == userdefined viewMode)
Jan Möbius's avatar
Jan Möbius committed
579
      void slotAddViewModeToolboxes(QString _mode, bool _custom, QStringList _usedWidgets);
580

581
      /// Add or change Toolbars for a ViewMode (non-userdefined viewMode)
582
583
      void slotAddViewModeToolbars(QString _mode, QStringList _usedToolbars);

584
585
      /// Add or change Toolbars for a ViewMode (_custom == userdefined viewMode)
      void slotAddViewModeToolbars(QString _mode, bool _custom, QStringList _usedToolbars);
586

Jan Möbius's avatar
Marlin:    
Jan Möbius committed
587
588
589
590
591
592
593
594
      /// Add or change Toolbars for a ViewMode (non-userdefined viewMode)
      void slotAddViewModeContextMenus(QString _mode, QStringList _usedToolbars);

      /// Add or change Toolbars for a ViewMode (_custom == userdefined viewMode)
      void slotAddViewModeContextMenus(QString _mode, bool _custom, QStringList _usedToolbars);

      /// Completly configure a view mode ( set toolbars, toolboxes, context menus, ... )
      void slotAddViewModeComplete(QString _mode , bool _custom, QStringList _toolboxes, QStringList _toolbars, QStringList _contextmenus);
595

Jan Möbius's avatar
Jan Möbius committed
596
      /// Sets the Icon for a given View Mode (non-userdefined viewMode)
597
      void slotSetViewModeIcon(QString _mode, QString _iconName);
598

Jan Möbius's avatar
Jan Möbius committed
599
600
      /// Sets the Icon for a given View Mode (_custom == userdefined viewMode)
      void slotSetViewModeIcon(QString _mode, bool _custom, QString _iconName);
Jan Möbius's avatar
 
Jan Möbius committed
601
602

      /// Slot for Changing visible toolWidgets
603
      void slotChangeView(QString _mode, QStringList _toolboxWidgets, QStringList _toolbars, QStringList _contextmenus, bool _expandAll = false);
604
605
      
      /// Set orientation of tool box (either on the right or the left side of the screen)
606
      void setToolBoxOrientationOnTheRight(bool _toolBoxRight);
607
608
609
      
      /// Hide or show the View Mode controls
      void showViewModeControls(bool _show);
Jan Möbius's avatar
 
Jan Möbius committed
610

Marcel Campen's avatar
Marcel Campen committed
611
612
613
      /// Hide the context menu
      void slotHideContextMenu();

Jan Möbius's avatar
 
Jan Möbius committed
614
615
616
617
618
619
620
    private slots:
      /// Remove viewMode
      void slotRemoveViewMode(QString _name);

      /// Slot for setting ViewMode from Menu
      void slotSetViewMode( QAction* action);

Jan Möbius's avatar
Jan Möbius committed
621
      /// Show a dialog in which the viewMode can be edited
Jan Möbius's avatar
 
Jan Möbius committed
622
      void slotViewModeDialog();
623

Jan Möbius's avatar
Jan Möbius committed
624
625
      /// Show a dialog in which the viewMode can be changed
      void slotViewChangeDialog();
Jan Möbius's avatar
 
Jan Möbius committed
626
627

    public slots :
628
629
      
      /// Set the view Mode to the given Mode
630
      void setViewMode( QString _mode, bool _expandAll = false );
631
632
      
      /// Move a specific toolbox widget to the top of the side area
633
      void moveToolBoxToTop(QString _name);
634
635
      
      /// Move a specific toolbox widget to the bottom of the side area
636
      void moveToolBoxToBottom(QString _name);
Jan Möbius's avatar
 
Jan Möbius committed
637
638
639
640
641
642
643
644
645
646

   /** @} */



  //===========================================================================
    /** @name Basic Gui Elements
    * @{ */
  //===========================================================================

647
  private:
Jan Möbius's avatar
 
Jan Möbius committed
648
649

    /// Examiner Widget
Jan Möbius's avatar
   
Jan Möbius committed
650
    std::vector< glViewer* >  examiner_widgets_;
Jan Möbius's avatar
Jan Möbius committed
651

Jan Möbius's avatar
 
Jan Möbius committed
652
653
    ///Spliter between toplevel objects and the textedit at the bottom
    QSplitter* splitter_;
Jan Möbius's avatar
Jan Möbius committed
654

655
656
657
    /// Group box containing Task Switcher Controls
    QGroupBox *viewModeControlBox_;
    
Jan Möbius's avatar
 
Jan Möbius committed
658
    /// Textedit at the bottom for log messages
659
    LoggerWidget* logWidget_;
Jan Möbius's avatar
Jan Möbius committed
660

Jan Möbius's avatar
 
Jan Möbius committed
661
662
663
664
665
666
    /// Size of the logging window ( defaults to 240 )
    int originalLoggerSize_;

    /// QMenu containing the recently opened files
    QMenu* recentFilesMenu_;

667
668
669
    /// Algorithms Menu
    QMenu* algorithmMenu_;

Jan Möbius's avatar
 
Jan Möbius committed
670
671
    /// Help Menu
    QMenu* helpMenu_;
672
673
674
675
676
677
678
    
    /// Window Menu
    QMenu* windowMenu_;
    
    /// Action for View Mode Widget Conrol in Menu
    QAction* AC_ShowViewModeControls_;
    
Jan Möbius's avatar
   
Jan Möbius committed
679
680
681
682
683
684
685
686
687
688
689
690
691
    /// gl widget used as drawing area to paint the graphics scene
    QGLWidget* glWidget_;

    /// graphics scene used to paint gl context and widgets
    QtGLGraphicsScene* glScene_;

    /// graphics view that holds the gl scene
    QtGLGraphicsView* glView_;

    /// center widged
    QGraphicsWidget* centerWidget_;

    /// Base layout that holds gl views
Jan Möbius's avatar
Jan Möbius committed
692
    QtMultiViewLayout* baseLayout_;
Jan Möbius's avatar
   
Jan Möbius committed
693

694
695
696
    /// Class that holds the animated log widget
    QtSlideWindow* slidingLogger_;

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
697
698
    /// Widget for toolBox
    QWidget* toolBoxArea_;
699

Jan Möbius's avatar
Jan Möbius committed
700
701
    /// Button to change viewModes
    QPushButton* vmChangeButton_;
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
702
703
704
705
706
707
708
709
710
711

    /// Spliter between toplevel objects and toolbox
    QSplitter* toolSplitter_;

    /// Toolbox
    SideArea* toolBox_;

    /// Toolbox scroll area
    QScrollArea* toolBoxScroll_;

712
    /// Handle to picking toolbar
Jan Möbius's avatar
Jan Möbius committed
713
    typedef std::map<QToolBar*,QGraphicsProxyWidget*> PickToolBarMap;
714
    PickToolBarMap curPickingToolbarItems_;
Jan Möbius's avatar
Dennis:    
Jan Möbius committed
715

716
717
718
    /// Extra toolbar not in scene for picking
    QToolBar* pickToolBarExternal_;

719
720
721
    /// Store all toolbars that once have been registered
    std::set<QToolBar*> registeredToolbars_;

Jan Möbius's avatar
Dennis:    
Jan Möbius committed
722
723
724
    /// Cursor handling
    CursorPainter* cursorPainter_;

Jan Möbius's avatar
   
Jan Möbius committed
725

726
727
728
    // widget showing the scenegraph
    ACG::QtWidgets::QtSceneGraphDialog* sceneGraphDialog_;

Jan Möbius's avatar
 
Jan Möbius committed
729
730
731
  /** @} */

  private slots:
732
733
734
735
736
737

    /** Creates and shows the Scenegraph Dialog
     */
    void slotShowSceneGraphDialog();


738
739
740
741
742
   /** Makes the sender examiner active
    */
   void slotActivateExaminer ();


Jan Möbius's avatar
 
Jan Möbius committed
743
744
745
746
747
748
   /** Display a log message in the Mainwidget
    * @param _type Type of Message (OUT,WARN,ERR)
    * @param _message The message to be displayed
    */
   void slotLog(Logtype _type, QString _message);

Jan Möbius's avatar
   
Jan Möbius committed
749
750
   /** Updates the size of the main graphics widget in the scene
     */
751
   void sceneRectChanged(const QRectF &rect);
Jan Möbius's avatar
   
Jan Möbius committed
752

Jan Möbius's avatar
 
Jan Möbius committed
753
754
755
756
757
758
  //===========================================================================
    /** @name Menubar controls
      * @{ */
  //===========================================================================
  private slots :

Jan Möbius's avatar
Jan Möbius committed
759
760
    void slotAddMenubarAction( QAction* _action , QString _name );
    void slotGetMenubarMenu (QString _name, QMenu *& _menu, bool _create);
Jan Möbius's avatar
 
Jan Möbius committed
761
762
763
764
765
766
767
768

  private:

    /// File Menu
    QMenu *fileMenu_;

    /// View Menu
    QMenu *viewMenu_;
769

770
771
    /// Tools Menu
    QMenu *toolsMenu_;
Jan Möbius's avatar
 
Jan Möbius committed
772
773
774
775

    /// First entry after all relevant parts of the File Menu
    QAction* fileMenuEnd_;

Jan Möbius's avatar
Jan Möbius committed
776
777
778
    /// All available menus
    QMap<QString, QMenu *> menus_;

Jan Möbius's avatar
 
Jan Möbius committed
779
  /** @} */
Jan Möbius's avatar
Jan Möbius committed
780

Jan Möbius's avatar
 
Jan Möbius committed
781
782
783
784
  //===========================================================================
    /** @name ToolBar controls
      * @{ */
  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
785
  private:
Jan Möbius's avatar
 
Jan Möbius committed
786
    QToolBar* viewerToolbar_;
Dirk Wilden's avatar
Dirk Wilden committed
787
788

    int toolbarCount_;
Jan Möbius's avatar
Jan Möbius committed
789

790
791
792
793
794
    QToolButton* stereoButton_;
    QToolButton* moveButton_;
    QToolButton* pickButton_;
    QToolButton* questionButton_;

795
    QComboBox* viewerLayoutBox_;
796

Jan Möbius's avatar
 
Jan Möbius committed
797
798
799
  /** @} */

  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
800
    /** @name View Menu
Jan Möbius's avatar
 
Jan Möbius committed
801
802
      * @{ */
  //===========================================================================
803

Jan Möbius's avatar
Jan Möbius committed
804
805
806
  public slots:
    /// Setup and update the global draw menu
    void slotUpdateGlobalDrawMenu();
807

808
809
810
811
812
    /// Setup and update the global renderer menu
    void slotUpdateRendererMenu();

    /// Setup and update the global postprocessor menu
    void slotUpdatePostProcessorMenu();
813

814
815
    /// Change viewer layout that was selected in the combo box
    void setViewerLayout(int _idx);
816

817
818
  private slots:
    /// Switches over to the next view mode
819
    void nextViewerLayout();
820

Jan Möbius's avatar
Jan Möbius committed
821
822
    /// Called when the global drawMode is selected
    void slotGlobalDrawMenu(QAction * _action);
823

824
825
    /// Called before the view Menu is shown
    void slotViewMenuAboutToShow();
826

827
828
829
830
831
832
    /// Called when the global renderer is selected
    void slotGlobalRendererMenu(QAction * _action);

    /// Called when the global postprocessor is selected
    void slotGlobalPostProcessorMenu(QAction * _action);

Jan Möbius's avatar
Jan Möbius committed
833
834
835
  private:
    /// This variable holds the global draw menu
    QMenu* globalDrawMenu_;
836

837
838
839
840
841
842
    /// This variable holds the global renderer menu
    QMenu* rendererMenu_;

    /// This variable holds the global postprocessor menu
    QMenu* postprocessorMenu_;

843
844
    QActionGroup * drawGroup_;

845
846
847
848
849
850
    /// Group for all renderers
    QActionGroup * rendererGroup_;

    /// Group for all postprocessors
    QActionGroup *  postProcessorGroup_;

Jan Möbius's avatar
Jan Möbius committed
851
852
    /// Group for all menu items
    QActionGroup* viewGroup_;
853

854
855
    QAction* perspectiveProjectionAction_;
    QAction* orthogonalProjectionAction_;
856

857
    /// Action to globally set animation
858
    QAction* globalAnimationAction_;
859

860
861
    /// Action to globally set backface culling
    QAction* globalBackfaceCullingAction_;
862

863
    /// Action to globally set two-sided lighting
864
865
    QAction* globalTwosidedLightingAction_;

866
    /// Action to globally set multisampling
867
    QAction* globalMultisamplingAction_;
868
869
870
    
    /// Action to globally set mipmapping
    QAction* globalMipmappingAction_;
871

Jan Möbius's avatar
Jan Möbius committed
872
    ACG::SceneGraph::DrawModes::DrawMode activeDrawModes_;
873

Jan Möbius's avatar
Jan Möbius committed
874
    ACG::SceneGraph::DrawModes::DrawMode availableGlobalDrawModes_;
875

Jan Möbius's avatar
Jan Möbius committed
876
877
878
879
880
881
  /** @} */

  //===========================================================================
    /** @name Context Menu
     * @{ */
  //===========================================================================
882

Jan Möbius's avatar
 
Jan Möbius committed
883
  signals :
884
885
886
887
888
889
890
891
892
    /// tells the plugins to update their context menu when an object is picked
    void updateContextMenu(int);

    /// tells the plugins to update their context menu when a node is picked
    void updateContextMenuNode(int);

    /// tells the plugins to update their context menu when the background is picked
    void updateContextMenuBackground();

Jan Möbius's avatar
 
Jan Möbius committed
893
894
895
896
897

  private slots:
    /// This slot is called by the examiner widgets gl area when a context menu is requested
    void slotCustomContextMenu( const QPoint& _point );

Jan Möbius's avatar
   
Jan Möbius committed
898
899
    /// called by plugins to add a new context menu item
    void slotAddContextItem(QAction* _entry, ContextMenuType _type);
Jan Möbius's avatar
 
Jan Möbius committed
900

Jan Möbius's avatar
   
Jan Möbius committed
901
902
    /// called by plugins to add a real context menu item depending on DataType
    void slotAddContextItem( QAction* _entry , DataType _dataType ,ContextMenuType type_);
Jan Möbius's avatar
Marlin:    
Jan Möbius committed
903
904
905
    
    /// called by slotAddContextItem to add the item to the view mode
    void slotAddContextItemToViewMode( QAction* _entry );
Jan Möbius's avatar
 
Jan Möbius committed
906

907
908
909
    /// Paste the view to the last active examiner
    void slotPasteView( );

910
911
912
    /// Paste the view, the window and toolbox size to the last active examiner
    void slotPasteViewAndWindow( );

913
914
915
    /// Set the supplied serialized view
    void slotSetView( QString view );

916
917
918
    /// Copy view from the last active examiner
    void slotCopyView( );

919
920
    /// Called when a coordsys drawMode has been changed
    void slotViewerDrawMenu( QAction * _action );
921

922
923
924
    /// Called when a different post processor has been chosen
    void slotPostProcessorMenu( QAction * _action);

Jan Möbius's avatar
Jan Möbius committed
925
926
927
    /// Called when a different renderer