Startet refactoring common container stuff into CContainerWidget

This commit is contained in:
Uwe Kindler 2017-02-03 22:56:08 +01:00
parent f4c0d38ba4
commit 7f5e393cfb
13 changed files with 1529 additions and 1429 deletions

View File

@ -1,7 +1,7 @@
SOURCES += \
$$PWD/src/API.cpp \
$$PWD/src/ContainerWidget.cpp \
$$PWD/src/MainContainerWidget.cpp \
$$PWD/src/SectionWidget.cpp \
$$PWD/src/SectionContent.cpp \
$$PWD/src/SectionTitleWidget.cpp \
@ -9,11 +9,12 @@ SOURCES += \
$$PWD/src/DropOverlay.cpp \
$$PWD/src/FloatingWidget.cpp \
$$PWD/src/Internal.cpp \
$$PWD/src/Serialization.cpp
$$PWD/src/Serialization.cpp \
$$PWD/src/ContainerWidget.cpp
HEADERS += \
$$PWD/include/ads/API.h \
$$PWD/include/ads/ContainerWidget.h \
$$PWD/include/ads/MainContainerWidget.h \
$$PWD/include/ads/SectionWidget.h \
$$PWD/include/ads/SectionContent.h \
$$PWD/include/ads/SectionTitleWidget.h \
@ -21,4 +22,5 @@ HEADERS += \
$$PWD/include/ads/DropOverlay.h \
$$PWD/include/ads/FloatingWidget.h \
$$PWD/include/ads/Internal.h \
$$PWD/include/ads/Serialization.h
$$PWD/include/ads/Serialization.h \
$$PWD/include/ads/ContainerWidget.h

View File

