31 setSizePolicy(
widget->sizePolicy());
33 QBoxLayout *layoutWidget =
new QBoxLayout(QBoxLayout::TopToBottom);
35 layoutWidget->setSpacing(0);
43 QBoxLayout *layoutMain =
new QBoxLayout(QBoxLayout::LeftToRight);
44 layoutMain->setContentsMargins(0, 0, 0, 0);
45 layoutMain->setSpacing(0);
46 layoutMain->addLayout(layoutWidget);
49 setLayout(layoutMain);
61 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
64 const bool isVisible = layoutMain->count() > 1;
65 if (isVisible == visible) {
69 layoutMain->takeAt(1);
79 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
81 QBoxLayout *layoutWidget =
dynamic_cast<QBoxLayout*
>(layoutMain->itemAt(0)->layout());
84 if (orientation == Qt::Vertical) {
85 if (layoutMain->direction() == QBoxLayout::TopToBottom) {
91 layoutMain->setDirection(QBoxLayout::TopToBottom);
93 if (layoutMain->direction() == QBoxLayout::LeftToRight) {
96 layoutWidget->setContentsMargins(0, 0, 0, 0);
99 layoutMain->setDirection(QBoxLayout::LeftToRight);
109 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
110 if (layoutMain->direction() == QBoxLayout::TopToBottom) {
111 QBoxLayout *layoutWidget =
dynamic_cast<QBoxLayout*
>(layoutMain->itemAt(0)->layout());
113 layoutWidget->setContentsMargins(margin, 0, margin, 0);
143 if (
layoutHeader->direction() == QBoxLayout::LeftToRight) {
152 const int minimumHeaderWidth =
label->minimumSizeHint().width() +
155 if (
q->width() < minimumHeaderWidth) {
156 if (
layoutHeader->direction() == QBoxLayout::TopToBottom) {
163 if (
layoutHeader->direction() == QBoxLayout::LeftToRight) {
174 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(
q->layout());
186 layoutMain->takeAt(1);
207 widgetWrapper->setProperty(
"id",
id);
213 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(
q->layout());
217 for (indexLayout = 0; indexLayout < layoutMain->count(); ++indexLayout) {
218 const QWidget *prevWidget = layoutMain->itemAt(indexLayout)->widget();
220 if (prevIndex >= index) {
224 layoutMain->insertWidget(indexLayout, widgetWrapper);
230 if (
q->layout()->count() == 0) {
233 for (
int i = 0; i <
q->layout()->count() - 1; ++i) {
235 qobject_cast<KisOptionCollectionWidgetWrapper*>(
q->layout()->itemAt(i)->
widget());
239 qobject_cast<KisOptionCollectionWidgetWrapper*>(
q->layout()->itemAt(
q->layout()->count() - 1)->
widget());
268 QWidget*
findWidget(QStringRef path, QWidget *candidate =
nullptr)
const
270 while (path.startsWith(
'/')) {
271 path = path.right(path.size() - 1);
273 if (path.isEmpty()) {
276 const int slashPosition = path.indexOf(
'/');
277 if (slashPosition == -1) {
280 QWidget *nextCandidate =
widget(path.left(slashPosition));
283 qobject_cast<KisOptionCollectionWidget*>(nextCandidate);
284 if (optionCollectionWidget) {
285 return optionCollectionWidget->
m_d->findWidget(path.right(path.size() - slashPosition), nextCandidate);
288 qobject_cast<KisOptionCollectionWidgetWithHeader*>(nextCandidate);
289 if (optionCollectionWidgetWithHeader) {
290 return optionCollectionWidgetWithHeader->
m_d->widgetCollection->m_d->findWidget(path.right(path.size() - slashPosition), nextCandidate);
292 QStringRef rest = path.right(path.size() - slashPosition);
293 while (rest.startsWith(
'/')) {
294 rest = rest.right(rest.size() - 1);
296 if (rest.isEmpty()) {
297 return nextCandidate;
308 QBoxLayout *layoutMain =
new QBoxLayout(QBoxLayout::TopToBottom);
309 layoutMain->setSpacing(5);
310 layoutMain->setContentsMargins(0, 0, 0, 0);
311 setLayout(layoutMain);
319 return m_d->widgetIndexFromId(&
id);
324 return m_d->containsWidget(&
id);
329 return m_d->widget(index);
334 return m_d->widget(&
id);
339 return m_d->findWidget(&path);
367 QWidget*
widget =
m_d->widgetWrappers[index]->widget();
368 widget->setParent(
nullptr);
369 m_d->widgetWrappers.removeAt(index);
370 m_d->adjustSeparators();
383 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
387 if (layoutMain->indexOf(widgetWrapper) != -1) {
391 for (indexLayout = 0; indexLayout < layoutMain->count(); ++indexLayout) {
392 const QWidget *prevWidget = layoutMain->itemAt(indexLayout)->widget();
394 if (prevIndex >= index) {
398 layoutMain->insertWidget(indexLayout, widgetWrapper);
399 widgetWrapper->setVisible(
true);
401 if (layoutMain->indexOf(widgetWrapper) == -1) {
404 layoutMain->takeAt(layoutMain->indexOf(widgetWrapper));
405 widgetWrapper->setVisible(
false);
408 m_d->adjustSeparators();
418 if (margin ==
m_d->widgetsMargin) {
421 m_d->widgetsMargin = margin;
423 widgetWrapper->setWidgetMargin(margin);
429 if (visible ==
m_d->showSeparators) {
432 m_d->showSeparators = visible;
433 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
434 layoutMain->setSpacing(visible ? 0 : 5);
435 m_d->adjustSeparators();
440 if (orientation ==
m_d->orientation) {
443 m_d->orientation = orientation;
445 widgetWrapper->setOrientation(orientation);
448 qobject_cast<KisOptionCollectionWidget*>(widgetWrapper->widget());
449 if (optionCollectionWidget) {
454 qobject_cast<KisOptionCollectionWidgetWithHeader*>(widgetWrapper->widget());
455 if (optionCollectionWidgetWithHeader) {
456 optionCollectionWidgetWithHeader->
setOrientation(orientation,
true);
460 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
461 layoutMain->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
466 return m_d->widgetWrappers.size();
471 return layout()->count();
479 m_d->label =
new QLabel(title,
this);
481 m_d->layoutPrimaryWidget =
new QBoxLayout(QBoxLayout::LeftToRight);
482 m_d->layoutPrimaryWidget->setSpacing(0);
483 m_d->layoutPrimaryWidget->setContentsMargins(0, 0, 0, 0);
485 m_d->layoutHeader =
new QBoxLayout(QBoxLayout::LeftToRight);
486 m_d->layoutHeader->setSpacing(10);
487 m_d->layoutHeader->setContentsMargins(0, 0, 0, 0);
488 m_d->layoutHeader->addWidget(
m_d->label, 0);
491 m_d->widgetCollection->setWidgetsMargin(0);
492 m_d->widgetCollection->setVisible(
false);
494 m_d->layoutWidgets =
new QBoxLayout(QBoxLayout::TopToBottom);
495 m_d->layoutWidgets->setSpacing(0);
496 m_d->layoutWidgets->setContentsMargins(5, 0, 0, 0);
497 m_d->layoutWidgets->addWidget(
m_d->widgetCollection);
499 QBoxLayout *layoutMain =
new QBoxLayout(QBoxLayout::TopToBottom);
500 layoutMain->setSpacing(5);
501 layoutMain->setContentsMargins(0, 0, 0, 0);
502 layoutMain->addLayout(
m_d->layoutHeader, 0);
504 setLayout(layoutMain);
512 if (
m_d->orientation == Qt::Horizontal) {
513 return QWidget::minimumSizeHint();
516 const QSize widgetListMinimumSizeHint =
m_d->layoutWidgets->minimumSize();
518 const int minimumHeaderWidth =
m_d->label->minimumSizeHint().width() +
519 (
m_d->primaryWidget ?
m_d->primaryWidget->minimumSizeHint().width() + 10 + 4 : 0);
520 const QSize headerMinimumSizeHint =
523 m_d->label->minimumSizeHint().width(),
524 m_d->primaryWidget ?
m_d->layoutPrimaryWidget->minimumSize().width() : 0
526 width() < minimumHeaderWidth
527 ?
m_d->label->minimumSizeHint().height() +
528 (
m_d->primaryWidget &&
m_d->primaryWidget->isVisible()
529 ?
m_d->layoutPrimaryWidget->minimumSize().height() +
m_d->layoutHeader->spacing() : 0)
531 m_d->label->minimumSizeHint().height(),
532 m_d->primaryWidget &&
m_d->primaryWidget->isVisible()
533 ?
m_d->layoutPrimaryWidget->minimumSize().height() : 0
539 qMax(widgetListMinimumSizeHint.width(), headerMinimumSizeHint.width()),
540 headerMinimumSizeHint.height() +
541 (
m_d->widgetCollection->numberOfVisibleWidgets() > 0 ? widgetListMinimumSizeHint.height() + layout()->spacing() : 0)
547 return m_d->primaryWidget;
555 const bool wasPrimaryWidgetVisible =
556 m_d->primaryWidget ?
m_d->primaryWidget->isVisible() :
true;
563 m_d->layoutPrimaryWidget->insertWidget(0,
widget);
565 if (!wasPrimaryWidgetVisible) {
566 widget->setVisible(
false);
570 m_d->layoutHeader->insertLayout(1,
m_d->layoutPrimaryWidget, 1);
572 m_d->adjustPrimaryWidget();
577 if (!
m_d->primaryWidget) {
589 m_d->primaryWidget =
nullptr;
590 widget->setParent(
nullptr);
591 m_d->layoutHeader->takeAt(1);
592 m_d->adjustPrimaryWidget();
602 if (
m_d->layoutHeader->count() == 2) {
605 m_d->layoutHeader->insertLayout(1,
m_d->layoutPrimaryWidget, 1);
606 m_d->primaryWidget->setVisible(
true);
607 m_d->adjustPrimaryWidget();
609 if (
m_d->layoutHeader->count() == 1) {
612 m_d->layoutHeader->takeAt(1);
613 m_d->primaryWidget->setVisible(
false);
619 return m_d->widgetCollection->widgetIndexFromId(
id);
624 return m_d->widgetCollection->containsWidget(
id);
629 return m_d->widgetCollection->widget(index);
634 return m_d->widgetCollection->widget(
id);
639 return m_d->widgetCollection->findWidget(path);
644 m_d->widgetCollection->insertWidget(index,
id,
widget);
645 m_d->adjustWidgetCollection();
650 m_d->widgetCollection->appendWidget(
id,
widget);
651 m_d->adjustWidgetCollection();
656 m_d->widgetCollection->removeWidget(index);
657 m_d->adjustWidgetCollection();
662 m_d->widgetCollection->removeWidget(
id);
663 m_d->adjustWidgetCollection();
668 QWidget *w =
m_d->widgetCollection->takeWidget(index);
669 m_d->adjustWidgetCollection();
675 QWidget *w =
m_d->widgetCollection->takeWidget(
id);
676 m_d->adjustWidgetCollection();
682 m_d->widgetCollection->setWidgetVisible(index, visible);
683 m_d->adjustWidgetCollection();
688 m_d->widgetCollection->setWidgetVisible(
id, visible);
689 m_d->adjustWidgetCollection();
694 m_d->widgetCollection->setWidgetsMargin(margin);
699 m_d->widgetCollection->setSeparatorsVisible(visible);
704 if (orientation ==
m_d->orientation) {
707 m_d->orientation = orientation;
708 m_d->adjustPrimaryWidget();
709 m_d->widgetCollection->setOrientation(orientation, recursive);
710 m_d->layoutWidgets->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
711 QBoxLayout *layoutMain =
dynamic_cast<QBoxLayout*
>(layout());
712 layoutMain->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
717 return m_d->widgetCollection->size();
722 return m_d->widgetCollection->numberOfVisibleWidgets();
727 m_d->adjustPrimaryWidget();
730#include "KisOptionCollectionWidget.moc"
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)