File indexing completed on 2024-05-19 04:29:52

0001 /*
0002  *  SPDX-FileCopyrightText: 2022 Deif Lou <ginoba@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include <QWidget>
0008 #include <QFrame>
0009 #include <QLabel>
0010 #include <QScrollArea>
0011 #include <QVariant>
0012 #include <QBoxLayout>
0013 
0014 #include <kis_assert.h>
0015 
0016 #include "KisOptionCollectionWidget.h"
0017 
0018 class KisOptionCollectionWidgetWrapper : public QWidget
0019 {
0020     Q_OBJECT
0021 
0022 public:
0023     KisOptionCollectionWidgetWrapper(QWidget *parent, QWidget *widget)
0024         : QWidget(parent)
0025         , m_widget(widget)
0026         , m_margin(0)
0027     {
0028         m_widget->setParent(this);
0029 
0030         setSizePolicy(widget->sizePolicy());
0031 
0032         QBoxLayout *layoutWidget = new QBoxLayout(QBoxLayout::TopToBottom);
0033         layoutWidget->setContentsMargins(m_margin, 0, m_margin, 0);
0034         layoutWidget->setSpacing(0);
0035         layoutWidget->addWidget(m_widget);
0036 
0037         m_separator = new QFrame(this);
0038         m_separator->setFrameShape(QFrame::HLine);
0039         m_separator->setFrameShadow(QFrame::Sunken);
0040         m_separator->setFixedHeight(10);
0041     
0042         QBoxLayout *layoutMain = new QBoxLayout(QBoxLayout::LeftToRight);
0043         layoutMain->setContentsMargins(0, 0, 0, 0);
0044         layoutMain->setSpacing(0);
0045         layoutMain->addLayout(layoutWidget);
0046         layoutMain->addWidget(m_separator);
0047 
0048         setLayout(layoutMain);
0049     }
0050 
0051     ~KisOptionCollectionWidgetWrapper() override {}
0052 
0053     QWidget* widget() const
0054     {
0055         return m_widget;
0056     }
0057 
0058     void setSeparatorVisible(bool visible)
0059     {
0060         QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0061         KIS_ASSERT(layoutMain);
0062 
0063         const bool isVisible = layoutMain->count() > 1;
0064         if (isVisible == visible) {
0065             return;
0066         }
0067         if (isVisible) {
0068             layoutMain->takeAt(1);
0069             m_separator->setVisible(false);
0070         } else {
0071             layoutMain->insertWidget(1, m_separator);
0072             m_separator->setVisible(true);
0073         }
0074     }
0075 
0076     void setOrientation(Qt::Orientation orientation)
0077     {
0078         QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0079         KIS_ASSERT(layoutMain);
0080         QBoxLayout *layoutWidget = dynamic_cast<QBoxLayout*>(layoutMain->itemAt(0)->layout());
0081         KIS_ASSERT(layoutWidget);
0082 
0083         if (orientation == Qt::Vertical) {
0084             if (layoutMain->direction() == QBoxLayout::TopToBottom) {
0085                 return;
0086             }
0087             layoutWidget->setContentsMargins(m_margin, 0, m_margin, 0);
0088             m_separator->setFixedSize(QWIDGETSIZE_MAX, 10);
0089             m_separator->setFrameShape(QFrame::HLine);
0090             layoutMain->setDirection(QBoxLayout::TopToBottom);
0091         } else {
0092             if (layoutMain->direction() == QBoxLayout::LeftToRight) {
0093                 return;
0094             }
0095             layoutWidget->setContentsMargins(0, 0, 0, 0);
0096             m_separator->setFixedSize(20, QWIDGETSIZE_MAX);
0097             m_separator->setFrameShape(QFrame::VLine);
0098             layoutMain->setDirection(QBoxLayout::LeftToRight);
0099         }
0100     }
0101 
0102     void setWidgetMargin(int margin)
0103     {
0104         if (m_margin == margin) {
0105             return;
0106         }
0107         m_margin = margin;
0108         QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0109         if (layoutMain->direction() == QBoxLayout::TopToBottom) {
0110             QBoxLayout *layoutWidget = dynamic_cast<QBoxLayout*>(layoutMain->itemAt(0)->layout());
0111             KIS_SAFE_ASSERT_RECOVER_RETURN(layoutWidget);
0112             layoutWidget->setContentsMargins(margin, 0, margin, 0);
0113         }
0114     }
0115 
0116 private:
0117     QWidget *m_widget;
0118     QFrame *m_separator;
0119     int m_margin;
0120 };
0121 
0122 struct KisOptionCollectionWidgetWithHeader::Private
0123 {
0124     KisOptionCollectionWidgetWithHeader *q{nullptr};
0125     QLabel *label{nullptr};
0126     QWidget *primaryWidget{nullptr};
0127     KisOptionCollectionWidget *widgetCollection{nullptr};
0128     QBoxLayout *layoutHeader{nullptr};
0129     QBoxLayout *layoutPrimaryWidget{nullptr};
0130     QBoxLayout *layoutWidgets{nullptr};
0131     Qt::Orientation orientation{Qt::Vertical};
0132 
0133     Private(KisOptionCollectionWidgetWithHeader *q) : q(q) {}
0134 
0135     void adjustPrimaryWidget()
0136     {
0137         if (!primaryWidget || !primaryWidget->isVisible()) {
0138             return;
0139         }
0140 
0141         if (orientation == Qt::Horizontal) {
0142             if (layoutHeader->direction() == QBoxLayout::LeftToRight) {
0143                 return;
0144             }
0145             layoutHeader->setDirection(QBoxLayout::LeftToRight);
0146             layoutHeader->setSpacing(10);
0147             layoutPrimaryWidget->setContentsMargins(0, 0, 0, 0);
0148             return;
0149         }
0150         // label.width + primaryWidget.size + 10px spacing + 4px extra (just in case)
0151         const int minimumHeaderWidth = label->minimumSizeHint().width() +
0152                                        primaryWidget->minimumSizeHint().width() +
0153                                        10 + 4;
0154         if (q->width() < minimumHeaderWidth) {
0155             if (layoutHeader->direction() == QBoxLayout::TopToBottom) {
0156                 return;
0157             }
0158             layoutHeader->setDirection(QBoxLayout::TopToBottom);
0159             layoutHeader->setSpacing(5);
0160             layoutPrimaryWidget->setContentsMargins(5, 0, 0, 0);
0161         } else {
0162             if (layoutHeader->direction() == QBoxLayout::LeftToRight) {
0163                 return;
0164             }
0165             layoutHeader->setDirection(QBoxLayout::LeftToRight);
0166             layoutHeader->setSpacing(10);
0167             layoutPrimaryWidget->setContentsMargins(0, 0, 0, 0);
0168         }
0169     }
0170 
0171     void adjustWidgetCollection()
0172     {
0173         QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(q->layout());
0174         KIS_ASSERT(layoutMain);
0175         if (layoutMain->indexOf(layoutWidgets) == -1) {
0176             if (widgetCollection->numberOfVisibleWidgets() == 0) {
0177                 return;
0178             }
0179             layoutMain->insertLayout(1, layoutWidgets, 1);
0180             widgetCollection->setVisible(true);
0181         } else {
0182             if (widgetCollection->numberOfVisibleWidgets() != 0) {
0183                 return;
0184             }
0185             layoutMain->takeAt(1);
0186             widgetCollection->setVisible(false);
0187         }
0188     }
0189     
0190 };
0191 
0192 struct KisOptionCollectionWidget::Private
0193 {
0194     KisOptionCollectionWidget *q{nullptr};
0195     QVector<KisOptionCollectionWidgetWrapper*> widgetWrappers;
0196     bool showSeparators{false};
0197     Qt::Orientation orientation{Qt::Vertical};
0198     int widgetsMargin{10};
0199 
0200     Private(KisOptionCollectionWidget *q) : q(q) {}
0201 
0202     void insertWidget(int index, const QString &id, QWidget *widget)
0203     {
0204         KisOptionCollectionWidgetWrapper *widgetWrapper =
0205             new KisOptionCollectionWidgetWrapper(q, widget);
0206         widgetWrapper->setProperty("id", id);
0207         widgetWrapper->setSeparatorVisible(showSeparators);
0208         widgetWrapper->setOrientation(orientation);
0209         widgetWrapper->setWidgetMargin(widgetsMargin);
0210         widgetWrappers.insert(index, widgetWrapper);
0211 
0212         QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(q->layout());
0213         KIS_ASSERT(layoutMain);
0214 
0215         int indexLayout;
0216         for (indexLayout = 0; indexLayout < layoutMain->count(); ++indexLayout) {
0217             const QWidget *prevWidget = layoutMain->itemAt(indexLayout)->widget();
0218             const int prevIndex = q->widgetIndexFromId(prevWidget->property("id").toString());
0219             if (prevIndex >= index) {
0220                 break;
0221             }
0222         }
0223         layoutMain->insertWidget(indexLayout, widgetWrapper);
0224         adjustSeparators();
0225     }
0226 
0227     void adjustSeparators()
0228     {
0229         if (q->layout()->count() == 0) {
0230             return;
0231         }
0232         for (int i = 0; i < q->layout()->count() - 1; ++i) {
0233             KisOptionCollectionWidgetWrapper *widgetWrapper =
0234                 qobject_cast<KisOptionCollectionWidgetWrapper*>(q->layout()->itemAt(i)->widget());
0235             widgetWrapper->setSeparatorVisible(showSeparators);
0236         }
0237         KisOptionCollectionWidgetWrapper *lastWidgetWrapper =
0238             qobject_cast<KisOptionCollectionWidgetWrapper*>(q->layout()->itemAt(q->layout()->count() - 1)->widget());
0239         lastWidgetWrapper->setSeparatorVisible(false);
0240     }
0241 
0242     int widgetIndexFromId(QStringRef id) const
0243     {
0244         for (int i = 0; i < widgetWrappers.size(); ++i) {
0245             if (widgetWrappers[i]->property("id").toString() == id) {
0246                 return i;
0247             }
0248         }
0249         return -1;
0250     }
0251 
0252     bool containsWidget(QStringRef id) const
0253     {
0254         return widgetIndexFromId(id) != -1;
0255     }
0256 
0257     QWidget* widget(int index) const
0258     {
0259         return widgetWrappers[index]->widget();
0260     }
0261 
0262     QWidget* widget(QStringRef id) const
0263     {
0264         return widget(widgetIndexFromId(id));
0265     }
0266 
0267     QWidget* findWidget(QStringRef path, QWidget *candidate = nullptr) const
0268     {
0269         while (path.startsWith('/')) {
0270             path = path.right(path.size() - 1);
0271         }
0272         if (path.isEmpty()) {
0273             return candidate;
0274         }
0275         const int slashPosition = path.indexOf('/');
0276         if (slashPosition == -1) {
0277             return widget(path);
0278         }
0279         QWidget *nextCandidate = widget(path.left(slashPosition));
0280         if (nextCandidate) {
0281             KisOptionCollectionWidget *optionCollectionWidget =
0282                 qobject_cast<KisOptionCollectionWidget*>(nextCandidate);
0283             if (optionCollectionWidget) {
0284                 return optionCollectionWidget->m_d->findWidget(path.right(path.size() - slashPosition), nextCandidate);
0285             }
0286             KisOptionCollectionWidgetWithHeader *optionCollectionWidgetWithHeader =
0287                 qobject_cast<KisOptionCollectionWidgetWithHeader*>(nextCandidate);
0288             if (optionCollectionWidgetWithHeader) {
0289                 return optionCollectionWidgetWithHeader->m_d->widgetCollection->m_d->findWidget(path.right(path.size() - slashPosition), nextCandidate);
0290             }
0291             QStringRef rest = path.right(path.size() - slashPosition);
0292             while (rest.startsWith('/')) {
0293                 rest = rest.right(rest.size() - 1);
0294             }
0295             if (rest.isEmpty()) {
0296                 return nextCandidate;
0297             }
0298         }
0299         return nullptr;
0300     }
0301 };
0302 
0303 KisOptionCollectionWidget::KisOptionCollectionWidget(QWidget *parent)
0304     : QWidget(parent)
0305     , m_d(new Private(this))
0306 {
0307     QBoxLayout *layoutMain = new QBoxLayout(QBoxLayout::TopToBottom);
0308     layoutMain->setSpacing(5);
0309     layoutMain->setContentsMargins(0, 0, 0, 0);
0310     setLayout(layoutMain);
0311 }
0312 
0313 KisOptionCollectionWidget::~KisOptionCollectionWidget()
0314 {}
0315 
0316 int KisOptionCollectionWidget::widgetIndexFromId(const QString &id) const
0317 {
0318     return m_d->widgetIndexFromId(&id);
0319 }
0320 
0321 bool KisOptionCollectionWidget::containsWidget(const QString &id) const
0322 {
0323     return m_d->containsWidget(&id);
0324 }
0325 
0326 QWidget* KisOptionCollectionWidget::widget(int index) const
0327 {
0328     return m_d->widget(index);
0329 }
0330 
0331 QWidget* KisOptionCollectionWidget::widget(const QString &id) const
0332 {
0333     return m_d->widget(&id);
0334 }
0335 
0336 QWidget* KisOptionCollectionWidget::findWidget(const QString &path) const
0337 {
0338     return m_d->findWidget(&path);
0339 }
0340 
0341 void KisOptionCollectionWidget::insertWidget(int index, const QString &id, QWidget *widget)
0342 {
0343     if (containsWidget(id)) {
0344         return;
0345     }
0346     m_d->insertWidget(index, id, widget);
0347 }
0348 
0349 void KisOptionCollectionWidget::appendWidget(const QString &id, QWidget *widget)
0350 {
0351     insertWidget(m_d->widgetWrappers.size(), id, widget);
0352 }
0353 
0354 void KisOptionCollectionWidget::removeWidget(int index)
0355 {
0356     delete takeWidget(index);
0357 }
0358 
0359 void KisOptionCollectionWidget::removeWidget(const QString &id)
0360 {
0361     removeWidget(widgetIndexFromId(id));
0362 }
0363 
0364 QWidget* KisOptionCollectionWidget::takeWidget(int index)
0365 {
0366     QWidget* widget = m_d->widgetWrappers[index]->widget();
0367     widget->setParent(nullptr);
0368     m_d->widgetWrappers.removeAt(index);
0369     m_d->adjustSeparators();
0370     return widget;
0371 }
0372 
0373 QWidget* KisOptionCollectionWidget::takeWidget(const QString &id)
0374 {
0375     return takeWidget(widgetIndexFromId(id));
0376 }
0377 
0378 void KisOptionCollectionWidget::setWidgetVisible(int index, bool visible)
0379 {
0380     KisOptionCollectionWidgetWrapper *widgetWrapper = m_d->widgetWrappers[index];
0381 
0382     QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0383     KIS_SAFE_ASSERT_RECOVER_RETURN(layoutMain);
0384 
0385     if (visible) {
0386         if (layoutMain->indexOf(widgetWrapper) != -1) {
0387             return;
0388         }
0389         int indexLayout;
0390         for (indexLayout = 0; indexLayout < layoutMain->count(); ++indexLayout) {
0391             const QWidget *prevWidget = layoutMain->itemAt(indexLayout)->widget();
0392             const int prevIndex = widgetIndexFromId(prevWidget->property("id").toString());
0393             if (prevIndex >= index) {
0394                 break;
0395             }
0396         }
0397         layoutMain->insertWidget(indexLayout, widgetWrapper);
0398         widgetWrapper->setVisible(true);
0399     } else {
0400         if (layoutMain->indexOf(widgetWrapper) == -1) {
0401             return;
0402         }
0403         layoutMain->takeAt(layoutMain->indexOf(widgetWrapper));
0404         widgetWrapper->setVisible(false);
0405     }
0406 
0407     m_d->adjustSeparators();
0408 }
0409 
0410 void KisOptionCollectionWidget::setWidgetVisible(const QString &id, bool visible)
0411 {
0412     setWidgetVisible(widgetIndexFromId(id), visible);
0413 }
0414 
0415 void KisOptionCollectionWidget::setWidgetsMargin(int margin)
0416 {
0417     if (margin == m_d->widgetsMargin) {
0418         return;
0419     }
0420     m_d->widgetsMargin = margin;
0421     for (KisOptionCollectionWidgetWrapper *widgetWrapper : m_d->widgetWrappers) {
0422         widgetWrapper->setWidgetMargin(margin);
0423     }
0424 }
0425 
0426 void KisOptionCollectionWidget::setSeparatorsVisible(bool visible)
0427 {
0428     if (visible == m_d->showSeparators) {
0429         return;
0430     }
0431     m_d->showSeparators = visible;
0432     QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0433     layoutMain->setSpacing(visible ? 0 : 5);
0434     m_d->adjustSeparators();
0435 }
0436 
0437 void KisOptionCollectionWidget::setOrientation(Qt::Orientation orientation, bool recursive)
0438 {
0439     if (orientation == m_d->orientation) {
0440         return;
0441     }
0442     m_d->orientation = orientation;
0443     for (KisOptionCollectionWidgetWrapper *widgetWrapper : m_d->widgetWrappers) {
0444         widgetWrapper->setOrientation(orientation);
0445         if (recursive) {
0446             KisOptionCollectionWidget *optionCollectionWidget =
0447                 qobject_cast<KisOptionCollectionWidget*>(widgetWrapper->widget());
0448             if (optionCollectionWidget) {
0449                 optionCollectionWidget->setOrientation(orientation, true);
0450                 continue;
0451             }
0452             KisOptionCollectionWidgetWithHeader *optionCollectionWidgetWithHeader =
0453                 qobject_cast<KisOptionCollectionWidgetWithHeader*>(widgetWrapper->widget());
0454             if (optionCollectionWidgetWithHeader) {
0455                 optionCollectionWidgetWithHeader->setOrientation(orientation, true);
0456             }
0457         }
0458     }
0459     QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0460     layoutMain->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
0461 }
0462 
0463 int KisOptionCollectionWidget::size() const
0464 {
0465     return m_d->widgetWrappers.size();
0466 }
0467 
0468 int KisOptionCollectionWidget::numberOfVisibleWidgets() const
0469 {
0470     return layout()->count();
0471 }
0472 
0473 KisOptionCollectionWidgetWithHeader::KisOptionCollectionWidgetWithHeader(const QString &title,
0474                                                                          QWidget *parent)
0475     : QWidget(parent)
0476     , m_d(new Private(this))
0477 {
0478     m_d->label = new QLabel(title, this);
0479     
0480     m_d->layoutPrimaryWidget = new QBoxLayout(QBoxLayout::LeftToRight);
0481     m_d->layoutPrimaryWidget->setSpacing(0);
0482     m_d->layoutPrimaryWidget->setContentsMargins(0, 0, 0, 0);
0483 
0484     m_d->layoutHeader = new QBoxLayout(QBoxLayout::LeftToRight);
0485     m_d->layoutHeader->setSpacing(10);
0486     m_d->layoutHeader->setContentsMargins(0, 0, 0, 0);
0487     m_d->layoutHeader->addWidget(m_d->label, 0);
0488 
0489     m_d->widgetCollection = new KisOptionCollectionWidget(this);
0490     m_d->widgetCollection->setWidgetsMargin(0);
0491     m_d->widgetCollection->setVisible(false);
0492 
0493     m_d->layoutWidgets = new QBoxLayout(QBoxLayout::TopToBottom);
0494     m_d->layoutWidgets->setSpacing(0);
0495     m_d->layoutWidgets->setContentsMargins(5, 0, 0, 0);
0496     m_d->layoutWidgets->addWidget(m_d->widgetCollection);
0497 
0498     QBoxLayout *layoutMain = new QBoxLayout(QBoxLayout::TopToBottom);
0499     layoutMain->setSpacing(5);
0500     layoutMain->setContentsMargins(0, 0, 0, 0);
0501     layoutMain->addLayout(m_d->layoutHeader, 0);
0502     
0503     setLayout(layoutMain);
0504 }
0505 
0506 KisOptionCollectionWidgetWithHeader::~KisOptionCollectionWidgetWithHeader()
0507 {}
0508 
0509 QSize KisOptionCollectionWidgetWithHeader::minimumSizeHint() const
0510 {
0511     if (m_d->orientation == Qt::Horizontal) {
0512         return QWidget::minimumSizeHint();
0513     }
0514 
0515     const QSize widgetListMinimumSizeHint = m_d->layoutWidgets->minimumSize();
0516     // label.width + primaryWidget.size + 10px spacing + 4px extra (just in case)
0517     const int minimumHeaderWidth = m_d->label->minimumSizeHint().width() +
0518                                    (m_d->primaryWidget ? m_d->primaryWidget->minimumSizeHint().width() + 10 + 4 : 0);
0519     const QSize headerMinimumSizeHint =
0520         QSize(
0521             qMax(
0522                 m_d->label->minimumSizeHint().width(),
0523                 m_d->primaryWidget ? m_d->layoutPrimaryWidget->minimumSize().width() : 0
0524             ),
0525             width() < minimumHeaderWidth
0526             ? m_d->label->minimumSizeHint().height() +
0527               (m_d->primaryWidget && m_d->primaryWidget->isVisible()
0528                 ? m_d->layoutPrimaryWidget->minimumSize().height() + m_d->layoutHeader->spacing() : 0)
0529             : qMax(
0530                 m_d->label->minimumSizeHint().height(),
0531                 m_d->primaryWidget && m_d->primaryWidget->isVisible()
0532                     ? m_d->layoutPrimaryWidget->minimumSize().height() : 0
0533               )
0534         );
0535 
0536     return
0537         QSize(
0538             qMax(widgetListMinimumSizeHint.width(), headerMinimumSizeHint.width()),
0539             headerMinimumSizeHint.height() +
0540                 (m_d->widgetCollection->numberOfVisibleWidgets() > 0 ? widgetListMinimumSizeHint.height() + layout()->spacing() : 0)
0541         );
0542 }
0543 
0544 QWidget* KisOptionCollectionWidgetWithHeader::primaryWidget() const
0545 {
0546     return m_d->primaryWidget;
0547 }
0548 
0549 void KisOptionCollectionWidgetWithHeader::setPrimaryWidget(QWidget *widget)
0550 {
0551     if (widget == m_d->primaryWidget) {
0552         return;
0553     }
0554     const bool wasPrimaryWidgetVisible =
0555         m_d->primaryWidget ? m_d->primaryWidget->isVisible() : true;
0556     removePrimaryWidget();
0557     if (!widget) {
0558         return;
0559     }
0560     m_d->primaryWidget = widget;
0561     widget->setParent(this);
0562     m_d->layoutPrimaryWidget->insertWidget(0, widget);
0563 
0564     if (!wasPrimaryWidgetVisible) {
0565         widget->setVisible(false);
0566         return;
0567     }
0568 
0569     m_d->layoutHeader->insertLayout(1, m_d->layoutPrimaryWidget, 1);
0570     widget->setVisible(true);
0571     m_d->adjustPrimaryWidget();
0572 }
0573 
0574 void KisOptionCollectionWidgetWithHeader::removePrimaryWidget()
0575 {
0576     if (!m_d->primaryWidget) {
0577         return;
0578     }
0579     delete takePrimaryWidget();
0580 }
0581 
0582 QWidget* KisOptionCollectionWidgetWithHeader::takePrimaryWidget()
0583 {
0584     QWidget *widget = m_d->primaryWidget;
0585     if (!widget) {
0586         return nullptr;
0587     }
0588     m_d->primaryWidget = nullptr;
0589     widget->setParent(nullptr);
0590     m_d->layoutHeader->takeAt(1);
0591     m_d->adjustPrimaryWidget();
0592     return widget;
0593 
0594 }
0595 
0596 void KisOptionCollectionWidgetWithHeader::setPrimaryWidgetVisible(bool visible)
0597 {
0598     KIS_ASSERT_RECOVER_RETURN(m_d->primaryWidget);
0599 
0600     if (visible) {
0601         if (m_d->layoutHeader->count() == 2) {
0602             return;
0603         }
0604         m_d->layoutHeader->insertLayout(1, m_d->layoutPrimaryWidget, 1);
0605         m_d->primaryWidget->setVisible(true);
0606         m_d->adjustPrimaryWidget();
0607     } else {
0608         if (m_d->layoutHeader->count() == 1) {
0609             return;
0610         }
0611         m_d->layoutHeader->takeAt(1);
0612         m_d->primaryWidget->setVisible(false);
0613     }
0614 }
0615 
0616 int KisOptionCollectionWidgetWithHeader::widgetIndexFromId(const QString &id) const
0617 {
0618     return m_d->widgetCollection->widgetIndexFromId(id);
0619 }
0620 
0621 bool KisOptionCollectionWidgetWithHeader::containsWidget(const QString &id) const
0622 {
0623     return m_d->widgetCollection->containsWidget(id);
0624 }
0625 
0626 QWidget* KisOptionCollectionWidgetWithHeader::widget(int index) const
0627 {
0628     return m_d->widgetCollection->widget(index);
0629 }
0630 
0631 QWidget* KisOptionCollectionWidgetWithHeader::widget(const QString &id) const
0632 {
0633     return m_d->widgetCollection->widget(id);
0634 }
0635 
0636 QWidget* KisOptionCollectionWidgetWithHeader::findWidget(const QString &path) const
0637 {
0638     return m_d->widgetCollection->findWidget(path);
0639 }
0640 
0641 void KisOptionCollectionWidgetWithHeader::insertWidget(int index, const QString &id, QWidget *widget)
0642 {
0643     m_d->widgetCollection->insertWidget(index, id, widget);
0644     m_d->adjustWidgetCollection();
0645 }
0646 
0647 void KisOptionCollectionWidgetWithHeader::appendWidget(const QString &id, QWidget *widget)
0648 {
0649     m_d->widgetCollection->appendWidget(id, widget);
0650     m_d->adjustWidgetCollection();
0651 }
0652 
0653 void KisOptionCollectionWidgetWithHeader::removeWidget(int index)
0654 {
0655     m_d->widgetCollection->removeWidget(index);
0656     m_d->adjustWidgetCollection();
0657 }
0658 
0659 void KisOptionCollectionWidgetWithHeader::removeWidget(const QString &id)
0660 {
0661     m_d->widgetCollection->removeWidget(id);
0662     m_d->adjustWidgetCollection();
0663 }
0664 
0665 QWidget* KisOptionCollectionWidgetWithHeader::takeWidget(int index)
0666 {
0667     QWidget *w = m_d->widgetCollection->takeWidget(index);
0668     m_d->adjustWidgetCollection();
0669     return w;
0670 }
0671 
0672 QWidget* KisOptionCollectionWidgetWithHeader::takeWidget(const QString &id)
0673 {
0674     QWidget *w =  m_d->widgetCollection->takeWidget(id);
0675     m_d->adjustWidgetCollection();
0676     return w;
0677 }
0678 
0679 void KisOptionCollectionWidgetWithHeader::setWidgetVisible(int index, bool visible)
0680 {
0681     m_d->widgetCollection->setWidgetVisible(index, visible);
0682     m_d->adjustWidgetCollection();
0683 }
0684 
0685 void KisOptionCollectionWidgetWithHeader::setWidgetVisible(const QString &id, bool visible)
0686 {
0687     m_d->widgetCollection->setWidgetVisible(id, visible);
0688     m_d->adjustWidgetCollection();
0689 }
0690 
0691 void KisOptionCollectionWidgetWithHeader::setWidgetsMargin(int margin)
0692 {
0693     m_d->widgetCollection->setWidgetsMargin(margin);
0694 }
0695 
0696 void KisOptionCollectionWidgetWithHeader::setSeparatorsVisible(bool visible)
0697 {
0698     m_d->widgetCollection->setSeparatorsVisible(visible);
0699 }
0700 
0701 void KisOptionCollectionWidgetWithHeader::setOrientation(Qt::Orientation orientation, bool recursive)
0702 {
0703     if (orientation == m_d->orientation) {
0704         return;
0705     }
0706     m_d->orientation = orientation;
0707     m_d->adjustPrimaryWidget();
0708     m_d->widgetCollection->setOrientation(orientation, recursive);
0709     m_d->layoutWidgets->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
0710     QBoxLayout *layoutMain = dynamic_cast<QBoxLayout*>(layout());
0711     layoutMain->setDirection(orientation == Qt::Vertical ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight);
0712 }
0713 
0714 int KisOptionCollectionWidgetWithHeader::size() const
0715 {
0716     return m_d->widgetCollection->size();
0717 }
0718 
0719 int KisOptionCollectionWidgetWithHeader::numberOfVisibleWidgets() const
0720 {
0721     return m_d->widgetCollection->numberOfVisibleWidgets();
0722 }
0723 
0724 void KisOptionCollectionWidgetWithHeader::resizeEvent(QResizeEvent*)
0725 {
0726     m_d->adjustPrimaryWidget();
0727 }
0728 
0729 #include "KisOptionCollectionWidget.moc"