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

Side by Side Diff: chrome/browser/resources/file_manager/js/file_selection.js

Issue 23662004: Reland r221579: Files.app: Let the PreviewPanel class control the visibility of the preview panel. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix the test. Created 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * The current selection object. 8 * The current selection object.
9 * 9 *
10 * @param {FileManager} fileManager FileManager instance. 10 * @param {FileManager} fileManager FileManager instance.
11 * @param {Array.<number>} indexes Selected indexes. 11 * @param {Array.<number>} indexes Selected indexes.
12 * @constructor 12 * @constructor
13 */ 13 */
14 function FileSelection(fileManager, indexes) { 14 function FileSelection(fileManager, indexes) {
15 this.fileManager_ = fileManager; 15 this.fileManager_ = fileManager;
16 this.computeBytesSequence_ = 0; 16 this.computeBytesSequence_ = 0;
17 this.indexes = indexes; 17 this.indexes = indexes;
18 this.entries = []; 18 this.entries = [];
19 this.urls = []; 19 this.urls = [];
20 this.totalCount = 0; 20 this.totalCount = 0;
21 this.fileCount = 0; 21 this.fileCount = 0;
22 this.directoryCount = 0; 22 this.directoryCount = 0;
23 this.bytes = 0; 23 this.bytes = 0;
24 this.showBytes = false; 24 this.showBytes = false;
25 this.allDriveFilesPresent = false, 25 this.allDriveFilesPresent = false,
26 this.iconType = null; 26 this.iconType = null;
27 this.bytesKnown = false; 27 this.bytesKnown = false;
28 this.mustBeHidden_ = false; 28 this.mustBeHidden_ = false;
29 this.mimeTypes = null;
29 30
30 // Synchronously compute what we can. 31 // Synchronously compute what we can.
31 for (var i = 0; i < this.indexes.length; i++) { 32 for (var i = 0; i < this.indexes.length; i++) {
32 var entry = fileManager.getFileList().item(this.indexes[i]); 33 var entry = fileManager.getFileList().item(this.indexes[i]);
33 if (!entry) 34 if (!entry)
34 continue; 35 continue;
35 36
36 this.entries.push(entry); 37 this.entries.push(entry);
37 this.urls.push(entry.toURL()); 38 this.urls.push(entry.toURL());
38 39
39 if (this.iconType == null) { 40 if (this.iconType == null) {
40 this.iconType = FileType.getIcon(entry); 41 this.iconType = FileType.getIcon(entry);
41 } else if (this.iconType != 'unknown') { 42 } else if (this.iconType != 'unknown') {
42 var iconType = FileType.getIcon(entry); 43 var iconType = FileType.getIcon(entry);
43 if (this.iconType != iconType) 44 if (this.iconType != iconType)
44 this.iconType = 'unknown'; 45 this.iconType = 'unknown';
45 } 46 }
46 47
47 if (entry.isFile) { 48 if (entry.isFile) {
48 this.fileCount += 1; 49 this.fileCount += 1;
49 } else { 50 } else {
50 this.directoryCount += 1; 51 this.directoryCount += 1;
51 } 52 }
52 this.totalCount++; 53 this.totalCount++;
53 } 54 }
54 55
55 this.tasks = new FileTasks(this.fileManager_); 56 this.tasks = new FileTasks(this.fileManager_);
57
58 Object.seal(this);
56 } 59 }
57 60
58 /** 61 /**
59 * Computes data required to get file tasks and requests the tasks. 62 * Computes data required to get file tasks and requests the tasks.
60 * 63 *
61 * @param {function} callback The callback. 64 * @param {function} callback The callback.
62 */ 65 */
63 FileSelection.prototype.createTasks = function(callback) { 66 FileSelection.prototype.createTasks = function(callback) {
64 if (!this.fileManager_.isOnDrive()) { 67 if (!this.fileManager_.isOnDrive()) {
65 this.tasks.init(this.urls); 68 this.tasks.init(this.urls);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 * 152 *
150 * @param {FileManager} fileManager File manager instance. 153 * @param {FileManager} fileManager File manager instance.
151 * @extends {cr.EventTarget} 154 * @extends {cr.EventTarget}
152 * @constructor 155 * @constructor
153 */ 156 */
154 function FileSelectionHandler(fileManager) { 157 function FileSelectionHandler(fileManager) {
155 this.fileManager_ = fileManager; 158 this.fileManager_ = fileManager;
156 // TODO(dgozman): create a shared object with most of UI elements. 159 // TODO(dgozman): create a shared object with most of UI elements.
157 this.okButton_ = fileManager.okButton_; 160 this.okButton_ = fileManager.okButton_;
158 this.filenameInput_ = fileManager.filenameInput_; 161 this.filenameInput_ = fileManager.filenameInput_;
159 162 this.previewPanel_ = fileManager.previewPanel_;
160 this.previewPanel_ = fileManager.dialogDom_.querySelector('.preview-panel'); 163 this.previewPanelElement_ =
161 this.previewThumbnails_ = this.previewPanel_. 164 fileManager.dialogDom_.querySelector('.preview-panel');
165 this.previewThumbnails_ = this.previewPanelElement_.
162 querySelector('.preview-thumbnails'); 166 querySelector('.preview-thumbnails');
163 this.previewSummary_ = this.previewPanel_.querySelector('.preview-summary'); 167 this.previewSummary_ =
168 this.previewPanelElement_.querySelector('.preview-summary');
164 this.previewText_ = this.previewSummary_.querySelector('.preview-text'); 169 this.previewText_ = this.previewSummary_.querySelector('.preview-text');
165 this.calculatingSize_ = this.previewSummary_. 170 this.calculatingSize_ = this.previewSummary_.
166 querySelector('.calculating-size'); 171 querySelector('.calculating-size');
167 this.calculatingSize_.textContent = str('CALCULATING_SIZE'); 172 this.calculatingSize_.textContent = str('CALCULATING_SIZE');
168 173
169 this.searchBreadcrumbs_ = fileManager.searchBreadcrumbs_; 174 this.searchBreadcrumbs_ = fileManager.searchBreadcrumbs_;
170 this.taskItems_ = fileManager.taskItems_; 175 this.taskItems_ = fileManager.taskItems_;
171 176
172 this.animationTimeout_ = null; 177 this.animationTimeout_ = null;
173 } 178 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 * @return {boolean} True if all files in the current selection are 308 * @return {boolean} True if all files in the current selection are
304 * available. 309 * available.
305 */ 310 */
306 FileSelectionHandler.prototype.isFileSelectionAvailable = function() { 311 FileSelectionHandler.prototype.isFileSelectionAvailable = function() {
307 return !this.fileManager_.isOnDrive() || 312 return !this.fileManager_.isOnDrive() ||
308 !this.fileManager_.isDriveOffline() || 313 !this.fileManager_.isDriveOffline() ||
309 this.selection.allDriveFilesPresent; 314 this.selection.allDriveFilesPresent;
310 }; 315 };
311 316
312 /** 317 /**
313 * Sets the flag to force the preview panel hidden.
314 * @param {boolean} hidden True to force hidden.
315 */
316 FileSelectionHandler.prototype.setPreviewPanelMustBeHidden = function(hidden) {
317 this.previewPanelMustBeHidden_ = hidden;
318 this.updatePreviewPanelVisibility_();
319 };
320
321 /**
322 * Animates preview panel show/hide transitions.
323 *
324 * @private
325 */
326 FileSelectionHandler.prototype.updatePreviewPanelVisibility_ = function() {
327 var panel = this.previewPanel_;
328 var state = panel.getAttribute('visibility');
329 var mustBeVisible =
330 // If one or more files are selected, show the file info.
331 (this.selection.totalCount > 0 ||
332 // If the directory is not root dir, show the directory info.
333 !PathUtil.isRootPath(this.fileManager_.getCurrentDirectory()) ||
334 // On Open File dialog, the preview panel is always shown.
335 this.fileManager_.dialogType == DialogType.SELECT_OPEN_FILE ||
336 this.fileManager_.dialogType == DialogType.SELECT_OPEN_MULTI_FILE);
337
338 var stopHidingAndShow = function() {
339 clearTimeout(this.hidingTimeout_);
340 this.hidingTimeout_ = 0;
341 setVisibility('visible');
342 }.bind(this);
343
344 var startHiding = function() {
345 setVisibility('hiding');
346 this.hidingTimeout_ = setTimeout(function() {
347 this.hidingTimeout_ = 0;
348 setVisibility('hidden');
349 cr.dispatchSimpleEvent(this, 'hide-preview-panel');
350 }.bind(this), 250);
351 }.bind(this);
352
353 var show = function() {
354 setVisibility('visible');
355 this.previewThumbnails_.textContent = '';
356 cr.dispatchSimpleEvent(this, 'show-preview-panel');
357 }.bind(this);
358
359 var setVisibility = function(visibility) {
360 panel.setAttribute('visibility', visibility);
361 };
362
363 switch (state) {
364 case 'visible':
365 if (!mustBeVisible || this.previewPanelMustBeHidden_)
366 startHiding();
367 break;
368
369 case 'hiding':
370 if (mustBeVisible && !this.previewPanelMustBeHidden_)
371 stopHidingAndShow();
372 break;
373
374 case 'hidden':
375 if (mustBeVisible && !this.previewPanelMustBeHidden_)
376 show();
377 }
378 };
379
380 /**
381 * @return {boolean} True if space reserverd for the preview panel.
382 * @private
383 */
384 FileSelectionHandler.prototype.isPreviewPanelVisibile_ = function() {
385 return this.previewPanel_.getAttribute('visibility') == 'visible';
386 };
387
388 /**
389 * Update the selection summary in preview panel. 318 * Update the selection summary in preview panel.
390 * 319 *
391 * @private 320 * @private
392 */ 321 */
393 FileSelectionHandler.prototype.updatePreviewPanelText_ = function() { 322 FileSelectionHandler.prototype.updatePreviewPanelText_ = function() {
394 var selection = this.selection; 323 var selection = this.selection;
395 if (selection.totalCount <= 1) { 324 if (selection.totalCount <= 1) {
396 // Hides the preview text if zero or one file is selected. We shows a 325 // Hides the preview text if zero or one file is selected. We shows a
397 // breadcrumb list instead on the preview panel. 326 // breadcrumb list instead on the preview panel.
398 this.hideCalculating_(); 327 this.hideCalculating_();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 if (this.selection != selection) 415 if (this.selection != selection)
487 return; 416 return;
488 selection.tasks.display(this.taskItems_); 417 selection.tasks.display(this.taskItems_);
489 selection.tasks.updateMenuItem(); 418 selection.tasks.updateMenuItem();
490 }.bind(this)); 419 }.bind(this));
491 } else { 420 } else {
492 this.taskItems_.hidden = true; 421 this.taskItems_.hidden = true;
493 } 422 }
494 423
495 // Update preview panels. 424 // Update preview panels.
496 var wasVisible = this.isPreviewPanelVisibile_(); 425 var wasVisible = this.previewPanel_.visible;
497 var thumbnailEntries; 426 var thumbnailEntries;
498 if (selection.totalCount == 0) { 427 if (selection.totalCount == 0) {
499 thumbnailEntries = [ 428 thumbnailEntries = [
500 this.fileManager_.getCurrentDirectoryEntry() 429 this.fileManager_.getCurrentDirectoryEntry()
501 ]; 430 ];
502 } else { 431 } else {
503 thumbnailEntries = selection.entries; 432 thumbnailEntries = selection.entries;
504 if (selection.totalCount != 1) { 433 if (selection.totalCount != 1) {
505 selection.computeBytes(function() { 434 selection.computeBytes(function() {
506 if (this.selection != selection) 435 if (this.selection != selection)
507 return; 436 return;
508 this.updatePreviewPanelText_(); 437 this.updatePreviewPanelText_();
509 }.bind(this)); 438 }.bind(this));
510 } 439 }
511 } 440 }
512 this.updatePreviewPanelVisibility_(); 441 this.previewPanel_.entries = selection.entries;
513 this.updatePreviewPanelText_(); 442 this.updatePreviewPanelText_();
514 this.showPreviewThumbnails_(thumbnailEntries); 443 this.showPreviewThumbnails_(thumbnailEntries);
515 444
516 // Update breadcrums. 445 // Update breadcrums.
517 var updateTarget = null; 446 var updateTarget = null;
518 var path = this.fileManager_.getCurrentDirectory(); 447 var path = this.fileManager_.getCurrentDirectory();
519 if (selection.totalCount == 1) { 448 if (selection.totalCount == 1) {
520 // Shows the breadcrumb list when a file is selected. 449 // Shows the breadcrumb list when a file is selected.
521 updateTarget = selection.entries[0].fullPath; 450 updateTarget = selection.entries[0].fullPath;
522 } else if (selection.totalCount == 0 && 451 } else if (selection.totalCount == 0 &&
523 this.isPreviewPanelVisibile_()) { 452 this.previewPanel_.visible) {
524 // Shows the breadcrumb list when no file is selected and the preview 453 // Shows the breadcrumb list when no file is selected and the preview
525 // panel is visible. 454 // panel is visible.
526 updateTarget = path; 455 updateTarget = path;
527 } 456 }
528 this.updatePreviewPanelBreadcrumbs_(updateTarget); 457 this.updatePreviewPanelBreadcrumbs_(updateTarget);
529 458
530 // Scroll to item 459 // Scroll to item
531 if (!wasVisible && this.selection.totalCount == 1) { 460 if (!wasVisible && this.selection.totalCount == 1) {
532 var list = this.fileManager_.getCurrentList(); 461 var list = this.fileManager_.getCurrentList();
533 list.scrollIndexIntoView(list.selectionModel.selectedIndex); 462 list.scrollIndexIntoView(list.selectionModel.selectedIndex);
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 style.left = (boxWidth - imageWidth) / 2 + 'px'; 681 style.left = (boxWidth - imageWidth) / 2 + 'px';
753 style.top = (boxHeight - imageHeight) / 2 + 'px'; 682 style.top = (boxHeight - imageHeight) / 2 + 'px';
754 style.position = 'relative'; 683 style.position = 'relative';
755 684
756 util.applyTransform(largeImage, transform); 685 util.applyTransform(largeImage, transform);
757 686
758 largeImageBox.appendChild(largeImage); 687 largeImageBox.appendChild(largeImage);
759 largeImageBox.style.zIndex = 1000; 688 largeImageBox.style.zIndex = 1000;
760 return true; 689 return true;
761 }; 690 };
OLDNEW
« no previous file with comments | « chrome/browser/resources/file_manager/js/file_manager.js ('k') | chrome/browser/resources/file_manager/js/main_scripts.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698