VideoWindow.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*!
  2. * Ext JS Library 4.0
  3. * Copyright(c) 2006-2011 Sencha Inc.
  4. * licensing@sencha.com
  5. * http://www.sencha.com/license
  6. */
  7. // From code originally written by David Davis (http://www.sencha.com/blog/html5-video-canvas-and-ext-js/)
  8. Ext.define('MyDesktop.VideoWindow', {
  9. extend: 'Ext.ux.desktop.Module',
  10. uses: [
  11. 'Ext.ux.desktop.Video'
  12. ],
  13. id:'video',
  14. windowId: 'video-window',
  15. tipWidth: 160,
  16. tipHeight: 96,
  17. init : function(){
  18. this.launcher = {
  19. text: 'About Ext JS',
  20. iconCls:'video'
  21. }
  22. },
  23. createWindow : function(){
  24. var me = this, desktop = me.app.getDesktop(),
  25. win = desktop.getWindow(me.windowId);
  26. if (!win) {
  27. win = desktop.createWindow({
  28. id: me.windowId,
  29. title: 'About Ext JS',
  30. width: 740,
  31. height: 480,
  32. iconCls: 'video',
  33. animCollapse: false,
  34. border: false,
  35. layout: 'fit',
  36. items: [
  37. {
  38. xtype: 'video',
  39. id: 'video-player',
  40. src: [
  41. // browser will pick the format it likes most:
  42. { src: 'http://dev.sencha.com/desktopvideo.mp4', type: 'video/mp4' },
  43. { src: 'http://dev.sencha.com/desktopvideo.ogv', type: 'video/ogg' },
  44. { src: 'http://dev.sencha.com/desktopvideo.mov', type: 'video/quicktime' }
  45. ],
  46. autobuffer: true,
  47. autoplay : true,
  48. controls : true,
  49. /* default */
  50. listeners: {
  51. afterrender: function(video) {
  52. me.videoEl = video.video.dom;
  53. if (video.supported) {
  54. me.tip = new Ext.tip.ToolTip({
  55. anchor : 'bottom',
  56. dismissDelay : 0,
  57. height : me.tipHeight,
  58. width : me.tipWidth,
  59. renderTpl: [
  60. '<canvas width="', me.tipWidth,
  61. '" height="', me.tipHeight, '">'
  62. ],
  63. renderSelectors: {
  64. body: 'canvas'
  65. },
  66. listeners: {
  67. afterrender: me.onTooltipRender,
  68. show: me.renderPreview,
  69. scope: me
  70. }
  71. }); // tip
  72. }
  73. }
  74. }
  75. }
  76. ],
  77. listeners: {
  78. beforedestroy: function() {
  79. me.tip = me.ctx = me.videoEl = null;
  80. }
  81. }
  82. });
  83. }
  84. if (me.tip) {
  85. me.tip.setTarget(win.taskButton.el);
  86. }
  87. return win;
  88. },
  89. onTooltipRender: function (tip) {
  90. // get the canvas 2d context
  91. var el = tip.body.dom, me = this;
  92. me.ctx = el.getContext && el.getContext('2d');
  93. },
  94. renderPreview: function() {
  95. var me = this;
  96. if ((me.tip && !me.tip.isVisible()) || !me.videoEl) {
  97. return;
  98. }
  99. if (me.ctx) {
  100. try {
  101. me.ctx.drawImage(me.videoEl, 0, 0, me.tipWidth, me.tipHeight);
  102. } catch(e) {};
  103. }
  104. // 20ms to keep the tooltip video smooth
  105. Ext.Function.defer(me.renderPreview, 20, me);
  106. }
  107. });