]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | Ext.define("StockApp.view.Preview", {\r |
2 | extend: 'Ext.chart.CartesianChart',\r | |
3 | requires: ['StockApp.sprite.RangeMask'],\r | |
4 | xtype: 'preview',\r | |
5 | config: {\r | |
6 | docked: 'bottom',\r | |
7 | insetPadding: 0,\r | |
8 | background: 'white',\r | |
9 | series: [\r | |
10 | {\r | |
11 | store: 'Apple',\r | |
12 | type: 'line',\r | |
13 | xField: 'date',\r | |
14 | yField: 'close',\r | |
15 | style: {\r | |
16 | stroke: 'rgba(237,123,43,0.75)',\r | |
17 | fill: 'rgba(237,123,43,0.1)',\r | |
18 | miterLimit: 1\r | |
19 | }\r | |
20 | },\r | |
21 | {\r | |
22 | store: 'Google',\r | |
23 | type: 'line',\r | |
24 | xField: 'date',\r | |
25 | yField: 'close',\r | |
26 | style: {\r | |
27 | stroke: 'rgba(67,175,174,0.75)',\r | |
28 | fill: 'rgba(67,175,174,0.1)',\r | |
29 | miterLimit: 1\r | |
30 | }\r | |
31 | }\r | |
32 | // {\r | |
33 | // store: 'Autodesk',\r | |
34 | // type: 'line',\r | |
35 | // xField: 'date',\r | |
36 | // yField: 'close',\r | |
37 | // style: {\r | |
38 | // stroke: 'rgba(221,31,74,0.75)',\r | |
39 | // fill: 'rgba(221,31,74,0.1)',\r | |
40 | // miterLimit: 1\r | |
41 | // }\r | |
42 | // },\r | |
43 | // {\r | |
44 | // store: 'IBM',\r | |
45 | // type: 'line',\r | |
46 | // xField: 'date',\r | |
47 | // yField: 'close',\r | |
48 | // style: {\r | |
49 | // stroke: 'rgba(255,76,77,0.75)',\r | |
50 | // fill: 'rgba(255,76,77,0.1)',\r | |
51 | // miterLimit: 1\r | |
52 | // }\r | |
53 | // },\r | |
54 | // {\r | |
55 | // store: 'Microsoft',\r | |
56 | // type: 'line',\r | |
57 | // xField: 'date',\r | |
58 | // yField: 'close',\r | |
59 | // style: {\r | |
60 | // stroke: 'rgba(24,121,34,0.75)',\r | |
61 | // fill: 'rgba(24,121,34,0.1)',\r | |
62 | // miterLimit: 1\r | |
63 | // }\r | |
64 | // },\r | |
65 | // {\r | |
66 | // store: 'Oracle',\r | |
67 | // type: 'line',\r | |
68 | // xField: 'date',\r | |
69 | // yField: 'close',\r | |
70 | // style: {\r | |
71 | // stroke: 'rgba(254,166,58,0.75)',\r | |
72 | // fill: 'rgba(254,166,58,0.1)',\r | |
73 | // miterLimit: 1\r | |
74 | // }\r | |
75 | // }\r | |
76 | ],\r | |
77 | axes: [\r | |
78 | {\r | |
79 | type: 'numeric',\r | |
80 | position: 'left',\r | |
81 | fields: ['close'],\r | |
82 | hidden: true\r | |
83 | },\r | |
84 | {\r | |
85 | type: 'time',\r | |
86 | position: 'bottom',\r | |
87 | fields: ['date'],\r | |
88 | style: {\r | |
89 | axisLine: false,\r | |
90 | strokeStyle: '#666',\r | |
91 | estStepSize: 150\r | |
92 | },\r | |
93 | dateFormat: 'Y',\r | |
94 | segmenter: {\r | |
95 | type: 'time',\r | |
96 | step: {\r | |
97 | unit: 'y',\r | |
98 | step: 1\r | |
99 | }\r | |
100 | },\r | |
101 | label: {\r | |
102 | fontSize: 10,\r | |
103 | fillStyle: '#666'\r | |
104 | }\r | |
105 | }\r | |
106 | ],\r | |
107 | sprites: [\r | |
108 | {\r | |
109 | type: 'rangemask',\r | |
110 | visibleRange: [0.5, 0.9],\r | |
111 | fill: 'rgba(0,0,0,0.15)',\r | |
112 | opacity: 1\r | |
113 | }\r | |
114 | ]\r | |
115 | },\r | |
116 | \r | |
117 | \r | |
118 | initialize: function () {\r | |
119 | this.callParent();\r | |
120 | this.getSurface('chart').element.setStyle({zIndex: 100});\r | |
121 | this.rangeMask = this.getSurface('chart').getItems()[0];\r | |
122 | this.rangeMask.fx.setCustomDurations({'handlerOpacity': 100});\r | |
123 | this.dragStatus = {};\r | |
124 | this.element.on('touchstart', 'onTouchStart', this);\r | |
125 | this.element.on('touchmove', 'onTouchMove', this);\r | |
126 | this.element.on('touchend', 'onTouchEnd', this);\r | |
127 | },\r | |
128 | \r | |
129 | onTouchStart: function (e) {\r | |
130 | var xy = this.element.getXY(),\r | |
131 | axis = this.axis || (this.axis = Ext.ComponentQuery.query('#mainChart axis')[1]),\r | |
132 | width = this.element.getSize().width,\r | |
133 | min = width * this.rangeMask.attr.visibleRange[0],\r | |
134 | max = width * this.rangeMask.attr.visibleRange[1],\r | |
135 | x = e.getX() - xy[0],\r | |
136 | any = false;\r | |
137 | \r | |
138 | if (min + 22 < x && x < max - 22 && !this.dragStatus.pan) {\r | |
139 | any = true;\r | |
140 | this.dragStatus.pan = {\r | |
141 | x: x,\r | |
142 | type: 'pan'\r | |
143 | };\r | |
144 | } else if (x - 22 < max && max < x + 22 && !this.dragStatus.right) {\r | |
145 | any = true;\r | |
146 | this.dragStatus.right = {\r | |
147 | x: x,\r | |
148 | type: 'right'\r | |
149 | };\r | |
150 | } else if (x - 22 < min && min < x + 22 && !this.dragStatus.left) {\r | |
151 | any = true;\r | |
152 | this.dragStatus.left = {\r | |
153 | x: x,\r | |
154 | type: 'left'\r | |
155 | };\r | |
156 | }\r | |
157 | \r | |
158 | if (any) {\r | |
159 | this.rangeMask.fx.setCustomDurations({'handlerOpacity': 0});\r | |
160 | this.rangeMask.setAttributes({handlerOpacity: 1});\r | |
161 | this.rangeMask.getParent().renderFrame();\r | |
162 | }\r | |
163 | },\r | |
164 | \r | |
165 | onTouchMove: function (e) {\r | |
166 | var axis = this.axis,\r | |
167 | width = this.element.getSize().width,\r | |
168 | min = this.rangeMask.attr.visibleRange[0],\r | |
169 | max = this.rangeMask.attr.visibleRange[1],\r | |
170 | gap = 5 / width,\r | |
171 | x = e.getX(),\r | |
172 | dx;\r | |
173 | \r | |
174 | if (this.dragStatus.pan) {\r | |
175 | dx = (x - this.dragStatus.pan.x) / width;\r | |
176 | this.dragStatus.pan.x = x;\r | |
177 | min += dx;\r | |
178 | max += dx;\r | |
179 | if (min < 0) {\r | |
180 | max -= min;\r | |
181 | min = 0;\r | |
182 | }\r | |
183 | if (max > 1) {\r | |
184 | min -= max - 1;\r | |
185 | max = 1;\r | |
186 | }\r | |
187 | }\r | |
188 | else if (this.dragStatus.left) {\r | |
189 | dx = (x - this.dragStatus.left.x) / width;\r | |
190 | this.dragStatus.left.x = x;\r | |
191 | min += dx;\r | |
192 | if (min < 0) {\r | |
193 | min = 0;\r | |
194 | }\r | |
195 | if (min > max - gap) {\r | |
196 | min = max - gap;\r | |
197 | }\r | |
198 | } else if (this.dragStatus.right) {\r | |
199 | dx = (x - this.dragStatus.right.x) / width;\r | |
200 | this.dragStatus.right.x = x;\r | |
201 | max += dx;\r | |
202 | if (max > 1) {\r | |
203 | max = 1;\r | |
204 | }\r | |
205 | if (max < min + gap) {\r | |
206 | max = min + gap;\r | |
207 | }\r | |
208 | } else {\r | |
209 | return;\r | |
210 | }\r | |
211 | axis.setVisibleRange([min, max]);\r | |
212 | this.rangeMask.setAttributes({visibleRange: [min, max]});\r | |
213 | this.getSurface('chart').renderFrame();\r | |
214 | Ext.getCmp('mainChart').performLayout();\r | |
215 | },\r | |
216 | \r | |
217 | onTouchEnd: function (e) {\r | |
218 | for (var i in {pan: 0, left: 0, right: 0}) {\r | |
219 | if (this.dragStatus[i]) {\r | |
220 | delete this.dragStatus[i];\r | |
221 | }\r | |
222 | }\r | |
223 | if (!this.dragStatus.pan && !this.dragStatus.left && !this.dragStatus.right) {\r | |
224 | this.rangeMask.fx.setCustomDurations({'handlerOpacity': 500});\r | |
225 | this.rangeMask.setAttributes({handlerOpacity: 0});\r | |
226 | }\r | |
227 | },\r | |
228 | \r | |
229 | performLayout: function () {\r | |
230 | this.callParent();\r | |
231 | var surface = this.getSurface('chart'),\r | |
232 | size = this.element.getSize();\r | |
233 | \r | |
234 | this.rangeMask.setAttributes({\r | |
235 | scalingCenterX: 0,\r | |
236 | scalingCenterY: 0,\r | |
237 | scalingX: size.width,\r | |
238 | scalingY: size.height\r | |
239 | });\r | |
240 | surface.setRect([0, 0, size.width, size.height]);\r | |
241 | surface.renderFrame();\r | |
242 | }\r | |
243 | }); |