source: main/trunk/model-sites-dev/respooled/collect/popup-video-respooled/js/game-on.js@ 29888

Last change on this file since 29888 was 29888, checked in by davidb, 9 years ago

Working popup editor, saving to localStorage. Tidy up on space-bar for global pause and start play.

  • Property svn:executable set to *
File size: 7.5 KB
Line 
1"use strict";
2
3var goDocStorage = null;
4
5var goPaper = null;
6
7var go_paper_x_dim = 920;
8var go_paper_y_dim = 445;
9
10var gameOnCurrentTimeXPos = 0;
11var gameOnCurrentTimelineRect = null;
12
13var num_midi_pitches = 128;
14
15
16function updateGameOnCurrentTimeline()
17{
18 gameOnCurrentTimeXPos = (mediaPlayer.currentTime / mediaPlayer.duration) * go_paper_x_dim;
19 //console.log("*** x pos = " + gameOnCurrentTimeXPos);
20
21 gameOnCurrentTimelineRect.attr({x: gameOnCurrentTimeXPos});
22}
23
24function getDocStorage(docOID)
25{
26 var docStorage = null;
27
28 if (hasLocalStorage) {
29
30 if (goDocStorage == null) {
31 var docStorageStr = localStorage.getItem(docOID);
32 //console.log("***docStorageStr = " + docStorageStr);
33
34 //var docStorage = (docStorageStr != null) ? eval("("+docStorageStr+")") : {palTracks:{}, popTracks:{}};
35 docStorage = eval("("+docStorageStr+")") || {palTracks:{}, popTracks:{}};
36 goDocStorage = docStorage;
37 }
38 else {
39 docStorage = goDocStorage;
40 }
41 }
42
43 return docStorage;
44}
45
46function getActiveTrackLayers(opt_field)
47{
48 var field = opt_field || "name";
49
50 var palActiveLayers = [];
51 $('#palForm input:checked').each(function() {
52 palActiveLayers.push(this[field]);
53 });
54
55 return palActiveLayers;
56}
57
58function populatePalList(docStorage)
59{
60 // populate pal List
61 if (hasLocalStorage) {
62
63 var palTracks = docStorage.palTracks || {};
64
65 //console.log("*** palTracks = " + JSON.stringify(palTracks));
66 var palListKeys = Object.keys(palTracks).sort();
67
68 for (var i=0; i<palListKeys.length; i++) {
69 var key = palListKeys[i];
70 var track = palTracks[key];
71 var name = key;
72 var cb_name = name.replace(/[ -]/g,"");
73 var cb_value = name;
74
75 var opt_checked = (i==0) ? ' checked="checked"' : "";
76
77 $('#palList').append('<div id="pal'+cb_name+'"><input type="checkbox" '
78 + '" name="'+cb_name+'" value="' + cb_value + '"'
79 + opt_checked + '>'
80 + name + '</div>');
81 }
82 }
83 else {
84 // Put in some fake data for now
85 $('#palList').append('<input type="checkbox" id="palPianoHero" name="PianoHero" value="Piano Hero" checked="checked"/>Piano Hero<br />');
86 $('#palList').append('<input type="checkbox" id="palDrumbeatHero" name="DrumbeatHero" value="Drum-beat Hero" />Drum-beat Hero<br />');
87 }
88}
89
90function displayActiveTrackLayers(docStorage)
91{
92 console.log("displayActiveTrackLayers()");
93
94 goPaper.clear();
95
96 if (hasLocalStorage) {
97
98 // 'palTracks' have the form:
99 // palTracks[save_name] = [ { name: "my recording 1", baseCTime: 123.3, events: [ .... ] } ]
100
101 var palTracks = docStorage.palTracks || {};
102
103 var total_duration = mediaPlayer.duration;
104 //console.log("*** total duration = " + total_duration);
105
106 var atl = getActiveTrackLayers("value");
107 //console.log("*** atl = " + JSON.stringify(atl));
108
109 var min_midi_pitch = num_midi_pitches-1;
110 var max_midi_pitch = 0;
111
112 for (var i=0; i<atl.length; i++) {
113 var storage_name = atl[i];
114 var track = palTracks[storage_name];
115
116 if (track != null) {
117
118 // calculate range of midi pitches present
119 for (var b=0; b<track.length; b++) {
120 var track_block = track[b];
121 var base_ctime = track_block.baseCTime;
122 var block_events = track_block.events;
123
124 for (var ne=0; ne<block_events.length; ne++) {
125 var midi_pitch = block_events[ne].midiPitch;
126 if (midi_pitch < min_midi_pitch) {
127 min_midi_pitch = midi_pitch;
128 }
129 if (midi_pitch > max_midi_pitch) {
130 max_midi_pitch = midi_pitch;
131 }
132 }
133 }
134 }
135 }
136 //console.log("*** max pitch = " + max_midi_pitch + ", min pitch = " + min_midi_pitch);
137
138 var raw_midi_range = max_midi_pitch - min_midi_pitch;
139 var midi_range = Math.max(4,raw_midi_range);
140
141 var midi_y_dim_spacing = go_paper_y_dim / midi_range;
142
143 for (var i=0; i<atl.length; i++) {
144 var storage_name = atl[i];
145 var track = palTracks[storage_name];
146
147 if (track != null) {
148
149 for (var b=0; b<track.length; b++) {
150
151 var track_block = track[b];
152 var base_ctime = track_block.baseCTime;
153
154 var block_events = track_block.events;
155
156 for (var ne=0; ne<block_events.length; ne++) {
157
158 var note_event = block_events[ne];
159
160 var startPercTime = (base_ctime + note_event.startCurrentTime)/total_duration;
161 var rx_org = startPercTime * go_paper_x_dim;
162 var ry_org = go_paper_y_dim - ((note_event.midiPitch - min_midi_pitch) * midi_y_dim_spacing);
163
164 var rx_dim = (note_event.duration/1000)/total_duration * go_paper_x_dim;
165 var ry_dim = midi_y_dim_spacing;
166
167 var rect = goPaper.rect(rx_org,ry_org,rx_dim,ry_dim);
168 rect.attr({stroke:"black",fill:"#2E52A4"});
169 }
170 }
171 }
172 }
173 }
174
175 gameOnCurrentTimelineRect = goPaper.rect(-2,0,1,go_paper_y_dim);
176 gameOnCurrentTimelineRect.attr({fill: "red", stroke: "red"});
177}
178
179function initGameOn()
180{
181 console.log("initGameOn()");
182
183 goDocStorage = getDocStorage(gs.cgiParams.d);
184
185 //var gmp_x_dim = $('#gameOnPaper').width();
186 //var gmp_y_dim = $('#gameOnPaper').height();
187
188 //console.log("*** gmp_x_dim = " + gmp_x_dim);
189 //console.log("*** gmp_y_dim = " + gmp_y_dim);
190
191
192 //var goPaper = Raphael("gameOnPaper",gmp_x_dim,gmp_y_dim);
193 goPaper = Raphael("gameOnPaper",go_paper_x_dim,go_paper_y_dim);
194 goPaper.canvas.style.backgroundColor = '#FFFFFF';
195
196 console.log("Browser supports LocalStorage: " + hasLocalStorage);
197
198 populatePalList(goDocStorage);
199 displayActiveTrackLayers(goDocStorage);
200}
201
202
203function palDeleteConfirmed()
204{
205 //var palActiveLayers = $('input[type=checkbox]:checked', '#palForm');
206
207 var palActiveLayersID = getActiveTrackLayers("name");
208 var palActiveLayersValue = getActiveTrackLayers("value");
209
210 var palTracks = goDocStorage.palTracks || {};
211
212 for (var i=0; i<palActiveLayersID.length; i++) {
213 var id = palActiveLayersID[i];
214 $('#pal'+id).remove();
215
216 var value = palActiveLayersValue[i];
217 delete palTracks[value];
218 }
219}
220
221
222function palDelete()
223{
224 $('#delete-recording-popup').dialog('open');
225
226 return false; // no need to process the event any further
227}
228
229function palDisplay()
230{
231 displayActiveTrackLayers(goDocStorage);
232
233 return false; // no need to process the event any further
234}
235
236function palSave()
237{
238 var palTracks = goDocStorage.palTracks || {};
239
240 var json_edit_str = trackEditor.getSession().getValue();
241 console.log("**** json edit str = " + json_edit_str);
242
243 var json_edit = eval("("+json_edit_str+")");
244
245 for (var key in json_edit){
246 if (json_edit.hasOwnProperty(key)) {
247 //console.log("*** key = " + key);
248 var val = json_edit[key];
249 console.log("**** Saving under key[ " + key + "]: " + JSON.stringify(val));
250 palTracks[key] = val;
251 }
252 }
253
254 if (hasLocalStorage) {
255 var docOID = gs.cgiParams.d;
256 console.log("Saving in Browser localStorage track data for '" + docOID + "'");
257 localStorage.setItem(docOID,JSON.stringify(goDocStorage));
258 }
259}
260
261function palEdit()
262{
263 var palTracks = goDocStorage.palTracks || {};
264
265 var palActiveLayers = getActiveTrackLayers("value");
266
267 var edit_json = {};
268
269 for (var i=0; i<palActiveLayers.length; i++) {
270 var track_name = palActiveLayers[i];
271 edit_json[track_name] = palTracks[track_name];
272 }
273
274 trackEditor.setValue(JSON.stringify(edit_json,null,'\t'));
275 trackEditor.clearSelection();
276
277 $('#edit-recording-popup').dialog('open');
278
279 return false; // no need to process the event any further
280}
281
Note: See TracBrowser for help on using the repository browser.