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