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

Side by Side Diff: chrome/browser/resources/file_manager/js/image_editor/gallery.js

Issue 8770044: [filebrowser] Yet another animation in gallery ribbon. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/resources/file_manager/js/image_editor/gallery.css ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /* 5 /*
6 * Base class that Ribbon uses to display photos. 6 * Base class that Ribbon uses to display photos.
7 */ 7 */
8 8
9 function RibbonClient() {} 9 function RibbonClient() {}
10 10
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 this.selectedIndex_ = -1; 494 this.selectedIndex_ = -1;
495 495
496 this.arrowLeft_ = arrowLeft; 496 this.arrowLeft_ = arrowLeft;
497 this.arrowLeft_. 497 this.arrowLeft_.
498 addEventListener('click', this.selectNext.bind(this, -1, null)); 498 addEventListener('click', this.selectNext.bind(this, -1, null));
499 499
500 this.arrowRight_ = arrowRight; 500 this.arrowRight_ = arrowRight;
501 this.arrowRight_. 501 this.arrowRight_.
502 addEventListener('click', this.selectNext.bind(this, 1, null)); 502 addEventListener('click', this.selectNext.bind(this, 1, null));
503 503
504 this.fadeLeft_ = this.document_.createElement('div'); 504 this.bar_ = this.document_.createElement('div');
505 this.fadeLeft_.className = 'fade left'; 505 this.bar_.className = 'ribbon';
506 this.container_.appendChild(this.fadeLeft_); 506 this.container_.appendChild(this.bar_);
507
508 this.bars_ = [];
509 for (var i = 0; i < 2; i++) {
510 var bar = this.document_.createElement('div');
511 bar.className = 'ribbon';
512 this.container_.appendChild(bar);
513 this.bars_.push(bar);
514 }
515 this.activeBarIndex_ = 0;
516 ImageUtil.setAttribute(this.bars_[0], 'inactive', false);
517 ImageUtil.setAttribute(this.bars_[1], 'inactive', true);
518
519 this.fadeRight_ = this.document_.createElement('div');
520 this.fadeRight_.className = 'fade right';
521 this.container_.appendChild(this.fadeRight_);
522 } 507 }
523 508
524 Ribbon.PAGING_SINGLE_ITEM_DELAY = 20; 509 Ribbon.PAGING_SINGLE_ITEM_DELAY = 20;
525 Ribbon.PAGING_ANIMATION_DURATION = 200; 510 Ribbon.PAGING_ANIMATION_DURATION = 200;
526 511
527 Ribbon.prototype.getSelectedItem = function () { 512 Ribbon.prototype.getSelectedItem = function () {
528 return this.items_[this.selectedIndex_]; 513 return this.items_[this.selectedIndex_];
529 }; 514 };
530 515
531 Ribbon.prototype.clear = function() { 516 Ribbon.prototype.clear = function() {
532 this.bars_[0].textContent = ''; 517 this.bar_.textContent = '';
533 this.bars_[1].textContent = '';
534 this.activeBarIndex_ = 0;
535 ImageUtil.setAttribute(this.bars_[0], 'inactive', false);
536 ImageUtil.setAttribute(this.bars_[1], 'inactive', true);
537 this.items_ = []; 518 this.items_ = [];
538 this.selectedIndex_ = -1; 519 this.selectedIndex_ = -1;
539 this.firstVisibleIndex_ = 0; 520 this.firstVisibleIndex_ = 0;
540 this.lastVisibleIndex_ = -1; // Zero thumbnails 521 this.lastVisibleIndex_ = -1; // Zero thumbnails
541 this.sequenceDirection_ = 0; 522 this.sequenceDirection_ = 0;
542 this.sequenceLength_ = 0; 523 this.sequenceLength_ = 0;
543 }; 524 };
544 525
545 Ribbon.prototype.add = function(url) { 526 Ribbon.prototype.add = function(url) {
546 var index = this.items_.length; 527 var index = this.items_.length;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 613
633 var selectedItem = this.getSelectedItem(); 614 var selectedItem = this.getSelectedItem();
634 var self = this; 615 var self = this;
635 var item = this.items_[index]; 616 var item = this.items_[index];
636 item.fetchMetadata(this.metadataProvider_, function(metadata) { 617 item.fetchMetadata(this.metadataProvider_, function(metadata) {
637 if (!selectedItem.isSelected()) return; 618 if (!selectedItem.isSelected()) return;
638 self.client_.prefetchImage(index, item.getContent(), metadata); 619 self.client_.prefetchImage(index, item.getContent(), metadata);
639 }); 620 });
640 }; 621 };
641 622
642 Ribbon.prototype.updateControls_ = function() { 623 Ribbon.ITEMS_COUNT = 5;
643 ImageUtil.setAttribute(this.fadeLeft_, 'active', this.firstVisibleIndex_ > 0);
644 ImageUtil.setAttribute(this.fadeRight_, 'active',
645 this.lastVisibleIndex_ + 1 < this.items_.length);
646 };
647 624
648 Ribbon.prototype.redraw = function() { 625 Ribbon.prototype.redraw = function() {
649 // The thumbnails are square. 626 // TODO(dgozman): use margin instead of 2 here.
650 var itemWidth = this.bars_[0].parentNode.clientHeight; 627 var itemWidth = this.bar_.clientHeight - 2;
651 var width = this.bars_[0].parentNode.clientWidth; 628 var fullItems = Ribbon.ITEMS_COUNT;
652 629 fullItems = Math.min(fullItems, this.items_.length);
653 var fullItems = Math.floor(width / itemWidth); 630 var right = Math.floor((fullItems - 1) / 2);
654 631
655 var fullWidth = fullItems * itemWidth; 632 var fullWidth = fullItems * itemWidth;
633 this.bar_.style.width = fullWidth + 'px';
656 634
657 this.bars_[0].style.width = fullWidth + 'px'; 635 var lastIndex = this.selectedIndex_ + right;
658 this.bars_[1].style.width = fullWidth + 'px'; 636 lastIndex = Math.max(lastIndex, fullItems - 1);
659 637 lastIndex = Math.min(lastIndex, this.items_.length - 1);
660 // Position the shadows over the first and the last visible thumbnails. 638 var firstIndex = lastIndex - fullItems + 1;
661 this.fadeLeft_.style.left = 0;
662 this.fadeRight_.style.right = (width - fullWidth) + 'px';
663
664 fullItems = Math.min(fullItems, this.items_.length);
665 var firstIndex = this.firstVisibleIndex_;
666 var lastIndex = firstIndex + fullItems - 1;
667
668 if (this.selectedIndex_ <= firstIndex && firstIndex > 0) {
669 firstIndex = Math.max(0, this.selectedIndex_ - (fullItems >> 1));
670 lastIndex = firstIndex + fullItems - 1;
671 }
672
673 if (this.selectedIndex_ >= lastIndex && lastIndex < this.items_.length - 1) {
674 lastIndex = Math.min(this.items_.length - 1,
675 this.selectedIndex_ + (fullItems >> 1));
676 firstIndex = lastIndex - fullItems + 1;
677 }
678
679 this.updateControls_();
680 639
681 if (this.firstVisibleIndex_ == firstIndex && 640 if (this.firstVisibleIndex_ == firstIndex &&
682 this.lastVisibleIndex_ == lastIndex) { 641 this.lastVisibleIndex_ == lastIndex) {
683 return; 642 return;
684 } 643 }
685 644
686 var activeBar = this.bars_[this.activeBarIndex_]; 645 if (this.lastVisibleIndex_ == -1) {
687 var children = activeBar.childNodes; 646 this.firstVisibleIndex_ = firstIndex;
688 var totalDuration = children.length * Ribbon.PAGING_SINGLE_ITEM_DELAY + 647 this.lastVisibleIndex_ = lastIndex;
689 Ribbon.PAGING_ANIMATION_DURATION;
690
691 var direction = 1;
692 var delay = 0;
693 if (firstIndex < this.firstVisibleIndex_) {
694 direction = -1;
695 delay = (children.length - 1) * Ribbon.PAGING_SINGLE_ITEM_DELAY;
696 }
697 for (var index = 0; index < children.length; ++index) {
698 setTimeout(
699 ImageUtil.setAttribute.bind(null, children[index], 'inactive', true),
700 delay);
701 delay += direction * Ribbon.PAGING_SINGLE_ITEM_DELAY;
702 } 648 }
703 649
704 // Place inactive bar below active after animation is finished. 650 this.bar_.textContent = '';
705 setTimeout( 651 var startIndex = Math.min(firstIndex, this.firstVisibleIndex_);
706 ImageUtil.setAttribute.bind(null, activeBar, 'inactive', true), 652 var toRemove = [];
707 totalDuration); 653 for (var index = startIndex + 1;
654 index <= Math.max(lastIndex, this.lastVisibleIndex_);
655 ++index) {
656 var box = this.items_[index].getBox(0);
Vladislav Kaznacheev 2011/12/02 15:45:13 shall we get rid of the second image in the Ribbon
dgozman 2011/12/05 09:16:57 For sure. Done.
657 box.style['margin-left'] = '0';
Vladislav Kaznacheev 2011/12/02 15:45:13 why not style.marginLeft?
dgozman 2011/12/05 09:16:57 Done.
658 this.bar_.appendChild(box);
659 if (index < firstIndex || index > lastIndex) {
660 toRemove.push(index);
661 }
662 }
663
664 var margin = itemWidth * Math.abs(firstIndex - this.firstVisibleIndex_);
665 var startBox = this.items_[startIndex].getBox(0);
666 if (startIndex == firstIndex) {
667 startBox.style['margin-left'] = -margin + 'px';
668 if (this.bar_.firstChild)
669 this.bar_.insertBefore(startBox, this.bar_.firstChild);
670 else
671 this.bar_.appendChild(startBox);
672 setTimeout(function() {
673 startBox.style['margin-left'] = '0';
674 }, 0);
675 } else {
676 toRemove.push(startBox);
677 startBox.style['margin-left'] = '0';
678 if (this.bar_.firstChild)
679 this.bar_.insertBefore(startBox, this.bar_.firstChild);
680 else
681 this.bar_.appendChild(startBox);
682 setTimeout(function() {
683 startBox.style['margin-left'] = -margin + 'px';
684 }, 0);
685 }
686
687 if (firstIndex > 0 && this.selectedIndex_ != firstIndex) {
688 this.bar_.classList.add('fade-left');
689 } else {
690 this.bar_.classList.remove('fade-left');
691 }
692
693 if (lastIndex < this.items_.length - 1 && this.selectedIndex_ != lastIndex) {
694 this.bar_.classList.add('fade-right');
695 } else {
696 this.bar_.classList.remove('fade-right');
697 }
708 698
709 this.firstVisibleIndex_ = firstIndex; 699 this.firstVisibleIndex_ = firstIndex;
710 this.lastVisibleIndex_ = lastIndex; 700 this.lastVisibleIndex_ = lastIndex;
711 701
712 this.activeBarIndex_ = 1 - this.activeBarIndex_; 702 var self = this;
713 activeBar = this.bars_[this.activeBarIndex_]; 703 setTimeout(function() {
714 activeBar.textContent = ''; 704 for (var i = 0; i < toRemove.length; i++) {
715 for (var index = firstIndex; index <= lastIndex; ++index) { 705 var index = toRemove[i];
716 var box = this.items_[index].getBox(this.activeBarIndex_); 706 if (i < this.firstVisibleIndex_ || i > this.lastVisibleIndex_) {
717 ImageUtil.setAttribute(box, 'inactive', false); 707 var box = this.items_[index].getBox(0);
718 activeBar.appendChild(box); 708 if (box.parentNode == this.bar_)
719 } 709 this.bar_.removeChild(box);
720 710 }
721 // Place active bar above inactive after animation is finished. 711 }
722 setTimeout( 712 }, 200);
723 ImageUtil.setAttribute.bind(null, activeBar, 'inactive', false),
724 totalDuration);
725 }; 713 };
726 714
727 Ribbon.prototype.getNextSelectedIndex_ = function(direction) { 715 Ribbon.prototype.getNextSelectedIndex_ = function(direction) {
728 var index = this.selectedIndex_ + (direction > 0 ? 1 : -1); 716 var index = this.selectedIndex_ + (direction > 0 ? 1 : -1);
729 if (index == -1) return this.items_.length - 1; 717 if (index == -1) return this.items_.length - 1;
730 if (index == this.items_.length) return 0; 718 if (index == this.items_.length) return 0;
731 return index; 719 return index;
732 }; 720 };
733 721
734 Ribbon.prototype.selectNext = function(direction, opt_callback) { 722 Ribbon.prototype.selectNext = function(direction, opt_callback) {
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 ShareMode.prototype.setUp = function() { 1076 ShareMode.prototype.setUp = function() {
1089 ImageEditor.Mode.prototype.setUp.apply(this, arguments); 1077 ImageEditor.Mode.prototype.setUp.apply(this, arguments);
1090 ImageUtil.setAttribute(this.menu_, 'hidden', false); 1078 ImageUtil.setAttribute(this.menu_, 'hidden', false);
1091 ImageUtil.setAttribute(this.button_, 'pressed', false); 1079 ImageUtil.setAttribute(this.button_, 'pressed', false);
1092 }; 1080 };
1093 1081
1094 ShareMode.prototype.cleanUpUI = function() { 1082 ShareMode.prototype.cleanUpUI = function() {
1095 ImageEditor.Mode.prototype.cleanUpUI.apply(this, arguments); 1083 ImageEditor.Mode.prototype.cleanUpUI.apply(this, arguments);
1096 ImageUtil.setAttribute(this.menu_, 'hidden', true); 1084 ImageUtil.setAttribute(this.menu_, 'hidden', true);
1097 }; 1085 };
OLDNEW
« no previous file with comments | « chrome/browser/resources/file_manager/js/image_editor/gallery.css ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698