@ -1,15 +1,16 @@
#ifndef ADS_CONTAINERWIDGET_H
#define ADS_CONTAINERWIDGET_H
#ifndef ContainerWidgetH
#define ContainerWidgetH
//============================================================================
/// \file ContainerWidget.h
/// \author Uwe Kindler
/// \date 03.02.2017
/// \brief Declaration of CContainerWidget
//============================================================================
#include <QList>
#include <QHash>
#include <QPointer>
//============================================================================
// INCLUDES
//============================================================================
#include <QFrame>
#include <QGridLayout>
#include <QSplitter>
class QPoint;
class QMenu;
#include "ads/API.h"
#include "ads/Internal.h"
@ -18,18 +19,16 @@ class QMenu;
#include "ads/Serialization.h"
#include "ads/DropOverlay.h"
ADS_NAMESPACE_BEGIN
namespace ads
{
class SectionWidget;
class DropOverlay;
class InternalContentData;
/*!
* ContainerWidget is the main container to provide the docking
* functionality. It manages multiple sections with all possible areas.
/**
* @brief
*/
class ADS_EXPORT_API MainContainerWidget : public QFrame
class CContainerWidget : public QFrame
{
Q_OBJECT
@ -40,152 +39,10 @@ class ADS_EXPORT_API MainContainerWidget : public QFrame
friend class ContainerWidgetPrivate;
public:
explicit MainContainerWidget(QWidget *parent = NULL);
virtual ~MainContainerWidget();
//
// Public API
//
/*!
* Adds the section-content <em>sc</em> to this container-widget into the section-widget <em>sw</em>.
* If <em>sw</em> is not NULL, the <em>area</em> is used to indicate how the content should be arranged.
* Returns a pointer to the SectionWidget of the added SectionContent. Do not use it for anything else than adding more
* SectionContent elements with this method.
*/
SectionWidget* addSectionContent(const SectionContent::RefPtr& sc, SectionWidget* sw = NULL, DropArea area = CenterDropArea);
/*!
* Completely removes the <em>sc</em> from this ContainerWidget.
* This container will no longer hold a reference to the content.
* The content can be safely deleted.
*/
bool removeSectionContent(const SectionContent::RefPtr& sc);
/*!
* Shows the specific SectionContent in UI.
* Independed of the current state, whether it is used inside a section or is floating.
*/
bool showSectionContent(const SectionContent::RefPtr& sc);
/*!
* Closes the specified SectionContent from UI.
* Independed of the current state, whether it is used inside a section or is floating.
*/
bool hideSectionContent(const SectionContent::RefPtr& sc);
/*!
* Selects the specific SectionContent as current, if it is part of a SectionWidget.
* If SC is floating, it does nothing (or should we show it?)
*/
bool raiseSectionContent(const SectionContent::RefPtr& sc);
/*!
* Indicates whether the SectionContent <em>sc</em> is visible.
*/
bool isSectionContentVisible(const SectionContent::RefPtr& sc);
/*!
* Creates a QMenu based on available SectionContents.
* The caller is responsible to delete the menu.
*/
QMenu* createContextMenu() const;
/*!
* Serializes the current state of contents and returns it as a plain byte array.
* \see restoreState(const QByteArray&)
*/
QByteArray saveState() const;
/*!
* Deserilizes the state of contents from <em>data</em>, which was written with <em>saveState()</em>.
* \see saveState()
*/
bool restoreState(const QByteArray& data);
//
// Advanced Public API
// You usually should not need access to this methods
//
/*!
* \brief contents
* \return List of known SectionContent for this ContainerWidget.
*/
QList<SectionContent::RefPtr> contents() const;
/**
* Access function for the section drop overlay
*/
QPointer<DropOverlay> sectionDropOverlay() const;
/**
* Filters the events of the floating widgets
*/
virtual bool event(QEvent *e) override;
private:
//
// Internal Stuff Begins Here
//
SectionWidget* newSectionWidget();
SectionWidget* dropContent(const InternalContentData& data, SectionWidget* targetSection, DropArea area, bool autoActive = true);
void addSectionWidget(SectionWidget* section);
SectionWidget* sectionWidgetAt(const QPoint& pos) const;
SectionWidget* dropContentOuterHelper(QLayout* l, const InternalContentData& data, Qt::Orientation orientation, bool append);
// Serialization
QByteArray saveHierarchy() const;
void saveFloatingWidgets(QDataStream& out) const;
void saveSectionWidgets(QDataStream& out, QWidget* widget) const;
bool saveSectionIndex(ADS_NS_SER::SectionIndexData &sid) const;
bool restoreHierarchy(const QByteArray& data);
bool restoreFloatingWidgets(QDataStream& in, int version, QList<FloatingWidget*>& floatings);
bool restoreSectionWidgets(QDataStream& in, int version, QSplitter* currentSplitter, QList<SectionWidget*>& sections, QList<SectionContent::RefPtr>& contentsToHide);
bool takeContent(const SectionContent::RefPtr& sc, InternalContentData& data);
FloatingWidget* startFloating(SectionWidget* sectionwidget, int ContentUid, const QPoint& TargetPos);
void hideContainerOverlay();
SectionWidget* insertNewSectionWidget(const InternalContentData& data,
SectionWidget* targetSection, SectionWidget* ret, Qt::Orientation Orientation, int InsertIndexOffset);
void moveFloatingWidget(const QPoint& TargetPos);
void dropFloatingWidget(FloatingWidget* FloatingWidget, const QPoint& TargetPos);
private slots:
void onActiveTabChanged();
void onActionToggleSectionContentVisibility(bool visible);
signals:
void orientationChanged();
/*!
* Emits whenever the "isActiveTab" state of a SectionContent changes.
* Whenever the users sets another tab as active, this signal gets invoked
* for the old tab and the new active tab (the order is unspecified).
*/
void activeTabChanged(const SectionContent::RefPtr& sc, bool active);
/*!
* Emits whenever the visibility of a SectionContent changes.
* \see showSectionContent(), hideSectionContent()
* \since 0.2
*/
void sectionContentVisibilityChanged(const SectionContent::RefPtr& sc, bool visible);
private:
QList<SectionWidget*> m_Sections;
QList<FloatingWidget*> m_Floatings;
QHash<int, HiddenSectionItem> m_HiddenSectionContents;
// Helper lookup maps, restricted to this container.
QHash<int, SectionContent::WeakPtr> m_SectionContentIdMap;
QHash<QString, SectionContent::WeakPtr> m_SectionContentNameMap;
QHash<int, SectionWidget*> m_SectionWidgetIdMap;
explicit CContainerWidget(QWidget *parent = nullptr);
virtual ~CContainerWidget();
protected:
// Layout stuff
QGridLayout* m_MainLayout = nullptr;
Qt::Orientation m_Orientation = Qt::Horizontal;
@ -197,5 +54,7 @@ private:
QPointer<DropOverlay> m_ContainerDropOverlay;
};
ADS_NAMESPACE_END
#endif
} // namespace ads
//---------------------------------------------------------------------------
#endif // ContainerWidgetH

