Implemented initial support for dropping multiple sections at the same time
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user