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 }