size.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. DrawingBoard.Control.Size = DrawingBoard.Control.extend({
  2. name: 'size',
  3. defaults: {
  4. type: "auto",
  5. dropdownValues: [1, 3, 6, 10, 20, 30, 40, 50]
  6. },
  7. types: ['dropdown', 'range'],
  8. initialize: function() {
  9. if (this.opts.type == "auto")
  10. this.opts.type = this._iHasRangeInput() ? 'range' : 'dropdown';
  11. var tpl = $.inArray(this.opts.type, this.types) > -1 ? this['_' + this.opts.type + 'Template']() : false;
  12. if (!tpl) return false;
  13. this.val = this.board.opts.size;
  14. this.$el.append( $( tpl ) );
  15. this.$el.attr('data-drawing-board-type', this.opts.type);
  16. this.updateView();
  17. var that = this;
  18. if (this.opts.type == "range") {
  19. this.$el.on('change', '.drawing-board-control-size-range-input', function(e) {
  20. that.val = $(this).val();
  21. that.updateView();
  22. that.board.ev.trigger('size:changed', that.val);
  23. e.preventDefault();
  24. });
  25. }
  26. if (this.opts.type == "dropdown") {
  27. this.$el.on('click', '.drawing-board-control-size-dropdown-current', $.proxy(function(e) {
  28. this.$el.find('.drawing-board-control-size-dropdown').toggleClass('drawing-board-utils-hidden');
  29. }, this));
  30. this.$el.on('click', '[data-size]', function(e) {
  31. that.val = parseInt($(this).attr('data-size'), 0);
  32. that.updateView();
  33. that.board.ev.trigger('size:changed', that.val);
  34. e.preventDefault();
  35. });
  36. }
  37. },
  38. _rangeTemplate: function() {
  39. // var tpl = '<div class="drawing-board-control-inner" title="{{size}}">' +
  40. // '<input type="range" min="1" max="50" value="{{size}}" step="1" class="drawing-board-control-size-range-input">' +
  41. // '<span class="drawing-board-control-size-range-current"></span>' +
  42. // '</div>';
  43. },
  44. _dropdownTemplate: function() {
  45. var tpl = '<div class="drawing-board-control-inner" title="{{size}}">' +
  46. '<div class="drawing-board-control-size-dropdown-current"><span></span></div>' +
  47. '<ul class="drawing-board-control-size-dropdown">';
  48. $.each(this.opts.dropdownValues, function(i, size) {
  49. tpl += DrawingBoard.Utils.tpl(
  50. '<li data-size="{{size}}"><span style="width: {{size}}px; height: {{size}}px; border-radius: {{size}}px;"></span></li>',
  51. { size: size }
  52. );
  53. });
  54. tpl += '</ul></div>';
  55. return tpl;
  56. },
  57. onBoardReset: function(opts) {
  58. this.updateView();
  59. },
  60. updateView: function() {
  61. var val = this.val;
  62. this.board.ctx.lineWidth = val;
  63. this.$el.find('.drawing-board-control-size-range-current, .drawing-board-control-size-dropdown-current span').css({
  64. width: val + 'px',
  65. height: val + 'px',
  66. borderRadius: val + 'px',
  67. marginLeft: -1*val/2 + 'px',
  68. marginTop: -1*val/2 + 'px'
  69. });
  70. this.$el.find('.drawing-board-control-inner').attr('title', val);
  71. if (this.opts.type == 'dropdown') {
  72. var closest = null;
  73. $.each(this.opts.dropdownValues, function(i, size) {
  74. if (closest === null || Math.abs(size - val) < Math.abs(closest - val))
  75. closest = size;
  76. });
  77. this.$el.find('.drawing-board-control-size-dropdown').addClass('drawing-board-utils-hidden');
  78. }
  79. },
  80. _iHasRangeInput: function() {
  81. var inputElem = document.createElement('input'),
  82. smile = ':)',
  83. docElement = document.documentElement,
  84. inputElemType = 'range',
  85. available;
  86. inputElem.setAttribute('type', inputElemType);
  87. available = inputElem.type !== 'text';
  88. inputElem.value = smile;
  89. inputElem.style.cssText = 'position:absolute;visibility:hidden;';
  90. if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
  91. docElement.appendChild(inputElem);
  92. defaultView = document.defaultView;
  93. available = defaultView.getComputedStyle &&
  94. defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
  95. (inputElem.offsetHeight !== 0);
  96. docElement.removeChild(inputElem);
  97. }
  98. return !!available;
  99. }
  100. });