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