//============================================================================= // // OpenFlipper // Copyright (C) 2008 by Computer Graphics Group, RWTH Aachen // www.openflipper.org // //----------------------------------------------------------------------------- // // License // // OpenFlipper is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // 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 Lesser General Public License // along with OpenFlipper. If not, see . // //----------------------------------------------------------------------------- // // $Revision$ // $Author$ // $Date$ // //============================================================================= //============================================================================= // // CLASS CoreWidget // //============================================================================= /** * \file CoreWidget.hh * This File contains the header of the frameworks main widget */ #ifndef COREWIDGET_HH #define COREWIDGET_HH //== INCLUDES ================================================================= #include "OpenFlipper/common/Types.hh" #include #include #include #include #include #include #include #include #include #include #include #include // QT INCLUDES #include #include #include #include #include #include #include #include #include #include #include #include #include struct ViewMode{ QString name; bool custom; //is the mode defined by the user? QStringList visibleWidgets; }; class StackWidgetInfo { public: StackWidgetInfo(bool _editable,QString _name,QWidget* _widget); bool editable; QString name; QWidget* widget; }; /** Info struct containing information about custom context menus */ struct MenuInfo { /// The context Menu QMenu* menu; /// Type of objects for which the context Menu should be visible DataType contextType; /// Position of the context Menu inside the main widgets context Menu ContextMenuType position; }; /** Core Widget of the Application */ class CoreWidget : public QMainWindow { Q_OBJECT public: /// constructor CoreWidget( QVector& _viewModes, std::vector& _plugins, QList< SlotInfo >& _coreSlots ); /// destructor ~CoreWidget(); signals: void clearAll(); void loadMenu(); void addEmptyObjectMenu(); void saveMenu(); void saveToMenu(); void loadIniMenu(); void saveIniMenu(); void recentOpen(QAction*); void exit(); void loadPlugin(); void showPlugins(); private slots: /// Called on applications close void closeEvent ( QCloseEvent * event ); //=========================================================================== /** @name Logger * @{ */ //=========================================================================== signals : void log(Logtype _type, QString _message); void log(QString _message); /** @} */ //=========================================================================== /** @name Keys * @{ */ //=========================================================================== protected : //! Handle key events virtual void keyPressEvent (QKeyEvent* _e); virtual void keyReleaseEvent(QKeyEvent* _e); signals : /** 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); ///call a scripting function void call( QString _expression , bool& _success ); private: ///typedefs typedef std::multimap< std::pair< int, Qt::KeyboardModifiers > , std::pair< QObject*, int > > KeyMap; typedef std::multimap< std::pair< QObject*, int >, std::pair< int, Qt::KeyboardModifiers > > InverseKeyMap; typedef std::pair< KeyMap::iterator, KeyMap::iterator > KeyRange; /** \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 */ void coreKeyPressEvent(); /// Handle core key events void coreKeyPressEvent (QKeyEvent* _e); void coreKeyReleaseEvent(QKeyEvent* _e); KeyBinding getKeyBinding(QObject* _plugin, int _keyIndex ); QString getRPCName(QObject* _plugin ); ///vector of keys registered to the core std::vector coreKeys_; ///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_; ///list of scripting slots from core QList< SlotInfo >& coreSlots_; private slots: /** \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. */ void slotRegisterKey(int _key, Qt::KeyboardModifiers _modifiers, QString _description, bool _multiUse = false); public slots: /** \brief add a new key Mapping * * internal function that stores a new keyCombination assignment for an existing keyBinding */ void slotAddKeyMapping(int _key, Qt::KeyboardModifiers _modifiers, QObject* _plugin, int _keyBindingID); /** \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. */ void slotRegisterSlotKeyBindings(); 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); private: /// Store the state of the shift key bool shiftPressed_; /** @} */ //=========================================================================== /** @name GUI creation * @{ */ //=========================================================================== public: /// Setup the main menubar void setupMenuBar(); /// Add a recent file and update menu void addRecent(QString _filename, DataType _type); /// Update the recent files menu void updateRecent(); /** @} */ //=========================================================================== /** @name GUI Controls * @{ */ //=========================================================================== public : /// Set application to Fullscreen and back void toggleFullscreen(); /// Enable or disable fullscreen mode void setFullscreen(bool _state ); /// Hide or show logging area void toggleLogger(); /// Change visibility of the logger void showLogger(OpenFlipper::Options::LoggerState _state); /// Hide or show toolbox area void toggleToolbox(); /// Show or hide toolbox void showToolbox( bool _state ); private: OpenFlipper::Options::LoggerState loggerState_; /** @} */ //=========================================================================== /** @name Tool Widgets / View Modes * @{ */ //=========================================================================== private: /// a List of all widgets in the toolbar QVector toolWidgets_; public: /// List of currently available viewModes QVector& viewModes_; private: QPushButton* viewModeButton_; /// Submenu holding all ViewMode actions QMenu* viewModeMenu_; /// Group for all menu items QActionGroup* viewGroup_; public slots: /// init ViewModes that were loaded via ini-file void initViewModes( ); /// Add a new ViewMode (non-userdefined viewMode) void slotAddViewMode(QString _mode, QStringList _usedWidgets); /// Add a new ViewMode (_custom == userdefined viewMode) void slotAddViewMode(QString _mode, bool _custom, QStringList _usedWidgets); /// Slot for Changing visible toolWidgets void slotChangeView(QString _mode, QStringList _toolWidgets); private slots: /// Remove viewMode void slotRemoveViewMode(QString _name); /// Slot for setting ViewMode from Menu void slotSetViewMode( QAction* action); /// Show a dialog in which the viewMode can be changed void slotViewModeDialog(); /// Set the view Mode to the given Mode public slots : void setViewMode( QString _mode ); /** @} */ //=========================================================================== /** @name Basic Gui Elements * @{ */ //=========================================================================== public : /// Examiner Widget std::vector< glViewer* > examiner_widgets_; ///Spliter between toplevel objects and the textedit at the bottom QSplitter* splitter_; /// Textedit at the bottom for log messages LoggerWidget* logWidget_; /// Size of the logging window ( defaults to 240 ) int originalLoggerSize_; /// QMenu containing the recently opened files QMenu* recentFilesMenu_; /// Help Menu QMenu* helpMenu_; /// 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 QtMultiViewLayout* baseLayout_; /// Class that holds the animated log widget QtSlideWindow* slidingLogger_; /// Temporary widget QWidget* tempLogWidget; /// Widget for toolBox QWidget* toolBoxArea_; /// Spliter between toplevel objects and toolbox QSplitter* toolSplitter_; /// Toolbox SideArea* toolBox_; /// Toolbox scroll area QScrollArea* toolBoxScroll_; // widget showing the scenegraph ACG::QtWidgets::QtSceneGraphDialog* sceneGraphDialog_; /** @} */ private slots: /** Creates and shows the Scenegraph Dialog */ void slotShowSceneGraphDialog(); /** 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); /** Updates the size of the main graphics widget in the scene */ void sceneRectChanged(const QRectF &rect); //=========================================================================== /** @name Menubar controls * @{ */ //=========================================================================== private slots : void slotAddMenu( QMenu* _menu , MenuType _type ); private: /// File Menu QMenu *fileMenu_; /// View Menu QMenu *viewMenu_; /// First entry after all relevant parts of the File Menu QAction* fileMenuEnd_; /** @} */ //=========================================================================== /** @name ToolBar controls * @{ */ //=========================================================================== private: QToolBar* viewerToolbar_; int toolbarCount_; QToolButton* stereoButton_; QToolButton* projectionButton_; QToolButton* moveButton_; QToolButton* lightButton_; QToolButton* pickButton_; QToolButton* questionButton_; /** @} */ //=========================================================================== /** @name Context Menu * @{ */ //=========================================================================== signals : // tells the plugins to update their context menu void updateContextMenu(int) ; private slots: /// This slot is called by the examiner widgets gl area when a context menu is requested void slotCustomContextMenu( const QPoint& _point ); /// called by plugins to add a new context menu void slotAddContextMenu(QMenu* _menu); /// called by plugins to add a real context menu depending on DataType void slotAddContextMenu( QMenu* _menu , DataType _dataType ,ContextMenuType type_); /// change the animation setting void slotChangeAnimation(bool _animation); /// change the backFaceCulling setting void slotChangeBackFaceCulling(bool _backFaceCulling); /// change the twoSidedLighting setting void slotChangeTwoSidedLighting(bool _lighting); /// Paste the view to the last active examiner void slotPasteView( ); /// Copy view from the last active examiner void slotCopyView( ); /// Create a snapshot of the last active examiner void slotSnapshot(); /// Set the snapShot name for all examiners void slotSnapshotName(); private : /** Update the contextmenu for the given position inside an examiner widget * * @param _point Picking position in coordinates of the viewer */ void updatePopupMenu(const QPoint& _point); void updatePopupMenuCoordsysNode(QMenu* _menu , const int _part); void updatePopupMenuObject(QMenu* _menu , const int _objectId ); void updatePopupMenuBackground(QMenu* _menu , const QPoint& _point); private : /// context Menu for the gl area QMenu* contextMenu_; /// Function Menu QMenu* functionMenu_; /// Context Menu containing all selection elements QMenu* contextSelectionMenu_; /// All context menu entries which will always be available std::vector< MenuInfo > persistentContextMenus_; /// All real context menu entries std::vector< MenuInfo > contextMenus_; /** @} */ //=========================================================================== /** @name StackWidget controls * @{ */ //=========================================================================== private slots: void slotGetStackWidget( QString _name, QWidget*& _widget ); void slotAddStackWidget( QString _name, QWidget* _widget ); void slotUpdateStackWidget( QString _name, QWidget* _widget ); void slotViewMenuAction( QAction * _action); void slotUpdateStackMenu(); private : /// QMenu containing the recently opened files QMenu* stackMenu_; std::vector< StackWidgetInfo > stackWidgetList_; /// Container widget for holding multiple views QStackedWidget* stackedWidget_; /** @} */ //=========================================================================== /** @name Help System * @{ */ //=========================================================================== public slots: /// Display the help Browser void showHelpBrowserUser(); /// Display the help Browser void showHelpBrowserDeveloper(); private: /// Pointer to the help Browser HelpWidget* helpBrowserDeveloper_; /// Pointer to the help Browser HelpWidget* helpBrowserUser_; /** @} */ //=========================================================================== /** @name About System * @{ */ //=========================================================================== public slots: /// Display the about widget void showAboutWidget(); private: /// Pointer to the about widget AboutWidget* aboutWidget_; /** @} */ //=========================================================================== /** @name Options System * @{ */ //=========================================================================== public slots: /// Display the Options Browser void showOptionsWidget(); signals: void applyOptions(); void saveOptions(); private: /// Pointer to the OptionsWidget OptionsWidget* optionsWidget_; /** @} */ //=========================================================================== /** @name ToolBar controls * @{ */ //=========================================================================== private slots: /// Called by Plugins to add a Toolbar void slotAddToolbar(QToolBar* _toolbar); /// Called by Plugins to remove a Toolbar void slotRemoveToolbar(QToolBar* _toolbar); /// Called by Plugins to get access to specific Toolbars by name void getToolBar( QString _name, QToolBar*& _toolbar); private : QToolBar* mainToolbar_; std::vector< QToolBar* > toolbars_; /** @} */ //=========================================================================== /** @name StatusBar controls * @{ */ //=========================================================================== public slots: void statusMessage(QString _message, int _timeout = 0); void clearStatusMessage(); void setStatus( ApplicationStatus::applicationStatus _status); private: void setupStatusBar(); private : QStatusBar* statusBar_; QLabel* statusIcon_; /** @} */ //=========================================================================== /** @name Drag and Drop * @{ */ //=========================================================================== private slots: void startDrag( QMouseEvent* _event ); void dragEnterEvent(QDragEnterEvent* _event); void dropEvent( QDropEvent* _event ); /** @} */ private : std::vector& plugins_; //=========================================================================== /** @name Viewer Controls * @{ */ //=========================================================================== private slots: /// Enable or disable Stereo void slotToggleStereoMode(); /// Change icons if the stereo mode has changed in the examiner void slotProjectionModeChanged( bool _ortho ); /// Change Icons if action mode is changed in an examiner void slotActionModeChanged( Viewer::ActionMode _mode ); /// Called when the functionMenu has to be updated void slotFunctionMenuUpdate(); /// Set Background Color for all viewers at once. void slotSetGlobalBackgroundColor(); /// Set Background Color for one viewer. void slotSetLocalBackgroundColor(); private : bool stereoActive_; /** @} */ }; //============================================================================= #endif // COREWIDGET_HH defined //=============================================================================