1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#include "widget/weffectpushbutton.h"
#include <QtDebug>
#include "moc_weffectpushbutton.cpp"
#include "widget/effectwidgetutils.h"
WEffectPushButton::WEffectPushButton(QWidget* pParent, EffectsManager* pEffectsManager)
: WPushButton(pParent),
m_pEffectsManager(pEffectsManager),
m_pButtonMenu(nullptr) {
setFocusPolicy(Qt::NoFocus);
}
void WEffectPushButton::setup(const QDomNode& node, const SkinContext& context) {
// Setup parent class.
WPushButton::setup(node, context);
auto pChainSlot = EffectWidgetUtils::getEffectChainFromNode(
node, context, m_pEffectsManager);
auto pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode(node, context, pChainSlot);
m_pEffectParameterSlot = EffectWidgetUtils::getButtonParameterSlotFromNode(
node, context, pEffectSlot);
connect(m_pEffectParameterSlot.data(),
&EffectParameterSlotBase::updated,
this,
&WEffectPushButton::parameterUpdated);
m_pButtonMenu = new QMenu(this);
connect(m_pButtonMenu,
&QMenu::triggered,
this,
&WEffectPushButton::slotActionChosen);
parameterUpdated();
VERIFY_OR_DEBUG_ASSERT(m_pEffectParameterSlot) {
SKIN_WARNING(node, context) << "Could not find effect parameter slot";
}
}
void WEffectPushButton::onConnectedControlChanged(double dParameter, double dValue) {
const QList<QAction*> actions = m_pButtonMenu->actions();
for (const auto& action : actions) {
if (action->data().toDouble() == dValue) {
action->setChecked(true);
break;
}
}
WPushButton::onConnectedControlChanged(dParameter, dValue);
}
void WEffectPushButton::mousePressEvent(QMouseEvent* e) {
const bool rightClick = e->button() == Qt::RightButton;
if (rightClick && m_pButtonMenu->actions().size()) {
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
m_pButtonMenu->exec(e->globalPosition().toPoint());
#else
m_pButtonMenu->exec(e->globalPos());
#endif
return;
}
// Pass all other press events to the base class.
WPushButton::mousePressEvent(e);
// The push handler may have set the left value. Check the corresponding
// QAction.
const double leftValue = getControlParameterLeft();
const QList<QAction*> actions = m_pButtonMenu->actions();
for (const auto& action : actions) {
if (action->data().toDouble() == leftValue) {
action->setChecked(true);
break;
}
}
}
void WEffectPushButton::mouseReleaseEvent(QMouseEvent* e) {
// Pass all other release events to the base class.
WPushButton::mouseReleaseEvent(e);
// The release handler may have set the left value. Check the corresponding
// QAction.
const double leftValue = getControlParameterLeft();
const QList<QAction*> actions = m_pButtonMenu->actions();
for (QAction* action : actions) {
if (action->data().toDouble() == leftValue) {
action->setChecked(true);
break;
}
}
}
void WEffectPushButton::parameterUpdated() {
VERIFY_OR_DEBUG_ASSERT(m_pEffectParameterSlot) {
return;
}
// Set tooltip
if (m_pEffectParameterSlot->isLoaded()) {
setBaseTooltip(QString("%1\n%2").arg(
m_pEffectParameterSlot->name(),
m_pEffectParameterSlot->description()));
} else {
// The button should be hidden by the skin when the buttonparameterX_loaded
// ControlObject indicates no parameter is loaded, so this tooltip should
// never be shown.
setBaseTooltip("");
}
m_pButtonMenu->clear();
EffectManifestParameterPointer pManifest = m_pEffectParameterSlot->getManifest();
QList<QPair<QString, double>> options;
if (pManifest) {
options = pManifest->getSteps();
}
// qDebug() << " HERE IS THE OPTIONS SIZE: " << options.size() << m_pEffectParameterSlot->getManifest().name();
m_iNoStates = options.size();
if (m_iNoStates == 0) {
// Toggle button without a menu
m_iNoStates = 2;
return;
}
double value = getControlParameterLeft();
auto* actionGroup = new QActionGroup(m_pButtonMenu);
actionGroup->setExclusive(true);
for (const auto& option : qAsConst(options)) {
// action is added automatically to actionGroup
auto* action = new QAction(actionGroup);
// qDebug() << options[i].first;
action->setText(option.first);
action->setData(option.second);
action->setCheckable(true);
if (option.second == value) {
action->setChecked(true);
}
m_pButtonMenu->addAction(action);
}
}
void WEffectPushButton::slotActionChosen(QAction* action) {
action->setChecked(true);
setControlParameter(action->data().toDouble());
}
|