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

Unified Diff: chrome/browser/resources/file_manager/js/image_editor/gallery.js

Issue 7828044: [filebrowser] First step to image editor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Removed commented code. Created 9 years, 3 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/file_manager/js/image_editor/gallery.js
===================================================================
--- chrome/browser/resources/file_manager/js/image_editor/gallery.js (revision 0)
+++ chrome/browser/resources/file_manager/js/image_editor/gallery.js (revision 0)
@@ -0,0 +1,295 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+function Gallery(container, closeCallback) {
+ this.container_ = container;
+ this.document_ = container.ownerDocument;
+ this.editing_ = false;
+ this.closeCallback_ = closeCallback;
+ this.onFadeTimeoutBound_ = this.onFadeTimeout_.bind(this);
+ this.fadeTimeoutId_ = null;
+ this.initDom_();
+}
+
+Gallery.open = function(parentDirEntry, entries, closeCallback) {
+ var container = document.querySelector('.gallery');
+ var gallery = new Gallery(container, closeCallback);
+ gallery.load(parentDirEntry, entries);
+};
+
+// TODO(dgozman): localization.
+Gallery.CLOSE_LABEL = 'Close';
+Gallery.EDIT_LABEL = 'Edit';
+Gallery.SHARE_LABEL = 'Share';
+
+Gallery.FADE_TIMEOUT = 5000;
+
+Gallery.prototype.initDom_ = function() {
+ var doc = this.document_;
+ this.container_.addEventListener('keydown', this.onKeyDown_.bind(this));
+ this.container_.addEventListener('mousemove', this.onMouseMove_.bind(this));
+
+ this.closeButton_ = doc.createElement('div');
+ this.closeButton_.className = 'close';
+ this.closeButton_.textContent = Gallery.CLOSE_LABEL;
+ this.closeButton_.addEventListener('click', this.closeCallback_);
+ this.container_.appendChild(this.closeButton_);
+
+ this.imageContainer_ = doc.createElement('div');
+ this.imageContainer_.className = 'image-container';
+ this.container_.appendChild(this.imageContainer_);
+
+ this.toolbar_ = doc.createElement('div');
+ this.toolbar_.className = 'toolbar';
+ this.container_.appendChild(this.toolbar_);
+
+ this.ribbon_ = new Ribbon(this.toolbar_,
+ this.onImageSelected_.bind(this));
+
+ this.editBar_ = doc.createElement('div');
+ this.editBar_.className = 'edit-bar';
+ this.toolbar_.appendChild(this.editBar_);
+
+ this.editButton_ = doc.createElement('div');
+ this.editButton_.className = 'button';
+ this.editButton_.textContent = Gallery.EDIT_LABEL;
+ this.editButton_.addEventListener('click', this.onEdit_.bind(this));
+ this.toolbar_.appendChild(this.editButton_);
+
+ this.shareButton_ = doc.createElement('div');
+ this.shareButton_.className = 'button';
+ this.shareButton_.textContent = Gallery.SHARE_LABEL;
+ this.shareButton_.addEventListener('click', this.onShare_.bind(this));
+ this.toolbar_.appendChild(this.shareButton_);
+
+ this.editor_ = new ImageEditor(this.imageContainer_, this.editBar_,
+ this.onSave_.bind(this), null /*closeCallback*/);
+};
+
+Gallery.prototype.load = function(parentDirEntry, entries) {
+ this.editBar_.setAttribute('hidden', 'hidden');
+ this.editButton_.removeAttribute('pressed');
+ this.shareButton_.removeAttribute('pressed');
+
+ this.ribbon_.setEntries(entries);
+ this.parentDirEntry_ = parentDirEntry;
+
+ if (entries.length == 0)
+ return;
+
+ this.ribbon_.select(0);
+ this.editor_.resizeFrame();
+
+ this.initiateFading_();
+};
+
+Gallery.prototype.onSave_ = function(blob) {
+ var name = this.entry_.name;
+ var ext = '';
+ var index = name.lastIndexOf('.');
+ if (index != -1) {
+ ext = name.substr(index);
+ name = name.substr(0, index);
+ }
+ var now = new Date();
+ // TODO(dgozman): better name format.
+ name = name + '_Edited_' + now.getFullYear() + '_' +
+ (now.getMonth() + 1) + '_' + now.getDate() + '_' +
+ now.getHours() + '_' + now.getMinutes() + ext;
+
+ function onError(error) {
+ console.log('Error saving from gallery: "' + name + '"');
+ console.log(error);
+ }
+
+ // TODO(dgozman): Check for existence.
+ this.parentDirEntry_.getFile(
+ name, {create: true, exclusive: true}, function(fileEntry) {
+ fileEntry.createWriter(function(fileWriter) {
+ fileWriter.onerror = onError;
+ fileWriter.onwritened = function() {
+ console.log('Saving from gallery succeeded: "' + name + '"');
+ };
+ fileWriter.write(blob);
+ }, onError);
+ }, onError);
+};
+
+Gallery.prototype.onImageSelected_ = function(entry) {
+ this.entry_ = entry;
+ this.editor_.load(entry.toURL());
+};
+
+Gallery.prototype.onEdit_ = function(event) {
+ // TODO(dgozman): nice animation.
+ if (this.editing_) {
+ this.editBar_.setAttribute('hidden', 'hidden');
+ this.editButton_.removeAttribute('pressed');
+ this.editing_ = false;
+ this.initiateFading_();
+ } else {
+ this.editBar_.removeAttribute('hidden');
+ this.editButton_.setAttribute('pressed', 'pressed');
+ this.editing_ = true;
+ }
+ this.ribbon_.redraw();
+};
+
+Gallery.prototype.onShare_ = function(event) {
+ // TODO(dgozman): implement.
+};
+
+Gallery.prototype.onKeyDown_ = function(event) {
+ if (this.editing_)
+ return;
+ switch (event.keyIdentifier) {
+ case 'Home':
+ this.ribbon_.scrollToFirst();
+ break;
+ case 'Left':
+ this.ribbon_.scrollLeft();
+ break;
+ case 'Right':
+ this.ribbon_.scrollRight();
+ break;
+ case 'End':
+ this.ribbon_.scrollToLast();
+ break;
+ }
+};
+
+Gallery.prototype.onMouseMove_ = function(e) {
+ if (this.fadeTimeoutId_) {
+ window.clearTimeout(this.fadeTimeoutId_);
+ }
+ this.toolbar_.removeAttribute('hidden');
+ this.initiateFading_();
+};
+
+Gallery.prototype.onFadeTimeout_ = function() {
+ this.fadeTimeoutId_ = null;
+ this.toolbar_.setAttribute('hidden', 'hidden');
+};
+
+Gallery.prototype.initiateFading_ = function() {
+ if (this.editing_) {
+ return;
+ }
+ this.fadeTimeoutId_ = window.setTimeout(
+ this.onFadeTimeoutBound_, Gallery.FADE_TIMEOUT);
+};
+
+function Ribbon(parentNode, onSelect) {
+ this.container_ = parentNode;
+ this.document_ = parentNode.ownerDocument;
+
+ this.bar_ = this.document_.createElement('div');
+ this.bar_.className = 'ribbon';
+ this.container_.appendChild(this.bar_);
+
+ this.left_ = this.document_.createElement('div');
+ this.left_.className = 'ribbon-left';
+ this.left_.addEventListener('click', this.scrollLeft.bind(this));
+
+ this.right_ = this.document_.createElement('div');
+ this.right_.className = 'ribbon-right';
+ this.right_.addEventListener('click', this.scrollRight.bind(this));
+
+ this.spacer_ = this.document_.createElement('div');
+ this.spacer_.className = 'ribbon-spacer';
+
+ this.onSelect_ = onSelect;
+ this.entries_ = [];
+ this.images_ = [];
+ this.selectedIndex_ = -1;
+ this.firstIndex_ = 0;
+}
+
+Ribbon.prototype.clear = function() {
+ this.bar_.textContent = '';
+ this.entries_ = [];
+ this.images_ = [];
+ this.selectedIndex_ = -1;
+ this.firstIndex_ = 0;
+};
+
+Ribbon.prototype.add = function(entry) {
+ this.entries_.push(entry);
+ var index = this.entries_.length - 1;
+
+ var box = this.document_.createElement('div');
+ box.className = 'ribbon-image';
+ box.addEventListener('click', this.select.bind(this, index));
+ this.images_.push(box);
+
+ var img = this.document_.createElement('img');
+ img.setAttribute('src', entry.toURL());
+ box.appendChild(img);
+};
+
+Ribbon.prototype.setEntries = function(entries) {
+ this.clear();
+ for (var index = 0; index < entries.length; ++index) {
+ this.add(entries[index]);
+ }
+
+ window.setTimeout(this.redraw.bind(this), 0);
+};
+
+Ribbon.prototype.select = function(index) {
+ if (index < 0 || index >= this.entries_.length)
+ return;
+ if (this.selectedIndex_ != -1)
+ this.images_[this.selectedIndex_].removeAttribute('selected');
+ this.selectedIndex_ = index;
+ this.images_[this.selectedIndex_].setAttribute('selected', 'selected');
+ if (this.onSelect_)
+ this.onSelect_(this.entries_[index]);
+};
+
+Ribbon.prototype.redraw = function() {
+ this.bar_.textContent = '';
+
+ // TODO(dgozman): get rid of these constants.
+ var itemWidth = 80;
+ var width = this.bar_.clientWidth - 40;
+
+ var fit = Math.round(Math.floor(width / itemWidth));
+ var lastIndex = Math.min(this.entries_.length, this.firstIndex_ + fit);
+ this.firstIndex_ = Math.max(0, lastIndex - fit);
+ this.bar_.appendChild(this.left_);
+ for (var index = this.firstIndex_; index < lastIndex; ++index) {
+ this.bar_.appendChild(this.images_[index]);
+ }
+ this.bar_.appendChild(this.spacer_);
+ this.bar_.appendChild(this.right_);
+};
+
+Ribbon.prototype.scrollLeft = function() {
+ if (this.firstIndex_ > 0) {
+ this.firstIndex_--;
+ this.redraw();
+ }
+};
+
+Ribbon.prototype.scrollRight = function() {
+ if (this.firstIndex_ < this.entries_.length - 1) {
+ this.firstIndex_++;
+ this.redraw();
+ }
+};
+
+Ribbon.prototype.scrollToFirst = function() {
+ if (this.firstIndex_ > 0) {
+ this.firstIndex_ = 0;
+ this.redraw();
+ }
+};
+
+Ribbon.prototype.scrollToLast = function() {
+ if (this.firstIndex_ < this.entries_.length - 1) {
+ this.firstIndex_ = this.entries_.length - 1;
+ this.redraw();
+ }
+};

Powered by Google App Engine
This is Rietveld 408576698