Skip to content

Commit b160a9f

Browse files
committed
Add timeline
1 parent d75a93f commit b160a9f

18 files changed

+769
-13
lines changed

src/plugins/visualeditor/core/ArrangementPanelInterface.cpp

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,108 @@
11
#include "ArrangementPanelInterface.h"
22
#include "ArrangementPanelInterface_p.h"
33

4+
#include <cmath>
5+
6+
#include <QQmlComponent>
7+
#include <QQuickItem>
8+
9+
#include <CoreApi/runtimeinterface.h>
10+
11+
#include <ScopicFlowCore/ScrollBehaviorViewModel.h>
12+
#include <ScopicFlowCore/TimeLayoutViewModel.h>
13+
#include <ScopicFlowCore/TimeViewModel.h>
14+
#include <ScopicFlowCore/TimelineInteractionController.h>
15+
416
#include <coreplugin/ProjectWindowInterface.h>
17+
#include <coreplugin/ProjectTimeline.h>
18+
19+
#include <visualeditor/ProjectViewModelContext.h>
20+
#include <visualeditor/internal/EditorPreference.h>
521

622
namespace VisualEditor {
723

24+
void ArrangementPanelInterfacePrivate::bindTimeViewModel() const {
25+
auto projectTimeline = windowHandle->projectTimeline();
26+
timeViewModel->setTimeline(projectTimeline->musicTimeline());
27+
timeViewModel->setEnd(projectTimeline->rangeHint());
28+
QObject::connect(projectTimeline, &Core::ProjectTimeline::rangeHintChanged, timeViewModel, [=, this] {
29+
timeViewModel->setEnd(projectTimeline->rangeHint());
30+
});
31+
QObject::connect(timeViewModel, &sflow::TimeViewModel::endChanged, projectTimeline, [=, this] {
32+
projectTimeline->setRangeHint(static_cast<int>(std::ceil(timeViewModel->end())));
33+
});
34+
}
35+
void ArrangementPanelInterfacePrivate::bindTimeLayoutViewModel() const {
36+
}
37+
void ArrangementPanelInterfacePrivate::bindTimelineInteractionController() const {
38+
}
39+
40+
static Qt::KeyboardModifier getModifier(Internal::EditorPreference::ScrollModifier modifier) {
41+
switch (modifier) {
42+
case Internal::EditorPreference::SM_Control:
43+
return Qt::ControlModifier;
44+
case Internal::EditorPreference::SM_Alt:
45+
return Qt::AltModifier;
46+
case Internal::EditorPreference::SM_Shift:
47+
return Qt::ShiftModifier;
48+
}
49+
Q_UNREACHABLE();
50+
}
51+
52+
void ArrangementPanelInterfacePrivate::bindScrollBehaviorViewModel() const {
53+
scrollBehaviorViewModel->setAlternateAxisModifier(getModifier(Internal::EditorPreference::alternateAxisModifier()));
54+
scrollBehaviorViewModel->setZoomModifier(getModifier(Internal::EditorPreference::zoomModifier()));
55+
scrollBehaviorViewModel->setPageModifier(getModifier(Internal::EditorPreference::pageModifier()));
56+
scrollBehaviorViewModel->setUsePageModifierAsAlternateAxisZoom(Internal::EditorPreference::usePageModifierAsAlternateAxisZoom());
57+
scrollBehaviorViewModel->setAutoScroll(Internal::EditorPreference::middleButtonAutoScroll());
58+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::alternateAxisModifierChanged, scrollBehaviorViewModel, [=, this] {
59+
scrollBehaviorViewModel->setAlternateAxisModifier(getModifier(Internal::EditorPreference::alternateAxisModifier()));
60+
});
61+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::zoomModifierChanged, scrollBehaviorViewModel, [=, this] {
62+
scrollBehaviorViewModel->setZoomModifier(getModifier(Internal::EditorPreference::zoomModifier()));
63+
});
64+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::pageModifierChanged, scrollBehaviorViewModel, [=, this] {
65+
scrollBehaviorViewModel->setPageModifier(getModifier(Internal::EditorPreference::pageModifier()));
66+
});
67+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::usePageModifierAsAlternateAxisZoomChanged, scrollBehaviorViewModel, [=, this] {
68+
scrollBehaviorViewModel->setUsePageModifierAsAlternateAxisZoom(Internal::EditorPreference::usePageModifierAsAlternateAxisZoom());
69+
});
70+
QObject::connect(Internal::EditorPreference::instance(), &Internal::EditorPreference::middleButtonAutoScrollChanged, scrollBehaviorViewModel, [=, this] {
71+
scrollBehaviorViewModel->setAutoScroll(Internal::EditorPreference::middleButtonAutoScroll());
72+
});
73+
}
74+
875
ArrangementPanelInterface::ArrangementPanelInterface(Core::ProjectWindowInterface *windowHandle) : QObject(windowHandle), d_ptr(new ArrangementPanelInterfacePrivate) {
976
Q_D(ArrangementPanelInterface);
1077
Q_ASSERT(windowHandle->getObjects(staticMetaObject.className()).isEmpty());
1178
windowHandle->addObject(staticMetaObject.className(), this);
1279
d->q_ptr = this;
1380
d->windowHandle = windowHandle;
81+
82+
d->timeViewModel = new sflow::TimeViewModel(this);
83+
d->timeLayoutViewModel = new sflow::TimeLayoutViewModel(this);
84+
d->timelineInteractionController = new sflow::TimelineInteractionController(this);
85+
d->scrollBehaviorViewModel = new sflow::ScrollBehaviorViewModel(this);
86+
87+
QQmlComponent component(Core::RuntimeInterface::qmlEngine(), "DiffScope.VisualEditor", "ArrangementView");
88+
if (component.isError()) {
89+
qFatal() << component.errorString();
90+
}
91+
auto o = component.createWithInitialProperties({
92+
{"arrangementPanelInterface", QVariant::fromValue(this)},
93+
{"projectViewModelContext", QVariant::fromValue(ProjectViewModelContext::of(d->windowHandle))},
94+
});
95+
if (component.isError()) {
96+
qFatal() << component.errorString();
97+
}
98+
o->setParent(this);
99+
d->arrangementView = qobject_cast<QQuickItem *>(o);
100+
Q_ASSERT(d->arrangementView);
101+
102+
d->bindTimeViewModel();
103+
d->bindTimeLayoutViewModel();
104+
d->bindTimelineInteractionController();
105+
d->bindScrollBehaviorViewModel();
14106
}
15107

