CoreWidget.hh 46.8 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2 3
*                                                                            *
*                              OpenFlipper                                   *
Martin Schultz's avatar
Martin Schultz committed
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 34 35 36 37 38
 *           Copyright (c) 2001-2015, RWTH-Aachen University                 *
 *           Department of Computer Graphics and Multimedia                  *
 *                          All rights reserved.                             *
 *                            www.openflipper.org                            *
 *                                                                           *
 *---------------------------------------------------------------------------*
 * This file is part of OpenFlipper.                                         *
 *---------------------------------------------------------------------------*
 *                                                                           *
 * Redistribution and use in source and binary forms, with or without        *
 * modification, are permitted provided that the following conditions        *
 * are met:                                                                  *
 *                                                                           *
 * 1. Redistributions of source code must retain the above copyright notice, *
 *    this list of conditions and the following disclaimer.                  *
 *                                                                           *
 * 2. Redistributions in binary form must reproduce the above copyright      *
 *    notice, this list of conditions and the following disclaimer in the    *
 *    documentation and/or other materials provided with the distribution.   *
 *                                                                           *
 * 3. Neither the name of the copyright holder nor the names of its          *
 *    contributors may be used to endorse or promote products derived from   *
 *    this software without specific prior written permission.               *
 *                                                                           *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       *
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A           *
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  *
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,       *
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR        *
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    *
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING      *
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS        *
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.              *
Jan Möbius's avatar
Jan Möbius committed
39
*                                                                            *
40
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
41

42
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
43 44
*                                                                            *
*   $Revision$                                                       *
45 46
*   $LastChangedBy$                                                 *
*   $Date$                    *
Jan Möbius's avatar
Jan Möbius committed
47
*                                                                            *
48
\*===========================================================================*/
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


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

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

#ifndef COREWIDGET_HH
#define COREWIDGET_HH


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

68 69
#include <set>

Jan Möbius's avatar
 
Jan Möbius committed
70
#include "OpenFlipper/common/Types.hh"
Jan Möbius's avatar
Jan Möbius committed
71
#include <OpenFlipper/common/GlobalOptions.hh>
Jan Möbius's avatar
 
Jan Möbius committed
72 73 74 75 76 77
#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
78
#include <OpenFlipper/widgets/coreWidget/SideArea.hh>
Dirk Wilden's avatar
Dirk Wilden committed
79
#include <OpenFlipper/widgets/coreWidget/ColorStatusBar.hh>
Jan Möbius's avatar
 
Jan Möbius committed
80

81
#include <OpenFlipper/widgets/glWidget/QtBaseViewer.hh>
Jan Möbius's avatar
 
Jan Möbius committed
82 83
#include <OpenFlipper/widgets/glWidget/QtGLGraphicsScene.hh>
#include <OpenFlipper/widgets/glWidget/QtGLGraphicsView.hh>
Jan Möbius's avatar
Jan Möbius committed
84
#include <OpenFlipper/widgets/glWidget/QtMultiViewLayout.hh>
85
#include <OpenFlipper/widgets/glWidget/QtSlideWindow.hh>
Jan Möbius's avatar
 
Jan Möbius committed
86 87 88 89 90 91 92 93

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

94 95 96
#include <QFuture>
#include <QFutureWatcher>

Jan Möbius's avatar
 
Jan Möbius committed
97 98
#include <QDockWidget>

99 100
#include <OpenFlipper/common/OFGLWidget.hh>

Jan Möbius's avatar
Jan Möbius committed
101
#include <OpenFlipper/widgets/aboutWidget/aboutWidget.hh>
102
#include <OpenFlipper/widgets/loggerWidget/loggerWidget.hh>
103
#include <OpenFlipper/widgets/optionsWidget/optionsWidget.hh>
104
#include <OpenFlipper/widgets/helpWidget/helpWidget.hh>
105
#include <OpenFlipper/widgets/stereoSettingsWidget/stereoSettingsWidget.hh>
106
#include <OpenFlipper/widgets/postProcessorWidget/postProcessorWidget.hh>
Jan Möbius's avatar
Jan Möbius committed
107
#include <OpenFlipper/widgets/rendererWidget/rendererWidget.hh>
Jan Möbius's avatar
Jan Möbius committed
108
#include <OpenFlipper/widgets/rendererWidget/rendererObjectWidget.hh>
Jan Möbius's avatar
 
