2017-02-25 05:44:02 +08:00
|
|
|
#ifndef DockManagerH
|
|
|
|
#define DockManagerH
|
2017-02-27 21:15:20 +08:00
|
|
|
/*******************************************************************************
|
2017-06-10 04:04:02 +08:00
|
|
|
** Qt Advanced Docking System
|
2017-02-27 21:15:20 +08:00
|
|
|
** Copyright (C) 2017 Uwe Kindler
|
2018-05-06 18:45:46 +08:00
|
|
|
**
|
2017-06-10 04:04:02 +08:00
|
|
|
** This library 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 2.1 of the License, or (at your option) any later version.
|
2018-05-06 18:45:46 +08:00
|
|
|
**
|
2017-06-10 04:04:02 +08:00
|
|
|
** This library is distributed in the hope that it will be useful,
|
2017-02-27 21:15:20 +08:00
|
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2017-06-10 04:04:02 +08:00
|
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
** Lesser General Public License for more details.
|
2018-05-06 18:45:46 +08:00
|
|
|
**
|
2017-06-10 04:04:02 +08:00
|
|
|
** You should have received a copy of the GNU Lesser General Public
|
|
|
|
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
|
2017-02-27 21:15:20 +08:00
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
2017-02-25 05:44:02 +08:00
|
|
|
//============================================================================
|
|
|
|
/// \file DockManager.h
|
|
|
|
/// \author Uwe Kindler
|
2017-02-27 01:13:56 +08:00
|
|
|
/// \date 26.02.2017
|
|
|
|
/// \brief Declaration of CDockManager class
|
2017-02-25 05:44:02 +08:00
|
|
|
//============================================================================
|
|
|
|
|
2017-02-27 21:15:20 +08:00
|
|
|
|
2017-02-25 05:44:02 +08:00
|
|
|
//============================================================================
|
|
|
|
// INCLUDES
|
|
|
|
//============================================================================
|
|
|
|
#include "DockContainerWidget.h"
|
2018-09-14 04:19:13 +08:00
|
|
|
#include <QIcon>
|
2017-02-25 05:44:02 +08:00
|
|
|
|
2018-07-17 21:11:49 +08:00
|
|
|
#include "ads_globals.h"
|
|
|
|
|
2018-02-13 19:00:58 +08:00
|
|
|
class QSettings;
|
2018-09-14 04:19:13 +08:00
|
|
|
class QMenu;
|
2018-02-13 19:00:58 +08:00
|
|
|
|
2017-02-25 05:44:02 +08:00
|
|
|
namespace ads
|
|
|
|
{
|
2017-02-27 01:13:56 +08:00
|
|
|
struct DockManagerPrivate;
|
2017-03-01 21:09:56 +08:00
|
|
|
class CFloatingDockContainer;
|
2018-08-29 14:47:05 +08:00
|
|
|
struct FloatingDockContainerPrivate;
|
2017-03-01 23:13:37 +08:00
|
|
|
class CDockContainerWidget;
|
|
|
|
class CDockOverlay;
|
2018-08-29 14:47:05 +08:00
|
|
|
class CDockAreaTabBar;
|
|
|
|
class CDockWidgetTab;
|
|
|
|
struct DockWidgetTabPrivate;
|
|
|
|
struct DockAreaWidgetPrivate;
|
2017-02-25 05:44:02 +08:00
|
|
|
|
|
|
|
/**
|
2017-02-27 01:13:56 +08:00
|
|
|
* The central dock manager that maintains the complete docking system
|
|
|
|
**/
|
2018-07-17 21:11:49 +08:00
|
|
|
class ADS_EXPORT CDockManager : public CDockContainerWidget
|
2017-02-25 05:44:02 +08:00
|
|
|
{
|
2017-02-27 01:13:56 +08:00
|
|
|
Q_OBJECT
|
|
|
|
private:
|
|
|
|
DockManagerPrivate* d; ///< private data (pimpl)
|
2018-05-06 18:45:46 +08:00
|
|
|
friend struct DockManagerPrivate;
|
2018-08-29 14:47:05 +08:00
|
|
|
friend class CFloatingDockContainer;
|
|
|
|
friend struct FloatingDockContainerPrivate;
|
|
|
|
friend class CDockContainerWidget;
|
|
|
|
friend class CDockAreaTabBar;
|
|
|
|
friend class CDockWidgetTab;
|
|
|
|
friend struct DockAreaWidgetPrivate;
|
|
|
|
friend struct DockWidgetTabPrivate;
|
2017-03-01 23:13:37 +08:00
|
|
|
|
2017-02-27 01:13:56 +08:00
|
|
|
protected:
|
2017-03-01 21:09:56 +08:00
|
|
|
/**
|
|
|
|
* Registers the given floating widget in the internal list of
|
|
|
|
* floating widgets
|
|
|
|
*/
|
|
|
|
void registerFloatingWidget(CFloatingDockContainer* FloatingWidget);
|
2017-03-01 23:13:37 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove the given floating widget from the list of registered floating
|
|
|
|
* widgets
|
|
|
|
*/
|
|
|
|
void removeFloatingWidget(CFloatingDockContainer* FloatingWidget);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers the given dock container widget
|
|
|
|
*/
|
|
|
|
void registerDockContainer(CDockContainerWidget* DockContainer);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove dock container from the internal list of registered dock
|
|
|
|
* containers
|
|
|
|
*/
|
|
|
|
void removeDockContainer(CDockContainerWidget* DockContainer);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Overlay for containers
|
|
|
|
*/
|
|
|
|
CDockOverlay* containerOverlay() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Overlay for dock areas
|
|
|
|
*/
|
|
|
|
CDockOverlay* dockAreaOverlay() const;
|
|
|
|
|
2018-08-29 14:47:05 +08:00
|
|
|
public:
|
2018-09-14 04:19:13 +08:00
|
|
|
enum eViewMenuInsertionOrder
|
|
|
|
{
|
|
|
|
MenuSortedByInsertion,
|
|
|
|
MenuAlphabeticallySorted
|
|
|
|
};
|
|
|
|
|
|
|
|
enum eXmlMode
|
|
|
|
{
|
|
|
|
XmlAutoFormattingDisabled,
|
|
|
|
XmlAutoFormattingEnabled
|
|
|
|
};
|
|
|
|
|
2018-08-29 14:47:05 +08:00
|
|
|
/**
|
|
|
|
* Default Constructor.
|
|
|
|
* If the given parent is a QMainWindow, the dock manager sets itself as the
|
|
|
|
* central widget
|
|
|
|
*/
|
|
|
|
CDockManager(QWidget* parent = 0);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Virtual Destructor
|
|
|
|
*/
|
|
|
|
virtual ~CDockManager();
|
|
|
|
|
2017-03-27 16:41:27 +08:00
|
|
|
/**
|
|
|
|
* Adds dockwidget into the given area.
|
|
|
|
* If DockAreaWidget is not null, then the area parameter indicates the area
|
|
|
|
* into the DockAreaWidget. If DockAreaWidget is null, the Dockwidget will
|
2018-08-29 14:47:05 +08:00
|
|
|
* be dropped into the container. If you would like to add a dock widget
|
|
|
|
* tabified, then you need to add it to an existing dock area object
|
|
|
|
* into the CenterDockWidgetArea. The following code shows this:
|
|
|
|
* \code
|
|
|
|
* DockManager->addDockWidget(ads::CenterDockWidgetArea, NewDockWidget,
|
|
|
|
* ExisitingDockArea);
|
|
|
|
* \endcode
|
2017-03-27 16:41:27 +08:00
|
|
|
* \return Returns the dock area widget that contains the new DockWidget
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* addDockWidget(DockWidgetArea area, CDockWidget* Dockwidget,
|
|
|
|
CDockAreaWidget* DockAreaWidget = nullptr);
|
|
|
|
|
2018-09-07 17:10:14 +08:00
|
|
|
/**
|
|
|
|
* This function will add the given Dockwidget to the given dock area as
|
|
|
|
* a new tab.
|
|
|
|
* If no dock area widget exists for the given area identifier, a new
|
|
|
|
* dock area widget is created.
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* addDockWidgetTab(DockWidgetArea area,
|
|
|
|
CDockWidget* Dockwidget);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This function will add the given Dockwidget to the given DockAreaWidget
|
|
|
|
* as a new tab.
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* addDockWidgetTabToArea(CDockWidget* Dockwidget,
|
|
|
|
CDockAreaWidget* DockAreaWidget);
|
|
|
|
|
2017-03-27 16:41:27 +08:00
|
|
|
/**
|
|
|
|
* Searches for a registered doc widget with the given ObjectName
|
|
|
|
* \return Return the found dock widget or nullptr if a dock widget with the
|
|
|
|
* given name is not registered
|
|
|
|
*/
|
|
|
|
CDockWidget* findDockWidget(const QString& ObjectName);
|
|
|
|
|
2017-03-01 23:13:37 +08:00
|
|
|
/**
|
|
|
|
* Returns the list of all active and visible dock containers
|
|
|
|
* Dock containers are the main dock manager and all floating widgets
|
|
|
|
*/
|
|
|
|
const QList<CDockContainerWidget*> dockContainers() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the list of all floating widgets
|
|
|
|
*/
|
|
|
|
const QList<CFloatingDockContainer*> floatingWidgets() const;
|
2017-03-02 22:49:53 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This function always return 0 because the main window is always behind
|
|
|
|
* any floating widget
|
|
|
|
*/
|
|
|
|
virtual unsigned int zOrderIndex() const;
|
2017-03-23 22:57:15 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Saves the current state of the dockmanger and all its dock widgets
|
2018-09-14 04:19:13 +08:00
|
|
|
* into the returned QByteArray.
|
|
|
|
* The XmlMode enables / disables the auto formatting for the XmlStreamWriter.
|
|
|
|
* If auto formatting is enabled, the output is intended and line wrapped.
|
|
|
|
* The XmlMode XmlAutoFormattingDisabled is better if you would like to have
|
|
|
|
* a more compact XML output - i.e. for storage in ini files.
|
2017-03-23 22:57:15 +08:00
|
|
|
*/
|
2018-09-14 04:19:13 +08:00
|
|
|
QByteArray saveState(eXmlMode XmlMode = XmlAutoFormattingDisabled, int version = 0) const;
|
2017-03-23 22:57:15 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Restores the state of this dockmanagers dockwidgets.
|
|
|
|
* The version number is compared with that stored in state. If they do
|
|
|
|
* not match, the dockmanager's state is left unchanged, and this function
|
|
|
|
* returns false; otherwise, the state is restored, and this function
|
|
|
|
* returns true.
|
|
|
|
*/
|
|
|
|
bool restoreState(const QByteArray &state, int version = 0);
|
2018-02-13 19:00:58 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Saves the current perspective to the internal list of perspectives.
|
|
|
|
* A perspective is the current state of the dock manager assigned
|
|
|
|
* with a certain name. This makes it possible for the user,
|
|
|
|
* to switch between different perspectives quickly.
|
|
|
|
* If a perspective with the given name already exists, then
|
|
|
|
* it will be overwritten with the new state.
|
|
|
|
*/
|
|
|
|
void addPerspective(const QString& UniquePrespectiveName);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the names of all available perspectives
|
|
|
|
*/
|
|
|
|
QStringList perspectiveNames() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Saves the perspectives to the given settings file.
|
|
|
|
*/
|
|
|
|
void savePerspectives(QSettings& Settings) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads the perspectives from the given settings file
|
|
|
|
*/
|
|
|
|
void loadPerspectives(QSettings& Settings);
|
|
|
|
|
2018-09-14 04:19:13 +08:00
|
|
|
/**
|
|
|
|
* Adds a toggle view action to the the internal view menu.
|
|
|
|
* You can either manage the insertion of the toggle view actions in your
|
|
|
|
* application or you can add the actions to the internal view menu and
|
|
|
|
* then simply insert the menu object into your.
|
|
|
|
* \param[in] ToggleViewAction The action to insert. If no group is provided
|
|
|
|
* the action is directly inserted into the menu. If a group
|
|
|
|
* is provided, the action is inserted into the group and the
|
|
|
|
* group is inserted into the menu if it is not existing yet.
|
|
|
|
* \param[in] Group This is the text used for the group menu item
|
|
|
|
* \param[in] GroupIcon The icon used for grouping the workbenches in the
|
|
|
|
* view menu. I.e. if there is a workbench for each device
|
|
|
|
* like for spectrometer devices, it is good to group all these
|
|
|
|
* workbenches under a menu item
|
2018-09-26 15:57:36 +08:00
|
|
|
* \return If Group is not empty, this function returns the GroupAction
|
|
|
|
* for this group. If the group is empty, the function returns
|
|
|
|
* the given ToggleViewAction.
|
2018-09-14 04:19:13 +08:00
|
|
|
*/
|
2018-09-26 15:57:36 +08:00
|
|
|
QAction* addToggleViewActionToMenu(QAction* ToggleViewAction,
|
2018-09-14 04:19:13 +08:00
|
|
|
const QString& Group = QString(), const QIcon& GroupIcon = QIcon());
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This function returns the internal view menu.
|
|
|
|
* To fill the view menu, you can use the addToggleViewActionToMenu()
|
|
|
|
* function.
|
|
|
|
*/
|
|
|
|
QMenu* viewMenu() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Define the insertion order for toggle view menu items.
|
|
|
|
* The order defines how the actions are added to the view menu.
|
|
|
|
* The default insertion order is MenuAlphabeticallySorted to make it
|
|
|
|
* easier for users to find the menu entry for a certain dock widget.
|
|
|
|
* You need to call this function befor you insert the first menu item
|
|
|
|
* into the view menu.
|
|
|
|
*/
|
|
|
|
void setViewMenuInsertionOrder(eViewMenuInsertionOrder Order);
|
|
|
|
|
2018-02-13 19:00:58 +08:00
|
|
|
public slots:
|
|
|
|
/**
|
|
|
|
* Opens the perspective with the given name.
|
|
|
|
*/
|
|
|
|
void openPerspective(const QString& PerspectiveName);
|
|
|
|
|
|
|
|
signals:
|
|
|
|
/**
|
|
|
|
* This signal is emitted if the list of perspectives changed
|
|
|
|
*/
|
|
|
|
void perspectiveListChanged();
|
2018-08-10 20:11:57 +08:00
|
|
|
|
2018-09-27 22:21:14 +08:00
|
|
|
/**
|
|
|
|
* This signal is emitted, if the restore function is called, just before
|
|
|
|
* the dock manager starts restoring the state.
|
|
|
|
* If this function is called, nothing has changed yet
|
|
|
|
*/
|
|
|
|
void restoringState();
|
|
|
|
|
2018-08-10 20:11:57 +08:00
|
|
|
/**
|
2018-08-24 19:41:58 +08:00
|
|
|
* This signal is emitted if the state changed in restoreState.
|
|
|
|
* The signal is emitted if the restoreState() function is called or
|
|
|
|
* if the openPerspective() function is called
|
2018-08-10 20:11:57 +08:00
|
|
|
*/
|
2018-09-27 22:21:14 +08:00
|
|
|
void stateRestored();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This signal is emitted, if the dock manager starts opening a
|
|
|
|
* perspective.
|
|
|
|
* Opening a perspective may take more than a second if there are
|
|
|
|
* many complex widgets. The application may use this signal
|
|
|
|
* to show some progress indicator or to change the mouse cursor
|
|
|
|
* into a busy cursor.
|
|
|
|
*/
|
|
|
|
void openingPerspective(const QString& PerspectiveName);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This signal is emitted if the dock manager finished opening a
|
|
|
|
* perspective
|
|
|
|
*/
|
|
|
|
void perspectiveOpened(const QString& PerspectiveName);
|
2017-02-27 01:13:56 +08:00
|
|
|
}; // class DockManager
|
2017-02-25 05:44:02 +08:00
|
|
|
} // namespace ads
|
2017-02-27 01:13:56 +08:00
|
|
|
//-----------------------------------------------------------------------------
|
2017-02-25 05:44:02 +08:00
|
|
|
#endif // DockManagerH
|