16108
ArrangementPanelInterface::~ArrangementPanelInterface() = default;
@@ -19,6 +111,33 @@ namespace VisualEditor {
19111
return qobject_cast<ArrangementPanelInterface *>(windowHandle->getFirstObject(staticMetaObject.className()));
20112
}
21113

114+
Core::ProjectWindowInterface *ArrangementPanelInterface::windowHandle() const {
115+
Q_D(const ArrangementPanelInterface);
116+
return d->windowHandle;
117+
}
118+
119+
sflow::TimeViewModel *ArrangementPanelInterface::timeViewModel() const {
120+
Q_D(const ArrangementPanelInterface);
121+
return d->timeViewModel;
122+
}
123+
sflow::TimeLayoutViewModel *ArrangementPanelInterface::timeLayoutViewModel() const {
124+
Q_D(const ArrangementPanelInterface);
125+
return d->timeLayoutViewModel;
126+
}
127+
sflow::ScrollBehaviorViewModel *ArrangementPanelInterface::scrollBehaviorViewModel() const {
128+
Q_D(const ArrangementPanelInterface);
129+
return d->scrollBehaviorViewModel;
130+
}
131+
sflow::TimelineInteractionController *ArrangementPanelInterface::timelineInteractionController() const {
132+
Q_D(const ArrangementPanelInterface);
133+
return d->timelineInteractionController;
134+
}
135+
136+
QQuickItem *ArrangementPanelInterface::arrangementView() const {
137+
Q_D(const ArrangementPanelInterface);
138+
return d->arrangementView;
139+
}
140+
22141
}
23142

