From 221a14315b09946db2485036bbf4a80295dc4889 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 2 Jul 2014 16:22:51 -0400 Subject: password reset / username dupe stuff from PH --- server/lib/schemas/User.js | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'server/lib/schemas') diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js index 77e2e02..b64f8fc 100644 --- a/server/lib/schemas/User.js +++ b/server/lib/schemas/User.js @@ -41,10 +41,8 @@ var UserSchema = new mongoose.Schema({ }, "{PATH} is not an acceptable name"] }, email: { type: String, default: "" }, - emailVerified: { - type: Boolean, - default: false, - }, + emailVerified: { type: Boolean, default: false, }, + emailOptout: { type: Boolean, default: false, }, password: { type: String, validate: [function (val) { @@ -52,6 +50,11 @@ var UserSchema = new mongoose.Schema({ return true }, "{PATH} is not an acceptable password"] }, + passwordNonce: { + type: String, + default: "", + }, + location: { type: String, default: "" }, photo: { type: String, default: "" }, bio: { type: String, default: "" }, @@ -72,6 +75,26 @@ UserSchema.methods.validPassword = function (pw) { shasum.update(pw) return this.password === shasum.digest('hex'); } - +UserSchema.statics.findByUsername = function (username, cb) { + this.findOne({ username: new RegExp("^" + username + "$", "i") }, cb) +} +UserSchema.statics.findByEmail = function (email, cb) { + email = util.escapeRegExp(email) + this.findOne({ email: new RegExp("^" + email + "$", "i") }, cb) +} +UserSchema.statics.findByIP = function (ip, cb) { + ip = util.ip2num(ip) + this.findOne({ $or: [{ created_ip: ip }, { last_ip: ip }] }, cb) +} +UserSchema.statics.resetPasswordNonce = function(user, cb){ + crypto.pseudoRandomBytes(256, function (err, buf){ + var shasum = crypto.createHash('sha1') + shasum.update(buf) + user.passwordNonce = shasum.digest('hex') + user.save(function(err, doc){ + cb() + }) + }) +} module.exports = exports = mongoose.model('user', UserSchema); exports.schema = UserSchema; -- cgit v1.2.3-70-g09d2 From 9fe187effeaf4a2e6205e2f1f52b32b8823f4f10 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 14 Jul 2014 15:21:12 -0400 Subject: muting, autoplay, loop --- .../assets/javascripts/mx/primitives/mx.video.js | 15 ++++++- .../assets/javascripts/mx/primitives/mx.vimeo.js | 14 ++++++- .../assets/javascripts/mx/primitives/mx.youtube.js | 16 ++++++- .../rectangles/engine/scenery/types/video.js | 9 ++++ public/assets/javascripts/ui/editor/MediaEditor.js | 49 +++++++++++++++------- public/assets/javascripts/ui/lib/View.js | 6 ++- server/lib/api/media.js | 1 - server/lib/schemas/Media.js | 13 ++++++ server/lib/schemas/Project.js | 4 -- 9 files changed, 104 insertions(+), 23 deletions(-) (limited to 'server/lib/schemas') diff --git a/public/assets/javascripts/mx/primitives/mx.video.js b/public/assets/javascripts/mx/primitives/mx.video.js index f92fe9f..c5dd749 100644 --- a/public/assets/javascripts/mx/primitives/mx.video.js +++ b/public/assets/javascripts/mx/primitives/mx.video.js @@ -30,6 +30,7 @@ MX.Video = MX.Object3D.extend({ this.player = document.createElement('video') this.player.addEventListener("loadedmetadata", this.ready.bind(this)) this.player.addEventListener("error", this.error.bind(this)) + this.player.addEventListener("ended", this.finished.bind(this)) this.player.width = this.width this.player.height = this.height this.player.src = this.media.url @@ -68,13 +69,25 @@ MX.Video = MX.Object3D.extend({ this.player.currentTime = n }, + mute: function(){ + this.player.muted = true + }, + + unmute: function(){ + this.player.muted = false + }, + duration: function(){ return this.player.duration }, finished: function(){ console.log("video finished") - if (this.media.bound) { + if (this.media.loop) { + this.seek(0) + this.play() + } + else if (this.bound) { $(".playButton").removeClass('playing') } }, diff --git a/public/assets/javascripts/mx/primitives/mx.vimeo.js b/public/assets/javascripts/mx/primitives/mx.vimeo.js index 5a373ff..c44464e 100644 --- a/public/assets/javascripts/mx/primitives/mx.vimeo.js +++ b/public/assets/javascripts/mx/primitives/mx.vimeo.js @@ -88,6 +88,14 @@ MX.Vimeo = MX.Object3D.extend({ duration: function(){ return this.player.duration }, + + mute: function(){ + this.player.api('setVolume', 0.0) + }, + + unmute: function(){ + this.player.api('setVolume', 0.8) + }, onPlay: function(){ if (this.paused) { @@ -102,7 +110,11 @@ MX.Vimeo = MX.Object3D.extend({ }, finished: function(){ - if (this.media.bound) { + if (this.media.loop) { + this.seek(0) + this.play() + } + else if (this.bound) { $(".playButton").removeClass('playing') } } diff --git a/public/assets/javascripts/mx/primitives/mx.youtube.js b/public/assets/javascripts/mx/primitives/mx.youtube.js index a31a24d..68bb5f3 100644 --- a/public/assets/javascripts/mx/primitives/mx.youtube.js +++ b/public/assets/javascripts/mx/primitives/mx.youtube.js @@ -79,6 +79,7 @@ MX.Youtube = MX.Object3D.extend({ ready: function(){ console.log("youtube ready") + this.seek(0) }, error: function(err){ @@ -127,10 +128,23 @@ MX.Youtube = MX.Object3D.extend({ duration: function(){ return this.player.getDuration() }, + + mute: function(){ + this.player.mute() + }, + + unmute: function(){ + this.player.unMute() + this.player.setVolume(80) + }, finished: function(){ console.log("youtube finished") - if (this.media.bound) { + if (this.media.loop) { + this.seek(0) + this.play() + } + else if (this.bound) { $(".playButton").removeClass('playing') } } diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js index 6117826..e61a0fa 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js @@ -57,6 +57,15 @@ Scenery.types.video = Scenery.types.base.extend(function(base){ seek: function(n){ this.mx.seek(n) }, + + mute: function(muted){ + if (muted) { + this.mx.mute() + } + else { + this.mx.unmute() + } + }, serialize: function(){ var data = base.serialize.call(this) diff --git a/public/assets/javascripts/ui/editor/MediaEditor.js b/public/assets/javascripts/ui/editor/MediaEditor.js index 29ec9e5..aea78aa 100644 --- a/public/assets/javascripts/ui/editor/MediaEditor.js +++ b/public/assets/javascripts/ui/editor/MediaEditor.js @@ -4,9 +4,13 @@ var MediaEditor = FormView.extend({ events: { "click .playButton": "togglePlaying", + "mousedown [name=keyframe]": "stopPropagation", "change [name=keyframe]": "seek", + "change [name=autoplay]": "setAutoplay", + "change [name=loop]": "setLoop", + "change [name=mute]": "setMute", }, - + initialize: function(opt){ this.parent = opt.parent this.__super__.initialize.call(this) @@ -22,6 +26,7 @@ var MediaEditor = FormView.extend({ // video fields this.$playButton = this.$(".playButton") + this.$autoplay = this.$("[name=autoplay]") this.$loop = this.$("[name=loop]") this.$mute = this.$("[name=mute]") this.$keyframe = this.$("[name=keyframe]") @@ -53,11 +58,10 @@ var MediaEditor = FormView.extend({ case "image": this.$(".image").show() this.$(".video").hide() - /* - this.$widthDimension - this.$heightDimension - this.$units - */ + + this.$widthDimension.val( Number(media.widthDimension) || "" ) + this.$heightDimension.val( Number(media.heightDimension) || "" ) + this.$units.val( media.units || "cm" ) break @@ -67,11 +71,12 @@ var MediaEditor = FormView.extend({ this.$(".video").show() this.$(".image").hide() - /* - this.$loop - this.$mute - this.$keyframe - */ + this.$playButton.toggleClass("playing", ! this.scenery.paused()) + this.$autoplay.prop('checked', !! media.autoplay) + this.$loop.prop('checked', !! media.loop) + this.$mute.prop('checked', !! media.mute) + this.$keyframe.val( Number(media.keyframe || 0) ) + break } @@ -80,15 +85,31 @@ var MediaEditor = FormView.extend({ seek: function(){ var n = parseFloat( this.$keyframe.val() ) this.scenery.seek(n) + + this.scenery.media.keyframe = n }, - + + setAutoplay: function(){ + var checked = this.$autoplay.prop('checked') + this.scenery.media.autoplay = checked + }, + setLoop: function(){ + var checked = this.$loop.prop('checked') + this.scenery.media.loop = checked + }, + setMute: function(){ + var checked = this.$mute.prop('checked') + this.scenery.media.mute = checked + this.scenery.mute(checked) + }, + bind: function(scenery){ this.scenery = scenery - this.scenery.media.bound = true + this.scenery.mx.bound = true }, unbind: function(){ - this.scenery.media.bound = false + this.scenery.mx.bound = false this.scenery = null }, diff --git a/public/assets/javascripts/ui/lib/View.js b/public/assets/javascripts/ui/lib/View.js index 5fc6736..999a0e5 100644 --- a/public/assets/javascripts/ui/lib/View.js +++ b/public/assets/javascripts/ui/lib/View.js @@ -84,7 +84,11 @@ var View = (function($, _){ preventDefault: function(e){ e && e.preventDefault() - } + }, + + stopPropagation: function(e){ + e && e.stopPropagation() + }, }); diff --git a/server/lib/api/media.js b/server/lib/api/media.js index 9699c16..16f9d41 100644 --- a/server/lib/api/media.js +++ b/server/lib/api/media.js @@ -43,7 +43,6 @@ var media = { }) function done () { - console.log(data) new Media(data).save(function(err, rec) { if (err || ! rec) { return res.json({ error: err }) } res.json(rec) diff --git a/server/lib/schemas/Media.js b/server/lib/schemas/Media.js index b415bae..1f26b8e 100644 --- a/server/lib/schemas/Media.js +++ b/server/lib/schemas/Media.js @@ -33,6 +33,19 @@ var MediaSchema = new mongoose.Schema({ type: String, default: "" }, + description: { + type: String, + default: "" + }, + autoplay: { type: Boolean, default: false }, + loop: { type: Boolean, default: false }, + mute: { type: Boolean, default: true }, + keyframe: { type: Number, default: 0.0 }, + + widthDimension: { type: Number }, + heightDimension: { type: Number }, + units: { type: String }, + user_id: { type: mongoose.Schema.ObjectId, index: true }, created_at: { type: Date }, }); diff --git a/server/lib/schemas/Project.js b/server/lib/schemas/Project.js index 75cefc5..0f54eaa 100644 --- a/server/lib/schemas/Project.js +++ b/server/lib/schemas/Project.js @@ -27,10 +27,6 @@ var ProjectSchema = new mongoose.Schema({ photo: { type: String, }, - about: { - type: String, - default: "" - }, rooms: [mongoose.Schema.Types.Mixed], walls: [mongoose.Schema.Types.Mixed], media: [mongoose.Schema.Types.Mixed], -- cgit v1.2.3-70-g09d2 From d81c96616859a57d5d5d63a6ae7b1492a5c4974a Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 16 Jul 2014 16:30:33 -0400 Subject: display room dimensions --- .../javascripts/rectangles/engine/map/ui_editor.js | 8 ++- .../javascripts/rectangles/engine/rooms/_rooms.js | 1 + .../assets/javascripts/ui/builder/BuilderInfo.js | 70 ++++++++++++++++++++++ .../javascripts/ui/builder/BuilderSettings.js | 5 +- .../assets/javascripts/ui/builder/BuilderView.js | 4 ++ .../assets/javascripts/ui/editor/EditorSettings.js | 1 + public/assets/javascripts/ui/editor/MediaEditor.js | 1 + public/assets/stylesheets/app.css | 11 ++++ server/lib/schemas/Layout.js | 1 + views/controls/builder/info.ejs | 7 ++- views/partials/scripts.ejs | 3 +- 11 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 public/assets/javascripts/ui/builder/BuilderInfo.js (limited to 'server/lib/schemas') diff --git a/public/assets/javascripts/rectangles/engine/map/ui_editor.js b/public/assets/javascripts/rectangles/engine/map/ui_editor.js index ea7a356..577ea32 100644 --- a/public/assets/javascripts/rectangles/engine/map/ui_editor.js +++ b/public/assets/javascripts/rectangles/engine/map/ui_editor.js @@ -53,16 +53,21 @@ Map.UI.Editor = function(map){ if (intersects.length && base.permissions.destroy) { base.mouse.down = false Rooms.remove(intersects[0]) + app.tube("builder-destroy-room", intersects[0]) return } else if (intersects.length && (base.permissions.move || base.permissions.resize)) { base.dragging = intersects[0] base.resizing = base.permissions.resize && base.dragging.rect.nearEdge(cursor.x.a, cursor.y.a, resize_margin / map.zoom) base.dragging.rect.translation.sides = base.resizing + app.tube("builder-pick-room", intersects[0]) } else if (base.permissions.create) { base.creating = true } + else if (intersects.length) { + app.tube("builder-pick-room", intersects[0]) + } if (e.shiftKey && base.dragging) { base.dragging.rect.quantize(10/map.zoom) @@ -109,7 +114,8 @@ Map.UI.Editor = function(map){ if (cursor.height() > side_min && cursor.width() > side_min) { cursor.x.abs().quantize(1) cursor.y.abs().quantize(1) - Rooms.add_with_rect( cursor ) + var room = Rooms.add_with_rect( cursor ) + app.tube("builder-pick-room", room) } } diff --git a/public/assets/javascripts/rectangles/engine/rooms/_rooms.js b/public/assets/javascripts/rectangles/engine/rooms/_rooms.js index 48931e9..e0033e3 100644 --- a/public/assets/javascripts/rectangles/engine/rooms/_rooms.js +++ b/public/assets/javascripts/rectangles/engine/rooms/_rooms.js @@ -26,6 +26,7 @@ var Rooms = new function(){ height: 500 }) base.add(room) + return room } base.remove = function(room){ diff --git a/public/assets/javascripts/ui/builder/BuilderInfo.js b/public/assets/javascripts/ui/builder/BuilderInfo.js new file mode 100644 index 0000000..53a122d --- /dev/null +++ b/public/assets/javascripts/ui/builder/BuilderInfo.js @@ -0,0 +1,70 @@ + +var BuilderInfo = View.extend({ + el: "#builderInfo", + + events: { + "keydown": 'stopPropagation', + "change [name=x]": 'changePosition', + "change [name=z]": 'changePosition', + "change [name=width]": 'changeDimensions', + "change [name=depth]": 'changeDimensions', + "change [name=height]": 'changeDimensions', + "change [name=units]": 'changeUnits', + "change [name=resolution]": 'changeResolution', + "change [name=camera-height]": 'changeCameraHeight', + }, + + initialize: function(opt){ + this.parent = opt.parent + this.$x = this.$("[name=x]") + this.$z = this.$("[name=z]") + this.$width = this.$("[name=width]") + this.$depth = this.$("[name=depth]") + this.$height = this.$("[name=height]") + this.$units = this.$("[name=units]") + this.$resolution = this.$("[name=resolution]") + this.$cameraHeight = this.$("[name=camera-height]") + app.on("builder-pick-room", this.pick.bind(this)) + app.on("builder-destroy-room", this.destroy.bind(this)) + }, + + toggle: function(state){ + this.$el.toggleClass("active", state) + }, + + show: function(){ + this.toggle(true) + }, + + hide: function(){ + this.toggle(false) + }, + + room: null, + + pick: function(room){ + this.room = room + this.$width.val( room.rect.x.length() ) + this.$depth.val( room.rect.y.length() ) + this.$height.val( room.height ) + this.$x.val( room.rect.x.a ) + this.$z.val( room.rect.y.a ) + + console.log(room) + }, + + destroy: function(room){ + this.room = null + this.hide() + }, + + changeDimensions: function(){ + }, + + changeUnits: function(){ + }, + + changeCameraHeight: function(){ + }, + +}) diff --git a/public/assets/javascripts/ui/builder/BuilderSettings.js b/public/assets/javascripts/ui/builder/BuilderSettings.js index 6006868..c551f95 100644 --- a/public/assets/javascripts/ui/builder/BuilderSettings.js +++ b/public/assets/javascripts/ui/builder/BuilderSettings.js @@ -7,6 +7,7 @@ var BuilderSettings = FormView.extend({ destroyAction: "/api/layout/destroy", events: { + "keydown": 'stopPropagation', "keydown [name=name]": 'enterSubmit', "click [data-role='save-layout']": 'save', "click [data-role='clone-layout']": 'clone', @@ -69,8 +70,8 @@ var BuilderSettings = FormView.extend({ }.bind(this)) }, - toggle: function(){ - this.$el.toggleClass("active") + toggle: function(state){ + this.$el.toggleClass("active", state) }, enterSubmit: function (e) { diff --git a/public/assets/javascripts/ui/builder/BuilderView.js b/public/assets/javascripts/ui/builder/BuilderView.js index a83bf43..7a92738 100644 --- a/public/assets/javascripts/ui/builder/BuilderView.js +++ b/public/assets/javascripts/ui/builder/BuilderView.js @@ -8,6 +8,7 @@ var BuilderView = View.extend({ }, initialize: function(){ + this.info = new BuilderInfo ({ parent: this }) this.toolbar = new BuilderToolbar ({ parent: this }) this.settings = new BuilderSettings ({ parent: this }) }, @@ -26,5 +27,8 @@ var BuilderView = View.extend({ ready: function(data){ this.settings.load(data) }, + + hideExtras: function(){ + } }) diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js index 887c894..13a6f60 100644 --- a/public/assets/javascripts/ui/editor/EditorSettings.js +++ b/public/assets/javascripts/ui/editor/EditorSettings.js @@ -7,6 +7,7 @@ var EditorSettings = FormView.extend({ destroyAction: "/api/project/destroy", events: { + "keydown": 'stopPropagation', "keydown [name=name]": 'enterSubmit', "click [data-role='save-project']": 'save', "click [data-role='clone-project']": 'clone', diff --git a/public/assets/javascripts/ui/editor/MediaEditor.js b/public/assets/javascripts/ui/editor/MediaEditor.js index f9eaad5..a075e6b 100644 --- a/public/assets/javascripts/ui/editor/MediaEditor.js +++ b/public/assets/javascripts/ui/editor/MediaEditor.js @@ -3,6 +3,7 @@ var MediaEditor = FormView.extend({ el: "#mediaEditor", events: { + "keydown": 'stopPropagation', "click [data-role=play-media]": "togglePaused", "mousedown [name=keyframe]": "stopPropagation", "mousedown": "stopPropagation", diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 2e3358a..3e6dced 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -1247,6 +1247,17 @@ input[type="range"]::-webkit-slider-thumb { position: relative; top: 5px; } +.setting.number.halflines { + height: 30px; +} +.setting.number.halflines input[type=text] { + float: left; + width: 50px; +} +.setting.number.halflines label:nth-of-type(2) { + text-align: center; +} + .setting.number input[type=text] { width: 150px; } diff --git a/server/lib/schemas/Layout.js b/server/lib/schemas/Layout.js index b096b85..33a5262 100644 --- a/server/lib/schemas/Layout.js +++ b/server/lib/schemas/Layout.js @@ -25,6 +25,7 @@ var LayoutSchema = new mongoose.Schema({ }, rooms: [mongoose.Schema.Types.Mixed], startPosition: mongoose.Schema.Types.Mixed, + cameraHeight: { type: Number, default: 180 }, user_id: { type: mongoose.Schema.ObjectId, index: true }, created_at: { type: Date }, updated_at: { type: Date }, diff --git a/views/controls/builder/info.ejs b/views/controls/builder/info.ejs index af0a76d..2cc8132 100644 --- a/views/controls/builder/info.ejs +++ b/views/controls/builder/info.ejs @@ -11,6 +11,12 @@ +
+ + + + +
@@ -29,7 +35,6 @@
-
diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs index 47a027e..2173cd5 100644 --- a/views/partials/scripts.ejs +++ b/views/partials/scripts.ejs @@ -72,9 +72,10 @@ + - + -- cgit v1.2.3-70-g09d2 From f20841988ccd27780d3801e4a6c32bf9afcc9368 Mon Sep 17 00:00:00 2001 From: Julie Lala Date: Thu, 17 Jul 2014 03:04:28 -0400 Subject: conversions between feet/meters/pixels --- public/assets/javascripts/app.js | 9 +- .../javascripts/mx/extensions/mx.movements.js | 2 +- .../assets/javascripts/ui/builder/BuilderInfo.js | 112 +++++++++++++++++++-- .../assets/javascripts/ui/builder/BuilderView.js | 1 + public/assets/javascripts/util.js | 1 - public/assets/stylesheets/app.css | 3 +- server/lib/schemas/Layout.js | 2 +- views/controls/builder/info.ejs | 25 ++--- 8 files changed, 123 insertions(+), 32 deletions(-) (limited to 'server/lib/schemas') diff --git a/public/assets/javascripts/app.js b/public/assets/javascripts/app.js index 0b441c7..1419d1d 100644 --- a/public/assets/javascripts/app.js +++ b/public/assets/javascripts/app.js @@ -17,8 +17,6 @@ else { var scene, cam, map; -var viewHeight = window.viewHeight || 186 - var app = new function(){} app.mode = { editor: false, builder: false } @@ -99,4 +97,11 @@ app.position = function(obj){ return pos } +app.defaults = { + viewHeight: window.viewHeight = 186, + units: app.units = "ft", + footResolution: 36, + meterResolution: 100, +} + document.addEventListener('DOMContentLoaded', app.init) diff --git a/public/assets/javascripts/mx/extensions/mx.movements.js b/public/assets/javascripts/mx/extensions/mx.movements.js index f176e8b..191088f 100644 --- a/public/assets/javascripts/mx/extensions/mx.movements.js +++ b/public/assets/javascripts/mx/extensions/mx.movements.js @@ -1,6 +1,6 @@ -MX.Movements = function (cam, viewHeight) { +MX.Movements = function (cam) { var moveForward, moveLeft, diff --git a/public/assets/javascripts/ui/builder/BuilderInfo.js b/public/assets/javascripts/ui/builder/BuilderInfo.js index 53a122d..9bbd385 100644 --- a/public/assets/javascripts/ui/builder/BuilderInfo.js +++ b/public/assets/javascripts/ui/builder/BuilderInfo.js @@ -5,28 +5,35 @@ var BuilderInfo = View.extend({ events: { "keydown": 'stopPropagation', "change [name=x]": 'changePosition', - "change [name=z]": 'changePosition', + "change [name=y]": 'changePosition', "change [name=width]": 'changeDimensions', "change [name=depth]": 'changeDimensions', "change [name=height]": 'changeDimensions', "change [name=units]": 'changeUnits', "change [name=resolution]": 'changeResolution', - "change [name=camera-height]": 'changeCameraHeight', + "change [name=viewHeight]": 'changeViewHeight', }, initialize: function(opt){ this.parent = opt.parent this.$x = this.$("[name=x]") - this.$z = this.$("[name=z]") + this.$y = this.$("[name=y]") this.$width = this.$("[name=width]") this.$depth = this.$("[name=depth]") this.$height = this.$("[name=height]") this.$units = this.$("[name=units]") - this.$resolution = this.$("[name=resolution]") - this.$cameraHeight = this.$("[name=camera-height]") + this.$viewHeight = this.$("[name=viewHeight]") + this.$unitName = this.$(".unitName") app.on("builder-pick-room", this.pick.bind(this)) app.on("builder-destroy-room", this.destroy.bind(this)) }, + + load: function(data){ + this.$viewHeight.unitVal( data.viewHeight || app.defaults.viewHeight ) + this.$units.val( "ft" ) + this.$unitName.html( "ft" ) + this.$resolution.val( app.defaults.footResolution ) + }, toggle: function(state){ this.$el.toggleClass("active", state) @@ -44,11 +51,11 @@ var BuilderInfo = View.extend({ pick: function(room){ this.room = room - this.$width.val( room.rect.x.length() ) - this.$depth.val( room.rect.y.length() ) - this.$height.val( room.height ) - this.$x.val( room.rect.x.a ) - this.$z.val( room.rect.y.a ) + this.$width.unitVal( room.rect.x.length() ) + this.$depth.unitVal( room.rect.y.length() ) + this.$height.unitVal( room.height ) + this.$x.unitVal( room.rect.x.a ) + this.$y.unitVal( room.rect.y.a ) console.log(room) }, @@ -59,12 +66,95 @@ var BuilderInfo = View.extend({ }, changeDimensions: function(){ +// this.$width.unitVal( room.rect.x.length() ) +// this.$depth.unitVal( room.rect.y.length() ) +// this.$height.unitVal( room.height ) }, changeUnits: function(){ + app.units = this.$units.val() + this.$('.units').resetUnitVal() }, - changeCameraHeight: function(){ + changeViewHeight: function(){ + window.viewHeight = this.$viewHeight.unitVal( ) }, }) + +$.fn.resetUnitVal = function(){ + this.each(function(){ + var n = $(this).data("px") + $(this).unitVal(n) + }); +} + +$.fn.unitVal = function(n){ + var s + if (typeof n === "undefined") { + s = $(this).val() + n = stringToMeasurement( s ) + } + s = measurementToString( n ) + $(this).val( s ).data("px", n) + return n +} + +function measurementToString( n ) { + var s, ft, inch + switch (app.units) { + case 'm': + s = round(n/36 * 0.3048 * 100) / 100 + " m" + break + case 'ft': + ft = floor(n / 36) + inch = abs(round((n % 36) / 3)) + s = ft + "'" + if (inch > 0) { + s += " " + inch + '"' + } + break + case 'px': + default: + s = round(n) + " px" + break + } + return s +} +function stringToMeasurement( s ) { + var ft, inch, ft_in, type + if (s.indexOf("'") !== -1 || s.indexOf('"') !== -1 || s.indexOf('ft') !== -1) { + ft_in = s.match(/[0-9.]+/g) + if (ft_in.length >= 2) { + ft = parseFloat( ft_in[0] ) + inch = parseFloat( ft_in[1] ) + } + else if (ft_in.length == 1) { + if (s.indexOf('"') !== -1) { + ft = 0 + inch = parseFloat( ft_in[0] ) + } + else { + ft = parseFloat( ft_in[0] ) + inch = 0 + } + } + else { + ft = inch = 0 + } + n = ft * 36 + inch * 3 + } + else if (type === "m") { + n = parseFloat(s.match(/[0-9.]+/)) * 36 / 0.3048 + } + else if (s.indexOf("px") !== -1) { + n = parseFloat(s.match(/[0-9.]+/)) + } + else { + n = abs( stringToMeasurement( s + app.units ) ) + } + if (s.indexOf('-') !== -1) { + n *= -1 + } + return n +} \ No newline at end of file diff --git a/public/assets/javascripts/ui/builder/BuilderView.js b/public/assets/javascripts/ui/builder/BuilderView.js index 7a92738..555cd58 100644 --- a/public/assets/javascripts/ui/builder/BuilderView.js +++ b/public/assets/javascripts/ui/builder/BuilderView.js @@ -26,6 +26,7 @@ var BuilderView = View.extend({ ready: function(data){ this.settings.load(data) + this.info.load(data) }, hideExtras: function(){ diff --git a/public/assets/javascripts/util.js b/public/assets/javascripts/util.js index b58da1f..58dcc3a 100644 --- a/public/assets/javascripts/util.js +++ b/public/assets/javascripts/util.js @@ -176,4 +176,3 @@ function bitcount(v) { v = (v & 0x33333333) + ((v >>> 2) & 0x33333333); return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24; } - diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 3e6dced..61a4fa9 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -1252,10 +1252,11 @@ input[type="range"]::-webkit-slider-thumb { } .setting.number.halflines input[type=text] { float: left; - width: 50px; + width: 60px; } .setting.number.halflines label:nth-of-type(2) { text-align: center; + width: 30px; } .setting.number input[type=text] { diff --git a/server/lib/schemas/Layout.js b/server/lib/schemas/Layout.js index 33a5262..e3f2616 100644 --- a/server/lib/schemas/Layout.js +++ b/server/lib/schemas/Layout.js @@ -25,7 +25,7 @@ var LayoutSchema = new mongoose.Schema({ }, rooms: [mongoose.Schema.Types.Mixed], startPosition: mongoose.Schema.Types.Mixed, - cameraHeight: { type: Number, default: 180 }, + viewHeight: { type: Number }, user_id: { type: mongoose.Schema.ObjectId, index: true }, created_at: { type: Date }, updated_at: { type: Date }, diff --git a/views/controls/builder/info.ejs b/views/controls/builder/info.ejs index 2cc8132..d92d34c 100644 --- a/views/controls/builder/info.ejs +++ b/views/controls/builder/info.ejs @@ -1,40 +1,35 @@
- +
- +
- +
- - - + + +
-
- - -
-
- - + +
-- cgit v1.2.3-70-g09d2