GridSettings.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /**
  2. * Copyright (c) 2011-2018 by Andrew Mustun. All rights reserved.
  3. *
  4. * This file is part of the QCAD project.
  5. *
  6. * QCAD is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * QCAD is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with QCAD.
  18. */
  19. include("scripts/sprintf.js");
  20. function GridSettings() {
  21. }
  22. GridSettings.getPreferencesCategory = function(appPreferences) {
  23. if (appPreferences) {
  24. return [ qsTr("Defaults for New Drawings"), qsTr("Grid") ];
  25. }
  26. return [ qsTr("General"), qsTr("Grid") ];
  27. };
  28. /**
  29. * Called when the user changed the drawing / global paper unit in another
  30. * preference page.
  31. */
  32. GridSettings.updateUnit = function(unit) {
  33. var unitSymbol = "";
  34. if (isString(unit)) {
  35. unit = parseInt(unit, 10);
  36. }
  37. unitSymbol = RUnit.unitToSymbol(unit);
  38. if (isNull(GridSettings.widgets)) {
  39. return;
  40. }
  41. for (var i=0; i<4; i++) {
  42. if (isNull(GridSettings.widgets["GridSpacingXUnit0%1".arg(i)])) {
  43. continue;
  44. }
  45. GridSettings.widgets["GridSpacingXUnit0%1".arg(i)].text = unitSymbol;
  46. GridSettings.widgets["GridSpacingYUnit0%1".arg(i)].text = unitSymbol;
  47. GridSettings.widgets["MetaGridSpacingXUnit0%1".arg(i)].text = unitSymbol;
  48. GridSettings.widgets["MetaGridSpacingYUnit0%1".arg(i)].text = unitSymbol;
  49. }
  50. // var i;
  51. // var cb = [];
  52. // cb.push(GridSettings.widgets["GridSpacingX"]);
  53. // cb.push(GridSettings.widgets["GridSpacingY"]);
  54. // cb.push(GridSettings.widgets["MetaGridSpacingX"]);
  55. // cb.push(GridSettings.widgets["MetaGridSpacingY"]);
  56. // for (i=0; i<cb.length; i++) {
  57. // cb[i].clear();
  58. // cb[i].addItem(qsTr("auto"));
  59. // }
  60. // var v, sv;
  61. // if (RUnit.isMetric(unit)) {
  62. // for (v=0.001; v<=1000; v*=10) {
  63. // sv = sprintf("%.4f", v);
  64. // for (i=0; i<cb.length; i++) {
  65. // cb[i].addItem(sv);
  66. // }
  67. // }
  68. // }
  69. // else {
  70. // for (v=1/128; v<=128; v*=2) {
  71. // sv = RMath.toFractionString(v, 128);
  72. // for (i=0; i<cb.length; i++) {
  73. // cb[i].addItem(sv);
  74. // }
  75. // }
  76. // }
  77. // for (i=0; i<cb.length; i++) {
  78. // cb[i].currentIndex = 0;
  79. // }
  80. };
  81. /**
  82. * Called when the user changed the linear format in another
  83. * preference page.
  84. */
  85. GridSettings.updateLinearFormat = function(linearFormat) {
  86. var unitSymbol = "";
  87. if (isString(linearFormat)) {
  88. linearFormat = parseInt(linearFormat, 10);
  89. }
  90. var i;
  91. var cb = [];
  92. for (i=0; i<4; i++) {
  93. cb.push(GridSettings.widgets["GridSpacingX0%1".arg(i)]);
  94. cb.push(GridSettings.widgets["GridSpacingY0%1".arg(i)]);
  95. cb.push(GridSettings.widgets["MetaGridSpacingX0%1".arg(i)]);
  96. cb.push(GridSettings.widgets["MetaGridSpacingY0%1".arg(i)]);
  97. }
  98. for (i=0; i<cb.length; i++) {
  99. cb[i].clear();
  100. cb[i].addItem(qsTr("auto"));
  101. }
  102. var v, sv;
  103. if (linearFormat===RS.ArchitecturalStacked ||
  104. linearFormat===RS.FractionalStacked ||
  105. linearFormat===RS.Architectural ||
  106. linearFormat===RS.Fractional) {
  107. for (v=1/128; v<=128; v*=2) {
  108. sv = RMath.toFractionString(v, 128);
  109. for (i=0; i<cb.length; i++) {
  110. cb[i].addItem(sv);
  111. }
  112. }
  113. }
  114. else {
  115. for (v=0.001; v<=1000; v*=10) {
  116. sv = sprintf("%.4f", v);
  117. for (i=0; i<cb.length; i++) {
  118. cb[i].addItem(sv);
  119. }
  120. }
  121. }
  122. for (i=0; i<cb.length; i++) {
  123. cb[i].currentIndex = 0;
  124. }
  125. };
  126. GridSettings.initPreferences = function(pageWidget, calledByPrefDialog, document, preferencesAction) {
  127. GridSettings.widgets = getWidgets(pageWidget);
  128. // update unit symbols beside grid spacing inputs:
  129. // update available choices for minimum grid spacing:
  130. var unit;
  131. var linearFormat;
  132. if (!isNull(document)) {
  133. unit = document.getUnit();
  134. linearFormat = document.getLinearFormat();
  135. }
  136. else {
  137. // no document: use default unit / format:
  138. unit = RSettings.getIntValue("UnitSettings/Unit", RS.Millimeter);
  139. linearFormat = RSettings.getIntValue("DimensionSettings/LinearFormat", RS.Decimal);
  140. }
  141. // unit might have been changed by user:
  142. var unitCombo = objectFromPath("MainWindow::Unit");
  143. if (isComboBox(unitCombo)) {
  144. unit = unitCombo.itemData(unitCombo.currentIndex);
  145. }
  146. var lfCombo = objectFromPath("MainWindow::LinearFormat");
  147. if (isComboBox(lfCombo)) {
  148. linearFormat = lfCombo.itemData(lfCombo.currentIndex);
  149. }
  150. for (var i=0; i<4; i++) {
  151. eval("function f(checked) { GridSettings.isometricGridToggled(" + i +", checked); }")
  152. GridSettings.widgets["IsometricGrid0%1".arg(i)].toggled.connect(GridSettings, f);
  153. eval("function f() { GridSettings.updateIsometricGrid(" + i + "); }")
  154. GridSettings.widgets["GridSpacingY0%1".arg(i)].editTextChanged.connect(GridSettings, f);
  155. eval("function f() { GridSettings.updateIsometricMetaGrid(" + i + "); }")
  156. GridSettings.widgets["MetaGridSpacingY0%1".arg(i)].editTextChanged.connect(GridSettings, f);
  157. }
  158. GridSettings.updateUnit(unit);
  159. GridSettings.updateLinearFormat(linearFormat);
  160. };
  161. GridSettings.savePreferences = function(pageWidget, calledByPrefDialog, document) {
  162. };
  163. GridSettings.isometricGridToggled = function(i, checked) {
  164. GridSettings.updateIsometricGrid(i);
  165. GridSettings.updateIsometricMetaGrid(i);
  166. if (!checked) {
  167. var cbXCombo = GridSettings.widgets["GridSpacingX0%1".arg(i)];
  168. var cbYCombo = GridSettings.widgets["GridSpacingY0%1".arg(i)];
  169. cbXCombo.setEditText(cbYCombo.currentText);
  170. cbXCombo = GridSettings.widgets["MetaGridSpacingX0%1".arg(i)];
  171. cbYCombo = GridSettings.widgets["MetaGridSpacingY0%1".arg(i)];
  172. cbXCombo.setEditText(cbYCombo.currentText);
  173. }
  174. };
  175. GridSettings.updateIsometricGrid = function(i) {
  176. if (!GridSettings.widgets["IsometricGrid0%1".arg(i)].checked) {
  177. //qDebug("grid not isometric");
  178. return;
  179. }
  180. var sx, sy;
  181. // update isometric grid: compute x spacing for given y spacing:
  182. var cbXCombo = GridSettings.widgets["GridSpacingX0%1".arg(i)];
  183. var cbYCombo = GridSettings.widgets["GridSpacingY0%1".arg(i)];
  184. var str = cbYCombo.currentText;
  185. if (str===qsTr("auto")) {
  186. cbXCombo.setEditText(qsTr("auto"));
  187. }
  188. else {
  189. sy = parseFloat(cbYCombo.currentText);
  190. sx = sy * 2.0 * Math.sin(RMath.deg2rad(60));
  191. cbXCombo.setEditText(sx.toString());
  192. }
  193. };
  194. GridSettings.updateIsometricMetaGrid = function(i) {
  195. if (!GridSettings.widgets["IsometricGrid0%1".arg(i)].checked) {
  196. //qDebug("grid not isometric");
  197. return;
  198. }
  199. var sx, sy;
  200. // update isometric meta grid: compute x spacing for given y spacing:
  201. var cbXCombo = GridSettings.widgets["MetaGridSpacingX0%1".arg(i)];
  202. var cbYCombo = GridSettings.widgets["MetaGridSpacingY0%1".arg(i)];
  203. var str = cbYCombo.currentText;
  204. if (str===qsTr("auto")) {
  205. cbXCombo.setEditText(qsTr("auto"));
  206. }
  207. else {
  208. sy = parseFloat(cbYCombo.currentText);
  209. sx = sy * 2.0 * Math.sin(Math.PI/3.0);
  210. cbXCombo.setEditText(sx.toString());
  211. }
  212. };
  213. GridSettings.applyPreferences = function(doc, mdiChild) {
  214. if (isNull(doc) || isNull(mdiChild)) {
  215. return;
  216. }
  217. var di = mdiChild.getDocumentInterface();
  218. var scenes = di.getGraphicsScenes();
  219. for (var si = 0; si<scenes.length; ++si) {
  220. var scene = scenes[si];
  221. var views = scene.getGraphicsViews();
  222. for (var vi = 0; vi<views.length; ++vi) {
  223. var view = views[vi];
  224. view.regenerate(false);
  225. }
  226. }
  227. };