From eac88be42cc1a7f85c7a0533414e1047e0addc39 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Mon, 23 Jun 2014 18:11:59 -0400 Subject: stubbing in stuff for videos/embeds --- .../rectangles/engine/scenery/_scenery.js | 6 +++- .../rectangles/engine/scenery/types/_object.js | 3 ++ .../rectangles/engine/scenery/types/embed.js | 38 ++++++++++++++++++++++ .../rectangles/engine/scenery/types/image.js | 1 + .../rectangles/engine/scenery/types/video.js | 12 ++++++- 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 public/assets/javascripts/rectangles/engine/scenery/types/embed.js (limited to 'public/assets/javascripts/rectangles/engine') diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js index 74801e9..d44ad41 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js +++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js @@ -19,9 +19,13 @@ var Scenery = new function(){ scene_media = new Scenery.types.image ({ media: media, wall: wall, id: id }) break + case 'video': + scene_media = new Scenery.types.video ({ media: media, wall: wall, id: id }) + break + case 'youtube': case 'vimeo': - scene_media = new Scenery.types.video ({ media: media, wall: wall, id: id }) + scene_media = new Scenery.types.embed ({ media: media, wall: wall, id: id }) break } diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js index 05c760b..65f3a94 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js @@ -35,6 +35,9 @@ Scenery.types.base = Fiber.extend(function(base){ destroy: function(){ this.unbind() scene.remove(this.mx) + this.mx.media = null + this.mx.ops = null + this.mx = null this.move = null this.media = null this.dimensions = null diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/embed.js b/public/assets/javascripts/rectangles/engine/scenery/types/embed.js new file mode 100644 index 0000000..58bc58d --- /dev/null +++ b/public/assets/javascripts/rectangles/engine/scenery/types/embed.js @@ -0,0 +1,38 @@ + +Scenery.types.embed = Scenery.types.base.extend(function(base){ + + var exports = { + + init: function(opt){ + base.init.call(this, opt) + this.scale = this.media.scale = 300 / max(300, this.media.width) + + this.build() + this.bind() + this.set_wall() + this.recenter() + }, + + build: function(){ + this.mx = new MX.Embed({ + src: this.media.url, + poster: this.media.thumbnail, + media: this.media, + y: this.scale * this.media.height/2, + backface: false, + }) + scene.add( this.mx ) + }, + + serialize: function(){ + var data = base.serialize.call(this) + return data + }, + + deserialize: function(data){ + this.mx.move(data.position) + }, + } + + return exports +}) diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/image.js b/public/assets/javascripts/rectangles/engine/scenery/types/image.js index b668e6a..99c1810 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/image.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/image.js @@ -17,6 +17,7 @@ Scenery.types.image = Scenery.types.base.extend(function(base){ this.mx = new MX.Image({ src: this.media.url, scale: this.scale, + media: this.media, y: this.scale * this.media.height/2, backface: false, }) diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js index b34e55c..a8b3722 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js @@ -14,13 +14,23 @@ Scenery.types.video = Scenery.types.base.extend(function(base){ }, build: function(){ - this.mx = new MX.Image({ + this.mx = new MX.Video({ src: this.media.url, + media: this.media, y: this.scale * this.media.height/2, backface: false, }) scene.add( this.mx ) }, + + play: function(){ + }, + + pause: function(){ + }, + + seek: function(){ + }, serialize: function(){ var data = base.serialize.call(this) -- cgit v1.2.3-70-g09d2 From 1b69dbd0897b21e9613c08811da5ca8e4c863cfa Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Tue, 24 Jun 2014 16:04:19 -0400 Subject: putting mp4/webm videos on walls --- .../assets/javascripts/mx/primitives/mx.video.js | 27 +++++++++------ .../assets/javascripts/mx/primitives/mx.vimeo.js | 6 ++-- .../assets/javascripts/mx/primitives/mx.youtube.js | 6 ++-- .../rectangles/engine/scenery/_scenery.js | 5 ++- .../rectangles/engine/scenery/types/embed.js | 38 --------------------- .../rectangles/engine/scenery/types/video.js | 8 ++++- .../rectangles/engine/scenery/types/vimeo.js | 39 ++++++++++++++++++++++ .../rectangles/engine/scenery/types/youtube.js | 39 ++++++++++++++++++++++ public/assets/javascripts/ui/editor/MediaViewer.js | 1 - public/assets/stylesheets/app.css | 12 +++++-- server/lib/api/media.js | 1 + server/lib/upload.js | 4 ++- 12 files changed, 125 insertions(+), 61 deletions(-) delete mode 100644 public/assets/javascripts/rectangles/engine/scenery/types/embed.js create mode 100644 public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js create mode 100644 public/assets/javascripts/rectangles/engine/scenery/types/youtube.js (limited to 'public/assets/javascripts/rectangles/engine') diff --git a/public/assets/javascripts/mx/primitives/mx.video.js b/public/assets/javascripts/mx/primitives/mx.video.js index c9ec339..b2727c0 100644 --- a/public/assets/javascripts/mx/primitives/mx.video.js +++ b/public/assets/javascripts/mx/primitives/mx.video.js @@ -4,11 +4,14 @@ MX.Video = MX.Object3D.extend({ this.type = "Video" var layer = this - layer.width = 0 - layer.height = 0 + layer.width = ops.width + layer.height = ops.height layer.x = ops.x || 0 layer.y = ops.y || 0 layer.z = ops.z || 0 + layer.rotationX = ops.rotationX || 0 + layer.rotationY = ops.rotationY || 0 + layer.rotationZ = ops.rotationZ || 0 layer.scale = ops.scale || 1 layer.backface = ops.backface || false layer.media = ops.media @@ -30,15 +33,22 @@ MX.Video = MX.Object3D.extend({ loadVideo: function(ops){ var layer = this - layer.ops = defaults(ops, layer.ops) var video = document.createElement('video') video.addEventListener("loadedmetadata", function(){ - // - video.play() + if (ops.autoplay) { + video.play() + } + else { + video.currentTime = video.duration / 3 + } }) + video.width = layer.width + video.height = layer.height video.src = ops.src video.load() + + this.el.appendChild(video) }, move: function(ops){ @@ -49,11 +59,6 @@ MX.Video = MX.Object3D.extend({ } layer.dirty = true layer.update() - }, - - toString: function(){ - var params = "id src width height depth x y z rotationX rotationY rotationZ scale".split(" ") - return this.__toString(params) - }, + } }) diff --git a/public/assets/javascripts/mx/primitives/mx.vimeo.js b/public/assets/javascripts/mx/primitives/mx.vimeo.js index b65f35a..b8efa17 100644 --- a/public/assets/javascripts/mx/primitives/mx.vimeo.js +++ b/public/assets/javascripts/mx/primitives/mx.vimeo.js @@ -11,9 +11,9 @@ MX.Vimeo = MX.Object3D.extend({ layer.x = ops.x || 0 layer.y = ops.y || 0 layer.z = ops.z || 0 - layer.rotationX = layer.ops.rotationX || 0 - layer.rotationY = layer.ops.rotationY || 0 - layer.rotationZ = layer.ops.rotationZ || 0 + layer.rotationX = ops.rotationX || 0 + layer.rotationY = ops.rotationY || 0 + layer.rotationZ = ops.rotationZ || 0 layer.scale = ops.scale || 1 layer.backface = ops.backface || false diff --git a/public/assets/javascripts/mx/primitives/mx.youtube.js b/public/assets/javascripts/mx/primitives/mx.youtube.js index 068ef9f..3756d80 100644 --- a/public/assets/javascripts/mx/primitives/mx.youtube.js +++ b/public/assets/javascripts/mx/primitives/mx.youtube.js @@ -11,9 +11,9 @@ MX.Youtube = MX.Object3D.extend({ layer.x = ops.x || 0 layer.y = ops.y || 0 layer.z = ops.z || 0 - layer.rotationX = layer.ops.rotationX || 0 - layer.rotationY = layer.ops.rotationY || 0 - layer.rotationZ = layer.ops.rotationZ || 0 + layer.rotationX = ops.rotationX || 0 + layer.rotationY = ops.rotationY || 0 + layer.rotationZ = ops.rotationZ || 0 layer.scale = ops.scale || 1 layer.backface = ops.backface || false diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js index d44ad41..b7e7892 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js +++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js @@ -24,8 +24,11 @@ var Scenery = new function(){ break case 'youtube': + scene_media = new Scenery.types.youtube ({ media: media, wall: wall, id: id }) + break + case 'vimeo': - scene_media = new Scenery.types.embed ({ media: media, wall: wall, id: id }) + scene_media = new Scenery.types.vimeo ({ media: media, wall: wall, id: id }) break } diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/embed.js b/public/assets/javascripts/rectangles/engine/scenery/types/embed.js deleted file mode 100644 index 58bc58d..0000000 --- a/public/assets/javascripts/rectangles/engine/scenery/types/embed.js +++ /dev/null @@ -1,38 +0,0 @@ - -Scenery.types.embed = Scenery.types.base.extend(function(base){ - - var exports = { - - init: function(opt){ - base.init.call(this, opt) - this.scale = this.media.scale = 300 / max(300, this.media.width) - - this.build() - this.bind() - this.set_wall() - this.recenter() - }, - - build: function(){ - this.mx = new MX.Embed({ - src: this.media.url, - poster: this.media.thumbnail, - media: this.media, - y: this.scale * this.media.height/2, - backface: false, - }) - scene.add( this.mx ) - }, - - serialize: function(){ - var data = base.serialize.call(this) - return data - }, - - deserialize: function(data){ - this.mx.move(data.position) - }, - } - - return exports -}) diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js index a8b3722..2f6dc01 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js @@ -17,6 +17,9 @@ Scenery.types.video = Scenery.types.base.extend(function(base){ this.mx = new MX.Video({ src: this.media.url, media: this.media, + width: this.media.width, + height: this.media.height, + scale: this.scale, y: this.scale * this.media.height/2, backface: false, }) @@ -24,12 +27,15 @@ Scenery.types.video = Scenery.types.base.extend(function(base){ }, play: function(){ + this.mx.play() }, pause: function(){ + this.mx.pause() }, - seek: function(){ + seek: function(n){ + this.mx.seek(n) }, serialize: function(){ diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js new file mode 100644 index 0000000..488d23c --- /dev/null +++ b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js @@ -0,0 +1,39 @@ + +Scenery.types.vimeo = Scenery.types.base.extend(function(base){ + + var exports = { + + init: function(opt){ + base.init.call(this, opt) + this.scale = this.media.scale = 300 / max(300, this.media.width) + + this.build() + this.bind() + this.set_wall() + this.recenter() + }, + + build: function(){ + this.mx = new MX.Vimeo({ + src: this.media.url, + poster: this.media.thumbnail, + media: this.media, + scale: this.scale, + y: this.scale * this.media.height/2, + backface: false, + }) + scene.add( this.mx ) + }, + + serialize: function(){ + var data = base.serialize.call(this) + return data + }, + + deserialize: function(data){ + this.mx.move(data.position) + }, + } + + return exports +}) diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js b/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js new file mode 100644 index 0000000..3a3aadd --- /dev/null +++ b/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js @@ -0,0 +1,39 @@ + +Scenery.types.youtube = Scenery.types.base.extend(function(base){ + + var exports = { + + init: function(opt){ + base.init.call(this, opt) + this.scale = this.media.scale = 300 / max(300, this.media.width) + + this.build() + this.bind() + this.set_wall() + this.recenter() + }, + + build: function(){ + this.mx = new MX.Youtube({ + src: this.media.url, + poster: this.media.thumbnail, + media: this.media, + scale: this.scale, + y: this.scale * this.media.height/2, + backface: false, + }) + scene.add( this.mx ) + }, + + serialize: function(){ + var data = base.serialize.call(this) + return data + }, + + deserialize: function(data){ + this.mx.move(data.position) + }, + } + + return exports +}) diff --git a/public/assets/javascripts/ui/editor/MediaViewer.js b/public/assets/javascripts/ui/editor/MediaViewer.js index b5398ff..88c3b18 100644 --- a/public/assets/javascripts/ui/editor/MediaViewer.js +++ b/public/assets/javascripts/ui/editor/MediaViewer.js @@ -67,7 +67,6 @@ var MediaViewer = ModalView.extend({ image = document.createElement('video') image.addEventListener("loadedmetadata", function(){ image.currentTime = image.duration * 1/3 - console.log(image.duration, image.currentTime) }) image.src = media.url image.load() diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 53365b7..a2b5d8c 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -511,19 +511,27 @@ h5 { cursor: -webkit-grabbing; cursor: -moz-grabbing; } -.mx-object3d.image, .mx-object3d canvas, +.mx-object3d.image, +.mx-object3d.video, +.mx-object3d canvas, .mx-object3d.backface-hidden { -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; -ms-backface-visibility: hidden; backface-visibility: hidden; } -.mx-object3d.backface-visible, .mx-object3d.backface-visible canvas{ +.mx-object3d.backface-visible, +.mx-object3d.backface-visible canvas{ -webkit-backface-visibility: visible; -moz-backface-visibility: visible; -ms-backface-visibility: visible; backface-visibility: visible; } +.mx-object3d iframe, +.mx-object3d video { + pointer-events: none; +} + #hud { position: fixed; top:0;left:0; diff --git a/server/lib/api/media.js b/server/lib/api/media.js index 48446ca..9699c16 100644 --- a/server/lib/api/media.js +++ b/server/lib/api/media.js @@ -32,6 +32,7 @@ var media = { data.type = "image" upload.put("media", req.files.image, { + username: req.user.username, unacceptable: function(err){ res.json({ error: { errors: { avatar: { message: "Problem saving image: " + err } } } }) }, diff --git a/server/lib/upload.js b/server/lib/upload.js index a5d7871..0f6c624 100644 --- a/server/lib/upload.js +++ b/server/lib/upload.js @@ -24,7 +24,9 @@ module.exports.put = function (key, file, opt) { var ts = moment().format('YYYYMMDD') var extension = acceptableuploadTypes[file.mimetype] - filename = (+now) + "-" + filename = (+now) + + (opt.username ? "-" + opt.username : "") + + "-" + file.originalname.replace(/\..*$/,"") .replace(/[^0-9a-zA-Z]+/g,"-") .substr(-128) -- cgit v1.2.3-70-g09d2 From 06f4b34b8670d6dcebfd7b000dd2921ca778dfae Mon Sep 17 00:00:00 2001 From: Julie Lala Date: Wed, 25 Jun 2014 00:22:50 -0400 Subject: yt, vimeo, video api --- .../assets/javascripts/mx/primitives/mx.video.js | 99 +++++++++++++--------- .../assets/javascripts/mx/primitives/mx.vimeo.js | 91 ++++++++++++++------ .../assets/javascripts/mx/primitives/mx.youtube.js | 56 +++++++++++- .../rectangles/engine/scenery/types/vimeo.js | 2 - .../rectangles/engine/scenery/types/youtube.js | 2 - .../javascripts/ui/builder/BuilderSettings.js | 6 +- .../assets/javascripts/ui/builder/BuilderView.js | 2 +- .../assets/javascripts/ui/editor/EditorSettings.js | 6 +- public/assets/javascripts/ui/editor/EditorView.js | 4 +- public/assets/javascripts/ui/reader/ReaderView.js | 2 +- public/assets/javascripts/ui/site/LayoutsModal.js | 6 +- server/index.js | 22 ++--- 12 files changed, 200 insertions(+), 98 deletions(-) (limited to 'public/assets/javascripts/rectangles/engine') diff --git a/public/assets/javascripts/mx/primitives/mx.video.js b/public/assets/javascripts/mx/primitives/mx.video.js index 1b17994..2fbf6be 100644 --- a/public/assets/javascripts/mx/primitives/mx.video.js +++ b/public/assets/javascripts/mx/primitives/mx.video.js @@ -4,52 +4,69 @@ MX.Video = MX.Object3D.extend({ this.type = "Video" - var layer = this - layer.width = ops.width - layer.height = ops.height - layer.x = ops.x || 0 - layer.y = ops.y || 0 - layer.z = ops.z || 0 - layer.rotationX = ops.rotationX || 0 - layer.rotationY = ops.rotationY || 0 - layer.rotationZ = ops.rotationZ || 0 - layer.scale = ops.scale || 1 - layer.backface = ops.backface || false - layer.media = ops.media - layer.el.classList.add('video') - - if (layer.backface) { - layer.el.classList.add("backface-visible") - } - - if (ops.src) { - this.load(ops) - } + this.media = ops.media + this.width = ops.media.width + this.height = ops.media.height + this.x = ops.x || 0 + this.y = ops.y || 0 + this.z = ops.z || 0 + this.rotationX = ops.rotationX || 0 + this.rotationY = ops.rotationY || 0 + this.rotationZ = ops.rotationZ || 0 + this.scale = ops.scale || 1 + this.backface = ops.backface || false - if (ops.className) { - layer.el.classList.add(ops.className) - } - layer.el.style.backgroundRepeat = 'no-repeat' + ops.className && this.el.classList.add(ops.className) + this.backface && this.el.classList.add("backface-visible") + this.el.classList.add("video") + + this.load() }, load: function(ops){ - var layer = this - - var video = document.createElement('video') - video.addEventListener("loadedmetadata", function(){ - if (ops.autoplay) { - video.play() - } - else { - video.currentTime = video.duration / 3 - } - }) - video.width = layer.width - video.height = layer.height - video.src = ops.src - video.load() + this.player = document.createElement('video') + this.player.addEventListener("loadedmetadata", $.proxy(this.ready, this)) + this.player.addEventListener("error", $.proxy(this.error, this)) + this.player.width = this.width + this.player.height = this.height + this.player.src = this.media.url + this.player.load() - this.el.appendChild(video) + this.el.appendChild(this.player) + }, + + ready: function(){ + if (this.media.autoplay) { + video.play() + } + else { + video.currentTime = video.duration / 3 + } + }, + + error: function(err){ + console.log("video error", err) }, + + play: function(){ + this.player.play() + }, + + pause: function(){ + this.player.pause() + }, + + seek: function(n){ + this.player.currentTime = n + }, + + duration: function(){ + return this.player.duration + }, + + finished: function(){ + console.log("video finished") + }, + }) diff --git a/public/assets/javascripts/mx/primitives/mx.vimeo.js b/public/assets/javascripts/mx/primitives/mx.vimeo.js index 344a450..994c835 100644 --- a/public/assets/javascripts/mx/primitives/mx.vimeo.js +++ b/public/assets/javascripts/mx/primitives/mx.vimeo.js @@ -4,36 +4,75 @@ MX.Vimeo = MX.Object3D.extend({ this.type = "Vimeo" - var layer = this - layer.media = ops.media - layer.width = ops.media.width - layer.height = ops.media.height - layer.x = ops.x || 0 - layer.y = ops.y || 0 - layer.z = ops.z || 0 - layer.rotationX = ops.rotationX || 0 - layer.rotationY = ops.rotationY || 0 - layer.rotationZ = ops.rotationZ || 0 - layer.scale = ops.scale || 1 - layer.backface = ops.backface || false + this.media = ops.media + this.width = ops.media.width + this.height = ops.media.height + this.x = ops.x || 0 + this.y = ops.y || 0 + this.z = ops.z || 0 + this.rotationX = ops.rotationX || 0 + this.rotationY = ops.rotationY || 0 + this.rotationZ = ops.rotationZ || 0 + this.scale = ops.scale || 1 + this.backface = ops.backface || false - if (layer.backface) { - layer.el.classList.add("backface-visible") - } - - if (ops.src) { - this.loadEmbed(ops) - } + ops.className && this.el.classList.add(ops.className) + this.backface && this.el.classList.add("backface-visible") + this.el.classList.add("video") - if (ops.className) { - layer.el.classList.add(ops.className) - } - layer.el.style.backgroundRepeat = 'no-repeat' + this.load() + }, + load: function (ops) { + var uid = 'player-' + Uid () + var preload = document.createElement("div") + preload.id = uid + preload.style.backgroundImage = "url(" + this.media.thumbnail + ")" + preload.style.width = this.media.width + "px" + preload.style.height = this.media.height + "px" + preload.style.pointerEvents = "none" + preload.className = "preload" + this.el.appendChild(preload) + + this.player = $f(preload) + this.player.addEvent('ready', $.proxy(this.ready, this)) }, + + ready: function(){ + console.log("vimeo ready") - loadEmbed: function(ops){ - var layer = this - } + // wait until ready before binding events. other events: play, pause + this.player.addEvent('finish', $.proxy(this.finished, this)) + + // so annoying that this is async!! + this.player.api('getDuration', $.proxy(function(n){ + console.log("vimeo duration", n) + this.player.duration = n + }, this)) + }, + + error: function(err){ + console.log("vimeo error", err) + }, + + play: function(){ + this.player.api('play') + }, + + pause: function(){ + this.player.api('pause') + }, + + seek: function(n){ + this.player.api('seekTo', n) + }, + + duration: function(){ + return this.player.duration + }, + + finished: function(){ + } + }) diff --git a/public/assets/javascripts/mx/primitives/mx.youtube.js b/public/assets/javascripts/mx/primitives/mx.youtube.js index b21184d..3662d7b 100644 --- a/public/assets/javascripts/mx/primitives/mx.youtube.js +++ b/public/assets/javascripts/mx/primitives/mx.youtube.js @@ -24,7 +24,7 @@ MX.Youtube = MX.Object3D.extend({ }, load: function (ops) { - var uid = 'player-' + Uid() + var uid = 'player-' + Uid () var preload = document.createElement("div") preload.id = uid preload.style.backgroundImage = "url(" + this.media.thumbnail + ")" @@ -34,6 +34,16 @@ MX.Youtube = MX.Object3D.extend({ preload.className = "preload" this.el.appendChild(preload) + // simply defer if not loaded yet + YT = YT || { + Player: function(){ + var args = arguments + setTimeout(function(){ + base.player = YT.loading ? YT.Player (args) : new YT.Player(args) + }, 300) + } + } + this.player = new YT.Player(uid, { videoId: this.media.token, width: this.width, @@ -41,7 +51,22 @@ MX.Youtube = MX.Object3D.extend({ events: { onReady: $.proxy(this.ready, this), onError: $.proxy(this.error, this), - } + onStateChange: $.proxy(this.statechange, this), + }, + playerVars: { + autohide: 1, + autoplay: 0, + disablekb: 1, + controls: 0, + enablejsapi: 1, + fs: 0, + modestbranding: 1, + iv_load_policy: 3, // no annotations + loop: 0, + showinfo: 0, + rel: 0, + wmode: 'opaque', + }, }) }, @@ -53,6 +78,24 @@ MX.Youtube = MX.Object3D.extend({ console.log("youtube error", err) }, + statechange: function(e){ + switch (e.data) { + case -1: // unstarted + break + case 0: // finished + this.finished() + break + case 1: // play + break + case 2: // pause + break + case 3: // buffering + break + case 5: // cued + break + } + }, + play: function(){ this.player.playVideo() }, @@ -61,10 +104,17 @@ MX.Youtube = MX.Object3D.extend({ this.player.pauseVideo() }, - seek: function(n){ + seek: function(n, allowSeekAhead){ + allowSeekAhead = typeof allowSeekAhead == "boolean" ? allowSeekAhead : true + this.player.seekTo(n, true) // set to false if seeking manually }, duration: function(){ + return this.player.getDuration() + }, + + finished: function(){ + console.log("youtube finished") } }) diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js index 488d23c..697c66a 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js @@ -15,8 +15,6 @@ Scenery.types.vimeo = Scenery.types.base.extend(function(base){ build: function(){ this.mx = new MX.Vimeo({ - src: this.media.url, - poster: this.media.thumbnail, media: this.media, scale: this.scale, y: this.scale * this.media.height/2, diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js b/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js index 3a3aadd..25d8485 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/youtube.js @@ -15,8 +15,6 @@ Scenery.types.youtube = Scenery.types.base.extend(function(base){ build: function(){ this.mx = new MX.Youtube({ - src: this.media.url, - poster: this.media.thumbnail, media: this.media, scale: this.scale, y: this.scale * this.media.height/2, diff --git a/public/assets/javascripts/ui/builder/BuilderSettings.js b/public/assets/javascripts/ui/builder/BuilderSettings.js index 9b2f753..9fcd55f 100644 --- a/public/assets/javascripts/ui/builder/BuilderSettings.js +++ b/public/assets/javascripts/ui/builder/BuilderSettings.js @@ -2,9 +2,9 @@ var BuilderSettings = FormView.extend({ el: "#builderSettings", - createAction: "/api/layouts/new", - updateAction: "/api/layouts/edit", - destroyAction: "/api/layouts/destroy", + createAction: "/api/layout/new", + updateAction: "/api/layout/edit", + destroyAction: "/api/layout/destroy", events: { "keydown [name=name]": 'enterSubmit', diff --git a/public/assets/javascripts/ui/builder/BuilderView.js b/public/assets/javascripts/ui/builder/BuilderView.js index 33aface..b42d3e7 100644 --- a/public/assets/javascripts/ui/builder/BuilderView.js +++ b/public/assets/javascripts/ui/builder/BuilderView.js @@ -2,7 +2,7 @@ var BuilderView = View.extend({ el: "#builderView", - action: "/api/layouts/", + action: "/api/layout/", events: { }, diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js index b9f4560..35bcbe0 100644 --- a/public/assets/javascripts/ui/editor/EditorSettings.js +++ b/public/assets/javascripts/ui/editor/EditorSettings.js @@ -2,9 +2,9 @@ var EditorSettings = FormView.extend({ el: "#editorSettings", - createAction: "/api/projects/new", - updateAction: "/api/projects/edit", - destroyAction: "/api/projects/destroy", + createAction: "/api/project/new", + updateAction: "/api/project/edit", + destroyAction: "/api/project/destroy", events: { "keydown [name=name]": 'enterSubmit', diff --git a/public/assets/javascripts/ui/editor/EditorView.js b/public/assets/javascripts/ui/editor/EditorView.js index b87ac83..2bb2d61 100644 --- a/public/assets/javascripts/ui/editor/EditorView.js +++ b/public/assets/javascripts/ui/editor/EditorView.js @@ -2,8 +2,8 @@ var EditorView = View.extend({ el: "#editorView", - projectAction: "/api/projects/", - layoutAction: "/api/layouts/", + projectAction: "/api/project/", + layoutAction: "/api/layout/", events: { }, diff --git a/public/assets/javascripts/ui/reader/ReaderView.js b/public/assets/javascripts/ui/reader/ReaderView.js index 001d097..7cd629b 100644 --- a/public/assets/javascripts/ui/reader/ReaderView.js +++ b/public/assets/javascripts/ui/reader/ReaderView.js @@ -2,7 +2,7 @@ var ReaderView = View.extend({ el: "#readerView", - projectAction: "/api/projects/", + projectAction: "/api/project/", events: { }, diff --git a/public/assets/javascripts/ui/site/LayoutsModal.js b/public/assets/javascripts/ui/site/LayoutsModal.js index 46ed634..d474aa7 100644 --- a/public/assets/javascripts/ui/site/LayoutsModal.js +++ b/public/assets/javascripts/ui/site/LayoutsModal.js @@ -28,7 +28,7 @@ var LayoutsIndex = View.extend({ var ProjectsModal = ModalView.extend(LayoutsIndex.prototype).extend({ el: ".mediaDrawer.projects", - action: "/api/projects", + action: "/api/project", events: { "click .templates span": 'toggleActive', @@ -65,7 +65,7 @@ var ProjectsModal = ModalView.extend(LayoutsIndex.prototype).extend({ var LayoutsModal = ModalView.extend(LayoutsIndex.prototype).extend({ el: ".mediaDrawer.layouts", - action: "/api/layouts", + action: "/api/layout", events: { "click .templates span": 'toggleActive', @@ -93,7 +93,7 @@ var LayoutsModal = ModalView.extend(LayoutsIndex.prototype).extend({ var NewProjectModal = ModalView.extend(LayoutsIndex.prototype).extend({ el: ".mediaDrawer.newProject", - action: "/api/layouts", + action: "/api/layout", events: { "click .templates span": 'toggleActive', diff --git a/server/index.js b/server/index.js index aed0ea1..b008131 100644 --- a/server/index.js +++ b/server/index.js @@ -113,17 +113,17 @@ site.route = function () { app.get('/project/new/:layout', middleware.ensureAuthenticated, views.editor) app.get('/project/:slug', middleware.ensureProject, views.editor) - app.get('/api/layouts', middleware.ensureAuthenticated, api.layouts.index) - app.get('/api/layouts/:slug', middleware.ensureAuthenticated, api.layouts.show) - app.post('/api/layouts/new', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.create) - app.post('/api/layouts/edit', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.update) - app.delete('/api/layouts/destroy', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.destroy) - - app.get('/api/projects', middleware.ensureAuthenticated, api.projects.index) - app.get('/api/projects/:slug', api.projects.show) - app.post('/api/projects/new', middleware.ensureAuthenticated, api.projects.create) - app.post('/api/projects/edit', middleware.ensureAuthenticated, api.projects.update) - app.delete('/api/projects/destroy', middleware.ensureAuthenticated, api.projects.destroy) + app.get('/api/layout', middleware.ensureAuthenticated, api.layouts.index) + app.get('/api/layout/:slug', middleware.ensureAuthenticated, api.layouts.show) + app.post('/api/layout/new', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.create) + app.post('/api/layout/edit', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.update) + app.delete('/api/layout/destroy', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.layouts.destroy) + + app.get('/api/project', middleware.ensureAuthenticated, api.projects.index) + app.get('/api/project/:slug', api.projects.show) + app.post('/api/project/new', middleware.ensureAuthenticated, api.projects.create) + app.post('/api/project/edit', middleware.ensureAuthenticated, api.projects.update) + app.delete('/api/project/destroy', middleware.ensureAuthenticated, api.projects.destroy) app.get('/api/media/user', middleware.ensureAuthenticated, api.media.user) app.post('/api/media/new', middleware.ensureAuthenticated, api.media.create) -- cgit v1.2.3-70-g09d2 From 9a2cfe7da6808a04b7c668075e9e9598ddb5ae04 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 11 Jul 2014 17:07:05 -0400 Subject: basic media editor --- .../javascripts/rectangles/engine/scenery/move.js | 6 ++ .../assets/javascripts/ui/editor/EditorToolbar.js | 2 +- public/assets/javascripts/ui/editor/EditorView.js | 2 +- public/assets/javascripts/ui/editor/MediaEditor.js | 69 ++++++++++++++++++++++ public/assets/stylesheets/app.css | 23 +++++--- views/controls/editor/media-editor.ejs | 30 ++++++---- views/editor.ejs | 2 +- views/partials/scripts.ejs | 3 +- 8 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 public/assets/javascripts/ui/editor/MediaEditor.js (limited to 'public/assets/javascripts/rectangles/engine') diff --git a/public/assets/javascripts/rectangles/engine/scenery/move.js b/public/assets/javascripts/rectangles/engine/scenery/move.js index bad0a55..aa7ddd1 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/move.js +++ b/public/assets/javascripts/rectangles/engine/scenery/move.js @@ -26,6 +26,12 @@ Scenery.move = function(base){ Scenery.remove(base.id) return } + + if (editor.permissions.pick) { + // load the modal + app.router.editorView.mediaEditor.pick(base) + } + if (! (editor.permissions.move || editor.permissions.resize) ) { e.clickAccepted = false return diff --git a/public/assets/javascripts/ui/editor/EditorToolbar.js b/public/assets/javascripts/ui/editor/EditorToolbar.js index 4a7c3e8..a3abc5a 100644 --- a/public/assets/javascripts/ui/editor/EditorToolbar.js +++ b/public/assets/javascripts/ui/editor/EditorToolbar.js @@ -87,7 +87,7 @@ var EditorToolbar = View.extend({ var editor = new function(){ this.permissions = new Permissions({ - 'pick': false, + 'pick': true, 'move': true, 'resize': false, 'destroy': false, diff --git a/public/assets/javascripts/ui/editor/EditorView.js b/public/assets/javascripts/ui/editor/EditorView.js index 2bb2d61..017e241 100644 --- a/public/assets/javascripts/ui/editor/EditorView.js +++ b/public/assets/javascripts/ui/editor/EditorView.js @@ -13,6 +13,7 @@ var EditorView = View.extend({ this.settings = new EditorSettings ({ parent: this }) this.mediaViewer = new MediaViewer ({ parent: this }) this.mediaUpload = new MediaUpload ({ parent: this }) + this.mediaEditor = new MediaEditor ({ parent: this }) this.wallpaperPicker = new WallpaperPicker ({ parent: this }) this.lightControl = new LightControl ({ parent: this }) }, @@ -39,4 +40,3 @@ var EditorView = View.extend({ } }) - diff --git a/public/assets/javascripts/ui/editor/MediaEditor.js b/public/assets/javascripts/ui/editor/MediaEditor.js new file mode 100644 index 0000000..8d6d517 --- /dev/null +++ b/public/assets/javascripts/ui/editor/MediaEditor.js @@ -0,0 +1,69 @@ + +var MediaEditor = FormView.extend({ + el: "#mediaEditor", + + events: { + }, + + initialize: function(opt){ + this.parent = opt.parent + this.__super__.initialize.call(this) + + this.$name = this.$("[name=name]") + this.$description = this.$("[name=description]") + this.$autoplay = this.$("[name=autoplay]") + + // image fields + this.$widthDimension = this.$("[name=width]") + this.$heightDimension = this.$("[name=height]") + this.$units = this.$("[name=units]") + + // video fields + this.$playButton = this.$(".play") + this.$loop = this.$("[name=loop]") + this.$mute = this.$("[name=mute]") + this.$keyframe = this.$("[name=keyframe]") + }, + + toggle: function(state) { + this.$el.toggleClass("active", state); + }, + + pick: function(scenery) { + this.$el.addClass("active") + + var media = scenery.media + + this.$name.val(media.title) + this.$description.val(media.description) + + switch (media.type) { + case "image": + this.$(".image").show() + this.$(".video").hide() + /* + this.$widthDimension + this.$heightDimension + this.$units + */ + + break + + case "youtube": + case "vimeo": + case "video": + this.$(".video").show() + this.$(".image").hide() + + /* + this.$loop + this.$mute + this.$keyframe + */ + + + break + } + }, + +}) diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 684761c..7389810 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -1106,7 +1106,7 @@ input[type=range] { -webkit-appearance: none; -moz-appearance: none; background-color: black; - width: 200px; + width: 180px; height:3px; } @@ -1176,13 +1176,15 @@ input[type="range"]::-webkit-slider-thumb { #startpoint.active:hover { text-decoration:none; } -.settings input[type="text"], textarea{ +.settings input[type="text"] { border: 1px solid #000; font-size: 15px; padding: 5px; } .settings textarea { + border: 1px solid #000; + padding: 5px; font-size: 12px; width: 100%; max-height: 200px; @@ -1193,7 +1195,7 @@ input[type="range"]::-webkit-slider-thumb { border: 1px solid #000; } -.settings .setting{ +.settings .setting { margin-bottom:10px; } .setting.subButtons { @@ -1210,6 +1212,13 @@ input[type="range"]::-webkit-slider-thumb { .settings .setting:last-child{ margin-bottom:0px; } +.settings input[type="text"].number { + width: 60px; +} + +.setting label { + padding-right: 5px; +} button { padding: 8px; @@ -1372,23 +1381,23 @@ form li textarea { margin-top: 20px; } -.video { +.demo .video { height:80vh; min-height:300px; } -.video span { +.demo .video span { font-size:100px; color:white; cursor:pointer; } -.video span.videoTitle { +.demo .video span.videoTitle { font-size: 29px; font-weight: 300; padding: 3px 7px; } -.video span.icon-ios7-play-outline:hover { +.demo .video span.icon-ios7-play-outline:hover { color:lightgreen; } diff --git a/views/controls/editor/media-editor.ejs b/views/controls/editor/media-editor.ejs index 95aabb5..483fa72 100644 --- a/views/controls/editor/media-editor.ejs +++ b/views/controls/editor/media-editor.ejs @@ -1,4 +1,4 @@ -
+
@@ -15,24 +15,32 @@ - - - Autoplay - Loop - Mute - Initial Still +
+
+ + + + + + +
+ +
+ Initial Still +
+
- Dimensions - Width - Height + Dimensions
+ +
diff --git a/views/editor.ejs b/views/editor.ejs index a79eb9a..5d1e052 100755 --- a/views/editor.ejs +++ b/views/editor.ejs @@ -13,8 +13,8 @@
[[ include controls/editor/toolbar ]] - [[ include controls/editor/video-toolbar ]] [[ include controls/editor/media-drawer ]] + [[ include controls/editor/media-editor ]] [[ include controls/editor/wallpaper ]] [[ include controls/editor/light-control ]] [[ include controls/editor/settings ]] diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs index 6dd4480..40bb306 100644 --- a/views/partials/scripts.ejs +++ b/views/partials/scripts.ejs @@ -78,13 +78,14 @@ + + - -- cgit v1.2.3-70-g09d2 From 1826bed806b079c6e44703a4e5f424b7aed7bd96 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Fri, 11 Jul 2014 17:29:41 -0400 Subject: play button --- .../rectangles/engine/scenery/types/video.js | 3 --- .../rectangles/engine/scenery/types/vimeo.js | 14 +++++++++++++- public/assets/javascripts/ui/editor/MediaEditor.js | 5 +++++ public/assets/stylesheets/app.css | 20 ++++++++++++++++++++ views/controls/editor/media-editor.ejs | 5 ++--- 5 files changed, 40 insertions(+), 7 deletions(-) (limited to 'public/assets/javascripts/rectangles/engine') diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js index 2f6dc01..a9fce4a 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js @@ -15,10 +15,7 @@ Scenery.types.video = Scenery.types.base.extend(function(base){ build: function(){ this.mx = new MX.Video({ - src: this.media.url, media: this.media, - width: this.media.width, - height: this.media.height, scale: this.scale, y: this.scale * this.media.height/2, backface: false, diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js index 697c66a..ded5f87 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js +++ b/public/assets/javascripts/rectangles/engine/scenery/types/vimeo.js @@ -22,7 +22,19 @@ Scenery.types.vimeo = Scenery.types.base.extend(function(base){ }) scene.add( this.mx ) }, - + + play: function(){ + this.mx.play() + }, + + pause: function(){ + this.mx.pause() + }, + + seek: function(n){ + this.mx.seek(n) + }, + serialize: function(){ var data = base.serialize.call(this) return data diff --git a/public/assets/javascripts/ui/editor/MediaEditor.js b/public/assets/javascripts/ui/editor/MediaEditor.js index 8d6d517..1ccb5cf 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: { + "click .play": "togglePlaying", }, initialize: function(opt){ @@ -29,7 +30,11 @@ var MediaEditor = FormView.extend({ this.$el.toggleClass("active", state); }, + togglePlaying: function(){ + }, + pick: function(scenery) { + this.scenery = scenery this.$el.addClass("active") var media = scenery.media diff --git a/public/assets/stylesheets/app.css b/public/assets/stylesheets/app.css index 7389810..4296223 100755 --- a/public/assets/stylesheets/app.css +++ b/public/assets/stylesheets/app.css @@ -1220,6 +1220,26 @@ input[type="range"]::-webkit-slider-thumb { padding-right: 5px; } +.setting .play { + color: white; + background: black; + border-radius: 50px; + padding: 6px 7px 5px; + cursor: pointer; +} +.setting .play .icon-play { + display: inline; +} +.setting .play.playing .icon-play { + display: none; +} +.setting .play .icon-pause { + display: none; +} +.setting .play.playing .icon-pause { + display: inline; +} + button { padding: 8px; border: 1px solid; diff --git a/views/controls/editor/media-editor.ejs b/views/controls/editor/media-editor.ejs index 483fa72..12ab2b4 100644 --- a/views/controls/editor/media-editor.ejs +++ b/views/controls/editor/media-editor.ejs @@ -12,8 +12,8 @@
- - + + + -->
diff --git a/views/controls/builder/info.ejs b/views/controls/builder/info.ejs new file mode 100644 index 0000000..af0a76d --- /dev/null +++ b/views/controls/builder/info.ejs @@ -0,0 +1,35 @@ +
+
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
diff --git a/views/controls/editor/media-editor.ejs b/views/controls/editor/media-editor.ejs index 65db3ce..5db1fb2 100644 --- a/views/controls/editor/media-editor.ejs +++ b/views/controls/editor/media-editor.ejs @@ -29,9 +29,9 @@
- Initial Still +
- +
diff --git a/views/partials/sign-in.ejs b/views/partials/sign-in.ejs index 3f05fff..8268b2a 100644 --- a/views/partials/sign-in.ejs +++ b/views/partials/sign-in.ejs @@ -6,7 +6,7 @@
- – or the ol' fashion way – +
  • @@ -39,7 +39,7 @@ - – or the ol' fashion way – +
  • diff --git a/views/projects/layouts-modal.ejs b/views/projects/layouts-modal.ejs index 75b2641..97f1e61 100644 --- a/views/projects/layouts-modal.ejs +++ b/views/projects/layouts-modal.ejs @@ -5,6 +5,9 @@

    Edit Room Layouts

    +
    + There are no room layouts available. Please create a new one. +
    @@ -18,6 +21,8 @@

    Your Projects

    +
    +
    @@ -31,6 +36,9 @@

    Choose Room Template

    +
    + There are no room layouts available. Please create a new one. +
    diff --git a/views/projects/list-projects.ejs b/views/projects/list-projects.ejs index 42387ba..2c12af0 100644 --- a/views/projects/list-projects.ejs +++ b/views/projects/list-projects.ejs @@ -6,7 +6,7 @@ [[ projects.forEach(function(project, i) { ]] - + [[ if (profile._id == project.user_id) { ]]
    edit
    [[ } ]] -- 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 'public/assets/javascripts/rectangles/engine') 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