Jan Möbius committed
109

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

112 113
#include <ACG/QtWidgets/QtSceneGraphWidget.hh>

Jan Möbius's avatar
Jan Möbius committed
114
#include <ACG/Scenegraph/DrawModes.hh>
115
#include <ACG/Scenegraph/CoordsysNode.hh>
Jan Möbius's avatar
Jan Möbius committed
116

117
#include <OpenFlipper/INIFile/INIFile.hh>
118
#include <OpenFlipper/BasePlugin/PluginFunctions.hh>
Jan Möbius's avatar
Jan Möbius committed
119

120 121
#include "../viewModeWidget/viewModeChangeWidget.hh"

Jan Möbius's avatar
Jan Möbius committed
122 123 124 125
/** \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
126 127 128 129 130





Jan Möbius's avatar
 
Jan Möbius committed
131
struct ViewMode{
132

Jan Möbius's avatar
Jan Möbius committed
133 134
  /// Name of the View Mode
  QString name;
135

136 137 138
  /// Icon of the View Mode
  /// TODO Specify size for Icons
  QString icon;
139

Jan Möbius's avatar
Jan Möbius committed
140 141
  /// Is this a user defined custom view mode or a plugin generated one
  bool custom;
142

Jan Möbius's avatar
Jan Möbius committed
143 144
  /// List of Visible Toolboxes in this view mode
  QStringList visibleToolboxes;
145

Jan Möbius's avatar
Jan Möbius committed
146 147
  /// List of Toolbars in this view mode
  QStringList visibleToolbars;
148

Jan Möbius's avatar
Jan Möbius committed
149 150
  /// List of context Menus in this view mode
  QStringList visibleContextMenus;
Jan Möbius's avatar
 
Jan Möbius committed
151 152 153 154 155 156 157 158 159 160 161 162 163
};

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

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

/** Info struct containing information about custom context menus
 */
164 165 166
class MenuInfo {
  public:
    MenuInfo():
Jan Möbius's avatar
Jan Möbius committed
167 168
      action(0),
      type(CONTEXTBACKGROUNDMENU)
169 170 171 172
    {}

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

174 175
    /// Type of objects for which the context Menu should be visible
    DataType        contextType;
Jan Möbius's avatar
 
Jan Möbius committed
176

177
    /// Type of the context Menu ( Context for what type .. Background,Object,Node)
Jan Möbius's avatar
Jan Möbius committed
178
    ContextMenuType type;
Jan Möbius's avatar
 
Jan Möbius committed
179 180
};

Jan Möbius's avatar
Jan Möbius committed
181 182 183 184
/** \brief Struct containing information about pickModes
 *
 * This is an internal DataStructure! Don't use it. It's used to
 * manage the pickmode information internally.
185 186 187 188 189 190 191
*/
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
192
    /// Destructor
193 194 195
    ~PickMode() {};


Jan Möbius's avatar
Jan Möbius committed
196 197 198 199
    /** \brief PickMode visible
     *
     * @param _visible Should this be a visible or a hidden pick mode?
     */
200 201
    void visible(const bool _visible);

Jan Möbius's avatar
Jan Möbius committed
202 203 204 205
    /** \brief PickMode visible
     *
     * Visible or hidden pick mode
     */
206 207
    bool visible() const;

Jan Möbius's avatar
Jan Möbius committed
208 209 210 211
    /** \brief PickMode Name
    *
    * Name of the pick mode
    */
212 213
    std::string name() const;

Jan Möbius's avatar
Jan Möbius committed
214 215 216 217 218 219 220
    /** \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
     */
