CoreWidget.hh 45 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
#include <OpenFlipper/widgets/rendererWidget/rendererObjectWidget.hh>
Jan Möbius's avatar
 
Jan Möbius committed
100

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

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

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

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

Jan Möbius's avatar
Jan Möbius committed
111
112
113
114
/** \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
115
116
117
118
119





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

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

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

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

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

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

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

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

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

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

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

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

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

Jan Möbius's avatar
Jan Möbius committed
170
171
172
173
/** \brief Struct containing information about pickModes
 *
 * This is an internal DataStructure! Don't use it. It's used to
 * manage the pickmode information internally.
174
175
176
177
178
179
180
*/
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
181
    /// Destructor
182
183
184
    ~PickMode() {};


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

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

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

Jan Möbius's avatar
Jan Möbius committed
203
204
205
206
207
208
209
    /** \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
     */
210
    void tracking(const bool _tracking);
Jan Möbius's avatar
Jan Möbius committed
211
212
213
214
215
216

    /** \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.
    */
217
218
    bool tracking() const;

Jan Möbius's avatar
Jan Möbius committed
219
220
221
222
223
    /** \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.
    */
224
225
    QCursor cursor() const;

226
227
228
229
230
231
232
233
234
    /** \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
235
236
237
238
239
240
241
    /** \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
    */
242
    void toolbar(QToolBar* _toolbar);
Jan Möbius's avatar
Jan Möbius committed
243
244
245
246
247
248

    /** \brief PickMode toolbar
    *
    * Each pickmode can have a toolbar that will be visible at the top of the screen.
    * This toolbar is stored here.
    */
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
    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
273
274
275
276
277
278
279
280
/** Core Widget of the Application
 */
class CoreWidget : public QMainWindow
{
  Q_OBJECT

public:

281
282
  friend class Core;

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

  /// 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
301
    void showPlugins();
Jan Möbius's avatar
 
Jan Möbius committed
302
303
304
305
306
307

  private slots:

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

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

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

   /** @} */

Jan Möbius's avatar
 
Jan Möbius committed
319
320
321
322
323
324
325
326
327
328
329
   //===========================================================================
  /** @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
330
331
332
    // Filter alt key events under windows
    //bool eventFilter(QObject *obj, QEvent *ev);

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

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

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

341
342
343
344
345
346
347
348
349
350
351
352
353
    /** 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
354

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

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

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

364
365
366
367
368
369
370
371
    /** \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
     */
372
373
    void coreKeyPressEvent();

Dirk Wilden's avatar
Dirk Wilden committed
374
375
376
377
378
    /// 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
379
    QString    getRPCName(QObject* _plugin );
Dirk Wilden's avatar
Dirk Wilden committed
380
381

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

Dirk Wilden's avatar
Dirk Wilden committed
384
385
386
387
388
389
    ///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
390
391
392
    ///list of scripting slots from core
    QList< SlotInfo >& coreSlots_;

Dirk Wilden's avatar
Dirk Wilden committed
393
  private slots:
394
395
396
397
398
     /** \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
399
400
401
402
    void slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description,
                         bool _multiUse = false);

  public slots:
403
404
405
406
     /** \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
407
    void slotAddKeyMapping(int _key, Qt::KeyboardModifiers _modifiers, QObject* _plugin, int _keyBindingID);
Dirk Wilden's avatar
Dirk Wilden committed
408

409
410
411
412
413
     /** \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
414
415
    void slotRegisterSlotKeyBindings();

416
417
418
419
420
421
422
  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
423
424
425
426
  private:
    /// Store the state of the shift key
    bool shiftPressed_;

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

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

  public:

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

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

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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
465
466
467
468
469
470
471
  /// 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
472

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

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

    /// 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
493
494
    /// Set application to Fullscreen and back
    void toggleFullscreen();
Jan Möbius's avatar
Jan Möbius committed
495

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

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

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

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

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

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

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

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

523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
    /// 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 );
540

541
542
543
    /// 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
544
545
  private:
    OpenFlipper::Options::LoggerState loggerState_;
Dirk Wilden's avatar
Dirk Wilden committed
546
547
    
    QSize defaultIconSize_;
548

Jan Möbius's avatar
 
Jan Möbius committed
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
  /** @} */

  //===========================================================================
    /** @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(  );

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

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

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

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

Jan Möbius's avatar
Marlin:    
Jan Möbius committed
588
589
590
591
592
593
594
595
      /// 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);
596

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

Jan Möbius's avatar
Jan Möbius committed
600
601
      /// 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
602
603

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

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

Jan Möbius's avatar
 
Jan Möbius committed
615
616
617
618
619
620
621
    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
622
      /// Show a dialog in which the viewMode can be edited
Jan Möbius's avatar
 
Jan Möbius committed
623
      void slotViewModeDialog();
624

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

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

   /** @} */



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

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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
671
672
    /// Help Menu
    QMenu* helpMenu_;
673
674
675
676
677
678
679
    
    /// Window Menu
    QMenu* windowMenu_;
    
    /// Action for View Mode Widget Conrol in Menu
    QAction* AC_ShowViewModeControls_;
    
Jan Möbius's avatar
   
Jan Möbius committed
680
681
682
683
684
685
686
687
688
689
690
691
692
    /// 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
693
    QtMultiViewLayout* baseLayout_;
Jan Möbius's avatar
   
Jan Möbius committed
694

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

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

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

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

    /// Toolbox
    SideArea* toolBox_;

    /// Toolbox scroll area
    QScrollArea* toolBoxScroll_;

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

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

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

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

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

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

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

  private slots:
733
734
735
736
737
738

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


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


Jan Möbius's avatar
 
Jan Möbius committed
744
745
746
747
748
749
   /** 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
750
751
   /** Updates the size of the main graphics widget in the scene
     */
752
   void sceneRectChanged(const QRectF &rect);
Jan Möbius's avatar
   
Jan Möbius committed
753

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

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

  private:

    /// File Menu
    QMenu *fileMenu_;

    /// View Menu
    QMenu *viewMenu_;
770

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

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

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

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

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

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

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

796
    QComboBox* viewerLayoutBox_;
797

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

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

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

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

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

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

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

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

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

828
829
830
831
832
833
    /// 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
834
835
836
  private:
    /// This variable holds the global draw menu
    QMenu* globalDrawMenu_;
837

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

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

844
845
    QActionGroup * drawGroup_;

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

    /// Group for all postprocessors
    QActionGroup *  postProcessorGroup_;

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

855
856
    QAction* perspectiveProjectionAction_;
    QAction* orthogonalProjectionAction_;
857

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

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

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

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

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

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

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

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

Jan Möbius's avatar
 
Jan Möbius committed
884
  signals :
885
886
887
888
889
890
891
892
893
    /// 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
894
895
896
897
898

  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
899
900
    /// 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
901

Jan Möbius's avatar
   
Jan Möbius committed
902
903
    /// 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
904
905
906
    
    /// called by slotAddContextItem to add the item to the view mode
    void slotAddContextItemToViewMode( QAction* _entry );
Jan Möbius's avatar
 
Jan Möbius committed
907

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

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

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

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

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

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

Jan Möbius's avatar