diff --git a/js/lattice/CompositeEditorLattice.js b/js/lattice/CompositeEditorLattice.js index b89c84c470aa242c7476089fb85ca0677451f76f..c23bd8b17481e8770d09ce4230aeb3bb2b9cb03d 100644 --- a/js/lattice/CompositeEditorLattice.js +++ b/js/lattice/CompositeEditorLattice.js @@ -74,10 +74,6 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre materials.setMaterial(id, data); }, - deleteComposite: function(){ - return materials.setMaterial(this.get("id"), null); - }, - diff --git a/js/materials/DMAMaterials.js b/js/materials/DMAMaterials.js index 3353d61ea145ecc0142c0cc4f30b2b6f93133907..3ab962e51fbf69f735e64c53305569c038559eba 100644 --- a/js/materials/DMAMaterials.js +++ b/js/materials/DMAMaterials.js @@ -21,8 +21,14 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu }; function deleteMaterial(id){ + if (materials[id].noDelete) { + console.warn("no delete flag on this material type"); + return false; + } delete materials[id];//todo check if being used first - return true; + var deleted = true; + if (deleted) loadMaterialClass();//set to defaults + return deleted; } var listener = {}; @@ -50,6 +56,7 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu newMaterials[key] = definitions[key]; var color = getMaterialColorForState(state, definitions[key], key); newMaterials[key].threeMaterial = makeMaterialObject(color); + newMaterials[key].noDelete = true;//don't delete the predefined materials }); return newMaterials; } diff --git a/js/menus/CompositeMenuView.js b/js/menus/CompositeMenuView.js index d2f25ca32324e1e4ddddd3386002c4967f77b4ed..55b5bed34f874839c1f195f482d10d7cf5973a19 100644 --- a/js/menus/CompositeMenuView.js +++ b/js/menus/CompositeMenuView.js @@ -44,9 +44,9 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma return null; }, - updateHex: function(hex){ + updateHex: function(hex, $target){ //update hex without rendering - $("#compositeColor").css("border-color", hex); + $target.css("border-color", hex); }, _finishComposite: function(e){ @@ -63,6 +63,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma _saveComposite: function(e){ e.preventDefault(); + //save as file }, _cancelComposite: function(e){ @@ -77,8 +78,8 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma this._exit(); return; } - lattice.compositeEditor.deleteComposite(); - this._exit(); + var deleted = materials.setMaterial(this.get("id"), null); + if (deleted) this._exit(); }, _exit: function(){ diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js index deafc0c6b4be3f71eb4c1fb6708eaad6ec2ee5a5..b131653fb4cedfbbafab878299f119daef78452c 100644 --- a/js/menus/MaterialEditorMenuView.js +++ b/js/menus/MaterialEditorMenuView.js @@ -6,14 +6,52 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate'], function($, _, MenuParentView, plist, materials, template){ + var materialNameIndex = 1; + return MenuParentView.extend({ events: { - "click #cancelMaterial": "_exit" + "click #cancelMaterial": "_cancelMaterial", + "click #deleteMaterial": "_deleteMaterial", + "click #finishMaterial": "_save" }, _initialize: function(){ //bind events + this.material = _.clone(materials[this.model.get("materialType")]); + }, + + getPropertyOwner: function($target){ + if ($target.hasClass("materialEditor")) return this.material; + return null; + }, + + updateHex: function(hex, $target){ + //update hex without rendering + $target.css("border-color", hex); + }, + + _save: function(e){ + e.preventDefault(); + var name = this.material.name; + if (name == "") name = "Material " + materialNameIndex++; + materials.setMaterial(this.model.get("materialType"), { + name: name, + color: this.material.color, + altColor: this.material.altColor + }); + this._exit(); + }, + + _deleteMaterial: function(e){ + e.preventDefault(); + var deleted = materials.setMaterial(this.model.get("materialType"), null); + if (deleted) this._exit(); + }, + + _cancelMaterial: function(e){ + e.preventDefault(); + this._exit(); }, _exit: function(){ @@ -21,7 +59,15 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi }, _makeTemplateJSON: function(){ - return _.extend({name:"name", color:"#ffff00", altColor:"#00ffff"}, plist); + return _.extend(this.material); + }, + + _destroy: function(){ + var self = this; + _.each(_.keys(this.material), function(key){ + delete self.material[key]; + }); + this.material = null; }, template: _.template(template) diff --git a/js/menus/MaterialMenuView.js b/js/menus/MaterialMenuView.js index ffc17fb5ebff1e648b720686fb0df28f3a372e9f..89e3ff70a902fbd6c6253ad95e6779ce033e4464 100644 --- a/js/menus/MaterialMenuView.js +++ b/js/menus/MaterialMenuView.js @@ -36,6 +36,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma e.stopPropagation(); e.preventDefault(); var id = $(e.target).data("id"); + this.model.set("materialType", id); this.model.set("currentTab", "materialEditor", {silent:true}); this.model.set("currentNav", "navMaterial"); }, diff --git a/js/menus/MenuParentView.js b/js/menus/MenuParentView.js index defecd9e6d62911b4725287f9c03474a25ca1fbf..45ebe547f614b12481c24a0581a56bfc59440e5a 100644 --- a/js/menus/MenuParentView.js +++ b/js/menus/MenuParentView.js @@ -29,6 +29,7 @@ define(['jquery', 'underscore', 'backbone'], function($, _, Backbone){ }, destroy: function(){ + if (this._destroy) this._destroy(); this.stopListening(); this.undelegateEvents(); this.$el.removeData().unbind(); diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js index 2ec39ea5b3095755aa8a599e6a62aed7d04087a5..cd574709571c8591c2e905a4076c94ccbb27a777 100644 --- a/js/menus/MenuWrapperView.js +++ b/js/menus/MenuWrapperView.js @@ -59,7 +59,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex console.warn("no property associated with string input"); return; } - this._setProperty($target, $target.val()); + this._setProperty($target, property, $target.val()); }, _updateHex: function(e){ @@ -73,7 +73,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex return; } this._setProperty($target, property, hex); - if (this.menu.updateHex) this.menu.updateHex(hex);//no render when input in focus, this forces update of the inputs color + if (this.menu.updateHex) this.menu.updateHex(hex, $target);//no render when input in focus, this forces update of the inputs color }, _isValidHex: function(hex){ @@ -175,7 +175,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex _toggleProperty: function($target, property){ //val = !val var owner = this._getPropertyOwner($target); - if (owner) owner.set(property, !owner.get(property)); + if (owner) this._setOwnerProperty(owner, property, !this._getOwnerProperty(owner, property)); }, _setProperty: function($target, property, newVal, key){ @@ -186,14 +186,24 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex return; } if (key){ - var propObject = owner.get(property).clone(); + var propObject = this._getOwnerProperty(owner, property).clone(); propObject[key] = newVal; - owner.set(property, propObject); + this._setOwnerProperty(owner, property, newVal); } else { - owner.set(property, newVal); + this._setOwnerProperty(owner, property, newVal); } }, + _getOwnerProperty: function(owner, property){ + if (owner instanceof Backbone.Model) return owner.get(property); + return owner[property]; + }, + + _setOwnerProperty: function(owner, property, value){ + if (owner instanceof Backbone.Model) owner.set(property, value); + else owner[property] = value; + }, + diff --git a/js/menus/templates/MaterialEditorMenuView.html b/js/menus/templates/MaterialEditorMenuView.html index a2ca68fb57adb23a9ec81c8516162baafe84979b..e2578716b8cbbd8fa979e0f44b2911eea2186641 100644 --- a/js/menus/templates/MaterialEditorMenuView.html +++ b/js/menus/templates/MaterialEditorMenuView.html @@ -1,12 +1,16 @@ <a href="#" class="btn btn-halfWidth btn-lg btn-default importJSON">Load Material</a> <a id="saveMaterial" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save Material</a><br/><br/> -Name: <input id="materialName" data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput materialEditor" type="text"><br/><br/> +Name: <input data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput materialEditor" type="text"><br/><br/> Display Color: - <input id="materialColor" style="border-color: <%= altColor %> ;" data-property="altColor" value="<%= color %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/> + <input id="materialColor" style="border-color: <%= altColor %> ;" data-property="altColor" value="<%= altColor %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/> <a id="newRandomColor" href="#" class="btn btn-block btn-lg btn-default">New Random Display Color</a><br/> Realistic Color: <input id="materialAltColor" style="border-color: <%= color %> ;" data-property="color" value="<%= color %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/> -Material Properties:<br/><br/>add properties here<br/><br/> +Material Properties:<br/><br/>- add properties here<br/><br/> <a id="finishMaterial" href="#" class="btn btn-block btn-lg btn-success">Save Material</a><br/> -<a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a> -<a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/> \ No newline at end of file +<% if (noDelete){ %> + <a id="cancelMaterial" href="#" class="btn btn-block btn-lg btn-default">Cancel / Exit</a> +<% } else { %> + <a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a> + <a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/> +<% } %> \ No newline at end of file