221
    void tracking(const bool _tracking);
Jan Möbius's avatar
Jan Möbius committed
222 223 224 225 226 227

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

Jan Möbius's avatar
Jan Möbius committed
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.
    */
235 236
    QCursor cursor() const;

237 238 239 240 241 242 243 244 245
    /** \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
246 247 248 249 250 251 252
    /** \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
    */
253
    void toolbar(QToolBar* _toolbar);
Jan Möbius's avatar
Jan Möbius committed
254 255 256 257 258 259

    /** \brief PickMode toolbar
    *
    * Each pickmode can have a toolbar that will be visible at the top of the screen.
    * This toolbar is stored here.
    */
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
    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
284 285 286 287 288 289 290 291
/** Core Widget of the Application
 */
class CoreWidget : public QMainWindow
{
  Q_OBJECT

public:

292 293
  friend class Core;

Jan Möbius's avatar
 
Jan Möbius committed
294
  /// constructor
295
  CoreWidget( QVector<ViewMode*>& _viewModes, QList< SlotInfo >& _coreSlots );
Jan Möbius's avatar
 
Jan Möbius committed
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311

  /// 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
312
    void showPlugins();
Jan Möbius's avatar
 
Jan Möbius committed
313 314 315 316 317 318

  private slots:

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

Dirk Wilden's avatar
Dirk Wilden committed
319 320 321 322 323 324 325 326 327 328 329
   //===========================================================================
  /** @name Logger
  * @{ */
  //===========================================================================

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

   /** @} */

Jan Möbius's avatar
 
Jan Möbius committed
330 331 332 333 334 335 336 337 338 339 340
   //===========================================================================
  /** @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
341 342 343
    // Filter alt key events under windows
    //bool eventFilter(QObject *obj, QEvent *ev);

344 345
  private:
    //event handling
346 347
    bool event( QEvent *event );

348 349
    bool eventFilter(QObject *_obj, QEvent *_event);

Jan Möbius's avatar
 
Jan Möbius committed
350 351
  signals :

352 353 354 355 356 357 358 359 360 361 362 363 364
    /** 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
365

Dirk Wilden's avatar
Dirk Wilden committed
366 367
    ///call a scripting function
    void call( QString _expression , bool& _success  );
Dirk Wilden's avatar
Dirk Wilden committed
368 369

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

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

375 376 377 378 379 380 381 382
    /** \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
     */
383 384
    void coreKeyPressEvent();

Dirk Wilden's avatar
Dirk Wilden committed
385 386 387 388 389
    /// 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
390
    QString    getRPCName(QObject* _plugin );
Dirk Wilden's avatar
Dirk Wilden committed
391 392

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

Dirk Wilden's avatar
Dirk Wilden committed
395 396 397 398 399 400
    ///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
401 402 403
    ///list of scripting slots from core
    QList< SlotInfo >& coreSlots_;

Dirk Wilden's avatar
Dirk Wilden committed
404
  private slots:
405 406 407 408 409
     /** \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
410 411 412 413
    void slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description,
                         bool _multiUse = false);

  public slots:
414 415 416 417
     /** \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
418
    void slotAddKeyMapping(int _key, Qt::KeyboardModifiers _modifiers, QObject* _plugin, int _keyBindingID);
Dirk Wilden's avatar
Dirk Wilden committed
419

420 421 422 423 424
     /** \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
425 426
    void slotRegisterSlotKeyBindings();

427 428 429 430 431 432 433
  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);

Jan Möbius's avatar
Jan Möbius committed
434 435
    void showReducedMenuBar(bool reduced);

Dirk Wilden's avatar
Dirk Wilden committed
436 437 438 439
  private:
    /// Store the state of the shift key
    bool shiftPressed_;

Jan Möbius's avatar
 
Jan Möbius committed
440 441 442 443 444 445 446 447 448
   /** @} */

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

