OLD | NEW |
| (Empty) |
1 | |
2 | |
3 Polymer('paper-tabs',Polymer.mixin({ | |
4 | |
5 /** | |
6 * If true, ink ripple effect is disabled. | |
7 * | |
8 * @attribute noink | |
9 * @type boolean | |
10 * @default false | |
11 */ | |
12 noink: false, | |
13 | |
14 /** | |
15 * If true, the bottom bar to indicate the selected tab will not be shown. | |
16 * | |
17 * @attribute nobar | |
18 * @type boolean | |
19 * @default false | |
20 */ | |
21 nobar: false, | |
22 | |
23 /** | |
24 * If true, the slide effect for the bottom bar is disabled. | |
25 * | |
26 * @attribute noslide | |
27 * @type boolean | |
28 * @default false | |
29 */ | |
30 noslide: false, | |
31 | |
32 /** | |
33 * If true, tabs are scrollable and the tab width is based on the label widt
h. | |
34 * | |
35 * @attribute scrollable | |
36 * @type boolean | |
37 * @default false | |
38 */ | |
39 scrollable: false, | |
40 | |
41 /** | |
42 * If true, dragging on the tabs to scroll is disabled. | |
43 * | |
44 * @attribute disableDrag | |
45 * @type boolean | |
46 * @default false | |
47 */ | |
48 disableDrag: false, | |
49 | |
50 /** | |
51 * If true, scroll buttons (left/right arrow) will be hidden for scrollable
tabs. | |
52 * | |
53 * @attribute hideScrollButton | |
54 * @type boolean | |
55 * @default false | |
56 */ | |
57 hideScrollButton: false, | |
58 | |
59 eventDelegates: { | |
60 'core-resize': 'resizeHandler' | |
61 }, | |
62 | |
63 activateEvent: 'tap', | |
64 | |
65 step: 10, | |
66 | |
67 holdDelay: 10, | |
68 | |
69 ready: function() { | |
70 this.super(); | |
71 this._trackxHandler = this.trackx.bind(this); | |
72 Polymer.addEventListener(this.$.tabsContainer, 'trackx', this._trackxHandl
er); | |
73 this._tabsObserver = new MutationObserver(this.updateBar.bind(this)); | |
74 }, | |
75 | |
76 domReady: function() { | |
77 this.async('resizeHandler'); | |
78 this._tabsObserver.observe(this, {childList: true, subtree: true, characte
rData: true}); | |
79 }, | |
80 | |
81 attached: function() { | |
82 this.resizableAttachedHandler(); | |
83 }, | |
84 | |
85 detached: function() { | |
86 Polymer.removeEventListener(this.$.tabsContainer, 'trackx', this._trackxHa
ndler); | |
87 this._tabsObserver.disconnect(); | |
88 this.resizableDetachedHandler(); | |
89 }, | |
90 | |
91 trackStart: function(e) { | |
92 if (!this.scrollable || this.disableDrag) { | |
93 return; | |
94 } | |
95 var t = e.target; | |
96 if (t && t.cancelRipple) { | |
97 t.cancelRipple(); | |
98 } | |
99 this._startx = this.$.tabsContainer.scrollLeft; | |
100 e.preventTap(); | |
101 }, | |
102 | |
103 trackx: function(e) { | |
104 if (!this.scrollable || this.disableDrag) { | |
105 return; | |
106 } | |
107 this.$.tabsContainer.scrollLeft = this._startx - e.dx; | |
108 }, | |
109 | |
110 resizeHandler: function() { | |
111 this.scroll(); | |
112 this.updateBar(); | |
113 }, | |
114 | |
115 scroll: function() { | |
116 if (!this.scrollable) { | |
117 return; | |
118 } | |
119 var tc = this.$.tabsContainer; | |
120 var l = tc.scrollLeft; | |
121 this.leftHidden = l === 0; | |
122 this.rightHidden = l === (tc.scrollWidth - tc.clientWidth); | |
123 }, | |
124 | |
125 holdLeft: function() { | |
126 this.holdJob = setInterval(this.scrollToLeft.bind(this), this.holdDelay); | |
127 }, | |
128 | |
129 holdRight: function() { | |
130 this.holdJob = setInterval(this.scrollToRight.bind(this), this.holdDelay); | |
131 }, | |
132 | |
133 releaseHold: function() { | |
134 clearInterval(this.holdJob); | |
135 this.holdJob = null; | |
136 }, | |
137 | |
138 scrollToLeft: function() { | |
139 this.$.tabsContainer.scrollLeft -= this.step; | |
140 }, | |
141 | |
142 scrollToRight: function() { | |
143 this.$.tabsContainer.scrollLeft += this.step; | |
144 }, | |
145 | |
146 /** | |
147 * Invoke this to update the size and position of the bottom bar. Usually | |
148 * you only need to call this if the `paper-tabs` is initially hidden and | |
149 * later becomes visible. | |
150 * | |
151 * @method updateBar | |
152 */ | |
153 updateBar: function() { | |
154 this.async('selectedItemChanged'); | |
155 }, | |
156 | |
157 selectedItemChanged: function(old) { | |
158 var oldIndex = this.selectedIndex; | |
159 this.super(arguments); | |
160 var s = this.$.selectionBar.style; | |
161 | |
162 if (!this.selectedItem) { | |
163 s.width = 0; | |
164 s.left = 0; | |
165 return; | |
166 } | |
167 | |
168 var r = this.$.tabsContent.getBoundingClientRect(); | |
169 this._w = r.width; | |
170 this._l = r.left; | |
171 | |
172 r = this.selectedItem.getBoundingClientRect(); | |
173 this._sw = r.width; | |
174 this._sl = r.left; | |
175 this._sOffsetLeft = this._sl - this._l; | |
176 | |
177 if (this.noslide || old == null) { | |
178 this.positionBarForSelected(); | |
179 return; | |
180 } | |
181 | |
182 var oldRect = old.getBoundingClientRect(); | |
183 | |
184 var m = 5; | |
185 this.$.selectionBar.classList.add('expand'); | |
186 if (oldIndex < this.selectedIndex) { | |
187 s.width = this.calcPercent(this._sl + this._sw - oldRect.left) - m + '%'
; | |
188 this._transitionCounter = 1; | |
189 } else { | |
190 s.width = this.calcPercent(oldRect.left + oldRect.width - this._sl) - m
+ '%'; | |
191 s.left = this.calcPercent(this._sOffsetLeft) + m + '%'; | |
192 this._transitionCounter = 2; | |
193 } | |
194 if (this.scrollable) { | |
195 this.scrollToSelectedIfNeeded(); | |
196 } | |
197 }, | |
198 | |
199 scrollToSelectedIfNeeded: function() { | |
200 var scrollLeft = this.$.tabsContainer.scrollLeft; | |
201 // scroll to selected if needed | |
202 if (this._sOffsetLeft + this._sw < scrollLeft || | |
203 this._sOffsetLeft - scrollLeft > this.$.tabsContainer.offsetWidth) { | |
204 this.$.tabsContainer.scrollLeft = this._sOffsetLeft; | |
205 } | |
206 }, | |
207 | |
208 positionBarForSelected: function() { | |
209 var s = this.$.selectionBar.style; | |
210 s.width = this.calcPercent(this._sw) + '%'; | |
211 s.left = this.calcPercent(this._sOffsetLeft) + '%'; | |
212 }, | |
213 | |
214 calcPercent: function(w) { | |
215 return 100 * w / this._w; | |
216 }, | |
217 | |
218 barTransitionEnd: function(e) { | |
219 this._transitionCounter--; | |
220 var cl = this.$.selectionBar.classList; | |
221 if (cl.contains('expand') && !this._transitionCounter) { | |
222 cl.remove('expand'); | |
223 cl.add('contract'); | |
224 this.positionBarForSelected(); | |
225 } else if (cl.contains('contract')) { | |
226 cl.remove('contract'); | |
227 } | |
228 } | |
229 | |
230 }, Polymer.CoreResizable)); | |
231 | |
OLD | NEW |