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 <QButtonGroup> 0008 #include <QHBoxLayout> 0009 0010 #include <KoGroupButton.h> 0011 0012 #include <kis_assert.h> 0013 #include "KisOptionButtonStrip.h" 0014 0015 class KisOptionButtonStrip::Private 0016 { 0017 public: 0018 int numberOfButtons{0}; 0019 QButtonGroup *buttonGroup{nullptr}; 0020 }; 0021 0022 KisOptionButtonStrip::KisOptionButtonStrip(QWidget *parent) 0023 : QWidget(parent) 0024 , m_d(new Private) 0025 { 0026 setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); 0027 0028 QHBoxLayout *mainLayout = new QHBoxLayout; 0029 mainLayout->setSpacing(0); 0030 mainLayout->setContentsMargins(0, 0, 0, 0); 0031 mainLayout->addStretch(); 0032 setLayout(mainLayout); 0033 0034 m_d->buttonGroup = new QButtonGroup(this); 0035 m_d->buttonGroup->setExclusive(true); 0036 0037 connect( 0038 m_d->buttonGroup, 0039 QOverload<QAbstractButton *, bool>::of(&QButtonGroup::buttonToggled), 0040 [this](QAbstractButton *button, bool checked) { 0041 emit buttonToggled(dynamic_cast<KoGroupButton *>(button), checked); 0042 emit buttonToggled(m_d->buttonGroup->id(button), checked); 0043 }); 0044 } 0045 0046 KisOptionButtonStrip::~KisOptionButtonStrip() 0047 { 0048 } 0049 0050 KoGroupButton *KisOptionButtonStrip::addButton(const QIcon &icon, 0051 const QString &text) 0052 { 0053 KoGroupButton *newButton = new KoGroupButton(this); 0054 newButton->setCheckable(true); 0055 newButton->setIcon(icon); 0056 newButton->setText(text); 0057 newButton->setMinimumSize(28, 28); 0058 0059 if (m_d->numberOfButtons > 0) { 0060 KoGroupButton *prevButton = dynamic_cast<KoGroupButton *>( 0061 m_d->buttonGroup->button(m_d->numberOfButtons - 1)); 0062 prevButton->setGroupPosition(m_d->numberOfButtons == 1 0063 ? KoGroupButton::GroupLeft 0064 : KoGroupButton::GroupCenter); 0065 newButton->setGroupPosition(KoGroupButton::GroupRight); 0066 } 0067 0068 m_d->buttonGroup->addButton(newButton, m_d->numberOfButtons); 0069 0070 QHBoxLayout *mainLayout = dynamic_cast<QHBoxLayout *>(layout()); 0071 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(mainLayout, newButton); 0072 mainLayout->insertWidget(m_d->numberOfButtons, newButton); 0073 0074 ++m_d->numberOfButtons; 0075 0076 return newButton; 0077 } 0078 0079 KoGroupButton *KisOptionButtonStrip::addButton(const QString &text) 0080 { 0081 return addButton(QIcon(), text); 0082 } 0083 0084 KoGroupButton *KisOptionButtonStrip::addButton() 0085 { 0086 return addButton(QIcon(), QString()); 0087 } 0088 0089 KoGroupButton *KisOptionButtonStrip::button(int index) const 0090 { 0091 return dynamic_cast<KoGroupButton *>(m_d->buttonGroup->button(index)); 0092 } 0093 0094 QList<KoGroupButton *> KisOptionButtonStrip::buttons() const 0095 { 0096 QList<KoGroupButton *> list; 0097 for (QAbstractButton *b : m_d->buttonGroup->buttons()) { 0098 list.append(dynamic_cast<KoGroupButton *>(b)); 0099 } 0100 return list; 0101 } 0102 0103 bool KisOptionButtonStrip::exclusive() const 0104 { 0105 return m_d->buttonGroup->exclusive(); 0106 } 0107 0108 void KisOptionButtonStrip::setExclusive(bool exclusive) 0109 { 0110 m_d->buttonGroup->setExclusive(exclusive); 0111 } 0112 0113 KoGroupButton *KisOptionButtonStrip::checkedButton() const 0114 { 0115 return dynamic_cast<KoGroupButton *>(m_d->buttonGroup->checkedButton()); 0116 } 0117 0118 int KisOptionButtonStrip::checkedButtonIndex() const 0119 { 0120 return m_d->buttonGroup->checkedId(); 0121 }