  public:

449 450
    /// Setup the main menubar
    void setupMenuBar();
451

Dirk Wilden's avatar
Dirk Wilden committed
452 453
   /** @} */

454 455 456 457 458 459 460 461 462 463 464 465 466

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

  private:

    /// Convenient way to access plugin list
    std::vector<PluginInfo>& plugins();

    /** @} */

Dirk Wilden's avatar
Dirk Wilden committed
467 468 469 470 471 472 473 474
  //===========================================================================
  /** @name Video Capturing
  * @{ */
  //===========================================================================

  signals:
    void startVideoCapture(QString _baseName, int _fps, bool _captureViewers);
    void stopVideoCapture();
475 476 477 478

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

Dirk Wilden's avatar
Dirk Wilden committed
479 480
  private slots:
    void startVideoCaptureDialog();
481

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

Jan Möbius's avatar
Jan Möbius committed
484 485 486 487
  //===========================================================================
  /** @name Recent File Menu handling
   * @{ */
  //===========================================================================
488

Dirk Wilden's avatar
Dirk Wilden committed
489 490
  public:

Jan Möbius's avatar
 
Jan Möbius committed
491 492 493 494 495 496 497
  /// 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
498

Jan Möbius's avatar
 
Jan Möbius committed
499 500 501 502
  //===========================================================================
  /** @name GUI Controls
  * @{ */
  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
503

Jan Möbius's avatar
 
Jan Möbius committed
504
  public :
505 506 507 508 509 510 511 512 513 514 515 516

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

517 518 519 520
    QScrollArea* getToolboxScrollArea() { return toolBoxScroll_; }
    QWidget* getToolboxArea() { return toolBoxArea_; }
    SideArea* getToolbox() { return toolBox_; }

521 522
  public slots:

Jan Möbius's avatar
 
Jan Möbius committed
523 524
    /// Set application to Fullscreen and back
    void toggleFullscreen();
Jan Möbius's avatar
Jan Möbius committed
525

526 527 528
    /// Enable or disable fullscreen mode
    void setFullscreen(bool _state );

Jan Möbius's avatar
 
Jan Möbius committed
529 530
    /// Hide or show logging area
    void toggleLogger();
531 532

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

Jan Möbius's avatar
 
Jan Möbius committed
535 536
    /// Hide or show toolbox area
    void toggleToolbox();
537 538 539
    
    /// Show or hide toolbox
    void showToolbox( bool _state );
540

541 542 543
    /// Change visibility of the Status Bar
    void toggleStatusBar();

544 545
    /// Show or hide status bar
    void showStatusBar( bool _state );
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
546

547 548
    /// Show or hide menubar
    void showMenuBar( bool _state );
549

550 551
    /// Hide or show menu bar
    void toggleMenuBar();
Dirk Wilden's avatar
Dirk Wilden committed
552

553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
    /// 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 );
570

571 572 573
    /// 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
574 575
  private:
    OpenFlipper::Options::LoggerState loggerState_;
Dirk Wilden's avatar
Dirk Wilden committed
576 577
    
    QSize defaultIconSize_;
578

Jan Möbius's avatar
 
Jan Möbius committed
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
  /** @} */

