Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: third_party/polymer/v0_8/components-chromium/paper-drawer-panel/paper-drawer-panel-extracted.js

Issue 1162563004: Upgrade to 1.0 and switch clients to dom-repeat where needed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix a layout import and remove the gzipped webanimation in reproduce.sh Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 1
2 2
3 (function() { 3 (function() {
4 4
5 'use strict'; 5 'use strict';
6 6
7 // this would be the only `paper-drawer-panel` in
8 // the whole app that can be in `dragging` state
9 var sharedPanel = null;
10
7 function classNames(obj) { 11 function classNames(obj) {
8 var classNames = []; 12 var classes = [];
9 for (var key in obj) { 13 for (var key in obj) {
10 if (obj.hasOwnProperty(key) && obj[key]) { 14 if (obj.hasOwnProperty(key) && obj[key]) {
11 classNames.push(key); 15 classes.push(key);
12 } 16 }
13 } 17 }
14 18
15 return classNames.join(' '); 19 return classes.join(' ');
16 } 20 }
17 21
18 Polymer({ 22 Polymer({
19 23
20 is: 'paper-drawer-panel', 24 is: 'paper-drawer-panel',
21 25
22 /** 26 /**
23 * Fired when the narrow layout changes. 27 * Fired when the narrow layout changes.
24 * 28 *
25 * @event paper-responsive-change {{narrow: boolean}} detail - 29 * @event paper-responsive-change {{narrow: boolean}} detail -
(...skipping 10 matching lines...) Expand all
36 * @event paper-select {{isSelected: boolean, item: Object}} detail - 40 * @event paper-select {{isSelected: boolean, item: Object}} detail -
37 * isSelected: True for selection and false for deselection. 41 * isSelected: True for selection and false for deselection.
38 * item: The panel that the event refers to. 42 * item: The panel that the event refers to.
39 */ 43 */
40 44
41 properties: { 45 properties: {
42 46
43 /** 47 /**
44 * The panel to be selected when `paper-drawer-panel` changes to narrow 48 * The panel to be selected when `paper-drawer-panel` changes to narrow
45 * layout. 49 * layout.
46 *
47 * @attribute defaultSelected
48 * @type string
49 * @default 'main'
50 */ 50 */
51 defaultSelected: { 51 defaultSelected: {
52 type: String, 52 type: String,
53 value: 'main' 53 value: 'main'
54 }, 54 },
55 55
56 /** 56 /**
57 * If true, swipe from the edge is disable. 57 * If true, swipe from the edge is disable.
58 *
59 * @attribute disableEdgeSwipe
60 * @type boolean
61 * @default false
62 */ 58 */
63 disableEdgeSwipe: Boolean, 59 disableEdgeSwipe: {
60 type: Boolean,
61 value: false
62 },
64 63
65 /** 64 /**
66 * If true, swipe to open/close the drawer is disabled. 65 * If true, swipe to open/close the drawer is disabled.
67 *
68 * @attribute disableSwipe
69 * @type boolean
70 * @default false
71 */ 66 */
72 disableSwipe: Boolean, 67 disableSwipe: {
68 type: Boolean,
69 value: false
70 },
73 71
74 // Whether the user is dragging the drawer interactively. 72 /**
73 * Whether the user is dragging the drawer interactively.
74 */
75 dragging: { 75 dragging: {
76 type: Boolean, 76 type: Boolean,
77 value: false 77 value: false
78 }, 78 },
79 79
80 /** 80 /**
81 * Width of the drawer panel. 81 * Width of the drawer panel.
82 *
83 * @attribute drawerWidth
84 * @type string
85 * @default '256px'
86 */ 82 */
87 drawerWidth: { 83 drawerWidth: {
88 type: String, 84 type: String,
89 value: '256px' 85 value: '256px'
90 }, 86 },
91 87
92 // How many pixels on the side of the screen are sensitive to edge 88 /**
93 // swipes and peek. 89 * How many pixels on the side of the screen are sensitive to edge
90 * swipes and peek.
91 */
94 edgeSwipeSensitivity: { 92 edgeSwipeSensitivity: {
95 type: Number, 93 type: Number,
96 value: 30 94 value: 30
97 }, 95 },
98 96
99 /** 97 /**
100 * If true, ignore `responsiveWidth` setting and force the narrow layout . 98 * If true, ignore `responsiveWidth` setting and force the narrow layout .
101 *
102 * @attribute forceNarrow
103 * @type boolean
104 * @default false
105 */ 99 */
106 forceNarrow: { 100 forceNarrow: {
107 observer: 'forceNarrowChanged',
108 type: Boolean, 101 type: Boolean,
109 value: false 102 value: false
110 }, 103 },
111 104
112 // Whether the browser has support for the transform CSS property. 105 /**
106 * Whether the browser has support for the transform CSS property.
107 */
113 hasTransform: { 108 hasTransform: {
114 type: Boolean, 109 type: Boolean,
115 value: function() { 110 value: function() {
116 return 'transform' in this.style; 111 return 'transform' in this.style;
117 } 112 }
118 }, 113 },
119 114
120 // Whether the browser has support for the will-change CSS property. 115 /**
116 * Whether the browser has support for the will-change CSS property.
117 */
121 hasWillChange: { 118 hasWillChange: {
122 type: Boolean, 119 type: Boolean,
123 value: function() { 120 value: function() {
124 return 'willChange' in this.style; 121 return 'willChange' in this.style;
125 } 122 }
126 }, 123 },
127 124
128 /** 125 /**
129 * Returns true if the panel is in narrow layout. This is useful if you 126 * Returns true if the panel is in narrow layout. This is useful if you
130 * need to show/hide elements based on the layout. 127 * need to show/hide elements based on the layout.
131 *
132 * @attribute narrow
133 * @type boolean
134 * @default false
135 */ 128 */
136 narrow: { 129 narrow: {
137 reflectToAttribute: true, 130 reflectToAttribute: true,
138 type: Boolean, 131 type: Boolean,
139 value: false, 132 value: false,
140 notify: true 133 notify: true
141 }, 134 },
142 135
143 // Whether the drawer is peeking out from the edge. 136 /**
137 * Whether the drawer is peeking out from the edge.
138 */
144 peeking: { 139 peeking: {
145 type: Boolean, 140 type: Boolean,
146 value: false 141 value: false
147 }, 142 },
148 143
149 /** 144 /**
150 * Max-width when the panel changes to narrow layout. 145 * Max-width when the panel changes to narrow layout.
151 *
152 * @attribute responsiveWidth
153 * @type string
154 * @default '640px'
155 */ 146 */
156 responsiveWidth: { 147 responsiveWidth: {
157 type: String, 148 type: String,
158 value: '640px' 149 value: '640px'
159 }, 150 },
160 151
161 /** 152 /**
162 * If true, position the drawer to the right. 153 * If true, position the drawer to the right.
163 *
164 * @attribute rightDrawer
165 * @type boolean
166 * @default false
167 */ 154 */
168 rightDrawer: { 155 rightDrawer: {
169 type: Boolean, 156 type: Boolean,
170 value: false 157 value: false
171 }, 158 },
172 159
173 /** 160 /**
174 * The panel that is being selected. `drawer` for the drawer panel and 161 * The panel that is being selected. `drawer` for the drawer panel and
175 * `main` for the main panel. 162 * `main` for the main panel.
176 *
177 * @attribute selected
178 * @type string
179 * @default null
180 */ 163 */
181 selected: { 164 selected: {
182 reflectToAttribute: true, 165 reflectToAttribute: true,
183 type: String, 166 type: String,
184 value: null 167 value: null
185 }, 168 },
186 169
187 /** 170 /**
188 * The attribute on elements that should toggle the drawer on tap, also elements will 171 * The attribute on elements that should toggle the drawer on tap, also elements will
189 * automatically be hidden in wide layout. 172 * automatically be hidden in wide layout.
190 */ 173 */
191 drawerToggleAttribute: { 174 drawerToggleAttribute: {
192 type: String, 175 type: String,
193 value: 'paper-drawer-toggle' 176 value: 'paper-drawer-toggle'
194 }, 177 },
195 178
196 /** 179 /**
197 * Whether the transition is enabled. 180 * Whether the transition is enabled.
198 */ 181 */
199 transition: { 182 transition: {
200 type: Boolean, 183 type: Boolean,
201 value: false 184 value: false
202 }, 185 },
203 186
204 /**
205 * Starting X coordinate of a tracking gesture. It is non-null only betw een trackStart and
206 * trackEnd events.
207 * @type {?number}
208 */
209 _startX: {
210 type: Number,
211 value: null
212 }
213
214 }, 187 },
215 188
216 listeners: { 189 listeners: {
217 tap: '_onTap', 190 tap: '_onTap',
218 track: '_onTrack' 191 track: '_onTrack',
192 down: '_downHandler',
193 up: '_upHandler'
194 },
219 195
220 // TODO: Implement tap handlers when taps are supported. 196 observers: [
221 // 197 '_forceNarrowChanged(forceNarrow, defaultSelected)'
222 // down: 'downHandler', 198 ],
223 // up: 'upHandler' 199
200 /**
201 * Toggles the panel open and closed.
202 *
203 * @method togglePanel
204 */
205 togglePanel: function() {
206 if (this._isMainSelected()) {
207 this.openDrawer();
208 } else {
209 this.closeDrawer();
210 }
211 },
212
213 /**
214 * Opens the drawer.
215 *
216 * @method openDrawer
217 */
218 openDrawer: function() {
219 this.selected = 'drawer';
220 },
221
222 /**
223 * Closes the drawer.
224 *
225 * @method closeDrawer
226 */
227 closeDrawer: function() {
228 this.selected = 'main';
229 },
230
231 ready: function() {
232 // Avoid transition at the beginning e.g. page loads and enable
233 // transitions only after the element is rendered and ready.
234 this.transition = true;
224 }, 235 },
225 236
226 _computeIronSelectorClass: function(narrow, transition, dragging, rightDra wer) { 237 _computeIronSelectorClass: function(narrow, transition, dragging, rightDra wer) {
227 return classNames({ 238 return classNames({
228 dragging: dragging, 239 dragging: dragging,
229 'narrow-layout': narrow, 240 'narrow-layout': narrow,
230 'right-drawer': rightDrawer, 241 'right-drawer': rightDrawer,
242 'left-drawer': !rightDrawer,
231 transition: transition 243 transition: transition
232 }); 244 });
233 }, 245 },
234 246
235 _computeDrawerStyle: function(drawerWidth) { 247 _computeDrawerStyle: function(drawerWidth) {
236 return 'width:' + drawerWidth + ';'; 248 return 'width:' + drawerWidth + ';';
237 }, 249 },
238 250
239 _computeMainStyle: function(narrow, rightDrawer, drawerWidth) { 251 _computeMainStyle: function(narrow, rightDrawer, drawerWidth) {
240 var style = ''; 252 var style = '';
241 253
242 style += 'left:' + ((narrow || rightDrawer) ? '0' : drawerWidth) + ';' 254 style += 'left:' + ((narrow || rightDrawer) ? '0' : drawerWidth) + ';';
243 255
244 if (rightDrawer) { 256 if (rightDrawer) {
245 style += 'right:' + (narrow ? '' : drawerWidth) + ';'; 257 style += 'right:' + (narrow ? '' : drawerWidth) + ';';
246 } else { 258 } else {
247 style += 'right:;' 259 style += 'right:;';
248 } 260 }
249 261
250 return style; 262 return style;
251 }, 263 },
252 264
253 _computeMediaQuery: function(forceNarrow, responsiveWidth) { 265 _computeMediaQuery: function(forceNarrow, responsiveWidth) {
254 return forceNarrow ? '' : '(max-width: ' + responsiveWidth + ')'; 266 return forceNarrow ? '' : '(max-width: ' + responsiveWidth + ')';
255 }, 267 },
256 268
257 _computeSwipeOverlayHidden: function(narrow, disableEdgeSwipe) { 269 _computeSwipeOverlayHidden: function(narrow, disableEdgeSwipe) {
258 return !narrow || disableEdgeSwipe; 270 return !narrow || disableEdgeSwipe;
259 }, 271 },
260 272
261 _onTrack: function(event) { 273 _onTrack: function(e) {
262 switch (event.detail.state) { 274 if (sharedPanel && this !== sharedPanel) {
275 return;
276 }
277 switch (e.detail.state) {
278 case 'start':
279 this._trackStart(e);
280 break;
281 case 'track':
282 this._trackX(e);
283 break;
263 case 'end': 284 case 'end':
264 this.trackEnd(event); 285 this._trackEnd(e);
265 break;
266 case 'move':
267 this.trackX(event);
268 break;
269 case 'start':
270 this.trackStart(event);
271 break; 286 break;
272 } 287 }
273 },
274 288
275 ready: function() {
276 // Avoid transition at the beginning e.g. page loads and enable
277 // transitions only after the element is rendered and ready.
278 this.transition = true;
279 },
280
281 /**
282 * Toggles the panel open and closed.
283 *
284 * @method togglePanel
285 */
286 togglePanel: function() {
287 if (this.isMainSelected()) {
288 this.openDrawer();
289 } else {
290 this.closeDrawer();
291 }
292 },
293
294 /**
295 * Opens the drawer.
296 *
297 * @method openDrawer
298 */
299 openDrawer: function() {
300 this.selected = 'drawer';
301 },
302
303 /**
304 * Closes the drawer.
305 *
306 * @method closeDrawer
307 */
308 closeDrawer: function() {
309 this.selected = 'main';
310 }, 289 },
311 290
312 _responsiveChange: function(narrow) { 291 _responsiveChange: function(narrow) {
313 this.narrow = narrow; 292 this.narrow = narrow;
314 293
315 if (this.narrow) { 294 if (this.narrow) {
316 this.selected = this.defaultSelected; 295 this.selected = this.defaultSelected;
317 } 296 }
318 297
319 this.setAttribute('touch-action', this.swipeAllowed() ? 'pan-y' : ''); 298 this.setScrollDirection(this._swipeAllowed() ? 'y' : 'all');
320 this.fire('paper-responsive-change', {narrow: this.narrow}); 299 this.fire('paper-responsive-change', {narrow: this.narrow});
321 }, 300 },
322 301
323 onQueryMatchesChanged: function(e) { 302 _onQueryMatchesChanged: function(e) {
324 this._responsiveChange(e.detail.value); 303 this._responsiveChange(e.detail.value);
325 }, 304 },
326 305
327 forceNarrowChanged: function() { 306 _forceNarrowChanged: function() {
328 this._responsiveChange(this.forceNarrow); 307 // set the narrow mode only if we reached the `responsiveWidth`
308 this._responsiveChange(this.forceNarrow || this.$.mq.queryMatches);
329 }, 309 },
330 310
331 swipeAllowed: function() { 311 _swipeAllowed: function() {
332 return this.narrow && !this.disableSwipe; 312 return this.narrow && !this.disableSwipe;
333 }, 313 },
334 314
335 isMainSelected: function() { 315 _isMainSelected: function() {
336 return this.selected === 'main'; 316 return this.selected === 'main';
337 }, 317 },
338 318
339 startEdgePeek: function() { 319 _startEdgePeek: function() {
340 this.width = this.$.drawer.offsetWidth; 320 this.width = this.$.drawer.offsetWidth;
341 this.moveDrawer(this.translateXForDeltaX(this.rightDrawer ? 321 this._moveDrawer(this._translateXForDeltaX(this.rightDrawer ?
342 -this.edgeSwipeSensitivity : this.edgeSwipeSensitivity)); 322 -this.edgeSwipeSensitivity : this.edgeSwipeSensitivity));
343 this.peeking = true; 323 this.peeking = true;
344 }, 324 },
345 325
346 stopEdgePeek: function() { 326 _stopEdgePeek: function() {
347 if (this.peeking) { 327 if (this.peeking) {
348 this.peeking = false; 328 this.peeking = false;
349 this.moveDrawer(null); 329 this._moveDrawer(null);
350 } 330 }
351 }, 331 },
352 332
353 _downHandler: function(e) { 333 _downHandler: function(e) {
354 if (!this.dragging && this._isMainSelected() && this._isEdgeTouch(e)) { 334 if (!this.dragging && this._isMainSelected() && this._isEdgeTouch(e) && !sharedPanel) {
355 this._startEdgePeek(); 335 this._startEdgePeek();
336 // grab this panel
337 sharedPanel = this;
356 } 338 }
357 }, 339 },
358 340
359 _upHandler: function(e) { 341 _upHandler: function() {
360 this._stopEdgePeek(); 342 this._stopEdgePeek();
343 // release the panel
344 sharedPanel = null;
361 }, 345 },
362 346
363 _onTap: function(e) { 347 _onTap: function(e) {
364 var targetElement = Polymer.dom(e).localTarget; 348 var targetElement = Polymer.dom(e).localTarget;
365 var isTargetToggleElement = targetElement && 349 var isTargetToggleElement = targetElement &&
366 this.drawerToggleAttribute && 350 this.drawerToggleAttribute &&
367 targetElement.hasAttribute(this.drawerToggleAttribute); 351 targetElement.hasAttribute(this.drawerToggleAttribute);
368 352
369 if (isTargetToggleElement) { 353 if (isTargetToggleElement) {
370 this.togglePanel(); 354 this.togglePanel();
371 } 355 }
372 }, 356 },
373 357
374 isEdgeTouch: function(event) { 358 _isEdgeTouch: function(e) {
375 var x = event.detail.x; 359 var x = e.detail.x;
376 360
377 return !this.disableEdgeSwipe && this.swipeAllowed() && 361 return !this.disableEdgeSwipe && this._swipeAllowed() &&
378 (this.rightDrawer ? 362 (this.rightDrawer ?
379 x >= this.offsetWidth - this.edgeSwipeSensitivity : 363 x >= this.offsetWidth - this.edgeSwipeSensitivity :
380 x <= this.edgeSwipeSensitivity); 364 x <= this.edgeSwipeSensitivity);
381 }, 365 },
382 366
383 trackStart: function(event) { 367 _trackStart: function() {
384 if (this.swipeAllowed()) { 368 if (this._swipeAllowed()) {
369 sharedPanel = this;
385 this.dragging = true; 370 this.dragging = true;
386 this._startX = event.detail.x;
387 371
388 if (this.isMainSelected()) { 372 if (this._isMainSelected()) {
389 this.dragging = this.peeking || this.isEdgeTouch(event); 373 this.dragging = this.peeking || this._isEdgeTouch(event);
390 } 374 }
391 375
392 if (this.dragging) { 376 if (this.dragging) {
393 this.width = this.$.drawer.offsetWidth; 377 this.width = this.$.drawer.offsetWidth;
394 this.transition = false; 378 this.transition = false;
395
396 // TODO: Re-enable when tap gestures are implemented.
397 //
398 // e.preventTap();
399 } 379 }
400 } 380 }
401 }, 381 },
402 382
403 translateXForDeltaX: function(deltaX) { 383 _translateXForDeltaX: function(deltaX) {
404 var isMain = this.isMainSelected(); 384 var isMain = this._isMainSelected();
405 385
406 if (this.rightDrawer) { 386 if (this.rightDrawer) {
407 return Math.max(0, isMain ? this.width + deltaX : deltaX); 387 return Math.max(0, isMain ? this.width + deltaX : deltaX);
408 } else { 388 } else {
409 return Math.min(0, isMain ? deltaX - this.width : deltaX); 389 return Math.min(0, isMain ? deltaX - this.width : deltaX);
410 } 390 }
411 }, 391 },
412 392
413 trackX: function(event) { 393 _trackX: function(e) {
414 var dx = event.detail.x - this._startX; 394 if (this.dragging) {
395 var dx = e.detail.dx;
415 396
416 if (this.dragging) {
417 if (this.peeking) { 397 if (this.peeking) {
418 if (Math.abs(dx) <= this.edgeSwipeSensitivity) { 398 if (Math.abs(dx) <= this.edgeSwipeSensitivity) {
419 // Ignore trackx until we move past the edge peek. 399 // Ignore trackx until we move past the edge peek.
420 return; 400 return;
421 } 401 }
422
423 this.peeking = false; 402 this.peeking = false;
424 } 403 }
425 404
426 this.moveDrawer(this.translateXForDeltaX(dx)); 405 this._moveDrawer(this._translateXForDeltaX(dx));
427 } 406 }
428 }, 407 },
429 408
430 trackEnd: function(event) { 409 _trackEnd: function(e) {
431 if (this.dragging) { 410 if (this.dragging) {
432 var xDirection = (event.detail.x - this._startX) > 0; 411 var xDirection = e.detail.dx > 0;
433 412
434 this.dragging = false; 413 this.dragging = false;
435 this._startX = null;
436 this.transition = true; 414 this.transition = true;
437 this.moveDrawer(null); 415 sharedPanel = null;
416 this._moveDrawer(null);
438 417
439 if (this.rightDrawer) { 418 if (this.rightDrawer) {
440 this[(xDirection > 0) ? 'closeDrawer' : 'openDrawer'](); 419 this[xDirection ? 'closeDrawer' : 'openDrawer']();
441 } else { 420 } else {
442 this[(xDirection > 0) ? 'openDrawer' : 'closeDrawer'](); 421 this[xDirection ? 'openDrawer' : 'closeDrawer']();
443 } 422 }
444 } 423 }
445 }, 424 },
446 425
447 transformForTranslateX: function(translateX) { 426 _transformForTranslateX: function(translateX) {
448 if (translateX === null) { 427 if (translateX === null) {
449 return ''; 428 return '';
450 } 429 }
451 430
452 return this.hasWillChange ? 'translateX(' + translateX + 'px)' : 431 return this.hasWillChange ? 'translateX(' + translateX + 'px)' :
453 'translate3d(' + translateX + 'px, 0, 0)'; 432 'translate3d(' + translateX + 'px, 0, 0)';
454 }, 433 },
455 434
456 moveDrawer: function(translateX) { 435 _moveDrawer: function(translateX) {
457 var s = this.$.drawer.style; 436 var s = this.$.drawer.style;
458 437
459 if (this.hasTransform) { 438 if (this.hasTransform) {
460 s.transform = this.transformForTranslateX(translateX); 439 s.transform = this._transformForTranslateX(translateX);
461 } else { 440 } else {
462 s.webkitTransform = this.transformForTranslateX(translateX); 441 s.webkitTransform = this._transformForTranslateX(translateX);
463 } 442 }
464 } 443 }
465 444
466 }); 445 });
467 446
468 }()); 447 }());
469 448
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698