RecorderManager.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /**
  2. * Recorder manager.
  3. * Used as a bookmarklet:
  4. *
  5. * javascript:void(window.open("../ux/event/RecorderManager.html","recmgr"))
  6. */
  7. Ext.define('Ext.ux.event.RecorderManager', {
  8. extend: 'Ext.panel.Panel',
  9. alias: 'widget.eventrecordermanager',
  10. uses: [
  11. 'Ext.ux.event.Recorder',
  12. 'Ext.ux.event.Player'
  13. ],
  14. layout: 'fit',
  15. buttonAlign: 'left',
  16. eventsToIgnore: {
  17. mousemove: 1,
  18. mouseover: 1,
  19. mouseout: 1
  20. },
  21. bodyBorder: false,
  22. playSpeed: 1,
  23. initComponent: function () {
  24. var me = this;
  25. me.recorder = new Ext.ux.event.Recorder({
  26. attachTo: me.attachTo,
  27. listeners: {
  28. add: me.updateEvents,
  29. coalesce: me.updateEvents,
  30. buffer: 200,
  31. scope: me
  32. }
  33. });
  34. me.recorder.eventsToRecord = Ext.apply({}, me.recorder.eventsToRecord);
  35. function speed (text, value) {
  36. return {
  37. text: text,
  38. speed: value,
  39. group: 'speed',
  40. checked: value == me.playSpeed,
  41. handler: me.onPlaySpeed,
  42. scope: me
  43. };
  44. }
  45. me.tbar = [
  46. {
  47. text: 'Record',
  48. xtype: 'splitbutton',
  49. whenIdle: true,
  50. handler: me.onRecord,
  51. scope: me,
  52. menu: me.makeRecordButtonMenu()
  53. },
  54. {
  55. text: 'Play',
  56. xtype: 'splitbutton',
  57. whenIdle: true,
  58. handler: me.onPlay,
  59. scope: me,
  60. menu: [
  61. speed('Recorded Speed (1x)', 1),
  62. speed('Double Speed (2x)', 2),
  63. speed('Quad Speed (4x)', 4),
  64. '-',
  65. speed('Full Speed', 1000)
  66. ]
  67. },
  68. {
  69. text: 'Clear',
  70. whenIdle: true,
  71. handler: me.onClear,
  72. scope: me
  73. },
  74. '->',
  75. {
  76. text: 'Stop',
  77. whenActive: true,
  78. disabled: true,
  79. handler: me.onStop,
  80. scope: me
  81. }
  82. ];
  83. var events = me.attachTo.testEvents;
  84. me.items = [
  85. {
  86. xtype: 'textarea',
  87. itemId: 'eventView',
  88. fieldStyle: 'font-family: monospace',
  89. selectOnFocus: true,
  90. emptyText: 'Events go here!',
  91. value: events ? me.stringifyEvents(events) : '',
  92. scrollToBottom: function () {
  93. var inputEl = this.inputEl.dom;
  94. inputEl.scrollTop = inputEl.scrollHeight;
  95. }
  96. }
  97. ];
  98. me.fbar = [
  99. {
  100. xtype: 'tbtext',
  101. text: 'Attached To: ' + me.attachTo.location.href
  102. }
  103. ];
  104. me.callParent();
  105. },
  106. makeRecordButtonMenu: function () {
  107. var ret = [],
  108. subs = {},
  109. eventsToRec = this.recorder.eventsToRecord,
  110. ignoredEvents = this.eventsToIgnore;
  111. Ext.Object.each(eventsToRec, function (name, value) {
  112. var sub = subs[value.kind];
  113. if (!sub) {
  114. subs[value.kind] = sub = [];
  115. ret.push({
  116. text: value.kind,
  117. menu: sub
  118. });
  119. }
  120. sub.push({
  121. text: name,
  122. checked: true,
  123. handler: function (menuItem) {
  124. if (menuItem.checked) {
  125. eventsToRec[name] = value;
  126. } else {
  127. delete eventsToRec[name];
  128. }
  129. }
  130. });
  131. if (ignoredEvents[name]) {
  132. sub[sub.length - 1].checked = false;
  133. Ext.Function.defer(function () {
  134. delete eventsToRec[name];
  135. }, 1);
  136. }
  137. });
  138. function less (lhs, rhs) {
  139. return (lhs.text < rhs.text) ? -1
  140. : ((rhs.text < lhs.text) ? 1 : 0);
  141. }
  142. ret.sort(less);
  143. Ext.Array.each(ret, function (sub) {
  144. sub.menu.sort(less);
  145. });
  146. return ret;
  147. },
  148. getEventView: function () {
  149. return this.down('#eventView');
  150. },
  151. onClear: function () {
  152. var view = this.getEventView();
  153. view.setValue('');
  154. },
  155. onPlay: function () {
  156. var me = this,
  157. view = me.getEventView(),
  158. events = view.getValue();
  159. if (events) {
  160. events = Ext.decode(events);
  161. if (events.length) {
  162. me.player = Ext.create('Ext.ux.event.Player', {
  163. attachTo: window.opener,
  164. eventQueue: events,
  165. listeners: {
  166. stop: me.onPlayStop,
  167. scope: me
  168. }
  169. });
  170. me.player.start();
  171. me.syncBtnUI();
  172. }
  173. }
  174. },
  175. onPlayStop: function () {
  176. this.player = null;
  177. this.syncBtnUI();
  178. },
  179. onPlaySpeed: function (menuitem) {
  180. this.playSpeed = menuitem.speed;
  181. },
  182. onRecord: function () {
  183. this.recorder.start();
  184. this.syncBtnUI();
  185. },
  186. onStop: function () {
  187. var me = this;
  188. if (me.player) {
  189. me.player.stop();
  190. me.player = null;
  191. } else {
  192. me.recorder.stop();
  193. }
  194. me.syncBtnUI();
  195. me.updateEvents();
  196. },
  197. syncBtnUI: function () {
  198. var me = this,
  199. idle = !me.player && !me.recorder.active;
  200. Ext.each(me.query('[whenIdle]'), function (btn) {
  201. btn.setDisabled(!idle);
  202. });
  203. Ext.each(me.query('[whenActive]'), function (btn) {
  204. btn.setDisabled(idle);
  205. });
  206. var view = me.getEventView();
  207. view.setReadOnly(!idle);
  208. },
  209. stringifyEvents: function (events) {
  210. var line,
  211. lines = [];
  212. Ext.each(events, function (ev) {
  213. line = [];
  214. Ext.Object.each(ev, function (name, value) {
  215. if (line.length) {
  216. line.push(', ');
  217. } else {
  218. line.push(' { ');
  219. }
  220. line.push(name, ': ');
  221. line.push(Ext.encode(value));
  222. });
  223. line.push(' }');
  224. lines.push(line.join(''));
  225. });
  226. return '[\n' + lines.join(',\n') + '\n]';
  227. },
  228. updateEvents: function () {
  229. var me = this,
  230. text = me.stringifyEvents(me.recorder.getRecordedEvents()),
  231. view = me.getEventView();
  232. view.setValue(text);
  233. view.scrollToBottom();
  234. }
  235. });