add an option for synching proportions and implement it (mostly)
authorRobert Kaiser <kairo@kairo.at>
Tue, 9 Dec 2008 01:52:23 +0000 (02:52 +0100)
committerRobert Kaiser <kairo@kairo.at>
Tue, 9 Dec 2008 01:52:23 +0000 (02:52 +0100)
xulapp/chrome/mandelbrot/content/image-settings.js
xulapp/chrome/mandelbrot/content/image-settings.xul
xulapp/chrome/mandelbrot/locales/en-US/image-settings.dtd
xulapp/defaults/preferences/prefs.js

index a907f5a..3b19434 100644 (file)
@@ -46,6 +46,21 @@ function drawPreview() {
   let canvas = document.getElementById("mbrotPreview");
   let context = canvas.getContext("2d");
 
+  if (document.getElementById("imgWidth").value /
+      document.getElementById("imgHeight").value
+        < 80 / 50) {
+    canvas.height = 50;
+    canvas.width = canvas.height *
+      document.getElementById("imgWidth").value /
+      document.getElementById("imgHeight").value;
+  }
+  else {
+    canvas.width = 80;
+    canvas.height = canvas.width *
+      document.getElementById("imgHeight").value /
+      document.getElementById("imgWidth").value;
+  }
+
   let Cr_min = parseFloat(document.getElementById("Cr_min").value);
   let Cr_max = parseFloat(document.getElementById("Cr_max").value);
   if ((Cr_min < -2) || (Cr_min > 2) ||
@@ -82,14 +97,41 @@ function drawPreview() {
 }
 
 function recalcCoord(coord, target) {
+  let othercoord = (coord == 'Ci') ? 'Cr' : 'Ci';
+  let owndim = (coord == 'Ci') ? 'height' : 'width';
+  let otherdim = (coord == 'Ci') ? 'width' : 'height';
   if (target == 'scale') {
-    document.getElementById(coord + '_scale').value =
+    var myscale =
       parseFloat(document.getElementById(coord + '_max').value) -
       parseFloat(document.getElementById(coord + '_min').value);
+    document.getElementById(coord + '_scale').value = roundCoord(myscale);
   }
   else if (target == 'max') {
-    document.getElementById('mandelbrot.last_image.' + coord + '_max').value =
+    let mymax =
       parseFloat(document.getElementById(coord + '_min').value) +
       parseFloat(document.getElementById(coord + '_scale').value);
+    document.getElementById('mandelbrot.last_image.' + coord + '_max').value = roundCoord(mymax);
+    var myscale = document.getElementById(coord + '_scale').value;
   }
+  if (document.getElementById('syncProp').checked) {
+    let otherscale = myscale *
+      document.getElementById('mandelbrot.image.' + otherdim).value /
+      document.getElementById('mandelbrot.image.' + owndim).value;
+    document.getElementById(othercoord + '_scale').value = roundCoord(otherscale);
+    let othermax =
+      parseFloat(document.getElementById(othercoord + '_min').value) +
+      parseFloat(document.getElementById(othercoord + '_scale').value);
+    document.getElementById('mandelbrot.last_image.' + othercoord + '_max').value = roundCoord(othermax);
+  }
+}
+
+function checkProportions() {
+  if (!document.getElementById('syncProp').checked) {
+    recalcCoord('Cr', 'scale');
+  }
+}
+
+function roundCoord(floatval) {
+  // We should round to 10 decimals here or so
+  return floatval;
 }
\ No newline at end of file
index c4c6092..752fcef 100644 (file)
@@ -69,6 +69,8 @@
                   type="string"/>
       <preference id="mandelbrot.last_image.Ci_max" name="mandelbrot.last_image.Ci_max"
                   type="string"/>
+      <preference id="mandelbrot.syncProportions" name="mandelbrot.syncProportions"
+                  type="bool"/>
     </preferences>
 
     <groupbox>
         <hbox flex="1">
           <label value="&img.width.label;" control="imgWidth"/>
           <textbox id="imgWidth" size="4"
-                   preference="mandelbrot.image.width"/>
+                   preference="mandelbrot.image.width"
+                   onchange="recalcCoord('Ci', 'scale');"/>
         </hbox>
         <hbox flex="1">
           <label value="&img.height.label;" control="imgHeight"/>
           <textbox id="imgHeight" size="4"
-                   preference="mandelbrot.image.height"/>
+                   preference="mandelbrot.image.height"
+                   onchange="recalcCoord('Cr', 'scale');"/>
         </hbox>
       </groupbox>
 
         </hbox>
         <button id="previewButton" label="&previewDraw.label;" oncommand="drawPreview();"/>
       </groupbox>
+
+      <groupbox>
+        <caption label="&options.title;"/>
+        <hbox flex="1">
+          <checkbox id="syncProp"
+                    preference="mandelbrot.syncProportions"
+                    onclick="checkProportions();"/>
+          <label value="&syncProp.label;" control="syncProp"/>
+        </hbox>
+      </groupbox>
     </hbox>
   </prefpane>
 </prefwindow>
index 1351acc..2433e06 100644 (file)
@@ -51,3 +51,6 @@
 
 <!ENTITY preview.title         "Preview">
 <!ENTITY previewDraw.label     "Preview">
+
+<!ENTITY options.title         "Options">
+<!ENTITY syncProp.label        "Proportional">
index a3e0f83..3ab5a34 100644 (file)
@@ -39,6 +39,7 @@ pref("toolkit.defaultChromeURI", "chrome://mandelbrot/content/mandelbrot.xul");
 
 /* default prefs */
 pref("javascript.options.jit.chrome", true);
+pref("mandelbrot.syncProportions", true);
 
 /* debugging prefs */
 pref("browser.dom.window.dump.enabled", true);