Skip to content

Commit b595ea0

Browse files
committed
Add Mixer
1 parent 2e87df6 commit b595ea0

24 files changed

+1149
-14
lines changed
File renamed without changes.

src/libs/application/dspxmodel/src/Master.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,51 @@ namespace dspx {
1616
public:
1717
Master *q_ptr;
1818
ModelPrivate *pModel;
19+
Handle handle;
1920
BusControl *control;
21+
bool multiChannelOutput{};
2022
};
2123

2224
Master::Master(Model *model) : QObject(model), d_ptr(new MasterPrivate) {
2325
Q_D(Master);
2426
d->q_ptr = this;
2527
d->pModel = ModelPrivate::get(model);
28+
d->handle = model->handle();
2629
d->control = d->pModel->createObject<BusControl>(model->handle());
2730
}
2831
void Master::handleProxySetEntityProperty(int property, const QVariant &value) {
2932
Q_D(Master);
30-
ModelPrivate::proxySetEntityPropertyNotify(d->control, property, value);
33+
switch (property) {
34+
case ModelStrategy::P_ControlGain:
35+
case ModelStrategy::P_ControlPan:
36+
case ModelStrategy::P_ControlMute: {
37+
ModelPrivate::proxySetEntityPropertyNotify(d->control, property, value);
38+
break;
39+
}
40+
case ModelStrategy::P_MultiChannelOutput: {
41+
d->multiChannelOutput = value.toBool();
42+
Q_EMIT multiChannelOutputChanged(d->multiChannelOutput);
43+
break;
44+
}
45+
default:
46+
Q_UNREACHABLE();
47+
}
48+
3149
}
3250
Master::~Master() = default;
3351

3452
BusControl *Master::control() const {
3553
Q_D(const Master);
3654
return d->control;
3755
}
56+
bool Master::multiChannelOutput() const {
57+
Q_D(const Master);
58+
return d->multiChannelOutput;
59+
}
60+
void Master::setMultiChannelOutput(bool multiChannelOutput) {
61+
Q_D(Master);
62+
d->pModel->strategy->setEntityProperty(d->handle, ModelStrategy::P_MultiChannelOutput, multiChannelOutput);
63+
}
3864