  //===========================================================================
    /** @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:

Jan Möbius's avatar
Jan Möbius committed
596
      QAction* viewModeButton_;
Jan Möbius's avatar
 
Jan Möbius committed
597 598 599 600 601 602 603 604 605

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

    public slots:

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

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

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

612
      /// Add or change Toolbars for a ViewMode (non-userdefined viewMode)
613 614
      void slotAddViewModeToolbars(QString _mode, QStringList _usedToolbars);

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

Jan Möbius's avatar
Marlin:  
Jan Möbius committed
618 619 620 621 622 623 624 625
      /// 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);
626

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

Jan Möbius's avatar
Jan Möbius committed
630 631
      /// 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
632 633

      /// Slot for Changing visible toolWidgets
634
      void slotChangeView(QString _mode, QStringList _toolboxWidgets, QStringList _toolbars, QStringList _contextmenus, bool _expandAll = false);
635 636
      
      /// Set orientation of tool box (either on the right or the left side of the screen)
637
      void setToolBoxOrientationOnTheRight(bool _toolBoxRight);
638 639 640
      
      /// Hide or show the View Mode controls
      void showViewModeControls(bool _show);
Jan Möbius's avatar
 
Jan Möbius committed
641

Marcel Campen's avatar
Marcel Campen committed
642 643 644
      /// Hide the context menu
      void slotHideContextMenu();

Jan Möbius's avatar
 
Jan Möbius committed
645 646 647 648 649 650 651
    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
652
      /// Show a dialog in which the viewMode can be edited
Jan Möbius's avatar
 
Jan Möbius committed
653
      void slotViewModeDialog();
654

655 656
      /// Closes the change view mode popup.
      void closeChangeViewModePopup();
Jan Möbius's avatar
 
Jan Möbius committed
657

Jan Möbius's avatar
Jan Möbius committed
658 659 660
      /// update the content of the specified examiner
      void slotUpdateExaminer(unsigned _id);

Jan Möbius's avatar
 
Jan Möbius committed
661
    public slots :
662 663
      
      /// Set the view Mode to the given Mode
664
      void setViewMode( QString _mode, bool _expandAll = false );
665 666
      
      /// Move a specific toolbox widget to the top of the side area
667
      void moveToolBoxToTop(QString _name);
668 669
      
      /// Move a specific toolbox widget to the bottom of the side area
670
      void moveToolBoxToBottom(QString _name);
Jan Möbius's avatar
 
Jan Möbius committed
671 672 673 674 675 676 677 678 679 680

   /** @} */



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

681
  private:
Jan Möbius's avatar
 
Jan Möbius committed
682 683

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

Jan Möbius's avatar
 
Jan Möbius committed
686 687
    ///Spliter between toplevel objects and the textedit at the bottom
    QSplitter* splitter_;
Jan Möbius's avatar
Jan Möbius committed
688

689
    /// Group box containing Task Switcher Controls
690
    QWidget *viewModeControlBox_;
691
    
Jan Möbius's avatar
 
Jan Möbius committed
692
    /// Textedit at the bottom for log messages
693
    LoggerWidget* logWidget_;
Jan Möbius's avatar
Jan Möbius committed
694

Jan Möbius's avatar
 
Jan Möbius committed
695 696 697 698 699 700
    /// Size of the logging window ( defaults to 240 )
    int originalLoggerSize_;

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

701 702 703
    /// Algorithms Menu
    QMenu* algorithmMenu_;

Jan Möbius's avatar
 
Jan Möbius committed
704 705
    /// Help Menu
    QMenu* helpMenu_;
706 707 708 709 710 711 712
    
    /// Window Menu
    QMenu* windowMenu_;
    
    /// Action for View Mode Widget Conrol in Menu
    QAction* AC_ShowViewModeControls_;
    
Jan Möbius's avatar
 
Jan Möbius committed
713
    /// gl widget used as drawing area to paint the graphics scene
714
    OFGLWidget* glWidget_;
Jan Möbius's avatar
 
Jan Möbius committed
715 716 717 718 719 720 721 722 723 724 725

    /// 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
726
    QtMultiViewLayout* baseLayout_;
Jan Möbius's avatar
 
Jan Möbius committed
727

728 729 730
    /// Class that holds the animated log widget
    QtSlideWindow* slidingLogger_;

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
731 732
    /// Widget for toolBox
    QWidget* toolBoxArea_;
733

734 735
    /// view mode gear icon at the upper left of the tool box
    QToolButton *viewModePopupBtn_;
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
736 737 738 739 740 741 742 743 744 745

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

    /// Toolbox
    SideArea* toolBox_;

