1 define([ 2 'jquery', 3 'underscore', 4 'viewcontroller', 5 'chroma', 6 'slickformatters', 7 'slickeditors' 8 ], function($, _, ViewControllers, chroma, slickformatters, slickeditors) { 9 10 // we only use the base attribute class, no need to get the base class 11 /** @private */ 12 var EmperorAttributeABC = ViewControllers.EmperorAttributeABC; 13 /** 14 * @class VisibilityController 15 * 16 * Manipulates and displays the visibility of objects on screen. 17 * 18 * @param {UIState} uiState The shared state 19 * @param {Node} container Container node to create the controller in. 20 * @param {Object} decompViewDict This object is keyed by unique 21 * identifiers and the values are DecompositionView objects referring to a 22 * set of objects presented on screen. This dictionary will usually be shared 23 * by all the tabs in the application. This argument is passed by reference. 24 * 25 * @return {VisibilityController} An instance of VisibilityController 26 * @constructs VisibilityController 27 * @extends EmperorAttributeABC 28 */ 29 function VisibilityController(uiState, container, decompViewDict) { 30 var helpmenu = 'Change the visibility of the attributes on the plot, ' + 31 'such as spheres, vectors and ellipsoids.'; 32 var title = 'Visibility'; 33 34 // Constant for width in slick-grid 35 var SLICK_WIDTH = 25, scope = this; 36 37 // Build the options dictionary 38 var options = {'valueUpdatedCallback': function(e, args) { 39 var visible = args.item.value; 40 var group = args.item.plottables; 41 var element = scope.getView(); 42 scope.setPlottableAttributes(element, visible, group); 43 }, 44 'categorySelectionCallback': function(evt, params) { 45 var category = scope.$select.val(); 46 47 var decompViewDict = scope.getView(); 48 49 // getting all unique values per categories 50 var uniqueVals = decompViewDict.decomp.getUniqueValuesByCategory( 51 category); 52 // getting color for each uniqueVals 53 var attributes = {}; 54 _.each(uniqueVals, function(value) { 55 attributes[value] = true; 56 }); 57 // fetch the slickgrid-formatted data 58 var data = decompViewDict.setCategory( 59 attributes, scope.setPlottableAttributes, category); 60 61 scope.setSlickGridDataset(data); 62 }, 63 'slickGridColumn': {id: 'title', name: '', field: 'value', 64 sortable: false, maxWidth: SLICK_WIDTH, 65 minWidth: SLICK_WIDTH, 66 formatter: Slick.Formatters.Checkmark, 67 editor: Slick.Editors.Checkbox}}; 68 69 EmperorAttributeABC.call(this, uiState, container, title, helpmenu, 70 decompViewDict, options); 71 72 this.$applyAll = $("<input type='button' value='Toggle Visible'>" 73 ).css({ 74 'margin': '0 auto', 75 'display': 'block' 76 }); 77 this.$header.append(this.$applyAll); 78 79 $(function() { 80 scope.$applyAll.hide(); 81 scope.$applyAll.on('click', function() { 82 scope.toggleVisibility(); 83 }); 84 }); 85 86 87 return this; 88 } 89 VisibilityController.prototype = Object.create(EmperorAttributeABC.prototype); 90 VisibilityController.prototype.constructor = EmperorAttributeABC; 91 92 /** 93 * 94 * Private method to reset all objects to be visible. 95 * 96 * @extends EmperorAttributeABC 97 * @private 98 * 99 */ 100 VisibilityController.prototype._resetAttribute = function() { 101 EmperorAttributeABC.prototype._resetAttribute.call(this); 102 103 _.each(this.decompViewDict, function(view) { 104 view.setVisibility(true); 105 view.showEdgesForPlottables(); 106 }); 107 }; 108 109 /** 110 * Helper function to set the visibility of plottable 111 * 112 * @param {Object} scope the scope where the plottables exist 113 * @param {boolean} visible Visibility of the plottables 114 * @param {Object[]} group Array of objects that should be changed in scope 115 */ 116 VisibilityController.prototype.setPlottableAttributes = 117 function(scope, visible, group) { 118 scope.setVisibility(visible, group); 119 }; 120 121 /** 122 * Sets whether or not elements in the tab can be modified. 123 * 124 * @param {Boolean} trulse option to enable elements. 125 */ 126 VisibilityController.prototype.setEnabled = function(trulse) { 127 EmperorAttributeABC.prototype.setEnabled.call(this, trulse); 128 129 // prevent errors when this method is called before the element exists 130 if (this.$applyAll) { 131 if (trulse) { 132 this.$applyAll.show(); 133 } 134 else { 135 this.$applyAll.hide(); 136 } 137 } 138 }; 139 140 /** 141 * Toggle visible objects 142 */ 143 VisibilityController.prototype.toggleVisibility = function() { 144 var view = this.getView(); 145 146 var groups = this.getSlickGridDataset(); 147 _.each(groups, function(group) { 148 149 // toggle the value in the data container and update the view 150 group.value = Boolean(true ^ group.value); 151 view.setVisibility(group.value, group.plottables); 152 }); 153 154 // lastly, update the grid table 155 this.setSlickGridDataset(groups); 156 }; 157 158 159 return VisibilityController; 160 }); 161