24143
#include "moc_ArrangementPanelInterface.cpp"

src/plugins/visualeditor/core/ArrangementPanelInterface.h

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,61 @@
22
#define DIFFSCOPE_VISUALEDITOR_ARRANGEMENTPANELINTERFACE_H
33

44
#include <QObject>
5+
#include <qqmlintegration.h>
56

67
#include <visualeditor/visualeditorglobal.h>
78

9+
class QQuickItem;
10+
11+
namespace sflow {
12+
class TimeViewModel;
13+
class TimeLayoutViewModel;
14+
class TimelineInteractionController;
15+
class ScrollBehaviorViewModel;
16+
}
17+
818
namespace Core {
919
class ProjectWindowInterface;
1020
}
1121

1222
namespace VisualEditor {
1323

24+
namespace Internal {
25+
class ArrangementAddOn;
26+
}
27+
1428
class ArrangementPanelInterfacePrivate;
1529

1630
class VISUAL_EDITOR_EXPORT ArrangementPanelInterface : public QObject {
1731
Q_OBJECT
32+
QML_ELEMENT
33+
QML_UNCREATABLE("")
1834
Q_DECLARE_PRIVATE(ArrangementPanelInterface)
35+
Q_PROPERTY(Core::ProjectWindowInterface *windowHandle READ windowHandle CONSTANT)
36+
Q_PROPERTY(sflow::TimeViewModel *timeViewModel READ timeViewModel CONSTANT)
37+
Q_PROPERTY(sflow::TimeLayoutViewModel *timeLayoutViewModel READ timeLayoutViewModel CONSTANT)
38+
Q_PROPERTY(sflow::ScrollBehaviorViewModel *scrollBehaviorViewModel READ scrollBehaviorViewModel CONSTANT)
39+
Q_PROPERTY(sflow::TimelineInteractionController *timelineInteractionController READ timelineInteractionController CONSTANT)
40+
Q_PROPERTY(QQuickItem *arrangementView READ arrangementView CONSTANT)
1941

2042
public:
21-
explicit ArrangementPanelInterface(Core::ProjectWindowInterface *windowHandle);
2243
~ArrangementPanelInterface() override;
2344

2445
static ArrangementPanelInterface *of(const Core::ProjectWindowInterface *windowHandle);
2546

47+
Core::ProjectWindowInterface *windowHandle() const;
48+
49+
sflow::TimeViewModel *timeViewModel() const;
50+
sflow::TimeLayoutViewModel *timeLayoutViewModel() const;
51+
sflow::ScrollBehaviorViewModel *scrollBehaviorViewModel() const;
52+
sflow::TimelineInteractionController *timelineInteractionController() const;
53+
54+
QQuickItem *arrangementView() const;
55+
2656
private:
57+
friend class Internal::ArrangementAddOn;
2758
QScopedPointer<ArrangementPanelInterfacePrivate> d_ptr;
59+
explicit ArrangementPanelInterface(Core::ProjectWindowInterface *windowHandle);
2860
};
2961

3062
}

src/plugins/visualeditor/core/ArrangementPanelInterface_p.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ namespace VisualEditor {
1111
ArrangementPanelInterface *q_ptr;
1212

1313
Core::ProjectWindowInterface *windowHandle;
14+
sflow::TimeViewModel *timeViewModel;
15+
sflow::TimeLayoutViewModel *timeLayoutViewModel;
16+
sflow::TimelineInteractionController *timelineInteractionController;
17+
sflow::ScrollBehaviorViewModel *scrollBehaviorViewModel;
18+
19+
QQuickItem *arrangementView;
20+
21+
void bindTimeViewModel() const;
22+
void bindTimeLayoutViewModel() const;
23+
void bindTimelineInteractionController() const;
24+
void bindScrollBehaviorViewModel() const;
1425
};
1526

1627
}

