Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_equalizer_widget.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <QMouseEvent>
10#include <QApplication>
11#include <QHBoxLayout>
12#include <QMenu>
13
14#include <klocalizedstring.h>
15
18
20
21#include "kis_debug.h"
22
24{
26 : maxDistance(0),
27 updateCompressor(300, KisSignalCompressor::FIRST_ACTIVE)
28 {
29 }
30
31 QMap<int, KisEqualizerColumn*> columns;
34 QMenu *contextMenu;
35};
36
37KisEqualizerWidget::KisEqualizerWidget(int maxDistance, QWidget *parent)
38 : QWidget(parent),
39 m_d(new Private)
40{
41 m_d->maxDistance = maxDistance;
42
43 QHBoxLayout *layout = new QHBoxLayout(this);
44 layout->setSpacing(0);
45 layout->setContentsMargins(0, 0, 0, 0);
46
47 for (int i = -m_d->maxDistance; i <= m_d->maxDistance; i++) {
48 KisEqualizerColumn *c = new KisEqualizerColumn(this, i, QString::number(i));
49 layout->addWidget(c, i == 0 ? 2 : 1);
50
51 if (i == m_d->maxDistance) {
52 c->setRightmost(true);
53 }
54
55 m_d->columns.insert(i, c);
56
57 connect(c, SIGNAL(sigColumnChanged(int,bool,int)),
58 &m_d->updateCompressor, SLOT(start()));
59 }
60
61 connect(&m_d->updateCompressor, SIGNAL(timeout()), SIGNAL(sigConfigChanged()));
62 connect(m_d->columns[0], SIGNAL(sigColumnChanged(int,bool,int)), this, SLOT(slotMasterColumnChanged(int,bool,int)));
63}
64
68
70{
72 v.maxDistance = m_d->maxDistance;
73
74 for (int i = -m_d->maxDistance; i <= m_d->maxDistance; i++) {
75 v.value.insert(i, m_d->columns[i]->value());
76 v.state.insert(i, m_d->columns[i]->state());
77 }
78
79 return v;
80}
81
83{
84 for (int i = -m_d->maxDistance; i <= m_d->maxDistance; i++) {
85 if (qAbs(i) <= v.maxDistance) {
86 m_d->columns[i]->setValue(v.value[i]);
87 m_d->columns[i]->setState(v.state[i]);
88 } else {
89 m_d->columns[i]->setState(false);
90 }
91 }
92}
93
95{
96 const bool currentState = m_d->columns[0]->state();
97 m_d->columns[0]->setState(!currentState);
98}
99
100void KisEqualizerWidget::resizeEvent(QResizeEvent *event)
101{
102 Q_UNUSED(event);
103 const QSize newSize = m_d->columns[1]->size();
104
105 QFont font =
107 QString::number(100), newSize);
108
109 if (font.pointSize() != this->font().pointSize()) {
110 setFont(font);
111
112 for (int i = -m_d->maxDistance; i <= m_d->maxDistance; i++) {
113 m_d->columns[i]->setFont(font);
114 }
115
116 }
117}
118
120{
121 if (!(ev->modifiers() & Qt::ShiftModifier)) return;
122
123 QPoint globalPos = ev->globalPos();
124 QWidget *w = qApp->widgetAt(globalPos);
125
126 if (w && w->inherits("QAbstractSlider")) {
127 QMouseEvent newEv(ev->type(),
128 w->mapFromGlobal(globalPos),
129 globalPos,
130 ev->button(),
131 ev->buttons(),
132 ev->modifiers() & ~Qt::ShiftModifier);
133 qApp->sendEvent(w, &newEv);
134 }
135}
136
137void KisEqualizerWidget::contextMenuEvent(QContextMenuEvent *event)
138{
140
141 if (!m_d->contextMenu) { // Lazy create and populate context menu.
142 m_d->contextMenu = new QMenu(this);
143
144 QAction *actReset = m_d->contextMenu->addAction(i18nc("Reset to default", "Reset"));
145 connect(actReset, &QAction::triggered, this, &KisEqualizerWidget::sigReset);
146 }
147
148 KIS_ASSERT_RECOVER_RETURN(m_d->contextMenu);
149
150 if (m_d->contextMenu) {
151 m_d->contextMenu->exec(QCursor::pos());
152 }
153}
154
156{
157 for (int i = 1; i <= m_d->maxDistance; i++) {
158 m_d->columns[i]->setForceDisabled(!state);
159 m_d->columns[-i]->setForceDisabled(!state);
160 }
161}
qreal v
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QFont getOnionSkinsFont(const QString &maxString, const QSize &availableSize) const
static KisAnimTimelineColors * instance()
void setRightmost(bool value)
void mouseMoveEvent(QMouseEvent *ev) override
KisEqualizerWidget(int maxDistance, QWidget *parent)
void contextMenuEvent(QContextMenuEvent *event) override
EqualizerValues getValues() const
void resizeEvent(QResizeEvent *event) override
void setValues(const EqualizerValues &values)
void slotMasterColumnChanged(int, bool, int)
const QScopedPointer< Private > m_d
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
QMap< int, KisEqualizerColumn * > columns