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