Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /**
  2. * WHITEBOPHIR
  3. *********************************************************
  4. * @licstart The following is the entire license notice for the
  5. * JavaScript code in this page.
  6. *
  7. * Copyright (C) 2013 Ophir LOJKINE
  8. *
  9. *
  10. * The JavaScript code in this page is free software: you can
  11. * redistribute it and/or modify it under the terms of the GNU
  12. * General Public License (GNU GPL) as published by the Free Software
  13. * Foundation, either version 3 of the License, or (at your option)
  14. * any later version. The code is distributed WITHOUT ANY WARRANTY;
  15. * without even the implied warranty of MERCHANTABILITY or FITNESS
  16. * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
  17. *
  18. * As additional permission under GNU GPL version 3 section 7, you
  19. * may distribute non-source (e.g., minimized or compacted) forms of
  20. * that code without the copy of the GNU GPL normally required by
  21. * section 4, provided you include this license notice and a URL
  22. * through which recipients can access the Corresponding Source.
  23. *
  24. * @licend
  25. */
  26. (function () { //Code isolation
  27. var ZOOM_FACTOR = .5;
  28. var origin = {
  29. scrollX: document.documentElement.scrollLeft,
  30. scrollY: document.documentElement.scrollTop,
  31. x: 0.0,
  32. y: 0.0,
  33. clientY: 0,
  34. scale: 1.0
  35. };
  36. var moved = false, pressed = false;
  37. function zoom(origin, scale) {
  38. var oldScale = origin.scale;
  39. var newScale = Tools.setScale(scale);
  40. window.scrollTo(
  41. origin.scrollX + origin.x * (newScale - oldScale),
  42. origin.scrollY + origin.y * (newScale - oldScale)
  43. );
  44. }
  45. var animation = null;
  46. function animate(scale) {
  47. cancelAnimationFrame(animation);
  48. animation = requestAnimationFrame(function () {
  49. zoom(origin, scale);
  50. });
  51. }
  52. function setOrigin(x, y, evt, isTouchEvent) {
  53. origin.scrollX = document.documentElement.scrollLeft;
  54. origin.scrollY = document.documentElement.scrollTop;
  55. origin.x = x;
  56. origin.y = y;
  57. origin.clientY = getClientY(evt, isTouchEvent);
  58. origin.scale = Tools.getScale();
  59. }
  60. function press(x, y, evt, isTouchEvent) {
  61. evt.preventDefault();
  62. setOrigin(x, y, evt, isTouchEvent);
  63. moved = false;
  64. pressed = true;
  65. }
  66. function move(x, y, evt, isTouchEvent) {
  67. if (pressed) {
  68. evt.preventDefault();
  69. var delta = getClientY(evt, isTouchEvent) - origin.clientY;
  70. var scale = origin.scale * (1 + delta * ZOOM_FACTOR / 100);
  71. if (Math.abs(delta) > 1) moved = true;
  72. animation = animate(scale);
  73. }
  74. }
  75. function onwheel(evt) {
  76. evt.preventDefault();
  77. var multiplier =
  78. (evt.deltaMode === WheelEvent.DOM_DELTA_LINE) ? 30 :
  79. (evt.deltaMode === WheelEvent.DOM_DELTA_PAGE) ? 1000 :
  80. 1;
  81. var deltaX = evt.deltaX * multiplier, deltaY = evt.deltaY * multiplier;
  82. if (!evt.ctrlKey) {
  83. // zoom
  84. var scale = Tools.getScale();
  85. var x = evt.pageX / scale;
  86. var y = evt.pageY / scale;
  87. setOrigin(x, y, evt, false);
  88. animate((1 - deltaY / 800) * Tools.getScale());
  89. } else if (evt.altKey) {
  90. // make finer changes if shift is being held
  91. var change = evt.shiftKey ? 1 : 5;
  92. // change tool size
  93. Tools.setSize(Tools.getSize() - deltaY / 100 * change);
  94. } else if (evt.shiftKey) {
  95. // scroll horizontally
  96. window.scrollTo(document.documentElement.scrollLeft + deltaY, document.documentElement.scrollTop + deltaX);
  97. } else {
  98. // regular scrolling
  99. window.scrollTo(document.documentElement.scrollLeft + deltaX, document.documentElement.scrollTop + deltaY);
  100. }
  101. }
  102. Tools.board.addEventListener("wheel", onwheel, { passive: false });
  103. Tools.board.addEventListener("touchmove", function ontouchmove(evt) {
  104. // 2-finger pan to zoom
  105. var touches = evt.touches;
  106. if (touches.length === 2) {
  107. var x0 = touches[0].clientX, x1 = touches[1].clientX,
  108. y0 = touches[0].clientY, y1 = touches[1].clientY,
  109. dx = x0 - x1,
  110. dy = y0 - y1;
  111. var x = (touches[0].pageX + touches[1].pageX) / 2 / Tools.getScale(),
  112. y = (touches[0].pageY + touches[1].pageY) / 2 / Tools.getScale();
  113. var distance = Math.sqrt(dx * dx + dy * dy);
  114. if (!pressed) {
  115. pressed = true;
  116. setOrigin(x, y, evt, true);
  117. origin.distance = distance;
  118. } else {
  119. var delta = distance - origin.distance;
  120. var scale = origin.scale * (1 + delta * ZOOM_FACTOR / 100);
  121. animate(scale);
  122. }
  123. }
  124. }, { passive: true });
  125. function touchend() {
  126. pressed = false;
  127. }
  128. Tools.board.addEventListener("touchend", touchend);
  129. Tools.board.addEventListener("touchcancel", touchend);
  130. function release(x, y, evt, isTouchEvent) {
  131. if (pressed && !moved) {
  132. var delta = (evt.shiftKey === true) ? -1 : 1;
  133. var scale = Tools.getScale() * (1 + delta * ZOOM_FACTOR);
  134. zoom(origin, scale);
  135. }
  136. pressed = false;
  137. }
  138. function key(down) {
  139. return function (evt) {
  140. if (evt.key === "Shift") {
  141. Tools.svg.style.cursor = "zoom-" + (down ? "out" : "in");
  142. }
  143. }
  144. }
  145. function getClientY(evt, isTouchEvent) {
  146. return isTouchEvent ? evt.changedTouches[0].clientY : evt.clientY;
  147. }
  148. var keydown = key(true);
  149. var keyup = key(false);
  150. function onstart() {
  151. window.addEventListener("keydown", keydown);
  152. window.addEventListener("keyup", keyup);
  153. }
  154. function onquit() {
  155. window.removeEventListener("keydown", keydown);
  156. window.removeEventListener("keyup", keyup);
  157. }
  158. var zoomTool = {
  159. "name": "Zoom",
  160. "shortcut": "z",
  161. "listeners": {
  162. "press": press,
  163. "move": move,
  164. "release": release,
  165. },
  166. "onstart": onstart,
  167. "onquit": onquit,
  168. "mouseCursor": "zoom-in",
  169. "icon": "tools/zoom/icon.svg",
  170. "helpText": "click_to_zoom",
  171. "showMarker": true,
  172. };
  173. Tools.add(zoomTool);
  174. })(); //End of code isolation