3965
QDspx::Master Master::toQDspx() const {
4066
return {

src/libs/application/dspxmodel/src/Master.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#ifndef DIFFSCOPE_DSPX_MODEL_MASTER_H
22
#define DIFFSCOPE_DSPX_MODEL_MASTER_H
33

4+
#include <QObject>
45
#include <qqmlintegration.h>
56

6-
#include <QObject>
7+
#include <dspxmodel/DspxModelGlobal.h>
78

89
namespace QDspx {
910
struct Master;
@@ -19,21 +20,27 @@ namespace dspx {
1920

2021
class MasterPrivate;
2122

22-
class Master : public QObject {
23+
class DSPX_MODEL_EXPORT Master : public QObject {
2324
Q_OBJECT
2425
QML_ELEMENT
2526
QML_UNCREATABLE("")
2627
Q_DECLARE_PRIVATE(Master)
2728
Q_PROPERTY(BusControl *control READ control CONSTANT)
28-
29+
Q_PROPERTY(bool multiChannelOutput READ multiChannelOutput WRITE setMultiChannelOutput NOTIFY multiChannelOutputChanged)
2930
public:
3031
~Master() override;
3132

3233
BusControl *control() const;
3334

35+
bool multiChannelOutput() const;
36+
void setMultiChannelOutput(bool multiChannelOutput);
37+
3438
QDspx::Master toQDspx() const;
3539
void fromQDspx(const QDspx::Master &master);
3640

41+
Q_SIGNALS:
42+
void multiChannelOutputChanged(bool multiChannelOutput);
43+
3744
private:
3845
friend class ModelPrivate;
3946
explicit Master(Model *model);

src/libs/application/dspxmodel/src/Model.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ namespace dspx {
225225
{"enabled", timeline()->isLoopEnabled()},
226226
{"start", timeline()->loopStart()},
227227
{"length", timeline()->loopLength()},
228+
}},
229+
{"master", QJsonObject{
230+
{"multiChannelOutput", master()->multiChannelOutput()}
228231
}}
229232
};
230233
return model;
@@ -252,6 +255,10 @@ namespace dspx {
252255
d->timeline->setLoopLength(length);
253256
}
254257
}
258+
{
259+
auto master = model.content.workspace.value("diffscope").value("master").toObject();
260+
d->master->setMultiChannelOutput(master.value("multiChannelOutput").toBool());
261+
}
255262
}
256263

257264
Label *Model::createLabel() {
@@ -376,7 +383,8 @@ namespace dspx {
376383
}
377384
case ModelStrategy::P_ControlGain:
378385
case ModelStrategy::P_ControlPan:
379-
case ModelStrategy::P_ControlMute: {
386+
case ModelStrategy::P_ControlMute:
387+
case ModelStrategy::P_MultiChannelOutput: {
380388
ModelPrivate::proxySetEntityPropertyNotify(d->master, property, value);
381389
break;
382390
}

src/libs/application/dspxmodel/src/ModelStrategy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ namespace dspx {
7575
P_LoopLength,
7676
P_LoopStart,
7777
P_Measure,
78+
P_MultiChannelOutput,
7879
P_Name,
7980
P_Numerator,
8081
P_Onset,
@@ -290,6 +291,7 @@ namespace dspx {
290291
{P_ControlGain, QMetaType::Double},
291292
{P_ControlPan, QMetaType::Double, validatePan},
292293
{P_ControlMute, QMetaType::Bool},
294+
{P_MultiChannelOutput, QMetaType::Bool},
293295
{P_LoopEnabled, QMetaType::Bool},
294296
{P_LoopStart, QMetaType::Int, validateIntGreaterOrEqualZero},
295297
{P_LoopLength, QMetaType::Int, validateIntGreaterZero},
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
#include "MixerPanelInterface.h"
2+
#include "MixerPanelInterface_p.h"
3+
4+
#include <QQmlComponent>
5+
#include <QQuickItem>
6+
#include <QVariant>
7+
8+
#include <CoreApi/runtimeinterface.h>
9+
10+
#include <ScopicFlowCore/ScrollBehaviorViewModel.h>
11+
#include <ScopicFlowCore/TrackListInteractionController.h>
12+
#include <ScopicFlowCore/TrackListLayoutViewModel.h>
13+
14+
#include <coreplugin/ProjectWindowInterface.h>
15+
16+
#include <visualeditor/ProjectViewModelContext.h>
17+
#include <visualeditor/internal/MixerAddOn.h>
18+
#include <visualeditor/internal/EditorPreference.h>
19+
20+
namespace VisualEditor {
21+
22+
static Qt::KeyboardModifier getModifier(Internal::EditorPreference::ScrollModifier modifier) {
23+
switch (modifier) {
24+
case Internal::EditorPreference::SM_Control:
25+
return Qt::ControlModifier;
26+
case Internal::EditorPreference::SM_Alt:
27+
return Qt::AltModifier;
28+
case Internal::EditorPreference::SM_Shift:
29+
return Qt::ShiftModifier;
30+
}
31+
Q_UNREACHABLE();
32+
}
33+
34+
static sflow::ScrollBehaviorViewModel::ScrollTypes getScrollTypes(MixerPanelInterface::Tool tool) {
35+
if (tool == MixerPanelInterface::HandTool) {
36+
return sflow::ScrollBehaviorViewModel::Wheel | sflow::ScrollBehaviorViewModel::Pinch | sflow::ScrollBehaviorViewModel::MiddleButton | sflow::ScrollBehaviorViewModel::LeftButton;
37+
}
38+
return sflow::ScrollBehaviorViewModel::Wheel | sflow::ScrollBehaviorViewModel::Pinch | sflow::ScrollBehaviorViewModel::MiddleButton;
39+
}
40+
41+
void MixerPanelInterfacePrivate::bindScrollBehaviorViewModel() const {
42+
Q_Q(const MixerPanelInterface);
43+
scrollBehaviorViewModel->setAlternateAxisModifier(getModifier(Internal::EditorPreference::alternateAxisModifier()));
44+
scrollBehaviorViewModel->setZoomModifier(getModifier(Internal::EditorPreference::zoomModifier()));
45+
scrollBehaviorViewModel->setPageModifier(getModifier(Internal::EditorPreference::pageModifier()));
46+
scrollBehaviorViewModel->setUsePageModifierAsAlternateAxisZoom(Internal::EditorPreference::usePageModifierAsAlternateAxisZoom());
47+
scrollBehaviorViewModel->setAutoScroll(Internal::EditorPreference::middleButtonAutoScroll());
48+
49+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::alternateAxisModifierChanged, scrollBehaviorViewModel, [=, this] {
50+
scrollBehaviorViewModel->setAlternateAxisModifier(getModifier(Internal::EditorPreference::alternateAxisModifier()));
51+
});
52+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::zoomModifierChanged, scrollBehaviorViewModel, [=, this] {
53+
scrollBehaviorViewModel->setZoomModifier(getModifier(Internal::EditorPreference::zoomModifier()));
54+
});
55+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::pageModifierChanged, scrollBehaviorViewModel, [=, this] {
56+
scrollBehaviorViewModel->setPageModifier(getModifier(Internal::EditorPreference::pageModifier()));
57+
});
58+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::usePageModifierAsAlternateAxisZoomChanged, scrollBehaviorViewModel, [=, this] {
59+
scrollBehaviorViewModel->setUsePageModifierAsAlternateAxisZoom(Internal::EditorPreference::usePageModifierAsAlternateAxisZoom());
60+
});
61+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::middleButtonAutoScrollChanged, scrollBehaviorViewModel, [=, this] {
62+
scrollBehaviorViewModel->setAutoScroll(Internal::EditorPreference::middleButtonAutoScroll());
63+
});
64+
65+
scrollBehaviorViewModel->setScrollTypes(getScrollTypes(tool));
66+
QObject::connect(q, &MixerPanelInterface::toolChanged, scrollBehaviorViewModel, [=, this] {
67+
scrollBehaviorViewModel->setScrollTypes(getScrollTypes(tool));
68+
});
69+
}
70+
71+
MixerPanelInterface::MixerPanelInterface(Internal::MixerAddOn *addOn, Core::ProjectWindowInterface *windowHandle) : QObject(windowHandle), d_ptr(new MixerPanelInterfacePrivate) {
72+
Q_D(MixerPanelInterface);
73+
Q_ASSERT(windowHandle->getObjects(staticMetaObject.className()).isEmpty());
74+
windowHandle->addObject(staticMetaObject.className(), this);
75+
d->q_ptr = this;
76+
d->windowHandle = windowHandle;
77+
d->addon = addOn;
78+
79+
d->trackListLayoutViewModel = new sflow::TrackListLayoutViewModel(this);
80+
d->masterTrackListLayoutViewModel = new sflow::TrackListLayoutViewModel(this);
81+
d->scrollBehaviorViewModel = new sflow::ScrollBehaviorViewModel(this);
82+
d->trackListInteractionController = ProjectViewModelContext::of(d->windowHandle)->createAndBindTrackListInteractionController();
83+
d->masterTrackListInteractionController = ProjectViewModelContext::of(d->windowHandle)->createAndBindTrackListInteractionControllerOfMaster();
84+
85+
QQmlComponent component(Core::RuntimeInterface::qmlEngine(), "DiffScope.VisualEditor", "MixerView");
86+
if (component.isError()) {
87+
qFatal() << component.errorString();
88+
}
89+
auto o = component.createWithInitialProperties({
90+
{"addOn", QVariant::fromValue(d->addon)},
91+
{"mixerPanelInterface", QVariant::fromValue(this)}
92+
});
93+
if (component.isError()) {
94+
qFatal() << component.errorString();
95+
}
96+
o->setParent(this);
97+
d->mixerView = qobject_cast<QQuickItem *>(o);
98+
Q_ASSERT(d->mixerView);
99+
100+
d->bindScrollBehaviorViewModel();
101+
}
102+
103+
MixerPanelInterface::~MixerPanelInterface() = default;
104+
105+
MixerPanelInterface *MixerPanelInterface::of(const Core::ProjectWindowInterface *windowHandle) {
106+
return qobject_cast<MixerPanelInterface *>(windowHandle->getFirstObject(staticMetaObject.className()));
107+
}
108+
109+
Core::ProjectWindowInterface *MixerPanelInterface::windowHandle() const {
110+
Q_D(const MixerPanelInterface);
111+
return d->windowHandle;
112+
}
113+
114+
sflow::TrackListLayoutViewModel *MixerPanelInterface::trackListLayoutViewModel() const {
115+
Q_D(const MixerPanelInterface);
116+
return d->trackListLayoutViewModel;
117+
}
118+
119+
sflow::TrackListLayoutViewModel *MixerPanelInterface::masterTrackListLayoutViewModel() const {
120+
Q_D(const MixerPanelInterface);
121+
return d->masterTrackListLayoutViewModel;
122+
}
123+
124+
sflow::ScrollBehaviorViewModel *MixerPanelInterface::scrollBehaviorViewModel() const {
125+
Q_D(const MixerPanelInterface);
126+
return d->scrollBehaviorViewModel;
127+
}
128+
129+
sflow::TrackListInteractionController *MixerPanelInterface::trackListInteractionController() const {
130+
Q_D(const MixerPanelInterface);
131+
return d->trackListInteractionController;
132+
}
133+
134+
sflow::TrackListInteractionController *MixerPanelInterface::masterTrackListInteractionController() const {
135+
Q_D(const MixerPanelInterface);
136+
return d->masterTrackListInteractionController;
137+
}
138+
139+
QQuickItem *MixerPanelInterface::mixerView() const {
140+
Q_D(const MixerPanelInterface);
141+
return d->mixerView;
142+
}
143+
144+
MixerPanelInterface::Tool MixerPanelInterface::tool() const {
145+
Q_D(const MixerPanelInterface);
146+
return d->tool;
147+
}
148+
149+
void MixerPanelInterface::setTool(Tool tool) {
150+
Q_D(MixerPanelInterface);
151+
if (d->tool != tool) {
152+
d->tool = tool;
153+
Q_EMIT toolChanged();
154+
}
155+
}
156+
157+
}
158+
159+
#include "moc_MixerPanelInterface.cpp"
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#ifndef DIFFSCOPE_VISUALEDITOR_MIXERPANELINTERFACE_H
2+
#define DIFFSCOPE_VISUALEDITOR_MIXERPANELINTERFACE_H
3+
4+
#include <QObject>
5+
#include <qqmlintegration.h>
6+
7+
#include <visualeditor/visualeditorglobal.h>
8+
9+
class QQuickItem;
10+
11+
namespace sflow {
12+
class ScrollBehaviorViewModel;
13+
class TrackListLayoutViewModel;
14+
class TrackListInteractionController;
15+
}
16+
17+
namespace Core {
18+
class ProjectWindowInterface;
19+
}
20+
21+
namespace VisualEditor {
22+
23+
namespace Internal {
24+
class MixerAddOn;
25+
}
26+
27+
class MixerPanelInterfacePrivate;
28+
29+
class VISUAL_EDITOR_EXPORT MixerPanelInterface : public QObject {
30+
Q_OBJECT
31+
QML_ELEMENT
32+
QML_UNCREATABLE("")
33+
Q_DECLARE_PRIVATE(MixerPanelInterface)
34+
Q_PROPERTY(Core::ProjectWindowInterface *windowHandle READ windowHandle CONSTANT)
35+
Q_PROPERTY(sflow::TrackListLayoutViewModel *trackListLayoutViewModel READ trackListLayoutViewModel CONSTANT)
36+
Q_PROPERTY(sflow::TrackListLayoutViewModel *masterTrackListLayoutViewModel READ masterTrackListLayoutViewModel CONSTANT)
37+
Q_PROPERTY(sflow::ScrollBehaviorViewModel *scrollBehaviorViewModel READ scrollBehaviorViewModel CONSTANT)
38+
Q_PROPERTY(sflow::TrackListInteractionController *trackListInteractionController READ trackListInteractionController CONSTANT)
39+
Q_PROPERTY(sflow::TrackListInteractionController *masterTrackListInteractionController READ masterTrackListInteractionController CONSTANT)
40+
Q_PROPERTY(QQuickItem *mixerView READ mixerView CONSTANT)
41+
Q_PROPERTY(Tool tool READ tool WRITE setTool NOTIFY toolChanged)
42+
43+
public:
44+
~MixerPanelInterface() override;
45+
46+
static MixerPanelInterface *of(const Core::ProjectWindowInterface *windowHandle);
47+
48+
Core::ProjectWindowInterface *windowHandle() const;
49+
50+
sflow::TrackListLayoutViewModel *trackListLayoutViewModel() const;
51+
sflow::TrackListLayoutViewModel *masterTrackListLayoutViewModel() const;
52+
sflow::ScrollBehaviorViewModel *scrollBehaviorViewModel() const;
53+
sflow::TrackListInteractionController *trackListInteractionController() const;
54+
sflow::TrackListInteractionController *masterTrackListInteractionController() const;
55+
56+
QQuickItem *mixerView() const;
57+
58+
enum Tool {
59+
PointerTool,
60+
HandTool,
61+
};
62+
Q_ENUM(Tool)
63+
Tool tool() const;
64+
void setTool(Tool tool);
65+
66+
Q_SIGNALS:
67+
void toolChanged();
68+
69+
private:
70+
friend class Internal::MixerAddOn;
71+
explicit MixerPanelInterface(Internal::MixerAddOn *addOn, Core::ProjectWindowInterface *windowHandle);
72+
QScopedPointer<MixerPanelInterfacePrivate> d_ptr;
73+
};
74+
75+
}
76+
77+
#endif //DIFFSCOPE_VISUALEDITOR_MIXERPANELINTERFACE_H

0 commit comments

Comments
 (0)