diff --git a/css/main.css b/css/main.css index 9400633dd379aabe4bfef87c909051081ff23b74..2a000be8c1059d5502226224ccd75275d02219db 100644 --- a/css/main.css +++ b/css/main.css @@ -172,3 +172,71 @@ input.numberInput{ display: inline; padding: 8px 10px; } + + + +.navbar-nav > .open > .dropdown-menu{ + padding: 3px 0!important; +} + +.divider{ + margin-right: 0!important; + margin-left: 0!important; + background-color: #676767!important; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu a{ + color: #e1e4e7!important; +} + +.dropdown-submenu li:hover{ + background-color: #428bca!important; +} + +.dropdown-submenu>.dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px; + border-radius: 0 6px 6px 6px; + background-color: #444; +} + +.dropdown-submenu:hover>.dropdown-menu { + display: block; +} + +.dropdown-submenu>a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #ccc; + margin-top: 5px; +} + +.dropdown-submenu:hover>a:after { + border-left-color: #fff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} \ No newline at end of file diff --git a/data/users/ben.user b/data/users/ben.user new file mode 100644 index 0000000000000000000000000000000000000000..22d8053648ccacd9ff3216143c06cf0ad93be91f --- /dev/null +++ b/data/users/ben.user @@ -0,0 +1 @@ +{"lattice":{"units":"inches","scale":2.78388,"shouldPreserveCells":true,"cellSeparation":{"xy":0,"z":0},"cellType":"octa","connectionType":"edgeRot","partType":"beam"},"assembler":{"camStrategy":"xRaster","placementOrder":"XYZ","camProcess":"shopbot","machine":"shopbot","rapidHeight":6.9,"safeHeight":0.5,"originPosition":{"x":-1.39194,"y":1.39194,"z":0},"stockPosition":{"x":-4.713,"y":-13.321,"z":-1.303},"rapidSpeeds":{"xy":6,"z":4},"feedRate":{"xy":0.1,"z":0.1},"stockHeight":0}} \ No newline at end of file diff --git a/js/menus/Navbar.js b/js/menus/Navbar.js index a1747f4c3dcbb86ff9a01b4e7a2cc5af9d93c52a..ee61f7e77d2a825ad8af8eeb4416b608cba06f8f 100644 --- a/js/menus/Navbar.js +++ b/js/menus/Navbar.js @@ -11,15 +11,17 @@ NavBar = Backbone.View.extend({ el: "body", events: { - "click #showHideMenu": "_setMenuVis", - "click .menuHoverControls": "_setNavSelection", - "click #saveJSON": "_save", - "click #saveAsJSON": "_saveAs", - "shown.bs.modal #saveAsModel": "_showSaveAsModal", - "hide.bs.modal #saveAsModel": "_hideSaveAsModal", - "change #saveAsModel": "_saveAs", - "click #importJSON": "_importJSON", - "change #jsonInput": "_selectJSONFiles" + "click #showHideMenu": "_setMenuVis", + "click .menuHoverControls": "_setNavSelection", + "click #saveJSON": "_save", + "click #saveAsJSON": "_saveAs", + "change #saveAsModel": "_saveAs",//detect enter key + "click #saveUser": "_saveUserSettings", + "shown.bs.modal .modal": "_showModal", + "hide.bs.modal .modal": "_hideModal", + "click .importJSON": "_importJSON", + "change #jsonInput": "_selectJSONFiles", + "click .savedUserSettings": "_loadSavedUser" }, initialize: function(){ @@ -90,31 +92,51 @@ NavBar = Backbone.View.extend({ reader.readAsText(files[0]); reader.onload = (function() { return function(e) { - dmaGlobals.lattice.loadFromJSON(e.target.result); + var extension = filename.substr(filename.length - 5); + if (extension == ".json"){ + dmaGlobals.appState.loadLatticeFromJSON(e.target.result); + } else if (extension == ".user"){ + dmaGlobals.appState.loadUser(e.target.result); + } else console.warn("file type not recognized"); } })(); }, _save: function(e){ e.preventDefault(); - dmaGlobals.lattice.saveJSON(); + dmaGlobals.appState.saveJSON(); }, _saveAs: function(e){ e.preventDefault(); var fileName = $("#saveAsFileName").val(); - dmaGlobals.lattice.saveJSON(fileName); + dmaGlobals.appState.saveJSON(fileName); $('#saveAsModel').modal('hide'); }, - _showSaveAsModal: function(){ - var input = $("#saveAsFileName"); + _saveUserSettings: function(e){ + e.preventDefault(); + var fileName = $("#userSettingsFilename").val(); + dmaGlobals.appState.saveUser(fileName); + $('#saveUserModel').modal('hide'); + }, + + _loadSavedUser: function(e){ + e.preventDefault(); + var url = "data/users/" + $(e.target).data("file"); + $.getJSON( url, function(data) { + dmaGlobals.appState.loadUser(data, true); + }); + }, + + _showModal: function(e){ + var input = $(e.target).find("input.filename"); input.focus(); input.select(); }, - _hideSaveAsModal: function(){ - $("#saveAsFileName").blur(); + _hideModal: function(e){ + $(e.target).find("input.filename").blur(); }, _uiStuff: function(){ @@ -128,7 +150,7 @@ NavBar = Backbone.View.extend({ }, _deselectAllNavItems: function(){ - $(".menuHoverControls").parent().removeClass("open");//no highlight + $(".open").removeClass("open");//no highlight } }); \ No newline at end of file diff --git a/js/models/AppState.js b/js/models/AppState.js index 79884584ce4d80bfa2d9613a1f3411a83faadf9b..a4e48611774dea91f15f9bfaa86d7997288712fc 100644 --- a/js/models/AppState.js +++ b/js/models/AppState.js @@ -38,7 +38,7 @@ AppState = Backbone.Model.extend({ assembler:"Assembler", cam: "Process", animate:"Preview", - send: "Send" + send: "Edit" } }, @@ -241,8 +241,6 @@ AppState = Backbone.Model.extend({ this.set("shift", state); break; case 68://d delete mode - console.log(state); - console.log(dmaGlobals.lattice.get("cellMode")); if (this.get("cellMode") == "cell") this.set("deleteMode", state);//only for cell mode else this.set("deleteMode", false); break; @@ -278,6 +276,64 @@ AppState = Backbone.Model.extend({ _handleScroll: function(e){//disable two finger swipe back if (Math.abs(e.originalEvent.deltaX) > Math.abs(e.originalEvent.deltaY)) e.preventDefault(); + }, + + //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////SAVE//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + _saveFile: function(data, name, extension){ + var blob = new Blob([data], {type: "text/plain;charset=utf-8"}); + saveAs(blob, name + extension); + }, + + saveJSON: function(name){ + if (!name) name = "lattice"; + var data = JSON.stringify({ + lattice:this._getLatticeDataToSave(), + assembler: this._getAssemblerDataToSave() + }); + this._saveFile(data, name, ".json"); + }, + + _getAssemblerDataToSave: function(){ + var assemblerData = _.omit(dmaGlobals.assembler.toJSON(), ["origin", "stock", "exporter", "appState", "lattice"]); + if (!dmaGlobals.assembler.get("editsMadeToProgram")) assemblerData.dataOut = ""; + return assemblerData; + }, + + _getLatticeDataToSave: function(){ + return _.omit(dmaGlobals.lattice.toJSON(), ["highlighter", "basePlane", "nodes", "appState"]); + }, + + loadLatticeFromJSON: function(data){ + dmaGlobals.lattice.clearCells(); + this._setData(JSON.parse(data), true); + dmaGlobals.lattice._updateLatticeType(null, null, null, true); + }, + + saveUser: function(name){ + var latticeData = _.omit(this._getLatticeDataToSave(), ["cells", "cellsMin", "cellsMax", "numCells"]); + var assemblerData = _.omit(this._getAssemblerDataToSave(), ["dataOut", "needsPostProcessing", "editsMadeToProgram"]); + var data = JSON.stringify({ + lattice:latticeData, + assembler:assemblerData + }); + this._saveFile(data, name, ".user"); + }, + + loadUser: function(data, isParsed){ + if (!isParsed) data = JSON.parse(data); + this._setData(data, false); + }, + + _setData: function(data, silent){ + _.each(_.keys(data.lattice), function(key){ + dmaGlobals.lattice.set(key, data.lattice[key], {silent:silent}); + }); + _.each(_.keys(data.assembler), function(key){ + dmaGlobals.assembler.set(key, data.assembler[key]); + }); } }); \ No newline at end of file diff --git a/js/models/Lattice.js b/js/models/Lattice.js index 9e07e6b332fe20217a96ce8d566c54a34fc9809e..ec88516ebb78f66a52992fe509aaf706a786ee8b 100644 --- a/js/models/Lattice.js +++ b/js/models/Lattice.js @@ -488,36 +488,6 @@ Lattice = Backbone.Model.extend({ else if (var2 == null) var2 = {order: newVarOrder, dim: newVarDim}; else var1 = {order: newVarOrder, dim: newVarDim}; this.rasterCells(order, callback, var1, var2, var3); - }, - - //////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////SAVE//////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////// - - saveJSON: function(name){ - if (!name) name = "lattice"; - var assemblerData = _.omit(dmaGlobals.assembler.toJSON(), ["origin", "stock", "exporter", "appState", "lattice"]); - if (!dmaGlobals.assembler.get("editsMadeToProgram")) assemblerData.dataOut = ""; - var data = JSON.stringify({ - lattice:_.omit(this.toJSON(), ["highlighter", "basePlane", "nodes", "appState"]), - assembler: assemblerData - }); - var blob = new Blob([data], {type: "text/plain;charset=utf-8"}); - saveAs(blob, name + ".json"); - }, - - loadFromJSON: function(data){ - this.clearCells(); - var data = JSON.parse(data); - var self = this; - _.each(_.keys(data.lattice), function(key){ - self.set(key, data.lattice[key], {silent:true}); - }); - _.each(_.keys(data.assembler), function(key){ - dmaGlobals.assembler.set(key, data.assembler[key]); - }); - this.set("shouldPreserveCells", true, {silent:true}); - this._updateLatticeType(null, null, null, true); } }); \ No newline at end of file diff --git a/main.html b/main.html index ba0b482c0324ca05d3f76ce4bee820972e8c127e..b694e82a84f811641c7d9c302570e6839a5c1ef1 100644 --- a/main.html +++ b/main.html @@ -105,9 +105,19 @@ <a href="#" class="dropdown-toggle" data-toggle="dropdown">File <b class="caret"></b></a> <span class="dropdown-arrow"></span> <ul class="dropdown-menu"> - <li><a id="saveJSON" href="#">Save JSON     (CTRL/⌘ + S)</a></li> - <li><a data-toggle="modal" data-target="#saveAsModel" href="#">Save JSON As...     (CTRL/⌘ + Shift + S)</a></li> - <li><a id="importJSON" href="#">Open JSON     (CTRL/⌘ + O)</a></li> + <li><a id="saveJSON" href="#">Save JSON     (CTRL/⌘ + S)</a></li> + <li><a data-toggle="modal" data-target="#saveAsModel" href="#">Save JSON As...     (CTRL/⌘ + Shift + S)</a></li> + <li><a class="importJSON" href="#">Open JSON...     (CTRL/⌘ + O)</a></li> + <li class="divider"></li> + <li class="dropdown-submenu"> + <a tabindex="-1">Load User Settings</a> + <ul class="dropdown-menu"> + <!--<li><a id="resetDefaultSettings" href="#">Reset Settings</a></li>--> + <li><a data-file="ben.user" class="savedUserSettings" href="#">Ben</a></li> + <li><a class="importJSON" href="#">From File...</a></li> + </ul> + </li> + <li><a id="saveUserSettings" data-toggle="modal" data-target="#saveUserModel" href="#">Save User Settings...</a></li> <li class="divider"></li> <li><a id="exportSTL" href="#">Export STL</a></li> </ul> @@ -128,10 +138,10 @@ <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> - <p class="modal-title" id="myModalLabel">Enter File Name</p> + <p class="modal-title" >Enter File Name</p> </div> <div class="modal-body"> - <input id="saveAsFileName" type="text" value="lattice" placeholder="Enter file name" class="form-control"> + <input id="saveAsFileName" type="text" value="lattice" placeholder="Enter file name" class="form-control filename"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> @@ -141,6 +151,24 @@ </div> </div> +<div class="modal fade" id="saveUserModel" tabindex="-1" role="dialog" aria-labelledby="basicModal" aria-hidden="true"> + <div class="modal-dialog modal-sm"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <p class="modal-title" >Save User Settings</p> + </div> + <div class="modal-body"> + <input id="userSettingsFilename" type="text" value="lattice" placeholder="Enter file name" class="form-control filename"> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> + <button type="button" id="saveUser" class="btn btn-primary">Save</button> + </div> + </div> + </div> +</div> + <div id="menuWrapper"><div id="menuHeader"></div><div id="menuContent"></div></div> <div id="about" class="row navMenu"> @@ -155,4 +183,4 @@ </body> -</html \ No newline at end of file +</html> \ No newline at end of file