summaryrefslogtreecommitdiffstats
path: root/src/control/controlobject.cpp
blob: 911693b75fcdad4297d5315537ecc8d6f36f3209 (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
#include "control/controlobject.h"

#include <QHash>
#include <QSet>
#include <QtDebug>

#include "control/control.h"
#include "moc_controlobject.cpp"
#include "util/stat.h"
#include "util/timer.h"

ControlObject::ControlObject()
        : m_pControl(ControlDoublePrivate::getDefaultControl()) {
}

ControlObject::ControlObject(const ConfigKey& key,
        bool bIgnoreNops,
        bool bTrack,
        bool bPersist,
        double defaultValue)
        : m_key(key) {
    // Don't bother looking up the control if key is invalid. Prevents log spew.
    if (m_key.isValid()) {
        m_pControl = ControlDoublePrivate::getControl(m_key,
                ControlFlag::None,
                this,
                bIgnoreNops,
                bTrack,
                bPersist,
                defaultValue);
    }

    // getControl can fail and return a NULL control even with the create flag.
    if (m_pControl) {
        connect(m_pControl.data(),
                &ControlDoublePrivate::valueChanged,
                this,
                &ControlObject::privateValueChanged,
                Qt::DirectConnection);
    } else {
        m_pControl = ControlDoublePrivate::getDefaultControl();
    }
}

ControlObject::~ControlObject() {
    DEBUG_ASSERT(m_pControl);
    const bool success = m_pControl->resetCreatorCO(this);
    Q_UNUSED(success);
    DEBUG_ASSERT(success);
}

// slot
void ControlObject::privateValueChanged(double dValue, QObject* pSender) {
    // Only emit valueChanged() if we did not originate this change.
    if (pSender != this) {
        emit valueChanged(dValue);
    }
}

// static
ControlObject* ControlObject::getControl(const ConfigKey& key, ControlFlags flags) {
    //qDebug() << "ControlObject::getControl for (" << key.group << "," << key.item << ")";
    QSharedPointer<ControlDoublePrivate> pCDP = ControlDoublePrivate::getControl(key, flags);
    if (pCDP) {
        return pCDP->getCreatorCO();
    }
    return nullptr;
}

bool ControlObject::exists(const ConfigKey& key) {
    return !ControlDoublePrivate::getControl(key, ControlFlag::NoWarnIfMissing).isNull();
}

void ControlObject::setValueFromMidi(MidiOpCode o, double v) {
    m_pControl->setValueFromMidi(o, v);
}

double ControlObject::getMidiParameter() const {
    return m_pControl->getMidiParameter();
}

// static
double ControlObject::get(const ConfigKey& key) {
    QSharedPointer<ControlDoublePrivate> pCop = ControlDoublePrivate::getControl(key);
    return pCop ? pCop->get() : 0.0;
}

double ControlObject::getParameter() const {
    return m_pControl->getParameter();
}

double ControlObject::getParameterForValue(double value) const {
    return m_pControl->getParameterForValue(value);
}

double ControlObject::getParameterForMidi(double midiParameter) const {
    return m_pControl->getParameterForMidi(midiParameter);
}

void ControlObject::setParameter(double v) {
    m_pControl->setParameter(v, this);
}

void ControlObject::setParameterFrom(double v, QObject* pSender) {
    m_pControl->setParameter(v, pSender);
}

// static
void ControlObject::set(const ConfigKey& key, const double& value) {
    QSharedPointer<ControlDoublePrivate> pCop = ControlDoublePrivate::getControl(key);
    if (pCop) {
        pCop->set(value, nullptr);
    }
}

void ControlObject::setReadOnly() {
    connectValueChangeRequest(this, &ControlObject::readOnlyHandler,
                              Qt::DirectConnection);
}

void ControlObject::readOnlyHandler(double v) {
    qWarning() << m_key << "is read-only. Ignoring set of value:" << v;
}