diff --git a/AdvancedDockingSystem/include/ads/ContainerWidget.h b/AdvancedDockingSystem/include/ads/ContainerWidget.h index e17af94..9880654 100644 --- a/AdvancedDockingSystem/include/ads/ContainerWidget.h +++ b/AdvancedDockingSystem/include/ads/ContainerWidget.h @@ -81,6 +81,7 @@ signals: protected: void dropIntoContainer(FloatingWidget* FloatingWidget, DropArea area); + void dropIntoSection(FloatingWidget* FloatingWidget, SectionWidget* targetSection, DropArea area); virtual bool event(QEvent *e) override; SectionWidget* newSectionWidget(); void addSectionWidget(SectionWidget* section); diff --git a/AdvancedDockingSystem/include/ads/MainContainerWidget.h b/AdvancedDockingSystem/include/ads/MainContainerWidget.h index d51f54d..18311ad 100644 --- a/AdvancedDockingSystem/include/ads/MainContainerWidget.h +++ b/AdvancedDockingSystem/include/ads/MainContainerWidget.h @@ -50,14 +50,6 @@ public: // Public API // - /*! - * Adds the section-content sc to this container-widget into the section-widget sw. - * If sw is not NULL, the area 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 sc from this ContainerWidget. * This container will no longer hold a reference to the content. diff --git a/AdvancedDockingSystem/src/API.cpp b/AdvancedDockingSystem/src/API.cpp index 86786b8..3cf46c7 100644 --- a/AdvancedDockingSystem/src/API.cpp +++ b/AdvancedDockingSystem/src/API.cpp @@ -97,17 +97,24 @@ QSplitter* findParentSplitter(class QWidget* w) QSplitter* findImmediateSplitter(class QWidget* w) { - QSplitter* sp = NULL; QLayout* l = w->layout(); if (!l || l->count() <= 0) - return sp; + { + return nullptr; + } + + QSplitter* sp = nullptr; for (int i = 0; i < l->count(); ++i) { QLayoutItem* li = l->itemAt(0); if (!li->widget()) + { continue; - if ((sp = dynamic_cast(li->widget())) != NULL) + } + if ((sp = dynamic_cast(li->widget())) != nullptr) + { break; + } } return sp; } diff --git a/AdvancedDockingSystem/src/ContainerWidget.cpp b/AdvancedDockingSystem/src/ContainerWidget.cpp index f17887c..5a2381a 100644 --- a/AdvancedDockingSystem/src/ContainerWidget.cpp +++ b/AdvancedDockingSystem/src/ContainerWidget.cpp @@ -90,10 +90,11 @@ void CContainerWidget::dropFloatingWidget(FloatingWidget* FloatingWidget, if (dropArea != InvalidDropArea) { std::cout << "Section Drop Content: " << dropArea << std::endl; - InternalContentData data; + /*InternalContentData data; FloatingWidget->takeContent(data); FloatingWidget->deleteLater(); - dropContent(data, sectionWidget, dropArea, true); + dropContent(data, sectionWidget, dropArea, true);*/ + dropIntoSection(FloatingWidget, sectionWidget, dropArea); } } @@ -104,40 +105,12 @@ void CContainerWidget::dropFloatingWidget(FloatingWidget* FloatingWidget, std::cout << "Container Drop Content: " << dropArea << std::endl; if (dropArea != InvalidDropArea) { + // drop content dropIntoContainer(FloatingWidget, dropArea); } } } -/*void dumpChildSplitters(QWidget* Widget) -{ - QSplitter* ParentSplitter = dynamic_cast(Widget); - auto Sections = Widget->findChildren(QString(), Qt::FindDirectChildrenOnly); - auto Splitters = Widget->findChildren(QString(), Qt::FindDirectChildrenOnly); - - std::cout << "-----------------------" << std::endl; - std::cout << "Sections " << Sections.size() << std::endl; - std::cout << "Splitters " << Splitters.size() << std::endl; - for (const auto& Splitter : Splitters) - { - if (ParentSplitter) - { - std::cout << "Orientation " << Splitter->orientation() << " index " << ParentSplitter->indexOf(Splitter) << std::endl; - } - else - { - std::cout << "Orientation " << Splitter->orientation() << std::endl; - } - dumpChildSplitters(Splitter); - } -} - - - -void CContainerWidget::dumpLayout() -{ - dumpChildSplitters(this); -}*/ void CContainerWidget::dropChildSections(QWidget* Parent) { @@ -163,13 +136,153 @@ void CContainerWidget::dropChildSections(QWidget* Parent) void CContainerWidget::dropIntoContainer(FloatingWidget* FloatingWidget, DropArea area) { dropChildSections(FloatingWidget->containerWidget()); - InternalContentData data; - FloatingWidget->takeContent(data); + + CContainerWidget* FloatingContainer = FloatingWidget->containerWidget(); + QSplitter* FloatingMainSplitter = FloatingContainer->findChild(QString(), Qt::FindDirectChildrenOnly); + + //QSplitter* oldsp = findImmediateSplitter(this); + // We use findChild here instead of findImmediateSplitter because I do not + // know what the advantage of the findImmediateSplitter function is + QSplitter* OldSplitter = this->findChild(QString(), Qt::FindDirectChildrenOnly); + //auto SectionWidgets = FloatingMainSplitter->findChildren(QString(), Qt::FindDirectChildrenOnly); + QList SectionWidgets; + for (int i = 0; i < FloatingMainSplitter->count(); ++i) + { + SectionWidgets.append(static_cast(FloatingMainSplitter->widget(i))); + } + + std::cout << "SectionWIdget[0] " << SectionWidgets[0] << " FloatingSplitter index 0" + << FloatingMainSplitter->widget(0) << std::endl; + //std::cout<< "oldsp " << oldsp << " oldsp2 " << oldsp2 << std::endl; + + Qt::Orientation orientation; + bool append; + + switch (area) + { + case TopDropArea: orientation = Qt::Vertical; append = false; break; + case RightDropArea: orientation = Qt::Horizontal; append = true; break; + case CenterDropArea: + case BottomDropArea: orientation = Qt::Vertical; append = true; break; + case LeftDropArea: orientation = Qt::Horizontal; append = false; break; + } + + auto l = m_MainLayout; + + if (!OldSplitter) + { + std::cout << "Create new splitter" << std::endl; + // we have no splitter yet - let us create one + QSplitter* sp = MainContainerWidget::newSplitter(FloatingMainSplitter->orientation()); + if (l->count() > 0) + { + qWarning() << "Still items in layout. This should never happen."; + QLayoutItem* li = l->takeAt(0); + delete li; + } + l->addWidget(sp); + for (auto SectionWidget : SectionWidgets) + { + sp->insertWidget(0, SectionWidget); + } + } + else if ((FloatingMainSplitter->orientation() == orientation) && + (OldSplitter->count() == 1 || OldSplitter->orientation() == orientation)) + { + OldSplitter->setOrientation(orientation); + std::cout << "Splitter with right orientation" << std::endl; + // we have a splitter with only one item or with the right orientation so + // we can make it match the orientation of the floating splitter + for (int i = 0; i < SectionWidgets.count(); ++i) + { + if (append) + { + OldSplitter->addWidget(SectionWidgets[i]); + } + else + { + OldSplitter->insertWidget(i, SectionWidgets[i]); + } + } + } + else + { + std::cout << "Splitter with wrong orientation" << std::endl; + // we have a splitter but with the wrong orientation + QSplitter* sp = MainContainerWidget::newSplitter(orientation); + if (append) + { + QLayoutItem* li = l->replaceWidget(OldSplitter, sp); + sp->addWidget(OldSplitter); + sp->addWidget(FloatingMainSplitter); + delete li; + } + else + { + sp->addWidget(FloatingMainSplitter); + QLayoutItem* li = l->replaceWidget(OldSplitter, sp); + sp->addWidget(OldSplitter); + delete li; + } + } + FloatingWidget->deleteLater(); - dropContent(data, nullptr, area, true); } +void CContainerWidget::dropIntoSection(FloatingWidget* FloatingWidget, + SectionWidget* targetSection, DropArea area) +{ + CContainerWidget* FloatingContainer = FloatingWidget->containerWidget(); + QSplitter* FloatingMainSplitter = FloatingContainer->findChild(QString(), + Qt::FindDirectChildrenOnly); QSplitter* OldSplitter = this->findChild(QString(), Qt::FindDirectChildrenOnly); + QList SectionWidgets; + for (int i = 0; i < FloatingMainSplitter->count(); ++i) + { + SectionWidgets.append(static_cast(FloatingMainSplitter->widget(i))); + } + + switch (area) + { + /*case TopDropArea:return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Vertical, 0); + case RightDropArea: return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Horizontal, 1); + case BottomDropArea: return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Vertical, 1); + case LeftDropArea: return insertNewSectionWidget(data, targetSectionWidget, section_widget, Qt::Horizontal, 0);*/ + case CenterDropArea: + for (auto SectionWidget : SectionWidgets) + { + //sp->insertWidget(0, SectionWidget); + //targetSectionWidget->addContent(data, autoActive); + // targetSection->add + } + return; + + default: + break; + } + + /*QSplitter* targetSectionSplitter = findParentSplitter(targetSection); + SectionWidget* sw = newSectionWidget(); + sw->addContent(data, true); + if (targetSectionSplitter->orientation() == Orientation) + { + const int index = targetSectionSplitter->indexOf(targetSection); + targetSectionSplitter->insertWidget(index + InsertIndexOffset, sw); + } + else + { + const int index = targetSectionSplitter->indexOf(targetSection); + QSplitter* s = MainContainerWidget::newSplitter(Orientation); + s->addWidget(sw); + s->addWidget(targetSection); + targetSectionSplitter->insertWidget(index, s); + } + ret = sw; + return ret;*/ +} + + + SectionWidget* CContainerWidget::sectionWidgetAt(const QPoint& pos) const { for (const auto& SectionWidget : m_Sections) diff --git a/AdvancedDockingSystem/src/MainContainerWidget.cpp b/AdvancedDockingSystem/src/MainContainerWidget.cpp index 96ea1c8..ef0f737 100644 --- a/AdvancedDockingSystem/src/MainContainerWidget.cpp +++ b/AdvancedDockingSystem/src/MainContainerWidget.cpp @@ -67,20 +67,6 @@ MainContainerWidget::~MainContainerWidget() } -SectionWidget* MainContainerWidget::addSectionContent(const SectionContent::RefPtr& sc, SectionWidget* sw, DropArea area) -{ - ADS_Expects(!sc.isNull()); - - // Drop it based on "area" - InternalContentData data; - data.content = sc; - data.titleWidget = new SectionTitleWidget(sc, NULL); - data.contentWidget = new SectionContentWidget(sc, NULL); - - connect(data.titleWidget, SIGNAL(activeTabChanged()), this, SLOT(onActiveTabChanged())); - return dropContent(data, sw, area, false); -} - bool MainContainerWidget::removeSectionContent(const SectionContent::RefPtr& sc) { ADS_Expects(!sc.isNull()); diff --git a/AdvancedDockingSystem/src/SectionWidget.cpp b/AdvancedDockingSystem/src/SectionWidget.cpp index 931120e..164d6c5 100644 --- a/AdvancedDockingSystem/src/SectionWidget.cpp +++ b/AdvancedDockingSystem/src/SectionWidget.cpp @@ -16,6 +16,8 @@ #include #include +#include + #if defined(ADS_ANIMATIONS_ENABLED) #include #endif @@ -111,6 +113,8 @@ SectionWidget::~SectionWidget() { splitter->deleteLater(); } + + std::cout << "SectionWidget::~SectionWidget()" << std::endl; } int SectionWidget::uid() const @@ -422,11 +426,7 @@ SectionWidgetTabsScrollArea::~SectionWidgetTabsScrollArea() void SectionWidgetTabsScrollArea::wheelEvent(QWheelEvent* e) { e->accept(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) const int direction = e->angleDelta().y(); -#else - const int direction = e->delta(); -#endif if (direction < 0) horizontalScrollBar()->setValue(horizontalScrollBar()->value() + 20); else diff --git a/AdvancedDockingSystemDemo/src/mainwindow.cpp b/AdvancedDockingSystemDemo/src/mainwindow.cpp index ac9801d..1a0ec44 100644 --- a/AdvancedDockingSystemDemo/src/mainwindow.cpp +++ b/AdvancedDockingSystemDemo/src/mainwindow.cpp @@ -123,6 +123,7 @@ void MainWindow::createContent() sw = _container->addSectionContent(createLongTextLabelSC(cw), nullptr, ADS_NS::CenterDropArea); sw = _container->addSectionContent(createCalendarSC(cw), nullptr, ADS_NS::LeftDropArea); sw = _container->addSectionContent(createFileSystemTreeSC(cw), nullptr, ADS_NS::BottomDropArea); + sw = _container->addSectionContent(createCalendarSC(cw), nullptr, ADS_NS::BottomDropArea); /*_container->addSectionContent(createCalendarSC(_container)); _container->addSectionContent(createLongTextLabelSC(_container));