Call onTransitionEnd() after active
[SugarCubes.git] / _Presets.pde
1 interface PresetListener {
2 public void onPresetLoaded(Preset preset);
3 public void onPresetDirty(Preset preset);
4 public void onPresetStored(Preset preset);
5 }
6
7 class PresetManager implements LXParameter.Listener {
8
9 public static final int NUM_PRESETS = 8;
10 public static final String FILENAME = "data/presets.txt";
11 public static final String DELIMITER = "\t";
12
13 private final Preset[] presets = new Preset[NUM_PRESETS];
14 private final List<PresetListener> listeners = new ArrayList<PresetListener>();
15
16 private Preset loadedPreset = null;
17 private LXPattern loadedPattern = null;
18
19 PresetManager() {
20 for (int i = 0; i < presets.length; ++i) {
21 presets[i] = new Preset(this, i);
22 }
23 String[] values = loadStrings(FILENAME);
24 if (values == null) {
25 write();
26 } else {
27 int i = 0;
28 for (String serialized : values) {
29 presets[i++].load(serialized);
30 if (i >= NUM_PRESETS) {
31 break;
32 }
33 }
34 }
35 }
36
37 public void addListener(PresetListener listener) {
38 listeners.add(listener);
39 }
40
41 public void select(int index) {
42 presets[index].select();
43 }
44
45 public void store(int index) {
46 presets[index].store(midiEngine.getFocusedPattern());
47 select(index);
48 }
49
50 public void onPresetLoaded(Preset preset, LXPattern pattern) {
51 if (loadedPattern != pattern) {
52 if (loadedPattern != null) {
53 for (LXParameter p : loadedPattern.getParameters()) {
54 ((LXListenableParameter) p).removeListener(this);
55 }
56 }
57 }
58 for (PresetListener listener : listeners) {
59 listener.onPresetLoaded(preset);
60 }
61 loadedPreset = preset;
62 loadedPattern = pattern;
63 for (LXParameter p : loadedPattern.getParameters()) {
64 ((LXListenableParameter) p).addListener(this);
65 }
66 }
67
68 public void onParameterChanged(LXParameter p) {
69 for (PresetListener listener : listeners) {
70 listener.onPresetDirty(loadedPreset);
71 }
72 }
73
74 public void write() {
75 String[] lines = new String[NUM_PRESETS];
76 int i = 0;
77 for (Preset preset : presets) {
78 lines[i++] = preset.serialize();
79 }
80 saveStrings(FILENAME, lines);
81 }
82 }
83
84 class Preset {
85
86 final PresetManager manager;
87 final int index;
88
89 String className;
90 final Map<String, Float> parameters = new HashMap<String, Float>();
91
92 Preset(PresetManager manager, int index) {
93 this.manager = manager;
94 this.index = index;
95 }
96
97 public void load(String serialized) {
98 className = null;
99 parameters.clear();
100 try {
101 String[] parts = serialized.split(PresetManager.DELIMITER);
102 className = parts[0];
103 int i = 1;
104 while (i < parts.length - 1) {
105 parameters.put(parts[i], Float.parseFloat(parts[i+1]));
106 i += 2;
107 }
108 } catch (Exception x) {
109 className = null;
110 parameters.clear();
111 }
112 }
113
114 public String serialize() {
115 if (className == null) {
116 return "null";
117 }
118 String val = className + PresetManager.DELIMITER;
119 for (String pKey : parameters.keySet()) {
120 val += pKey + PresetManager.DELIMITER + parameters.get(pKey) + PresetManager.DELIMITER;
121 }
122 return val;
123 }
124
125 public void store(LXPattern pattern) {
126 className = null;
127 parameters.clear();
128 className = pattern.getClass().getName();
129 for (LXParameter p : pattern.getParameters()) {
130 parameters.put(p.getLabel(), p.getValuef());
131 }
132 manager.write();
133 }
134
135 public void select() {
136 Engine.Deck deck = midiEngine.getFocusedDeck();
137 for (LXPattern pattern : deck.getPatterns()) {
138 if (pattern.getClass().getName().equals(className)) {
139 for (String pLabel : parameters.keySet()) {
140 for (LXParameter p : pattern.getParameters()) {
141 if (p.getLabel().equals(pLabel)) {
142 p.setValue(parameters.get(pLabel));
143 }
144 }
145 }
146 deck.goPattern(pattern);
147 manager.onPresetLoaded(this, pattern);
148 break;
149 }
150 }
151 }
152 }
153