File indexing completed on 2024-05-12 16:02:06

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "KoAnchorSelectionWidget.h"
0008 
0009 #include <array>
0010 #include <QToolButton>
0011 #include <QButtonGroup>
0012 #include <QGridLayout>
0013 #include <QFontMetrics>
0014 #include "kis_icon_utils.h"
0015 
0016 #include "kis_debug.h"
0017 #include "kis_signals_blocker.h"
0018 #include "kis_algebra_2d.h"
0019 
0020 
0021 struct Q_DECL_HIDDEN KoAnchorSelectionWidget::Private {
0022     std::array<QToolButton*, KoFlake::NumAnchorPositions> buttons;
0023     QButtonGroup *buttonGroup;
0024 
0025 };
0026 
0027 KoAnchorSelectionWidget::KoAnchorSelectionWidget(QWidget *parent)
0028     : QWidget(parent),
0029       m_d(new Private)
0030 {
0031     QVector<QIcon> icons;
0032 
0033     icons << KisIconUtils::loadIcon("arrow-topleft");
0034     icons << KisIconUtils::loadIcon("arrow-up");
0035     icons << KisIconUtils::loadIcon("arrow-topright");
0036     icons << KisIconUtils::loadIcon("arrow-left");
0037     icons << QIcon(); // center
0038     icons << KisIconUtils::loadIcon("arrow-right");
0039     icons << KisIconUtils::loadIcon("arrow-downleft");
0040     icons << KisIconUtils::loadIcon("arrow-down");
0041     icons << KisIconUtils::loadIcon("arrow-downright");
0042     icons << QIcon(); // no anchor
0043 
0044     QGridLayout *gridLayout = new QGridLayout(this);
0045     gridLayout->setSpacing(0);
0046     gridLayout->setContentsMargins(0,0,0,0);
0047 
0048     m_d->buttonGroup = new QButtonGroup(this);
0049 
0050     for (int i = 0; i < KoFlake::NumAnchorPositions; i++) {
0051         QToolButton *button = new QToolButton(this);
0052         button->setCheckable(true);
0053         //button->setAutoRaise(true);
0054         button->setAutoExclusive(true);
0055         button->setIcon(icons[i]);
0056         button->setFocusPolicy(Qt::NoFocus);
0057         button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
0058 
0059         if (i != KoFlake::NoAnchor) {
0060             gridLayout->addWidget(button, i / 3, i % 3, Qt::AlignCenter);
0061         } else {
0062             button->setVisible(false);
0063         }
0064 
0065         m_d->buttonGroup->addButton(button, i);
0066         m_d->buttons[i] = button;
0067     }
0068 
0069     connect(m_d->buttonGroup, SIGNAL(buttonClicked(int)), SLOT(slotGroupClicked(int)));
0070 }
0071 
0072 KoAnchorSelectionWidget::~KoAnchorSelectionWidget()
0073 {
0074 }
0075 
0076 KoFlake::AnchorPosition KoAnchorSelectionWidget::value() const
0077 {
0078     return KoFlake::AnchorPosition(m_d->buttonGroup->checkedId());
0079 }
0080 
0081 QPointF KoAnchorSelectionWidget::value(const QRectF rect, bool *valid) const
0082 {
0083     KoFlake::AnchorPosition anchor = this->value();
0084     return anchorToPoint(anchor, rect, valid);
0085 }
0086 
0087 void KoAnchorSelectionWidget::setValue(KoFlake::AnchorPosition value)
0088 {
0089     if (value == this->value()) return;
0090 
0091     KisSignalsBlocker b(m_d->buttonGroup);
0092 
0093     if (value >= 0) {
0094         m_d->buttonGroup->button(int(value))->setChecked(true);
0095     } else {
0096         QAbstractButton *button = m_d->buttonGroup->checkedButton();
0097         if (button) {
0098             button->setChecked(false);
0099         }
0100     }
0101 
0102     emit valueChanged(value);
0103 }
0104 
0105 QSize KoAnchorSelectionWidget::sizeHint() const
0106 {
0107     const QSize minSize = minimumSizeHint();
0108     const int preferredHint = qMax(minSize.height(), height());
0109     return QSize(preferredHint, preferredHint);
0110 }
0111 
0112 QSize KoAnchorSelectionWidget::minimumSizeHint() const
0113 {
0114     QFontMetrics metrics(this->font());
0115     const int minHeight = 3 * (metrics.height() + 5);
0116     return QSize(minHeight, minHeight);
0117 }
0118 
0119 void KoAnchorSelectionWidget::slotGroupClicked(int id)
0120 {
0121     KIS_SAFE_ASSERT_RECOVER_RETURN(id >= 0 && id < KoFlake::NumAnchorPositions);
0122     emit valueChanged(KoFlake::AnchorPosition(id));
0123 }
0124