comparison mpui.js @ 188:6fba2c255319

More work on the MP.JS launcher.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 23 Aug 2018 16:32:10 +0300
parents 28caa87348d3
children 283b2b657574
comparison
equal deleted inserted replaced
187:28caa87348d3 188:6fba2c255319
1 /* 1 /*
2 * Multipaint.JS - Javascript launcher 2 * Multipaint.JS - Javascript launcher
3 * (C) Copyright 2018 Matti 'ccr' Hämäläinen <ccr@tnsp.org> 3 * (C) Copyright 2018 Matti 'ccr' Hämäläinen <ccr@tnsp.org>
4 */ 4 */
5 var mpMachine = 0, mpUIScale, mpForcedWidth, mpForcedHeight; 5 var mpMachine = 0, mpUIScale, mpUIForcedWidth, mpUIForcedHeight;
6 var mpURL; 6 var mpURL;
7 7
8 var mpMachines = 8 var mpMachines =
9 [ 9 [
10 [ 0, "C64 hires" , true ], 10 [ 0, "C64 hires" , true ],
21 [ 21, "C64 FLI multicolor" , false ], 21 [ 21, "C64 FLI multicolor" , false ],
22 */ 22 */
23 ]; 23 ];
24 24
25 25
26 var mpResolutions = 26 var mpUIDimensions =
27 [ 27 [
28 [ -1, -1 ], 28 [ -1, -1 ],
29 [ 1200, 980 ], 29 [ 1200, 800 ],
30 [ 1600, 1200 ], 30 [ 1600, 1200 ],
31 ]; 31 ];
32 32
33
34 var mpUIScales =
35 [
36 2, 3, 1
37 ];
33 38
34 var mpSources = 39 var mpSources =
35 [ 40 [
36 "buffers.pde", 41 "buffers.pde",
37 "preview.pde", 42 "preview.pde",
90 { 95 {
91 stAddEventOb(obname, stGE(obname), evtype, evcallback, evparam); 96 stAddEventOb(obname, stGE(obname), evtype, evcallback, evparam);
92 } 97 }
93 98
94 99
95 function mpShowMachineSelector() 100 function stGetSelValue(velem, vdef)
101 {
102 if (velem)
103 return velem.selectedIndex >= 0 ? velem.options[velem.selectedIndex].value : vdef;
104 else
105 return vdef;
106 }
107
108
109 function stCreateSelect(vid, vlist, vcallback)
110 {
111 var vobj = stCE("select", vid);
112
113 for (var n = 0; n < vlist.length; n++)
114 {
115 var mp = vlist[n];
116 var opt = stCE("option");
117 vcallback(n, opt, mp);
118 vobj.appendChild(opt);
119 }
120
121 return vobj;
122 }
123
124
125 function mpShowLauncher()
96 { 126 {
97 var mpCanvas = stGE("mpCanvas"); 127 var mpCanvas = stGE("mpCanvas");
98 mpCanvas.style.display = "none"; 128 mpCanvas.style.display = "none";
99 129
100 var mpUI = stGE("mpUI"); 130 var mpUI = stGE("mpUI");
107 137
108 mobj = stCE("p"); 138 mobj = stCE("p");
109 mobj.textContent = "Choose your target machine:"; 139 mobj.textContent = "Choose your target machine:";
110 mdiv.appendChild(mobj); 140 mdiv.appendChild(mobj);
111 141
112 mobj = stCE("select", "machineID"); 142
113 for (var n = 0; n < mpMachines.length; n++) 143 mdiv.appendChild(stCreateSelect("machineID", mpMachines,
114 { 144 function (vn, vopt, val) { vopt.value = val[0]; vopt.textContent = val[1]; }));
115 var mp = mpMachines[n];
116 var opt = stCE("option");
117 opt.value = mp[0];
118 opt.textContent = mp[1];
119 mobj.appendChild(opt);
120 }
121 mdiv.appendChild(mobj);
122 145
123 mobj = stCE("button", "selectID"); 146 mobj = stCE("button", "selectID");
124 mobj.textContent = "RUN"; 147 mobj.textContent = "RUN";
125 stAddEventOb(mobj.name, mobj, "click", mpMachineSelected); 148 stAddEventOb(mobj.name, mobj, "click", mpLauncherDone);
126 mdiv.appendChild(mobj); 149 mdiv.appendChild(mobj);
127 150
128 151
129 mdiv = stCE("div", "mresolution"); 152 mdiv = stCE("div", "mdimensions");
130 mpUI.appendChild(mdiv); 153 mpUI.appendChild(mdiv);
131 154
132 mobj = stCE("p"); 155 mobj = stCE("p");
133 mobj.textContent = "Choose optional resolution:"; 156 mobj.textContent = "Choose optional UI size:";
134 mdiv.appendChild(mobj); 157 mdiv.appendChild(mobj);
135 158
136 mobj = stCE("select", "resolutionID"); 159 mdiv.appendChild(stCreateSelect("dimensionsID", mpUIDimensions,
137 for (var n = 0; n < mpResolutions.length; n++) 160 function (vn, vopt, val) { vopt.value = vn; vopt.textContent = (vn == 0) ? "DEFAULT" : val[0] +" x "+ val[1]; }));
138 { 161
139 var mp = mpResolutions[n]; 162 mdiv.appendChild(stCreateSelect("scalesID", mpUIScales,
140 var opt = stCE("option"); 163 function (vn, vopt, val) { vopt.value = val; vopt.textContent = " x "+ val; }));
141 opt.value = n;
142 if (n == 0)
143 opt.textContent = "DEFAULT";
144 else
145 opt.textContent = mp[0] +" x " +mp[1];
146 mobj.appendChild(opt);
147 }
148 mdiv.appendChild(mobj);
149 164
150 165
151 mobj = stCE("div"); 166 mobj = stCE("div");
152 mobj.innerHTML = 167 mobj.innerHTML =
153 "<p><b>Things of note:</b></p>"+ 168 "<p><b>Things of note:</b></p>"+
177 mobj = stCE("hr"); 192 mobj = stCE("hr");
178 mpUI.appendChild(mobj); 193 mpUI.appendChild(mobj);
179 } 194 }
180 195
181 196
182 function mpMachineSelected() 197 function mpLauncherDone()
183 { 198 {
199 // Get selected values from DOM elements
184 var mpUI = stGE("mpUI"); 200 var mpUI = stGE("mpUI");
185 var id = stGE("machineID"); 201 mpMachine = stGetSelValue(stGE("machineID"), 0);
186 mpMachine = id.selectedIndex >= 0 ? id.options[id.selectedIndex].value : 0; 202
187 203 var index = stGetSelValue(stGE("dimensionsID"), -1);
188 id = stGE("resolutionID");
189 var index = id.selectedIndex >= 0 ? id.options[id.selectedIndex].value : 0;
190 if (index > 0) 204 if (index > 0)
191 { 205 {
192 mpForcedWidth = mpResolutions[index][0]; 206 mpUIForcedWidth = mpDimensions[index][0];
193 mpForcedHeight = mpResolutions[index][1]; 207 mpUIForcedHeight = mpDimensions[index][1];
194 } 208 }
209 else
210 mpUIForcedWidth = mpUIForcedHeight = 0;
211
212 mpUIScale = stGetSelValue(stGE("scalesID"), -1);
195 213
196 stClearChildren(mpUI); 214 stClearChildren(mpUI);
197 215
216 // Initialize the canvas etc.
198 var mpCanvas = stGE("mpCanvas"); 217 var mpCanvas = stGE("mpCanvas");
199 mpCanvas.style.display = "block"; 218 mpCanvas.style.display = "block";
200 219
201 window.location.href = mpURL +"?"+ mpMachine.toString() +":"+ mpForcedWidth +":"+ mpForcedHeight; 220 window.location.href = mpURL +"?"+ mpMachine.toString() +":"+ mpUIForcedWidth +":"+ mpUIForcedHeight +":"+ mpUIScale;
202 221
203 mpRunSketch(mpCanvas); 222 mpRunSketch(mpCanvas);
204 } 223 }
205 224
206 225
208 { 227 {
209 stGE("mpNote").innerHTML = 228 stGE("mpNote").innerHTML =
210 "<a href=\"http://multipaint.kameli.net/\">Multipaint</a> (C) 2016-2018 <b>Tero 'Dr. TerrorZ' Heikkinen</b>, "+ 229 "<a href=\"http://multipaint.kameli.net/\">Multipaint</a> (C) 2016-2018 <b>Tero 'Dr. TerrorZ' Heikkinen</b>, "+
211 "ProcessingJS port and modifications by <b>Matti 'ccr' Hämäläinen</b> (2018)"; 230 "ProcessingJS port and modifications by <b>Matti 'ccr' Hämäläinen</b> (2018)";
212 231
232 // Check for URL parameters
213 var slink = window.location.href; 233 var slink = window.location.href;
214 var spos, found = false; 234 var spos, found = false;
215 if ((spos = slink.indexOf("?")) >= 0) 235 if ((spos = slink.indexOf("?")) >= 0)
216 { 236 {
217 var sargs = unescape(slink.substr(spos + 1)).split(":"); 237 var sargs = unescape(slink.substr(spos + 1)).split(":");
218 mpURL = slink.substr(0, spos); 238 mpURL = slink.substr(0, spos);
219 239 mpMachine = parseInt(sargs[0]);
220 var tmp = parseInt(sargs[0]); 240 found = true;
221 for (var n = 0; n < mpMachines.length; n++)
222 {
223 var mp = mpMachines[n];
224 if (mp[0] == tmp)
225 {
226 mpMachine = mp[0];
227 found = true;
228 break;
229 }
230 }
231 241
232 if (sargs.length >= 3) 242 if (sargs.length >= 3)
233 { 243 {
234 mpForcedWidth = parseInt(sargs[1]); 244 mpUIForcedWidth = parseInt(sargs[1]);
235 mpForcedHeight = parseInt(sargs[2]); 245 mpUIForcedHeight = parseInt(sargs[2]);
236 } 246 }
237 if (sargs.length >= 4) 247 if (sargs.length >= 4)
238 mpUIScale = parseInt(sargs[3]); 248 mpUIScale = parseInt(sargs[3]);
239 } 249 }
240 else 250 else
241 mpURL = slink; 251 mpURL = slink;
242 252
253 // Either run sketch or show the launcher
243 if (found) 254 if (found)
244 { 255 {
245 mpRunSketch(stGE("mpCanvas")); 256 mpRunSketch(stGE("mpCanvas"));
246 } 257 }
247 else 258 else
248 { 259 {
249 stAddEventOb("DOM", document, "DOMContentLoaded", mpShowMachineSelector); 260 stAddEventOb("DOM", document, "DOMContentLoaded", mpShowLauncher);
250 } 261 }
251 } 262 }