]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | Ext.require([\r |
2 | 'Ext.XTemplate',\r | |
3 | 'Ext.util.KeyNav',\r | |
4 | 'Ext.fx.*'\r | |
5 | ]);\r | |
6 | \r | |
7 | Ext.define('Board', {\r | |
8 | constructor: function(size, activeCls){\r | |
9 | this.size = size;\r | |
10 | this.activeCls = activeCls;\r | |
11 | },\r | |
12 | \r | |
13 | render: function(el){\r | |
14 | el = Ext.get(el);\r | |
15 | \r | |
16 | var tpl = Ext.create('Ext.XTemplate',\r | |
17 | '<tpl for=".">',\r | |
18 | '<div class="square">{.}</div>',\r | |
19 | '<tpl if="xindex % ' + this.size + ' === 0"><div class="x-clear"></div></tpl>',\r | |
20 | '</tpl>'),\r | |
21 | data = [],\r | |
22 | i = 0,\r | |
23 | max = this.size * this.size;\r | |
24 | \r | |
25 | for (; i < max; ++i) {\r | |
26 | data.push(i + 1);\r | |
27 | }\r | |
28 | tpl.append(el, data);\r | |
29 | this.cells = el.select('.square');\r | |
30 | },\r | |
31 | \r | |
32 | getIndex: function(xy){\r | |
33 | return this.size * xy[0] + xy[1];\r | |
34 | },\r | |
35 | \r | |
36 | constrain: function(x, y) {\r | |
37 | x = Ext.Number.constrain(x, 0, this.size - 1);\r | |
38 | y = Ext.Number.constrain(y, 0, this.size - 1);\r | |
39 | return [x, y];\r | |
40 | },\r | |
41 | \r | |
42 | setActive: function(x, y) {\r | |
43 | var xy = this.constrain(x, y),\r | |
44 | cell = this.cells.item(this.getIndex(xy));\r | |
45 | \r | |
46 | cell.radioCls(this.activeCls);\r | |
47 | this.active = xy;\r | |
48 | },\r | |
49 | \r | |
50 | setActiveCls: function(activeCls){\r | |
51 | this.cells.removeCls(this.activeCls);\r | |
52 | this.activeCls = activeCls;\r | |
53 | var active = this.active;\r | |
54 | this.setActive(active[0], active[1]);\r | |
55 | },\r | |
56 | \r | |
57 | highlightActive: function(){\r | |
58 | var cell = this.cells.item(this.getIndex(this.active));\r | |
59 | Ext.create('Ext.fx.Anim', {\r | |
60 | target: cell,\r | |
61 | duration: 1000,\r | |
62 | alternate: true,\r | |
63 | iterations: 2,\r | |
64 | to: {\r | |
65 | backgroundColor: '#FFFF00'\r | |
66 | },\r | |
67 | callback: function(){\r | |
68 | cell.setStyle('background-color', '');\r | |
69 | }\r | |
70 | });\r | |
71 | },\r | |
72 | \r | |
73 | moveUp: function(){\r | |
74 | var active = this.active;\r | |
75 | this.setActive(active[0] - 1, active[1]);\r | |
76 | },\r | |
77 | \r | |
78 | moveDown: function(){\r | |
79 | var active = this.active;\r | |
80 | this.setActive(active[0] + 1, active[1]);\r | |
81 | },\r | |
82 | \r | |
83 | moveLeft: function(){\r | |
84 | var active = this.active;\r | |
85 | this.setActive(active[0], active[1] - 1);\r | |
86 | },\r | |
87 | \r | |
88 | moveRight: function(){\r | |
89 | var active = this.active;\r | |
90 | this.setActive(active[0], active[1] + 1);\r | |
91 | }\r | |
92 | });\r | |
93 | \r | |
94 | Ext.onReady(function(){\r | |
95 | \r | |
96 | var cls = 'active-green';\r | |
97 | var board = new Board(4, cls);\r | |
98 | board.render('board');\r | |
99 | board.setActive(0, 0);\r | |
100 | \r | |
101 | var nav = Ext.create('Ext.util.KeyNav', Ext.getDoc(), {\r | |
102 | scope: board,\r | |
103 | left: board.moveLeft,\r | |
104 | up: board.moveUp,\r | |
105 | right: board.moveRight,\r | |
106 | down: board.moveDown,\r | |
107 | space: board.highlightActive,\r | |
108 | home: function(){\r | |
109 | cls = Ext.String.toggle(cls, 'active-green', 'active-red');\r | |
110 | board.setActiveCls(cls);\r | |
111 | }\r | |
112 | });\r | |
113 | \r | |
114 | });\r |