]> git.proxmox.com Git - extjs.git/blame - extjs/build/examples/kitchensink/classic/samples/view/draw/FreeDrawComponent.js
add extjs 6.0.1 sources
[extjs.git] / extjs / build / examples / kitchensink / classic / samples / view / draw / FreeDrawComponent.js
CommitLineData
6527f429
DM
1/**\r
2 * Demonstrates path drawing and smoothing.\r
3 */\r
4Ext.define('KitchenSink.view.FreeDrawComponent', function () {\r
5\r
6 function smoothList(points) {\r
7 if (points.length < 3) {\r
8 return ['M', points[0], points[1]];\r
9 }\r
10 var dx = [], dy = [], result = ['M'],\r
11 i, ln = points.length;\r
12 for (i = 0; i < ln; i += 2) {\r
13 dx.push(points[i]);\r
14 dy.push(points[i + 1]);\r
15 }\r
16 dx = Ext.draw.Draw.spline(dx);\r
17 dy = Ext.draw.Draw.spline(dy);\r
18 result.push(dx[0], dy[0], 'C');\r
19 for (i = 1, ln = dx.length; i < ln; i++) {\r
20 result.push(dx[i], dy[i]);\r
21 }\r
22 return result;\r
23 }\r
24\r
25 return {\r
26 extend: 'Ext.draw.Container',\r
27 xtype: 'free-paint-component',\r
28\r
29 config: {\r
30 background: 'white'\r
31 },\r
32\r
33 sprite: undefined,\r
34 lastEventX: undefined,\r
35 lastEventY: undefined,\r
36 list: [],\r
37\r
38 listeners: {\r
39 element: 'element',\r
40 // The type of events that are supported for each framework and platform are...\r
41 // - ExtJS on Desktop Machine: Mouse events\r
42 // - ExtJS on Touch Device: Mouse events + Touch events\r
43 // - Sencha Touch: Touch events + Drag events\r
44 //\r
45 // Mouse events = mousedown / mousemove / mouseup\r
46 // Touch events = touchstart / touchmove / touchend\r
47 // Drag events = dragstart / drag / dragend\r
48 //\r
49 // Since this is an ExtJS example, we can listen to Mouse events only.\r
50 //\r
51 // If we wanted the example to run on Sencha Touch also, we would have\r
52 // to listen to both Mouse events and Drag events (listening to Mouse\r
53 // events and Touch events would work as well but with the drawback\r
54 // that ExtJS on Touch Device would send duplicate events.\r
55 mousedown: function(e) {\r
56 var targetElement = this,\r
57 me = Ext.getCmp(targetElement.id),\r
58 surface = me.getSurface();\r
59 if (!me.sprite) {\r
60 var xy = surface.getEventXY(e),\r
61 x = xy[0],\r
62 y = xy[1];\r
63\r
64 me.list = [x, y, x, y];\r
65 me.lastEventX = x;\r
66 me.lastEventY = y;\r
67 me.sprite = surface.add({\r
68 type: 'path',\r
69 path: ['M', me.list[0], me.list[1], 'L', me.list[0] + 1e-1, me.list[1] + 1e-1],\r
70 lineWidth: 30 * Math.random() + 10,\r
71 lineCap: 'round',\r
72 lineJoin: 'round',\r
73 strokeStyle: new Ext.draw.Color(Math.random() * 127 + 128, Math.random() * 127 + 128, Math.random() * 127 + 128)\r
74 });\r
75 surface.renderFrame();\r
76 }\r
77 },\r
78 mousemove: function(e) {\r
79 var targetElement = this,\r
80 me = Ext.getCmp(targetElement.id),\r
81 surface = me.getSurface();\r
82 if (me.sprite) {\r
83 var xy = surface.getEventXY(e),\r
84 x = xy[0],\r
85 y = xy[1],\r
86 dx = me.lastEventX - x,\r
87 dy = me.lastEventY - y,\r
88 D = 10;\r
89\r
90 if (dx * dx + dy * dy < D * D) {\r
91 me.list.length -= 2;\r
92 me.list.push(x, y);\r
93 } else {\r
94 me.list.length -= 2;\r
95 me.list.push(me.lastEventX = x, me.lastEventY = y);\r
96 me.list.push(me.lastEventX + 1, me.lastEventY + 1);\r
97 }\r
98\r
99 var path = smoothList(me.list);\r
100 me.sprite.setAttributes({\r
101 path: path\r
102 });\r
103 if (Ext.os.is.Android) {\r
104 Ext.draw.Animator.schedule(function () {\r
105 surface.renderFrame();\r
106 }, me);\r
107 } else {\r
108 surface.renderFrame();\r
109 }\r
110 }\r
111 }\r
112 },\r
113\r
114 initEvents: function () {\r
115 this.callParent(arguments);\r
116 this.on({\r
117 element: 'element',\r
118 mouseup: this.onMouseUp,\r
119 mouseleave: this.onMouseUp\r
120 });\r
121 },\r
122\r
123 onMouseUp: function(e) {\r
124 var targetElement = this,\r
125 me = Ext.getCmp(targetElement.id);\r
126 me.sprite = null;\r
127 },\r
128\r
129 onResize: function() {\r
130 var size = this.element.getSize();\r
131 this.getSurface().setRect([0, 0, size.width, size.height]);\r
132 this.renderFrame();\r
133 }\r
134 };\r
135});\r
136\r
137\r