src/plugins/visualeditor/core/ProjectViewModelContext.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010

1111
namespace VisualEditor {
1212

13-
static void bindProjectTimeLineToViewModel(Core::ProjectTimeline *projectTimeline, sflow::PlaybackViewModel *playbackViewModel) {
13+
void ProjectViewModelContextPrivate::bindPlaybackViewModel() const {
14+
auto projectTimeline = windowHandle->projectTimeline();
1415
QObject::connect(projectTimeline, &Core::ProjectTimeline::positionChanged, playbackViewModel, [=] {
1516
playbackViewModel->setPrimaryPosition(projectTimeline->position());
1617
});
@@ -34,7 +35,8 @@ namespace VisualEditor {
3435
d->q_ptr = this;
3536
d->windowHandle = windowHandle;
3637
d->playbackViewModel = new sflow::PlaybackViewModel(this);
37-
bindProjectTimeLineToViewModel(windowHandle->projectTimeline(), d->playbackViewModel);
38+
39+
d->bindPlaybackViewModel();
3840
}
3941

4042
ProjectViewModelContext::~ProjectViewModelContext() = default;
@@ -43,6 +45,11 @@ namespace VisualEditor {
4345
return qobject_cast<ProjectViewModelContext *>(windowHandle->getFirstObject(staticMetaObject.className()));
4446
}
4547

48+
Core::ProjectWindowInterface *ProjectViewModelContext::windowHandle() const {
49+
Q_D(const ProjectViewModelContext);
50+
return d->windowHandle;
51+
}
52+
4653
sflow::PlaybackViewModel *ProjectViewModelContext::playbackViewModel() const {
4754
Q_D(const ProjectViewModelContext);
4855
return d->playbackViewModel;

src/plugins/visualeditor/core/ProjectViewModelContext.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define DIFFSCOPE_COREPLUGIN_PROJECTVIEWMODELCONTEXT_H
33

44
#include <QObject>
5+
#include <qqmlintegration.h>
56

67
#include <visualeditor/visualeditorglobal.h>
78

@@ -15,22 +16,32 @@ namespace Core {
1516

1617
namespace VisualEditor {
1718

19+
namespace Internal {
20+
class ProjectAddOn;
21+
}
22+
1823
class ProjectViewModelContextPrivate;
1924

2025
class VISUAL_EDITOR_EXPORT ProjectViewModelContext : public QObject {
2126
Q_OBJECT
27+
QML_ELEMENT
28+
QML_UNCREATABLE("")
2229
Q_DECLARE_PRIVATE(ProjectViewModelContext)
30+
Q_PROPERTY(Core::ProjectWindowInterface *windowHandle READ windowHandle CONSTANT)
2331
Q_PROPERTY(sflow::PlaybackViewModel *playbackViewModel READ playbackViewModel CONSTANT)
2432

2533
public:
26-
explicit ProjectViewModelContext(Core::ProjectWindowInterface *windowHandle);
2734
~ProjectViewModelContext() override;
2835

2936
static ProjectViewModelContext *of(const Core::ProjectWindowInterface *windowHandle);
3037

38+
Core::ProjectWindowInterface *windowHandle() const;
39+
3140
sflow::PlaybackViewModel *playbackViewModel() const;
3241

3342
private:
43+
friend class Internal::ProjectAddOn;
44+
explicit ProjectViewModelContext(Core::ProjectWindowInterface *windowHandle);
3445
QScopedPointer<ProjectViewModelContextPrivate> d_ptr;
3546
};
3647

src/plugins/visualeditor/core/ProjectViewModelContext_p.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ namespace VisualEditor {
1212

1313
Core::ProjectWindowInterface *windowHandle;
1414
sflow::PlaybackViewModel *playbackViewModel;
15-
};
1615

16+
void bindPlaybackViewModel() const;
17+
};
1718
}
1819

1920
#endif //DIFFSCOPE_COREPLUGIN_PROJECTVIEWMODELCONTEXT_P_H

0 commit comments

Comments
 (0)