    /// Toolbox scroll area
    QScrollArea* toolBoxScroll_;

746
    /// Handle to picking toolbar
Jan Möbius's avatar
Jan Möbius committed
747
    typedef std::map<QToolBar*,QGraphicsProxyWidget*> PickToolBarMap;
748
    PickToolBarMap curPickingToolbarItems_;
Jan Möbius's avatar
Dennis:  
Jan Möbius committed
749

750 751 752
    /// Extra toolbar not in scene for picking
    QToolBar* pickToolBarExternal_;

753 754 755
    /// Store all toolbars that once have been registered
    std::set<QToolBar*> registeredToolbars_;

Jan Möbius's avatar
Dennis:  
Jan Möbius committed
756 757 758
    /// Cursor handling
    CursorPainter* cursorPainter_;

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

760 761 762
    // widget showing the scenegraph
    ACG::QtWidgets::QtSceneGraphDialog* sceneGraphDialog_;

763 764 765 766
    QWidgetAction *viewModeChangePopupAction_;

    viewModeChangeWidget* modeChangeWidget;

Jan Möbius's avatar
 
Jan Möbius committed
767 768 769
  /** @} */

  private slots:
770 771 772 773 774 775

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


776 777 778 779 780
   /** Makes the sender examiner active
    */
   void slotActivateExaminer ();


Jan Möbius's avatar
 
Jan Möbius committed
781 782 783 784 785 786
   /** 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
787 788
   /** Updates the size of the main graphics widget in the scene
     */
789
   void sceneRectChanged(const QRectF &rect);
Jan Möbius's avatar
 
Jan Möbius committed
790

Jan Möbius's avatar
 
Jan Möbius committed
791 792 793 794 795 796
  //===========================================================================
    /** @name Menubar controls
      * @{ */
  //===========================================================================
  private slots :

Jan Möbius's avatar
Jan Möbius committed
797
    void slotAddMenubarAction( QAction* _action , QString _name );
798
    void slotAddMenubarActions( std::vector<QAction*> _actions , QString _name );
Jan Möbius's avatar
Jan Möbius committed
799
    void slotGetMenubarMenu (QString _name, QMenu *& _menu, bool _create);
Jan Möbius's avatar
 
Jan Möbius committed
800 801 802 803 804 805 806 807

  private:

    /// File Menu
    QMenu *fileMenu_;

    /// View Menu
    QMenu *viewMenu_;
808

809 810
    /// Tools Menu
    QMenu *toolsMenu_;
Jan Möbius's avatar
 
Jan Möbius committed
811 812 813 814

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

Jan Möbius's avatar
Jan Möbius committed
815 816 817
    /// All available menus
    QMap<QString, QMenu *> menus_;

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

Jan Möbius's avatar
 
Jan Möbius committed
820 821 822 823
  //===========================================================================
    /** @name ToolBar controls
      * @{ */
  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
824
  private:
Jan Möbius's avatar
 
Jan Möbius committed
825
    QToolBar* viewerToolbar_;
Dirk Wilden's avatar
Dirk Wilden committed
826 827

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

829 830 831 832 833
    QToolButton* stereoButton_;
    QToolButton* moveButton_;
    QToolButton* pickButton_;
    QToolButton* questionButton_;

834
    QComboBox* viewerLayoutBox_;
835

Jan Möbius's avatar
 
Jan Möbius committed
836 837 838
  /** @} */

