Loading...
Searching...
No Matches
PatternProperties.hpp
1#pragma once
2#include <Midi/Commands/CommandFactory.hpp>
3
4#include <score/command/Command.hpp>
5#include <score/command/PropertyCommand.hpp>
6#include <score/model/path/PathSerialization.hpp>
7
8#include <Patternist/PatternModel.hpp>
9namespace Patternist
10{
11inline auto& CommandFactoryName()
12{
13 return Midi::CommandFactoryName();
14}
15class UpdatePattern final : public score::Command
16{
17 SCORE_COMMAND_DECL(Midi::CommandFactoryName(), UpdatePattern, "Update a pattern")
18public:
19 UpdatePattern(const ProcessModel& model, int p, const Pattern& pat)
20 : m_model{model}
21 , m_id{p}
22 , m_old{model.patterns()[p]}
23 , m_new{pat}
24 {
25 }
26
27 void undo(const score::DocumentContext& ctx) const override
28 {
29 m_model.find(ctx).setPattern(m_id, m_old);
30 }
31
32 void redo(const score::DocumentContext& ctx) const override
33 {
34 m_model.find(ctx).setPattern(m_id, m_new);
35 }
36
37 void update(const ProcessModel& model, int p, const Pattern& pat) { m_new = pat; }
38
39protected:
40 void serializeImpl(DataStreamInput& s) const override
41 {
42 s << m_model << m_id << m_old << m_new;
43 }
44
45 void deserializeImpl(DataStreamOutput& s) override
46 {
47 s >> m_model >> m_id >> m_old >> m_new;
48 }
49
50private:
51 Path<ProcessModel> m_model;
52 int m_id{};
53 Pattern m_old;
54 Pattern m_new;
55};
56
57class UpdatePatterns final : public score::Command
58{
59 SCORE_COMMAND_DECL(Midi::CommandFactoryName(), UpdatePatterns, "Update patterns")
60public:
61 UpdatePatterns(const ProcessModel& model, std::vector<Pattern> pat)
62 : m_model{model}
63 , m_old{model.patterns()}
64 , m_new{std::move(pat)}
65 {
66 }
67
68 void undo(const score::DocumentContext& ctx) const override
69 {
70 m_model.find(ctx).setPatterns(m_old);
71 }
72
73 void redo(const score::DocumentContext& ctx) const override
74 {
75 m_model.find(ctx).setPatterns(m_new);
76 }
77
78protected:
79 void serializeImpl(DataStreamInput& s) const override
80 {
81 s << m_model << m_old << m_new;
82 }
83
84 void deserializeImpl(DataStreamOutput& s) override { s >> m_model >> m_old >> m_new; }
85
86private:
87 Path<ProcessModel> m_model;
88 std::vector<Pattern> m_old;
89 std::vector<Pattern> m_new;
90};
91}
92PROPERTY_COMMAND_T(
93 Patternist, SetPatternChannel, ProcessModel::p_channel, "Change channel")
94SCORE_COMMAND_DECL_T(Patternist::SetPatternChannel)
95PROPERTY_COMMAND_T(
96 Patternist, SetCurrentPattern, ProcessModel::p_currentPattern, "Change pattern")
97SCORE_COMMAND_DECL_T(Patternist::SetCurrentPattern)
The Path class is a typesafe wrapper around ObjectPath.
Definition Path.hpp:52
Definition PatternModel.hpp:48
Definition PatternProperties.hpp:16
Definition PatternProperties.hpp:58
The Command class.
Definition Command.hpp:34
Definition DataStreamHelpers.hpp:99
Definition DataStreamHelpers.hpp:103
Definition PatternModel.hpp:36
Definition DocumentContext.hpp:18