summaryrefslogtreecommitdiffstats
path: root/src/widget/weffectpushbutton.cpp
blob: e94ef7f530c4dd68745fb484626f709af2d3fd6f (plain)
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());
}