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 }