From b93d2fbd4860efc2e36b9910648c2292570e9906 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 17 Feb 2017 07:40:12 +0100 Subject: [PATCH] Some cleanup and support for dropping floating window with multiple setcion into section --- .../include/ads/ContainerWidget.h | 5 +- .../include/ads/FloatingWidget.h | 6 +- .../include/ads/SectionTitleWidget.h | 1 - .../include/ads/SectionWidget.h | 3 +- AdvancedDockingSystem/src/ContainerWidget.cpp | 55 +++++++++++++++++-- AdvancedDockingSystem/src/FloatingWidget.cpp | 38 +++++++------ .../src/SectionTitleWidget.cpp | 35 +++++------- AdvancedDockingSystem/src/SectionWidget.cpp | 27 ++++----- 8 files changed, 106 insertions(+), 64 deletions(-) diff --git a/AdvancedDockingSystem/include/ads/ContainerWidget.h b/AdvancedDockingSystem/include/ads/ContainerWidget.h index 33ffcbf..b834a12 100644 --- a/AdvancedDockingSystem/include/ads/ContainerWidget.h +++ b/AdvancedDockingSystem/include/ads/ContainerWidget.h @@ -73,6 +73,10 @@ public: MainContainerWidget* mainContainerWidget() const {return m_MainContainerWidget;} + void addSectionWidget(SectionWidget* section); + + void takeSection(SectionWidget* Widget); + signals: /*! * Emits whenever the "isActiveTab" state of a SectionContent changes. @@ -86,7 +90,6 @@ protected: void dropIntoSection(FloatingWidget* FloatingWidget, SectionWidget* targetSection, DropArea area); virtual bool event(QEvent *e) override; SectionWidget* newSectionWidget(); - void addSectionWidget(SectionWidget* section); SectionWidget* dropContentOuterHelper(QLayout* l, const InternalContentData& data, Qt::Orientation orientation, bool append); SectionWidget* insertNewSectionWidget(const InternalContentData& data, SectionWidget* targetSection, SectionWidget* ret, Qt::Orientation Orientation, int InsertIndexOffset); diff --git a/AdvancedDockingSystem/include/ads/FloatingWidget.h b/AdvancedDockingSystem/include/ads/FloatingWidget.h index 4766b0c..97b3494 100644 --- a/AdvancedDockingSystem/include/ads/FloatingWidget.h +++ b/AdvancedDockingSystem/include/ads/FloatingWidget.h @@ -54,7 +54,7 @@ class FloatingWidget : public QWidget public: FloatingWidget(MainContainerWidget* container, SectionContent::RefPtr sc, SectionTitleWidget* titleWidget, SectionContentWidget* contentWidget, QWidget* parent = NULL); - FloatingWidget(SectionWidget* sectionWidget); + FloatingWidget(MainContainerWidget* container, SectionWidget* sectionWidget); virtual ~FloatingWidget(); SectionContent::RefPtr content() const { return _content; } @@ -88,8 +88,8 @@ private: MainContainerWidget* m_MainContainerWidget; SectionContent::RefPtr _content; - SectionTitleWidget* _titleWidget; - SectionContentWidget* _contentWidget; + //SectionTitleWidget* _titleWidget; + //SectionContentWidget* _contentWidget; CContainerWidget* m_ContainerWidget; CContainerWidget* m_DropContainer; bool m_DraggingActive = false; diff --git a/AdvancedDockingSystem/include/ads/SectionTitleWidget.h b/AdvancedDockingSystem/include/ads/SectionTitleWidget.h index c930e19..18271ce 100644 --- a/AdvancedDockingSystem/include/ads/SectionTitleWidget.h +++ b/AdvancedDockingSystem/include/ads/SectionTitleWidget.h @@ -50,7 +50,6 @@ protected: virtual void mouseMoveEvent(QMouseEvent* ev); private: - void moveFloatingWidget(QMouseEvent* ev, MainContainerWidget* cw); void startFloating(QMouseEvent* ev, MainContainerWidget* cw, SectionWidget* sectionwidget); void moveTab(QMouseEvent* ev); diff --git a/AdvancedDockingSystem/include/ads/SectionWidget.h b/AdvancedDockingSystem/include/ads/SectionWidget.h index e13ecc0..7e0c475 100644 --- a/AdvancedDockingSystem/include/ads/SectionWidget.h +++ b/AdvancedDockingSystem/include/ads/SectionWidget.h @@ -45,6 +45,7 @@ public: void addContent(const SectionContent::RefPtr& c); void addContent(const InternalContentData& data, bool autoActivate); bool takeContent(int uid, InternalContentData& data); + bool takeContentAt(int Index, InternalContentData& data); int indexOfContent(const SectionContent::RefPtr& c) const; int indexOfContentByUid(int uid) const; int indexOfContentByTitlePos(const QPoint& pos, QWidget* exclude = NULL) const; @@ -71,8 +72,6 @@ private slots: private: const int _uid; - - QPointer m_ContainerWidget; QPointer m_MainContainerWidget; QList m_Contents; QList m_TitleWidgets; diff --git a/AdvancedDockingSystem/src/ContainerWidget.cpp b/AdvancedDockingSystem/src/ContainerWidget.cpp index 0a1e305..dc81f12 100644 --- a/AdvancedDockingSystem/src/ContainerWidget.cpp +++ b/AdvancedDockingSystem/src/ContainerWidget.cpp @@ -226,6 +226,7 @@ void CContainerWidget::dropIntoContainer(FloatingWidget* FloatingWidget, DropAre } } + m_Sections.append(SectionWidgets); FloatingWidget->deleteLater(); } @@ -249,18 +250,51 @@ void CContainerWidget::dropIntoSection(FloatingWidget* FloatingWidget, case BottomDropArea: return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Vertical, 1); case LeftDropArea: return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Horizontal, 0);*/ case CenterDropArea: + { + QList SectionWidgets = FloatingContainer->findChildren(QString(), Qt::FindChildrenRecursively); for (auto SectionWidget : SectionWidgets) { - //sp->insertWidget(0, SectionWidget); - //targetSectionWidget->addContent(data, autoActive); - // targetSection->add + std::cout << "dropping into section CenterDropArea " << SectionWidget->contentCount() << std::endl; + while (SectionWidget->contentCount()) + { + InternalContentData data; + if (!SectionWidget->takeContentAt(0, data)) + { + qWarning() << "THIS SHOULD NOT HAPPEN!! " << 0; + return; + } + targetSection->addContent(data, false); + } } - return; + FloatingWidget->deleteLater(); + } + return; default: break; } + /* InternalContentData data; + if (!sectionwidget->takeContent(m_Content->uid(), data)) + { + qWarning() << "THIS SHOULD NOT HAPPEN!!" << m_Content->uid(); + return; + } + + FloatingWidget* fw = new FloatingWidget(cw, data.content, data.titleWidget, data.contentWidget, cw); + fw->resize(sectionwidget->size()); + fw->setObjectName("FloatingWidget"); + fw->startFloating(m_DragStartMousePosition); + + // Delete old section, if it is empty now. + if (sectionwidget->contents().isEmpty()) + { + delete sectionwidget; + sectionwidget = NULL; + } + deleteEmptySplitter(cw);*/ + + /*QSplitter* targetSectionSplitter = findParentSplitter(targetSection); SectionWidget* sw = newSectionWidget(); sw->addContent(data, true); @@ -285,6 +319,8 @@ void CContainerWidget::dropIntoSection(FloatingWidget* FloatingWidget, SectionWidget* CContainerWidget::sectionWidgetAt(const QPoint& pos) const { + std::cout << "CContainerWidget::sectionWidgetAt m_Sections count " + << m_Sections.count() << std::endl; for (const auto& SectionWidget : m_Sections) { if (SectionWidget->rect().contains(SectionWidget->mapFromGlobal(pos))) @@ -360,6 +396,10 @@ SectionWidget* CContainerWidget::newSectionWidget() void CContainerWidget::addSectionWidget(SectionWidget* section) { ADS_Expects(section != NULL); + if (section->containerWidget()) + { + section->containerWidget()->takeSection(section); + } // Create default splitter. if (!m_Splitter) @@ -373,6 +413,13 @@ void CContainerWidget::addSectionWidget(SectionWidget* section) return; } m_Splitter->addWidget(section); + m_Sections.append(section); +} + + +void CContainerWidget::takeSection(SectionWidget* Widget) +{ + m_Sections.removeAll(Widget); } SectionWidget* CContainerWidget::dropContentOuterHelper(QLayout* l, const InternalContentData& data, Qt::Orientation orientation, bool append) diff --git a/AdvancedDockingSystem/src/FloatingWidget.cpp b/AdvancedDockingSystem/src/FloatingWidget.cpp index 5a1c4e8..176655c 100644 --- a/AdvancedDockingSystem/src/FloatingWidget.cpp +++ b/AdvancedDockingSystem/src/FloatingWidget.cpp @@ -136,47 +136,48 @@ void CFloatingTitleWidget::onMaximizeButtonClicked() -FloatingWidget::FloatingWidget(MainContainerWidget* container, SectionContent::RefPtr sc, SectionTitleWidget* titleWidget, SectionContentWidget* contentWidget, QWidget* parent) : - QWidget(0), - m_MainContainerWidget(container), - _content(sc), - _titleWidget(titleWidget), - _contentWidget(contentWidget) +FloatingWidget::FloatingWidget(MainContainerWidget* MainContainer, SectionContent::RefPtr sc, SectionTitleWidget* titleWidget, SectionContentWidget* contentWidget, QWidget* parent) : + QWidget(MainContainer, Qt::Window), + m_MainContainerWidget(MainContainer), + _content(sc) { QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom); l->setContentsMargins(0, 0, 0, 0); l->setSpacing(0); setLayout(l); - - // Title + Controls - /*CFloatingTitleWidget* TitleBar = new CFloatingTitleWidget(sc->flags(), this); - l->insertWidget(0, TitleBar); - connect(TitleBar, SIGNAL(closeButtonClicked()), this, SLOT(onCloseButtonClicked()));*/ - m_ContainerWidget = new CContainerWidget(m_MainContainerWidget, this); m_MainContainerWidget->m_Containers.append(m_ContainerWidget); l->addWidget(m_ContainerWidget, 1); + InternalContentData data; data.content = sc; data.contentWidget = contentWidget; data.titleWidget = titleWidget; + m_ContainerWidget->dropContent(data, nullptr, CenterDropArea); m_ContainerWidget->show(); - m_zOrderIndex = ++zOrderCounter; - container->m_Floatings.append(this); + m_MainContainerWidget->m_Floatings.append(this); } -FloatingWidget::FloatingWidget(SectionWidget* sectionWidget) +FloatingWidget::FloatingWidget(MainContainerWidget* MainContainer, SectionWidget* sectionWidget) + : QWidget(MainContainer, Qt::Window), + m_MainContainerWidget(MainContainer) { QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom); l->setContentsMargins(0, 0, 0, 0); l->setSpacing(0); setLayout(l); - l->addWidget(sectionWidget); + m_ContainerWidget = new CContainerWidget(m_MainContainerWidget, this); + m_MainContainerWidget->m_Containers.append(m_ContainerWidget); + l->addWidget(m_ContainerWidget, 1); + + m_ContainerWidget->addSectionWidget(sectionWidget); + m_ContainerWidget->show(); m_zOrderIndex = ++zOrderCounter; + m_MainContainerWidget->m_Floatings.append(this); } @@ -188,7 +189,8 @@ FloatingWidget::~FloatingWidget() bool FloatingWidget::takeContent(InternalContentData& data) { - data.content = _content; + // TODO remove takeContent function + /*data.content = _content; data.titleWidget = _titleWidget; data.contentWidget = _contentWidget; @@ -198,7 +200,7 @@ bool FloatingWidget::takeContent(InternalContentData& data) layout()->removeWidget(_contentWidget); _contentWidget->setParent(m_MainContainerWidget); - _contentWidget = NULL; + _contentWidget = NULL;*/ return true; } diff --git a/AdvancedDockingSystem/src/SectionTitleWidget.cpp b/AdvancedDockingSystem/src/SectionTitleWidget.cpp index 1727233..8ad9365 100644 --- a/AdvancedDockingSystem/src/SectionTitleWidget.cpp +++ b/AdvancedDockingSystem/src/SectionTitleWidget.cpp @@ -146,31 +146,26 @@ void SectionTitleWidget::mouseReleaseEvent(QMouseEvent* ev) } -void SectionTitleWidget::moveFloatingWidget(QMouseEvent* ev, MainContainerWidget* cw) -{ - std::cout << "SectionTitleWidget::moveFloatingWidget" << std::endl; - /*const QPoint DragDistance = ev->globalPos() - m_DragStartGlobalMousePosition; - const QPoint moveToGlobalPos = m_DragStartPosition + DragDistance; - m_FloatingWidget->move(moveToGlobalPos);*/ - - const QPoint moveToPos = ev->globalPos() - m_DragStartMousePosition; - //m_FloatingWidget->move(moveToPos); -} - - void SectionTitleWidget::startFloating(QMouseEvent* ev, MainContainerWidget* cw, SectionWidget* sectionwidget) { std::cout << "SectionTitleWidget::startFloating" << std::endl; - QPoint moveToPos = ev->globalPos() - m_DragStartMousePosition; - InternalContentData data; - if (!sectionwidget->takeContent(m_Content->uid(), data)) - { - qWarning() << "THIS SHOULD NOT HAPPEN!!" << m_Content->uid(); - return; - } + FloatingWidget* fw; + if (sectionwidget->contentCount() > 1) + { + InternalContentData data; + if (!sectionwidget->takeContent(m_Content->uid(), data)) + { + qWarning() << "THIS SHOULD NOT HAPPEN!!" << m_Content->uid(); + return; + } + fw = new FloatingWidget(cw, data.content, data.titleWidget, data.contentWidget, cw); + } + else + { + fw = new FloatingWidget(cw, sectionwidget); + } - FloatingWidget* fw = new FloatingWidget(cw, data.content, data.titleWidget, data.contentWidget, cw); fw->resize(sectionwidget->size()); fw->setObjectName("FloatingWidget"); fw->startFloating(m_DragStartMousePosition); diff --git a/AdvancedDockingSystem/src/SectionWidget.cpp b/AdvancedDockingSystem/src/SectionWidget.cpp index 164d6c5..a96e448 100644 --- a/AdvancedDockingSystem/src/SectionWidget.cpp +++ b/AdvancedDockingSystem/src/SectionWidget.cpp @@ -35,7 +35,6 @@ ADS_NAMESPACE_BEGIN SectionWidget::SectionWidget(MainContainerWidget* MainContainer, CContainerWidget* parent) : QFrame(parent), _uid(GetNextUid()), - m_ContainerWidget(parent), m_MainContainerWidget(MainContainer), _tabsLayout(NULL), _tabsLayoutInitCount(0), @@ -124,7 +123,7 @@ int SectionWidget::uid() const CContainerWidget* SectionWidget::containerWidget() const { - return m_ContainerWidget; + return dynamic_cast(parent()); } QRect SectionWidget::titleAreaGeometry() const @@ -191,17 +190,21 @@ void SectionWidget::addContent(const InternalContentData& data, bool autoActivat bool SectionWidget::takeContent(int uid, InternalContentData& data) { - // Find SectionContent. - SectionContent::RefPtr sc; - int index = -1; for (int i = 0; i < m_Contents.count(); i++) { if (m_Contents[i]->uid() != uid) + { continue; - index = i; - sc = m_Contents.takeAt(i); - break; + } + return takeContentAt(i, data); } + + return false; +} + +bool SectionWidget::takeContentAt(int index, InternalContentData& data) +{ + SectionContent::RefPtr sc = m_Contents.takeAt(index); if (!sc) return false; @@ -240,6 +243,7 @@ bool SectionWidget::takeContent(int uid, InternalContentData& data) return !data.content.isNull(); } + int SectionWidget::indexOfContent(const SectionContent::RefPtr& c) const { return m_Contents.indexOf(c); @@ -289,14 +293,7 @@ void SectionWidget::moveContent(int from, int to) QLayoutItem* liFrom = NULL; liFrom = _tabsLayout->takeAt(from); -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) _tabsLayout->insertItem(to, liFrom); -#else - _tabsLayout->insertWidget(to, liFrom->widget()); - delete liFrom; - liFrom = NULL; -#endif - liFrom = _contentsLayout->takeAt(from); _contentsLayout->insertWidget(to, liFrom->widget()); delete liFrom;