|
|
|
|
@@ -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<QSplitter*>(Widget);
|
|
|
|
|
auto Sections = Widget->findChildren<SectionWidget*>(QString(), Qt::FindDirectChildrenOnly);
|
|
|
|
|
auto Splitters = Widget->findChildren<QSplitter*>(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<QSplitter*>(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<QSplitter*>(QString(), Qt::FindDirectChildrenOnly);
|
|
|
|
|
//auto SectionWidgets = FloatingMainSplitter->findChildren<SectionWidget*>(QString(), Qt::FindDirectChildrenOnly);
|
|
|
|
|
QList<SectionWidget*> SectionWidgets;
|
|
|
|
|
for (int i = 0; i < FloatingMainSplitter->count(); ++i)
|
|
|
|
|
{
|
|
|
|
|
SectionWidgets.append(static_cast<SectionWidget*>(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<QSplitter*>(QString(),
|
|
|
|
|
Qt::FindDirectChildrenOnly); QSplitter* OldSplitter = this->findChild<QSplitter*>(QString(), Qt::FindDirectChildrenOnly);
|
|
|
|
|
QList<SectionWidget*> SectionWidgets;
|
|
|
|
|
for (int i = 0; i < FloatingMainSplitter->count(); ++i)
|
|
|
|
|
{
|
|
|
|
|
SectionWidgets.append(static_cast<SectionWidget*>(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)
|
|
|
|
|
|