  //===========================================================================
Jan Möbius's avatar
Jan Möbius committed
839
    /** @name View Menu
Jan Möbius's avatar
 
Jan Möbius committed
840 841
      * @{ */
  //===========================================================================
842

Jan Möbius's avatar
Jan Möbius committed
843 844 845
  public slots:
    /// Setup and update the global draw menu
    void slotUpdateGlobalDrawMenu();
846

847 848 849
    /// Setup and update the global renderer menu
    void slotUpdateRendererMenu();

850 851
    /// Change viewer layout that was selected in the combo box
    void setViewerLayout(int _idx);
852

853 854
  private slots:
    /// Switches over to the next view mode
855
    void nextViewerLayout();
856

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

860 861
    /// Called before the view Menu is shown
    void slotViewMenuAboutToShow();
862

863 864 865 866 867 868
    /// 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
869 870 871
  private:
    /// This variable holds the global draw menu
    QMenu* globalDrawMenu_;
872

873 874 875
    /// This variable holds the global renderer menu
    QMenu* rendererMenu_;

876 877
    QActionGroup * drawGroup_;

878 879 880
    /// Group for all renderers
    QActionGroup * rendererGroup_;

Jan Möbius's avatar
Jan Möbius committed
881 882
    /// Group for all menu items
    QActionGroup* viewGroup_;
883

884 885
    QAction* perspectiveProjectionAction_;
    QAction* orthogonalProjectionAction_;
886

887
    /// Action to globally set animation
888
    QAction* globalAnimationAction_;
889

890 891
    /// Action to globally set backface culling
    QAction* globalBackfaceCullingAction_;
892

893
    /// Action to globally set two-sided lighting
894 895
    QAction* globalTwosidedLightingAction_;

896
    /// Action to globally set multisampling
897
    QAction* globalMultisamplingAction_;
898 899 900
    
    /// Action to globally set mipmapping
    QAction* globalMipmappingAction_;
901

Jan Möbius's avatar
Jan Möbius committed
902
    ACG::SceneGraph::DrawModes::DrawMode activeDrawModes_;
903

Jan Möbius's avatar
Jan Möbius committed
904
    ACG::SceneGraph::DrawModes::DrawMode availableGlobalDrawModes_;
905

Jan Möbius's avatar
Jan Möbius committed
906 907 908 909 910 911
  /** @} */

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

Jan Möbius's avatar
 
Jan Möbius committed
913
  signals :
914 915 916 917 918 919 920 921 922
    /// 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
923 924 925 926 927

  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
928 929
    /// 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
930

Jan Möbius's avatar
 
Jan Möbius committed
931 932
    /// 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
933 934 935
    
    /// called by slotAddContextItem to add the item to the view mode
    void slotAddContextItemToViewMode( QAction* _entry );
Jan Möbius's avatar
 
Jan Möbius committed
936

937 938 939
    /// Paste the view to the last active examiner
    void slotPasteView( );

940 941 942
    /// Paste the view, the window and toolbox size to the last active examiner
    void slotPasteViewAndWindow( );

943 944 945
    /// Set the supplied serialized view
    void slotSetView( QString view );

946 947 948
    /// Set the supplied serialized view
    void slotSetViewAndWindowGeometry( QString view );

949 950 951
    /// Copy view from the last active examiner
    void slotCopyView( );

952 953
    /// Called when a coordsys drawMode has been changed
    void slotViewerDrawMenu( QAction * _action );
954

955 956 957
    /// Called when a different post processor has been chosen
    void slotPostProcessorMenu( QAction * _action);

Jan Möbius's avatar
Jan Möbius committed
958 959 960
    /// Called when a different renderer has been chosen
    void slotRenderMenu( QAction * _action);

961 962
    /// Creates a draw Menu for the currently active Viewer
    void slotUpdateViewerDrawMenu();
963

Dirk Wilden's avatar
Dirk Wilden committed
964
    /// Create a snapshot of the last active examiner
965
    void slotExaminerSnapshot();
Dirk Wilden's avatar
Dirk Wilden committed
966

967 968 969
    /// Show / hide wheels
    void slotSwitchWheels(bool _state);

970 971 972
    /// Switch navigation mode
    void slotSwitchNavigation(bool _egomode);

Dirk Wilden's avatar
Dirk Wilden committed
973 974 975
    /// Set the snapShot name for all examiners
    void slotSnapshotName();

Dirk Wilden's avatar
Dirk Wilden committed
976 977 978
    /// Hide coordinate systems in all viewers
    void slotCoordSysVisibility(bool _visible);

Jan Möbius's avatar
 
Jan Möbius committed
979
  private :
Jan Möbius's avatar
Jan Möbius committed
980 981 982 983
    /** Update the contextmenu for the given position inside an examiner widget
     *
     * @param _point      Picking position in coordinates of the viewer
     */
984 985
    void updatePopupMenu(const QPoint& _point);

986 987
    void updatePopupMenuCoordsysNode(QMenu* _menu , const int _part);
    void updatePopupMenuObject(QMenu* _menu , BaseObjectData* _object );
Jan Möbius's avatar
Jan Möbius committed
988
    void updatePopupMenuBackground(QMenu* _menu , const QPoint& _point);
989 990 991
    void updatePopupMenuNode(QMenu* _menu , ACG::SceneGraph::BaseNode* _node);