View File

@ -0,0 +1,191 @@
#ifndef ADS_CONTAINERWIDGET_H
#define ADS_CONTAINERWIDGET_H
#include <QList>
#include <QHash>
#include <QPointer>
#include <QFrame>
#include <QGridLayout>
#include <QSplitter>
class QPoint;
class QMenu;
#include "ads/API.h"
#include "ads/Internal.h"
#include "ads/SectionContent.h"
#include "ads/FloatingWidget.h"
#include "ads/Serialization.h"
#include "ads/DropOverlay.h"
#include "ads/ContainerWidget.h"
ADS_NAMESPACE_BEGIN
class SectionWidget;
class DropOverlay;
class InternalContentData;
/*!
* ContainerWidget is the main container to provide the docking
* functionality. It manages multiple sections with all possible areas.
*/
class ADS_EXPORT_API MainContainerWidget : public CContainerWidget
{
Q_OBJECT
friend class SectionContent;
friend class SectionWidget;
friend class FloatingWidget;
friend class SectionTitleWidget;
friend class ContainerWidgetPrivate;
public:
explicit MainContainerWidget(QWidget *parent = nullptr);
virtual ~MainContainerWidget();
//
// Public API
//
/*!
* Adds the section-content <em>sc</em> to this container-widget into the section-widget <em>sw</em>.
* If <em>sw</em> is not NULL, the <em>area</em> is used to indicate how the content should be arranged.
* Returns a pointer to the SectionWidget of the added SectionContent. Do not use it for anything else than adding more
* SectionContent elements with this method.
*/
SectionWidget* addSectionContent(const SectionContent::RefPtr& sc, SectionWidget* sw = NULL, DropArea area = CenterDropArea);
/*!
* Completely removes the <em>sc</em> from this ContainerWidget.
* This container will no longer hold a reference to the content.
* The content can be safely deleted.
*/
bool removeSectionContent(const SectionContent::RefPtr& sc);
/*!
* Shows the specific SectionContent in UI.
* Independed of the current state, whether it is used inside a section or is floating.
*/
bool showSectionContent(const SectionContent::RefPtr& sc);
/*!
* Closes the specified SectionContent from UI.
* Independed of the current state, whether it is used inside a section or is floating.
*/
bool hideSectionContent(const SectionContent::RefPtr& sc);
/*!
* Selects the specific SectionContent as current, if it is part of a SectionWidget.
* If SC is floating, it does nothing (or should we show it?)
*/
bool raiseSectionContent(const SectionContent::RefPtr& sc);
/*!
* Indicates whether the SectionContent <em>sc</em> is visible.
*/
bool isSectionContentVisible(const SectionContent::RefPtr& sc);
/*!
* Creates a QMenu based on available SectionContents.
* The caller is responsible to delete the menu.
*/
QMenu* createContextMenu() const;
/*!
* Serializes the current state of contents and returns it as a plain byte array.
* \see restoreState(const QByteArray&)
*/
QByteArray saveState() const;
/*!
* Deserilizes the state of contents from <em>data</em>, which was written with <em>saveState()</em>.
* \see saveState()
*/
bool restoreState(const QByteArray& data);
//
// Advanced Public API
// You usually should not need access to this methods
//
/*!
* \brief contents
* \return List of known SectionContent for this ContainerWidget.
*/
QList<SectionContent::RefPtr> contents() const;
/**
* Access function for the section drop overlay
*/
QPointer<DropOverlay> sectionDropOverlay() const;
/**
* Filters the events of the floating widgets
*/
virtual bool event(QEvent *e) override;
private:
//
// Internal Stuff Begins Here
//
SectionWidget* newSectionWidget();
SectionWidget* dropContent(const InternalContentData& data, SectionWidget* targetSection, DropArea area, bool autoActive = true);
void addSectionWidget(SectionWidget* section);
SectionWidget* sectionWidgetAt(const QPoint& pos) const;
SectionWidget* dropContentOuterHelper(QLayout* l, const InternalContentData& data, Qt::Orientation orientation, bool append);
// Serialization
QByteArray saveHierarchy() const;
void saveFloatingWidgets(QDataStream& out) const;
void saveSectionWidgets(QDataStream& out, QWidget* widget) const;
bool saveSectionIndex(ADS_NS_SER::SectionIndexData &sid) const;
bool restoreHierarchy(const QByteArray& data);
bool restoreFloatingWidgets(QDataStream& in, int version, QList<FloatingWidget*>& floatings);
bool restoreSectionWidgets(QDataStream& in, int version, QSplitter* currentSplitter, QList<SectionWidget*>& sections, QList<SectionContent::RefPtr>& contentsToHide);
bool takeContent(const SectionContent::RefPtr& sc, InternalContentData& data);
FloatingWidget* startFloating(SectionWidget* sectionwidget, int ContentUid, const QPoint& TargetPos);
void hideContainerOverlay();
SectionWidget* insertNewSectionWidget(const InternalContentData& data,
SectionWidget* targetSection, SectionWidget* ret, Qt::Orientation Orientation, int InsertIndexOffset);
void moveFloatingWidget(const QPoint& TargetPos);
void dropFloatingWidget(FloatingWidget* FloatingWidget, const QPoint& TargetPos);
private slots:
void onActiveTabChanged();
void onActionToggleSectionContentVisibility(bool visible);
signals:
void orientationChanged();
/*!
* Emits whenever the "isActiveTab" state of a SectionContent changes.
* Whenever the users sets another tab as active, this signal gets invoked
* for the old tab and the new active tab (the order is unspecified).
*/
void activeTabChanged(const SectionContent::RefPtr& sc, bool active);
/*!
* Emits whenever the visibility of a SectionContent changes.
* \see showSectionContent(), hideSectionContent()
* \since 0.2
*/
void sectionContentVisibilityChanged(const SectionContent::RefPtr& sc, bool visible);
private:
QList<SectionWidget*> m_Sections;
QList<FloatingWidget*> m_Floatings;
QHash<int, HiddenSectionItem> m_HiddenSectionContents;
// Helper lookup maps, restricted to this container.
QHash<int, SectionContent::WeakPtr> m_SectionContentIdMap;
QHash<QString, SectionContent::WeakPtr> m_SectionContentNameMap;
QHash<int, SectionWidget*> m_SectionWidgetIdMap;
};
ADS_NAMESPACE_END
#endif

