X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=emcclib.js;h=385281ad0b6778e0120a554c86e827de9f18aa04;hb=3234912f921916a1b8da164fd61dc75579358577;hp=b6486849add02d813c77a2d367b7646cfc2bd83e;hpb=5dc559c8be1b8f6ed15f560433f25c952c874f93;p=sgt-puzzles.git diff --git a/emcclib.js b/emcclib.js index b648684..385281a 100644 --- a/emcclib.js +++ b/emcclib.js @@ -71,7 +71,7 @@ mergeInto(LibraryManager.library, { * case we need to do something special - see below. */ js_add_preset: function(ptr) { - var name = (ptr == 0 ? "Custom..." : Pointer_stringify(ptr)); + var name = (ptr == 0 ? "Customise..." : Pointer_stringify(ptr)); var value = gametypeoptions.length; var option = document.createElement("option"); @@ -81,39 +81,20 @@ mergeInto(LibraryManager.library, { gametypeoptions.push(option); if (ptr == 0) { - // Create a _second_ element called 'Custom', which is - // hidden. - // - // Hiding this element (that is, setting it display:none) - // has the effect of making it not show up when the - // drop-down list is actually opened, but still show up - // when the item is selected. - // - // So what happens is that there's one element marked - // 'Custom' that the _user_ selects, but a second one to - // which we reset the dropdown after the config box - // returns (if we don't then turn out to select a - // different preset anyway). The point is that if the user - // has 'Custom' selected, but then wants to customise - // their settings a second time, we still get an onchange - // event when they select the Custom option again, which - // we wouldn't get if the browser thought it was already - // the selected one. But here, it's _not_ the selected - // option already; its invisible evil twin is selected. - // - // (Actually, they're not _identical_ evil twins: we label - // the two slightly differently. The visible one that the - // user can select is labelled "Custom..." to hint that it - // opens a dialog box, whereas the invisible one that's - // left shown after the box closes is just "Custom", - // because that's telling you what you _have_ got - // selected.) + // The option we've just created is the one for inventing + // a new custom setup. + gametypenewcustom = option; + option.value = -1; + + // Now create another element called 'Custom', which will + // be auto-selected by us to indicate the custom settings + // you've previously selected. However, we don't add it to + // the game type selector; it will only appear when the + // user actually has custom settings selected. option = document.createElement("option"); - option.value = value; + option.value = -2; option.appendChild(document.createTextNode("Custom")); - option.style.display = "none"; - gametypeselector.appendChild(option); - gametypehiddencustom = option; + gametypethiscustom = option; } }, @@ -140,11 +121,31 @@ mergeInto(LibraryManager.library, { * which turn out to exactly match a preset). */ js_select_preset: function(n) { - if (gametypeoptions[n].value == gametypehiddencustom.value) { - // If we're asked to select the visible Custom option, - // select the invisible one instead. See comment above in - // js_add_preset. - gametypehiddencustom.selected = true; + if (gametypethiscustom !== null) { + // Fiddle with the Custom/Customise options. If we're + // about to select the Custom option, then it should be in + // the menu, and the other one should read "Re-customise"; + // if we're about to select another one, then the static + // Custom option should disappear and the other one should + // read "Customise". + + if (gametypethiscustom.parentNode == gametypeselector) + gametypeselector.removeChild(gametypethiscustom); + if (gametypenewcustom.parentNode == gametypeselector) + gametypeselector.removeChild(gametypenewcustom); + + if (n < 0) { + gametypeselector.appendChild(gametypethiscustom); + gametypenewcustom.lastChild.data = "Re-customise..."; + } else { + gametypenewcustom.lastChild.data = "Customise..."; + } + gametypeselector.appendChild(gametypenewcustom); + gametypenewcustom.selected = false; + } + + if (n < 0) { + gametypethiscustom.selected = true; } else { gametypeoptions[n].selected = true; } @@ -411,7 +412,7 @@ mergeInto(LibraryManager.library, { // Find the width of the string var ctx1 = onscreen_canvas.getContext('2d'); ctx1.font = font; - var width = ctx1.measureText(midpoint_test_str).width; + var width = (ctx1.measureText(midpoint_test_str).width + 1) | 0; // Construct a test canvas of appropriate size, initialise it to // black, and draw the string on it in white @@ -566,6 +567,7 @@ mergeInto(LibraryManager.library, { statusbar.style.width = (w - 4) + "px"; document.getElementById("statusbarholder").style.width = w + "px"; } + resizable_div.style.width = w + "px"; onscreen_canvas.height = h; offscreen_canvas.height = h;