| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 cr.define('print_preview', function() { | 5 cr.define('print_preview', function() { |
| 6 'use strict'; | 6 'use strict'; |
| 7 | 7 |
| 8 /** | 8 /** |
| 9 * Toggles visibility of the specified printing options sections. | 9 * Toggles visibility of the specified printing options sections. |
| 10 * @param {!print_preview.DestinationStore} destinationStore To listen for |
| 11 * destination changes. |
| 10 * @param {!Array.<print_preview.SettingsSection>} settingsSections Sections | 12 * @param {!Array.<print_preview.SettingsSection>} settingsSections Sections |
| 11 * to toggle by this component. | 13 * to toggle by this component. |
| 12 * @constructor | 14 * @constructor |
| 13 * @extends {print_preview.Component} | 15 * @extends {print_preview.Component} |
| 14 */ | 16 */ |
| 15 function MoreSettings(settingsSections) { | 17 function MoreSettings(destinationStore, settingsSections) { |
| 16 print_preview.Component.call(this); | 18 print_preview.Component.call(this); |
| 17 | 19 |
| 20 /** @private {!print_preview.DestinationStore} */ |
| 21 this.destinationStore_ = destinationStore; |
| 22 |
| 18 /** @private {!Array.<print_preview.SettingsSection>} */ | 23 /** @private {!Array.<print_preview.SettingsSection>} */ |
| 19 this.settingsSections_ = settingsSections; | 24 this.settingsSections_ = settingsSections; |
| 20 | 25 |
| 21 /** @private {MoreSettings.SettingsToShow} */ | 26 /** @private {MoreSettings.SettingsToShow} */ |
| 22 this.settingsToShow_ = MoreSettings.SettingsToShow.MOST_POPULAR; | 27 this.settingsToShow_ = MoreSettings.SettingsToShow.MOST_POPULAR; |
| 28 |
| 29 /** @private {boolean} */ |
| 30 this.capabilitiesReady_ = false; |
| 31 |
| 32 /** @private {boolean} */ |
| 33 this.firstDestinationReady_ = false; |
| 23 }; | 34 }; |
| 24 | 35 |
| 25 /** | 36 /** |
| 26 * Which settings are visible to the user. | 37 * Which settings are visible to the user. |
| 27 * @enum {number} | 38 * @enum {number} |
| 28 */ | 39 */ |
| 29 MoreSettings.SettingsToShow = { | 40 MoreSettings.SettingsToShow = { |
| 30 MOST_POPULAR: 1, | 41 MOST_POPULAR: 1, |
| 31 ALL: 2 | 42 ALL: 2 |
| 32 }; | 43 }; |
| 33 | 44 |
| 34 MoreSettings.prototype = { | 45 MoreSettings.prototype = { |
| 35 __proto__: print_preview.Component.prototype, | 46 __proto__: print_preview.Component.prototype, |
| 36 | 47 |
| 37 /** @override */ | 48 /** @override */ |
| 38 enterDocument: function() { | 49 enterDocument: function() { |
| 39 print_preview.Component.prototype.enterDocument.call(this); | 50 print_preview.Component.prototype.enterDocument.call(this); |
| 40 | 51 |
| 41 this.tracker.add(this.getElement(), 'click', this.onClick_.bind(this)); | 52 this.tracker.add(this.getElement(), 'click', this.onClick_.bind(this)); |
| 53 this.tracker.add( |
| 54 this.destinationStore_, |
| 55 print_preview.DestinationStore.EventType.DESTINATION_SELECT, |
| 56 this.onDestinationChanged_.bind(this)); |
| 57 this.tracker.add( |
| 58 this.destinationStore_, |
| 59 print_preview.DestinationStore.EventType. |
| 60 SELECTED_DESTINATION_CAPABILITIES_READY, |
| 61 this.onDestinationCapabilitiesReady_.bind(this)); |
| 42 this.settingsSections_.forEach(function(section) { | 62 this.settingsSections_.forEach(function(section) { |
| 43 this.tracker.add( | 63 this.tracker.add( |
| 44 section, | 64 section, |
| 45 print_preview.SettingsSection.EventType.COLLAPSIBLE_CONTENT_CHANGED, | 65 print_preview.SettingsSection.EventType.COLLAPSIBLE_CONTENT_CHANGED, |
| 46 this.updateState_.bind(this)); | 66 this.updateState_.bind(this)); |
| 47 }.bind(this)); | 67 }.bind(this)); |
| 48 | 68 |
| 49 this.updateState_(); | 69 this.updateState_(true); |
| 50 }, | 70 }, |
| 51 | 71 |
| 52 /** | 72 /** |
| 53 * Toggles "more/fewer options" state and notifies all the options sections | 73 * Toggles "more/fewer options" state and notifies all the options sections |
| 54 * to reflect the new state. | 74 * to reflect the new state. |
| 55 * @private | 75 * @private |
| 56 */ | 76 */ |
| 57 onClick_: function() { | 77 onClick_: function() { |
| 58 this.settingsToShow_ = | 78 this.settingsToShow_ = |
| 59 this.settingsToShow_ == MoreSettings.SettingsToShow.MOST_POPULAR ? | 79 this.settingsToShow_ == MoreSettings.SettingsToShow.MOST_POPULAR ? |
| 60 MoreSettings.SettingsToShow.ALL : | 80 MoreSettings.SettingsToShow.ALL : |
| 61 MoreSettings.SettingsToShow.MOST_POPULAR; | 81 MoreSettings.SettingsToShow.MOST_POPULAR; |
| 62 this.updateState_(); | 82 this.updateState_(false); |
| 83 }, |
| 84 |
| 85 /** |
| 86 * Called when the destination selection has changed. Updates UI elements. |
| 87 * @private |
| 88 */ |
| 89 onDestinationChanged_: function() { |
| 90 this.firstDestinationReady_ = true; |
| 91 this.capabilitiesReady_ = false; |
| 92 this.updateState_(false); |
| 93 }, |
| 94 |
| 95 /** |
| 96 * Called when the destination selection has changed. Updates UI elements. |
| 97 * @private |
| 98 */ |
| 99 onDestinationCapabilitiesReady_: function() { |
| 100 this.capabilitiesReady_ = true; |
| 101 this.updateState_(false); |
| 63 }, | 102 }, |
| 64 | 103 |
| 65 /** | 104 /** |
| 66 * Updates the component appearance according to the current state. | 105 * Updates the component appearance according to the current state. |
| 106 * @param {boolean} noAnimation Whether section visibility transitions |
| 107 * should not be animated. |
| 67 * @private | 108 * @private |
| 68 */ | 109 */ |
| 69 updateState_: function() { | 110 updateState_: function(noAnimation) { |
| 111 if (!this.firstDestinationReady_) { |
| 112 fadeOutElement(this.getElement(), noAnimation); |
| 113 return; |
| 114 } |
| 115 |
| 70 var all = this.settingsToShow_ == MoreSettings.SettingsToShow.ALL; | 116 var all = this.settingsToShow_ == MoreSettings.SettingsToShow.ALL; |
| 71 this.getChildElement('.more-settings-label').textContent = | 117 this.getChildElement('.more-settings-label').textContent = |
| 72 localStrings.getString(all ? 'lessOptionsLabel' : 'moreOptionsLabel'); | 118 localStrings.getString(all ? 'lessOptionsLabel' : 'moreOptionsLabel'); |
| 73 var iconEl = this.getChildElement('.more-settings-icon'); | 119 var iconEl = this.getChildElement('.more-settings-icon'); |
| 74 iconEl.classList.toggle('more-settings-icon-plus', !all); | 120 iconEl.classList.toggle('more-settings-icon-plus', !all); |
| 75 iconEl.classList.toggle('more-settings-icon-minus', all); | 121 iconEl.classList.toggle('more-settings-icon-minus', all); |
| 76 | 122 |
| 77 var availableSections = this.settingsSections_.reduce( | 123 var availableSections = this.settingsSections_.reduce( |
| 78 function(count, section) { | 124 function(count, section) { |
| 79 return count + (section.isAvailable() ? 1 : 0); | 125 return count + (section.isAvailable() ? 1 : 0); |
| 80 }, 0); | 126 }, 0); |
| 81 | 127 |
| 82 // Magic 6 is chosen as the number of sections when it still feels like | 128 // Magic 6 is chosen as the number of sections when it still feels like |
| 83 // manageable and not too crowded. | 129 // manageable and not too crowded. Also, when capabilities are not know |
| 130 // yet, ignore this limit to avoid unnecessary fade in/out cycles. |
| 84 var hasSectionsToToggle = | 131 var hasSectionsToToggle = |
| 85 availableSections > 6 && | 132 (availableSections > 6 || !this.capabilitiesReady_) && |
| 86 this.settingsSections_.some(function(section) { | 133 this.settingsSections_.some(function(section) { |
| 87 return section.hasCollapsibleContent(); | 134 return section.hasCollapsibleContent(); |
| 88 }); | 135 }); |
| 89 | 136 |
| 90 if (hasSectionsToToggle) | 137 if (hasSectionsToToggle) |
| 91 fadeInElement(this.getElement()); | 138 fadeInElement(this.getElement(), noAnimation); |
| 92 else | 139 else |
| 93 fadeOutElement(this.getElement()); | 140 fadeOutElement(this.getElement(), noAnimation); |
| 94 | 141 |
| 95 var collapseContent = | 142 var collapseContent = |
| 96 this.settingsToShow_ == MoreSettings.SettingsToShow.MOST_POPULAR && | 143 this.settingsToShow_ == MoreSettings.SettingsToShow.MOST_POPULAR && |
| 97 hasSectionsToToggle; | 144 hasSectionsToToggle; |
| 98 this.settingsSections_.forEach(function(section) { | 145 this.settingsSections_.forEach(function(section) { |
| 99 section.collapseContent = collapseContent; | 146 section.setCollapseContent(collapseContent, noAnimation); |
| 100 }); | 147 }); |
| 101 } | 148 } |
| 102 }; | 149 }; |
| 103 | 150 |
| 104 // Export | 151 // Export |
| 105 return { | 152 return { |
| 106 MoreSettings: MoreSettings | 153 MoreSettings: MoreSettings |
| 107 }; | 154 }; |
| 108 }); | 155 }); |
| OLD | NEW |