View File

@ -1,4 +1,4 @@
#include <ads/ContainerWidget.h>
#include <ads/MainContainerWidget.h>
#include "ads/API.h"
#include <QWidget>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
#include <ads/ContainerWidget.h>
#include <ads/MainContainerWidget.h>
#include "ads/FloatingWidget.h"
#include <QBoxLayout>

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
#include <ads/ContainerWidget.h>
#include <ads/MainContainerWidget.h>
#include "ads/SectionContent.h"
#include <QWidget>

View File

@ -20,7 +20,7 @@
#include "ads/SectionContent.h"
#include "ads/SectionWidget.h"
#include "ads/FloatingWidget.h"
#include <ads/ContainerWidget.h>
#include <ads/MainContainerWidget.h>
#include <iostream>

View File

@ -25,7 +25,7 @@
#include "ads/SectionTitleWidget.h"
#include "ads/SectionContentWidget.h"
#include "ads/FloatingWidget.h"
#include <ads/ContainerWidget.h>
#include <ads/MainContainerWidget.h>
ADS_NAMESPACE_BEGIN

View File

@ -5,7 +5,7 @@
#include <QList>
#include <QString>
#include <QAbstractTableModel>
#include "../../../AdvancedDockingSystem/include/ads/ContainerWidget.h"
#include "../../../AdvancedDockingSystem/include/ads/MainContainerWidget.h"
#include "ads/API.h"
#include "ads/SectionContent.h"
ADS_NAMESPACE_BEGIN

View File

@ -2,7 +2,7 @@
#define SECTIONCONTENTLISTWIDGET
#include <QDialog>
#include "../../../AdvancedDockingSystem/include/ads/ContainerWidget.h"
#include "../../../AdvancedDockingSystem/include/ads/MainContainerWidget.h"
#include "ui_SectionContentListWidget.h"
#include "ads/API.h"

View File

@ -2,7 +2,7 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include "../../AdvancedDockingSystem/include/ads/ContainerWidget.h"
#include "../../AdvancedDockingSystem/include/ads/MainContainerWidget.h"
#include "ads/API.h"
#include "ads/SectionContent.h"