arrowsControl.js

  1. define(['utils', 'IControl', 'errors'], function(Utils, IControl, Errors) {
  2. "use strict";
  3. /**
  4. * @class
  5. * Класс управления панелью с помощью стрелок, отображаемых по сторонам панели.
  6. * @param {JQuery} mainDiv - элемент, в котором располагается панель. Должен содержать класс rb-wrapper.
  7. * @param {function} actionFn - функция, определяющая действие при переходе в одну из сторон (Moving.prototype._moveByActionValue)
  8. * @param {Moving#afterRenderDispatcher} afterRender - Диспетчер, выполняющий зарегистрированные функции после рендеринга контента моделей на странице после перехода
  9. * @constructor ArrowsControl
  10. * @extends IControl
  11. */
  12. function ArrowsControl(mainDiv, actionFn, afterRender) {
  13. if (!(mainDiv instanceof $)) {
  14. throw new Errors.ArgumentError('mainDiv', mainDiv);
  15. }
  16. if (typeof actionFn !== 'function') {
  17. throw new Errors.ArgumentError('actionFn', actionFn);
  18. }
  19. this._isEnable = false;
  20. this._mainDiv = mainDiv.parent();
  21. this._actionFn = actionFn;
  22. this._afterRender = afterRender;
  23. }
  24. Utils.inherite(ArrowsControl, IControl);
  25. /**
  26. * Применить конфигурацию. Учитывает опции hideArrowsTime, showArrowsOutside, showArrowsOnHover, hideArrowsAfterTime.
  27. * @param {Moving~config} config
  28. * @memberOf ArrowsControl
  29. */
  30. ArrowsControl.prototype.configure = function(config) {
  31. if (typeof config === 'object') {
  32. if (config.hideArrowsTime !== undefined) {
  33. this._hideArrowsTime = config.hideArrowsTime;
  34. }
  35. if (config.showArrowsOutside !== undefined) {
  36. this._showArrowsOutside = config.showArrowsOutside;
  37. }
  38. if (config.showArrowsOnHover !== undefined) {
  39. this._showArrowsOnHover = config.showArrowsOnHover;
  40. }
  41. if (config.hideArrowsAfterTime !== undefined) {
  42. this._hideArrowsAfterTime = config.hideArrowsAfterTime;
  43. }
  44. }
  45. this._containerClass = (this._showArrowsOnHover ? 'rb__arrow-container-hover' : 'rb__arrow-container');
  46. };
  47. /**
  48. *
  49. * @returns {boolean}
  50. * @memberOf ArrowsControl
  51. */
  52. ArrowsControl.prototype.isEnable = function() {
  53. return this._isEnable;
  54. };
  55. /**
  56. *
  57. * @memberOf ArrowsControl
  58. */
  59. ArrowsControl.prototype.enable = function() {
  60. if (this._isEnable) return;
  61. var self = this;
  62. var mouseEnterHandler = function(e) {
  63. if (!self._hideArrowsAfterTime) return;
  64. var arrow = $(e.currentTarget),
  65. $body = $('body'),
  66. arrowOffset = arrow.offset(),
  67. arrowX = arrowOffset.left,
  68. arrowY = arrowOffset.top,
  69. arrowXX = arrowX + arrow.width(),
  70. arrowYY = arrowY + arrow.height();
  71. //var timeoutId;
  72. function mouseMoveHandler(e) {
  73. var x = e.clientX, y = e.clientY;
  74. if (!(arrowX < x && x < arrowXX && arrowY < y && y < arrowYY)) {
  75. arrow.toggleClass('rb__arrow-none', false);
  76. arrow.toggleClass('rb__arrow-cursor', true);
  77. $body.off('mousemove', mouseMoveHandler);
  78. //clearTimeout(timeoutId);
  79. }
  80. }
  81. function hideArrow() {
  82. arrow.toggleClass('rb__arrow-none', true);
  83. arrow.toggleClass('rb__arrow-cursor', false);
  84. $body.on('mousemove', mouseMoveHandler);
  85. //timeoutId = setTimeout(function() {
  86. // arrow.toggleClass('rb__arrow-none', false);
  87. // arrow.toggleClass('rb__arrow-cursor', true);
  88. // $body.off('mousemove', mouseMoveHandler);
  89. //}, 10000);
  90. // todo если из iframe не всплывает mousemove с нормальными координатами, для iframe не будет работать
  91. }
  92. if (arrow.length) {
  93. arrow[0].hideArrowId = setTimeout(hideArrow, self._hideArrowsTime);
  94. }
  95. };
  96. var mouseLeaveHandler = function(e) {
  97. if (!self._hideArrowsAfterTime) return;
  98. var arrow = $(e.currentTarget);
  99. clearTimeout(arrow[0].hideArrowId);
  100. };
  101. var clickHandler = function(e) {
  102. var arrow = $(e.currentTarget);
  103. mouseLeaveHandler(e);
  104. self._afterRender.add(mouseEnterHandler.bind(undefined, e), true);
  105. self._actionFn(arrow, Utils.sides, function(container, defValue) {
  106. return container.is('.rb__arrow-container_' + defValue);
  107. });
  108. };
  109. var markup = '';
  110. Utils.sides.forEach(function(side) {
  111. markup += '<div class="' +
  112. self._containerClass +
  113. ' rb__arrow-cursor rb__arrow-container_' + side + '' +
  114. (self._showArrowsOutside ? (' rb__arrow-outside_' + side) : '') +
  115. '">' +
  116. '<div class="rb__arrow rb__arrow_' + side + '"></div>' +
  117. '</div>';
  118. });
  119. this._mainDiv.append($(markup));
  120. var $rbArrowContainer = this._mainDiv.find('>.' + this._containerClass);
  121. $rbArrowContainer.on('click', clickHandler);
  122. $rbArrowContainer.on('mouseenter', mouseEnterHandler);
  123. $rbArrowContainer.on('mouseleave', mouseLeaveHandler);
  124. this._clickHandler = clickHandler;
  125. this._mouseEnterHandler = mouseEnterHandler;
  126. this._mouseLeaveHandler = mouseLeaveHandler;
  127. this._isEnable = true;
  128. };
  129. /**
  130. *
  131. * @memberOf ArrowsControl
  132. */
  133. ArrowsControl.prototype.disable = function() {
  134. if (!this._isEnable) return;
  135. var $rbArrowContainer = this._mainDiv.find('>.' + this._containerClass);
  136. for (var i = 0; i < $rbArrowContainer.length; i++) {
  137. clearTimeout($rbArrowContainer[i].hideArrowId);
  138. }
  139. $rbArrowContainer.off('click', this._clickHandler);
  140. $rbArrowContainer.off('mouseenter', this._mouseEnterHandler);
  141. $rbArrowContainer.off('mouseleave', this._mouseLeaveHandler);
  142. this._clickHandler = null;
  143. this._mouseEnterHandler = null;
  144. this._mouseLeaveHandler = null;
  145. this._mainDiv.find('>.' + this._containerClass).remove();
  146. this._isEnable = false;
  147. };
  148. /**
  149. *
  150. * @memberOf ArrowsControl
  151. */
  152. ArrowsControl.prototype.destroy = function() {
  153. this.disable();
  154. };
  155. return ArrowsControl;
  156. });