File indexing completed on 2024-05-12 16:02:29

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