    bool addContextMenus( QMenu* _menu , ContextMenuType _type, int _id = -1);
Jan Möbius's avatar
 
Jan Möbius committed
992 993 994 995 996 997 998 999 1000 1001

  private :
    /// context Menu for the gl area
    QMenu*  contextMenu_;

    /// Context Menu containing all selection elements
    QMenu*  contextSelectionMenu_;

    /// All real context menu entries
    std::vector< MenuInfo > contextMenus_;
1002

1003 1004
    /// DrawGroup for per Viewer Draw Modes
    QActionGroup* drawGroupViewer_;
1005

1006 1007
    /// Draw Menu for per Viewer Draw Modes
    QMenu* viewerDrawMenu_;
Jan Möbius's avatar
 
Jan Möbius committed
1008

Matthias Möller's avatar
Matthias Möller committed
1009 1010 1011
    /// owns all the checkboxes of viewerDrawMenu_
    QWidget* viewerDrawMenuWidget_;

1012 1013 1014 1015
    /// Menu which holds the context menu entries for
    /// the coordsys node if invisible
    QMenu* coordSysMenu_;

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

Dirk Wilden's avatar
Dirk Wilden committed
1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
  //===========================================================================
    /** @name Snapshots
     * @{ */
  //===========================================================================

  private:

    QString snapshotName_;
    int     snapshotCounter_;

  public slots:

    /// Create a snapshot of the whole app with fileDialog
Dirk Wilden's avatar
Dirk Wilden committed
1031
    void viewerSnapshotDialog();
Dirk Wilden's avatar
Dirk Wilden committed
1032 1033

    /// Create a snapshot of the whole app
Dirk Wilden's avatar
Dirk Wilden committed
1034
    void viewerSnapshot();
Dirk Wilden's avatar
Dirk Wilden committed
1035 1036 1037 1038 1039 1040 1041 1042 1043 1044

    /// Create a snapshot of the whole app with fileDialog
    void applicationSnapshotDialog();

    /// Create a snapshot of the whole app
    void applicationSnapshot();

    /// Set the snapshot name
    void applicationSnapshotName(QString _name);

1045 1046 1047
    /// Scriptable snapshot method offering full control
    void viewerSnapshot(QString file_name, bool store_comments,
            bool comments_visible_only, bool comments_targeted_only,
1048
            bool store_material_info, int snapshot_width, int snapshot_height,
1049 1050
            bool snapshot_transparent, bool hide_coord_sys,
            int snapshot_multisampling, bool store_view);
Dirk Wilden's avatar
Dirk Wilden committed
1051 1052 1053

  /** @} */

1054 1055 1056 1057 1058 1059 1060
  //===========================================================================
    /** @name Thread-safe functions using QFuture
    * @{ */
  //===========================================================================

  public:

1061
    void writeImageAsynchronously(QImage* _image, const QString _name);
1062 1063 1064 1065 1066 1067

  private:

    // Store pointers to QFuture and QFutureWatcher
    std::map<QFutureWatcher<void>*,QFuture<void>*> watcher_garbage_;

1068 1069 1070
    // Mutex for operations on map
    QMutex map_mutex_;

1071 1072 1073 1074 1075 1076
  private slots:

    void delete_garbage();

  /** @} */