You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

203 rivejä
3.8 KiB

  1. define([
  2. 'js/system/events',
  3. 'html!ui/templates/messages/template',
  4. 'css!ui/templates/messages/styles',
  5. 'js/input',
  6. 'js/system/client'
  7. ], function(
  8. events,
  9. template,
  10. styles,
  11. input,
  12. client
  13. ) {
  14. return {
  15. tpl: template,
  16. messages: [],
  17. maxTtl: 500,
  18. shiftDown: false,
  19. hoverItem: null,
  20. hoverFilter: false,
  21. postRender: function() {
  22. this.onEvent('onGetMessages', this.onGetMessages.bind(this));
  23. this.onEvent('onDoWhisper', this.onDoWhisper.bind(this));
  24. this.find('input')
  25. .on('keydown', this.sendChat.bind(this))
  26. .on('blur', this.toggle.bind(this, false, true));
  27. this
  28. .find('.filter')
  29. .on('mouseover', this.onFilterHover.bind(this, true))
  30. .on('mouseleave', this.onFilterHover.bind(this, false))
  31. .on('click', this.onClickFilter.bind(this));
  32. this.onEvent('onKeyDown', this.onKeyDown.bind(this));
  33. },
  34. onFilterHover: function(hover) {
  35. this.hoverFilter = hover;
  36. },
  37. onClickFilter: function(e) {
  38. var el = $(e.currentTarget);
  39. el.toggleClass('active');
  40. this.find('.list').toggleClass(el.attr('filter'));
  41. this.find('.el.message').focus();
  42. },
  43. onKeyDown: function(key, state) {
  44. if (key == 'enter')
  45. this.toggle(true);
  46. },
  47. onDoWhisper: function(charName) {
  48. this.toggle(true);
  49. var toName = charName;
  50. if (charName.indexOf(' ') > -1)
  51. toName = "'" + toName + "'";
  52. this.find('input').val('@' + toName + ' ');
  53. },
  54. onGetMessages: function(e) {
  55. var messages = e.messages;
  56. if (!messages.length)
  57. messages = [messages];
  58. var container = this.find('.list');
  59. messages.forEach(function(m) {
  60. var message = m.message;
  61. if (m.item) {
  62. var source = message.split(':')[0] + ': ';
  63. message = source + '<span class="q' + (m.item.quality || 0) + '">' + message.replace(source, '') + '</span>';
  64. }
  65. var el = $('<div class="list-message ' + m.class + '">' + message + '</div>')
  66. .appendTo(container);
  67. if (m.type != null)
  68. el.addClass(m.type);
  69. else
  70. el.addClass('info');
  71. if (m.item) {
  72. el.find('span')
  73. .on('mousemove', this.showItemTooltip.bind(this, el, m.item))
  74. .on('mouseleave', this.hideItemTooltip.bind(this));
  75. }
  76. this.messages.push({
  77. ttl: this.maxTtl,
  78. el: el
  79. });
  80. }, this);
  81. container.scrollTop(9999999);
  82. },
  83. hideItemTooltip: function() {
  84. if (this.dragEl) {
  85. this.hoverCell = null;
  86. return;
  87. }
  88. events.emit('onHideItemTooltip', this.hoverItem);
  89. this.hoverItem = null;
  90. },
  91. showItemTooltip: function(el, item, e) {
  92. if (item)
  93. this.hoverItem = item;
  94. else
  95. item = this.hoverItem;
  96. if (!item)
  97. return;
  98. var ttPos = null;
  99. if (el) {
  100. ttPos = {
  101. x: ~~(e.clientX + 32),
  102. y: ~~(e.clientY)
  103. };
  104. }
  105. events.emit('onShowItemTooltip', item, ttPos, null, true);
  106. },
  107. update: function() {
  108. return;
  109. var maxTtl = this.maxTtl;
  110. for (var i = 0; i < this.messages.length; i++) {
  111. var m = this.messages[i];
  112. if (m.ttl > 0) {
  113. m.ttl--;
  114. var opacity = ~~(m.ttl / maxTtl * 10) / 10;
  115. m.el[0].style.opacity = opacity;
  116. }
  117. }
  118. },
  119. toggle: function(show, isFake) {
  120. if ((isFake) && (this.hoverFilter))
  121. return;
  122. input.resetKeys();
  123. this.el.removeClass('typing');
  124. var textbox = this.find('input');
  125. if (show) {
  126. this.el.addClass('typing');
  127. textbox.focus();
  128. this.find('.list').scrollTop(9999999);
  129. } else {
  130. textbox.val('');
  131. }
  132. },
  133. sendChat: function(e) {
  134. if (e.which == 27)
  135. this.toggle(false);
  136. if (e.which != 13)
  137. return;
  138. if (!this.el.hasClass('typing')) {
  139. this.toggle(true);
  140. return;
  141. }
  142. var textbox = this.find('input');
  143. var val = textbox.val()
  144. .split('<')
  145. .join('')
  146. .split('>')
  147. .join('');
  148. if (val == '')
  149. return;
  150. textbox.blur();
  151. client.request({
  152. cpn: 'social',
  153. method: 'chat',
  154. data: {
  155. message: val
  156. }
  157. });
  158. }
  159. }
  160. });