2017-03-23 17:23:53 +08:00
|
|
|
#ifndef DockContainerWidgetH
|
|
|
|
#define DockContainerWidgetH
|
|
|
|
/*******************************************************************************
|
2017-06-10 04:04:02 +08:00
|
|
|
** Qt Advanced Docking System
|
2017-03-23 17:23:53 +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-03-23 17:23:53 +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-03-23 17:23:53 +08:00
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
/// \file DockContainerWidget.h
|
|
|
|
/// \author Uwe Kindler
|
|
|
|
/// \date 24.02.2017
|
|
|
|
/// \brief Declaration of CDockContainerWidget class
|
|
|
|
//============================================================================
|
|
|
|
|
|
|
|
|
|
|
|
//============================================================================
|
|
|
|
// INCLUDES
|
|
|
|
//============================================================================
|
|
|
|
#include <QFrame>
|
|
|
|
|
|
|
|
#include "ads_globals.h"
|
2018-10-12 21:18:05 +08:00
|
|
|
#include "DockWidget.h"
|
2018-07-17 21:11:49 +08:00
|
|
|
|
2017-12-30 01:18:16 +08:00
|
|
|
class QXmlStreamWriter;
|
|
|
|
class QXmlStreamReader;
|
|
|
|
|
2017-03-23 17:23:53 +08:00
|
|
|
namespace ads
|
|
|
|
{
|
|
|
|
struct DockContainerWidgetPrivate;
|
|
|
|
class CDockAreaWidget;
|
|
|
|
class CDockWidget;
|
|
|
|
class CDockManager;
|
2018-08-29 14:47:05 +08:00
|
|
|
struct DockManagerPrivate;
|
2017-03-23 17:23:53 +08:00
|
|
|
class CFloatingDockContainer;
|
2018-08-29 14:47:05 +08:00
|
|
|
struct FloatingDockContainerPrivate;
|
2017-03-23 17:23:53 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Container that manages a number of dock areas with single dock widgets
|
|
|
|
* or tabyfied dock widgets in each area
|
|
|
|
*/
|
2018-07-17 21:11:49 +08:00
|
|
|
class ADS_EXPORT CDockContainerWidget : public QFrame
|
2017-03-23 17:23:53 +08:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
private:
|
|
|
|
DockContainerWidgetPrivate* d; ///< private data (pimpl)
|
2018-05-06 18:45:46 +08:00
|
|
|
friend struct DockContainerWidgetPrivate;
|
2018-08-29 14:47:05 +08:00
|
|
|
friend class CDockManager;
|
|
|
|
friend struct DockManagerPrivate;
|
|
|
|
friend class CDockAreaWidget;
|
2018-09-14 19:21:29 +08:00
|
|
|
friend struct DockAreaWidgetPrivate;
|
2018-08-29 14:47:05 +08:00
|
|
|
friend class CFloatingDockContainer;
|
|
|
|
friend struct FloatingDockContainerPrivate;
|
2018-09-14 19:21:29 +08:00
|
|
|
friend class CDockWidget;
|
2017-03-23 17:23:53 +08:00
|
|
|
|
|
|
|
protected:
|
|
|
|
/**
|
|
|
|
* Handles activation events to update zOrderIndex
|
|
|
|
*/
|
|
|
|
virtual bool event(QEvent *e) override;
|
|
|
|
|
2017-03-28 14:48:44 +08:00
|
|
|
/**
|
|
|
|
* Access function for the internal root splitter
|
|
|
|
*/
|
|
|
|
QSplitter* rootSplitter() const;
|
|
|
|
|
2018-08-29 14:47:05 +08:00
|
|
|
/**
|
|
|
|
* Drop floating widget into the container
|
|
|
|
*/
|
|
|
|
void dropFloatingWidget(CFloatingDockContainer* FloatingWidget, const QPoint& TargetPos);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds the given dock area to this container widget
|
|
|
|
*/
|
|
|
|
void addDockArea(CDockAreaWidget* DockAreaWidget, DockWidgetArea area = CenterDockWidgetArea);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Removes the given dock area from this container
|
|
|
|
*/
|
|
|
|
void removeDockArea(CDockAreaWidget* area);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Saves the state into the given stream
|
|
|
|
*/
|
|
|
|
void saveState(QXmlStreamWriter& Stream) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Restores the state from given stream.
|
|
|
|
* If Testing is true, the function only parses the data from the given
|
|
|
|
* stream but does not restore anything. You can use this check for
|
|
|
|
* faulty files before you start restoring the state
|
|
|
|
*/
|
|
|
|
bool restoreState(QXmlStreamReader& Stream, bool Testing);
|
|
|
|
|
2018-09-07 17:10:14 +08:00
|
|
|
/**
|
|
|
|
* This function returns the last added dock area widget for the given
|
|
|
|
* area identifier or 0 if no dock area widget has been added for the given
|
|
|
|
* area
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* lastAddedDockAreaWidget(DockWidgetArea area) const;
|
|
|
|
|
2018-09-14 19:21:29 +08:00
|
|
|
/**
|
|
|
|
* This function returns true if this dock area has only one single
|
|
|
|
* visible dock widget.
|
2018-09-26 15:57:36 +08:00
|
|
|
* A top level widget is a real floating widget. Only the isFloating()
|
|
|
|
* function of top level widgets may returns true.
|
2018-09-14 19:21:29 +08:00
|
|
|
*/
|
2018-09-26 15:57:36 +08:00
|
|
|
bool hasTopLevelDockWidget() const;
|
2018-09-14 19:21:29 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* If hasSingleVisibleDockWidget() returns true, this function returns the
|
|
|
|
* one and only visible dock widget. Otherwise it returns a nullptr.
|
|
|
|
*/
|
2018-09-26 15:57:36 +08:00
|
|
|
CDockWidget* topLevelDockWidget() const;
|
2018-09-14 19:21:29 +08:00
|
|
|
|
2018-10-11 14:54:32 +08:00
|
|
|
/**
|
|
|
|
* This function returns a list of all dock widgets in this floating widget.
|
|
|
|
* It may be possible, depending on the implementation, that dock widgets,
|
|
|
|
* that are not visible to the user have no parent widget. Therefore simply
|
|
|
|
* calling findChildren() would not work here. Therefore this function
|
|
|
|
* iterates over all dock areas and creates a list that contains all
|
|
|
|
* dock widgets returned from all dock areas.
|
|
|
|
*/
|
|
|
|
QList<CDockWidget*> dockWidgets() const;
|
|
|
|
|
2017-03-23 17:23:53 +08:00
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Default Constructor
|
|
|
|
*/
|
|
|
|
CDockContainerWidget(CDockManager* DockManager, QWidget* parent = 0);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Virtual Destructor
|
|
|
|
*/
|
|
|
|
virtual ~CDockContainerWidget();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
* be dropped into the container.
|
|
|
|
* \return Returns the dock area widget that contains the new DockWidget
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* addDockWidget(DockWidgetArea area, CDockWidget* Dockwidget,
|
|
|
|
CDockAreaWidget* DockAreaWidget = nullptr);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the current zOrderIndex
|
|
|
|
*/
|
|
|
|
virtual unsigned int zOrderIndex() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This function returns true if this container widgets z order index is
|
|
|
|
* higher than the index of the container widget given in Other parameter
|
|
|
|
*/
|
|
|
|
bool isInFrontOf(CDockContainerWidget* Other) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the dock area at teh given global position or 0 if there is no
|
|
|
|
* dock area at this position
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* dockAreaAt(const QPoint& GlobalPos) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the dock area at the given Index or 0 if the index is out of
|
|
|
|
* range
|
|
|
|
*/
|
|
|
|
CDockAreaWidget* dockArea(int Index) const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the list of dock areas that are not closed
|
|
|
|
* If all dock widgets in a dock area are closed, the dock area will be closed
|
|
|
|
*/
|
|
|
|
QList<CDockAreaWidget*> openedDockAreas() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of dock areas in this container
|
|
|
|
*/
|
|
|
|
int dockAreaCount() const;
|
|
|
|
|
2017-03-29 21:43:18 +08:00
|
|
|
/**
|
|
|
|
* Returns the number of visible dock areas
|
|
|
|
*/
|
|
|
|
int visibleDockAreaCount() const;
|
|
|
|
|
2017-03-23 17:23:53 +08:00
|
|
|
/**
|
|
|
|
* This function returns true, if this container is in a floating widget
|
|
|
|
*/
|
|
|
|
bool isFloating() const;
|
|
|
|
|
2017-03-28 14:48:44 +08:00
|
|
|
/**
|
|
|
|
* Dumps the layout for debugging purposes
|
|
|
|
*/
|
|
|
|
void dumpLayout();
|
|
|
|
|
2018-10-12 21:18:05 +08:00
|
|
|
/**
|
|
|
|
* This functions returns the dock widget features of all dock widget in
|
|
|
|
* this container.
|
|
|
|
* A bitwise and is used to combine the flags of all dock widgets. That
|
|
|
|
* means, if only dock widget does not support a certain flag, the whole
|
|
|
|
* dock are does not support the flag.
|
|
|
|
*/
|
|
|
|
CDockWidget::DockWidgetFeatures features() const;
|
|
|
|
|
2017-03-23 17:23:53 +08:00
|
|
|
signals:
|
|
|
|
/**
|
|
|
|
* This signal is emitted if one or multiple dock areas has been added to
|
|
|
|
* the internal list of dock areas.
|
|
|
|
* If multiple dock areas are inserted, this signal is emitted only once
|
|
|
|
*/
|
|
|
|
void dockAreasAdded();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This signal is emitted if one or multiple dock areas has been removed
|
|
|
|
*/
|
|
|
|
void dockAreasRemoved();
|
|
|
|
}; // class DockContainerWidget
|
|
|
|
} // namespace ads
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#endif // DockContainerWidgetH
|