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"