Krita Source Code Documentation
Loading...
Searching...
No Matches
KoAnchorSelectionWidget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <array>
10#include <QToolButton>
11#include <QButtonGroup>
12#include <QGridLayout>
13#include <QFontMetrics>
14#include "kis_icon_utils.h"
15
16#include "kis_debug.h"
17#include "kis_signals_blocker.h"
18#include "kis_algebra_2d.h"
19
20
21struct Q_DECL_HIDDEN KoAnchorSelectionWidget::Private {
22 std::array<QToolButton*, KoFlake::NumAnchorPositions> buttons;
23 QButtonGroup *buttonGroup;
24
25};
26
28 : QWidget(parent),
29 m_d(new Private)
30{
31 QVector<QIcon> icons;
32
33 icons << KisIconUtils::loadIcon("arrow-topleft");
34 icons << KisIconUtils::loadIcon("arrow-up");
35 icons << KisIconUtils::loadIcon("arrow-topright");
36 icons << KisIconUtils::loadIcon("arrow-left");
37 icons << QIcon(); // center
38 icons << KisIconUtils::loadIcon("arrow-right");
39 icons << KisIconUtils::loadIcon("arrow-downleft");
40 icons << KisIconUtils::loadIcon("arrow-down");
41 icons << KisIconUtils::loadIcon("arrow-downright");
42 icons << QIcon(); // no anchor
43
44 QGridLayout *gridLayout = new QGridLayout(this);
45 gridLayout->setSpacing(0);
46 gridLayout->setContentsMargins(0,0,0,0);
47
48 m_d->buttonGroup = new QButtonGroup(this);
49
50 for (int i = 0; i < KoFlake::NumAnchorPositions; i++) {
51 QToolButton *button = new QToolButton(this);
52 button->setCheckable(true);
53 //button->setAutoRaise(true);
54 button->setAutoExclusive(true);
55 button->setIcon(icons[i]);
56 button->setFocusPolicy(Qt::NoFocus);
57 button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
58
59 if (i != KoFlake::NoAnchor) {
60 gridLayout->addWidget(button, i / 3, i % 3, Qt::AlignCenter);
61 } else {
62 button->setVisible(false);
63 }
64
65 m_d->buttonGroup->addButton(button, i);
66 m_d->buttons[i] = button;
67 }
68
69 connect(m_d->buttonGroup, SIGNAL(idClicked(int)), SLOT(slotGroupClicked(int)));
70}
71
75
77{
78 return KoFlake::AnchorPosition(m_d->buttonGroup->checkedId());
79}
80
81QPointF KoAnchorSelectionWidget::value(const QRectF rect, bool *valid) const
82{
83 KoFlake::AnchorPosition anchor = this->value();
84 return anchorToPoint(anchor, rect, valid);
85}
86
88{
89 if (value == this->value()) return;
90
91 KisSignalsBlocker b(m_d->buttonGroup);
92
93 if (value >= 0) {
94 m_d->buttonGroup->button(int(value))->setChecked(true);
95 } else {
96 QAbstractButton *button = m_d->buttonGroup->checkedButton();
97 if (button) {
98 button->setChecked(false);
99 }
100 }
101
102 Q_EMIT valueChanged(value);
103}
104
106{
107 const QSize minSize = minimumSizeHint();
108 const int preferredHint = qMax(minSize.height(), height());
109 return QSize(preferredHint, preferredHint);
110}
111
113{
114 QFontMetrics metrics(this->font());
115 const int minHeight = 3 * (metrics.height() + 5);
116 return QSize(minHeight, minHeight);
117}
118
124
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
QString button(const QWheelEvent &ev)
QIcon loadIcon(const QString &name)
AnchorPosition
Definition KoFlake.h:85
@ NoAnchor
Definition KoFlake.h:95
@ NumAnchorPositions
Definition KoFlake.h:96
QScopedPointer< Private > m_d
std::array< QToolButton *, KoFlake::NumAnchorPositions > buttons
QSize minimumSizeHint() const override
KoFlake::AnchorPosition value() const
KoAnchorSelectionWidget(QWidget *parent=0)
void valueChanged(KoFlake::AnchorPosition id)
void setValue(KoFlake::AnchorPosition value)