summaryrefslogtreecommitdiff
path: root/public/assets/javascripts
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts')
-rw-r--r--public/assets/javascripts/app.js21
-rw-r--r--public/assets/javascripts/mx/extensions/mx.movementsMobile.js2
-rw-r--r--public/assets/javascripts/rectangles/engine/rooms/builder.js6
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/_scenery.js3
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/randomize.js18
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/undo.js30
-rw-r--r--public/assets/javascripts/ui/_router.js4
-rw-r--r--public/assets/javascripts/ui/editor/ColorControl.js7
-rw-r--r--public/assets/javascripts/ui/editor/EditorSettings.js15
-rw-r--r--public/assets/javascripts/ui/editor/EditorToolbar.js1
-rw-r--r--public/assets/javascripts/ui/editor/EditorView.js1
-rw-r--r--public/assets/javascripts/ui/editor/MediaTumblr.js53
-rw-r--r--public/assets/javascripts/ui/editor/MediaUpload.js2
-rw-r--r--public/assets/javascripts/ui/editor/MediaViewer.js46
-rw-r--r--public/assets/javascripts/ui/editor/WallpaperPicker.js29
-rw-r--r--public/assets/javascripts/ui/lib/ModalView.js6
16 files changed, 202 insertions, 42 deletions
diff --git a/public/assets/javascripts/app.js b/public/assets/javascripts/app.js
index 01a2e54..41edafe 100644
--- a/public/assets/javascripts/app.js
+++ b/public/assets/javascripts/app.js
@@ -1,12 +1,9 @@
if (is_mobile) {
- $("html").addClass("mobile");
-}
-else if ($.browser.msie || ! has3d()) {
- $("html").addClass("fallback");
+ $("html").addClass("mobile")
}
else {
- $("html").addClass("desktop");
+ $("html").addClass("desktop")
}
@@ -22,6 +19,8 @@ app.init = function () {
}
app.launch = function () {
+ if ($.browser.msie || ! has3d()) { return app.fallback() }
+
var movements
scene = new MX.Scene().addTo('#scene')
@@ -74,6 +73,18 @@ app.launch = function () {
window.scrollTo(0,0)
}
+app.fallback = function(){
+ app.unsupported = true
+ var msg = "Sorry, your browser is not supported.<br><br>" +
+ "Please use <a href='http://chrome.com/'>Chrome</a> or <a href='https://www.apple.com/safari/'>Safari</a> or <a href='http://getfirefox.com/'>Firefox</a>."
+ var $fallback = $("<div>")
+ $fallback.attr('id', 'fallback')
+ $fallback.html(msg)
+ $('body').append($fallback)
+ $("#keyhint").hide()
+ $("#editorView").hide()
+}
+
app.on = function(){
app.tube.on.apply(app.tube, arguments)
}
diff --git a/public/assets/javascripts/mx/extensions/mx.movementsMobile.js b/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
index 8810649..95b61d1 100644
--- a/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
+++ b/public/assets/javascripts/mx/extensions/mx.movementsMobile.js
@@ -163,7 +163,7 @@ MX.MobileMovements = function (cam) {
dy += 360
}
- destRotationX = MX.toRad(dx)
+ destRotationX = dx > 45 ? 0 : MX.toRad(dx)
destRotationY += MX.toRad(dy)
},
diff --git a/public/assets/javascripts/rectangles/engine/rooms/builder.js b/public/assets/javascripts/rectangles/engine/rooms/builder.js
index c95734b..5e09fab 100644
--- a/public/assets/javascripts/rectangles/engine/rooms/builder.js
+++ b/public/assets/javascripts/rectangles/engine/rooms/builder.js
@@ -261,6 +261,9 @@
el.rotationX = PI/2
el.rect = region
el.side = FLOOR
+ if ($.browser.mozilla) {
+ el.el.style.display = "none"
+ }
return el
}
this.make_ceiling = function (room, region) {
@@ -277,6 +280,9 @@
el.rotationX = -PI/2
el.rect = region
el.side = CEILING
+ if ($.browser.mozilla) {
+ el.el.style.display = "none"
+ }
return el
}
this.make_wall = function (klass) {
diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
index d03e0e1..d52fe21 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -99,6 +99,7 @@ var Scenery = new function(){
}
base.deserialize = function(scenery_data){
+ var added = []
scenery_data.forEach(function(data){
var wall = Walls.lookup[data.wall_id] || Walls.first()
var scene_media = base.add({
@@ -107,7 +108,9 @@ var Scenery = new function(){
media: data.media,
id: data.id
})
+ added.push(scene_media)
})
+ return added
}
return base
diff --git a/public/assets/javascripts/rectangles/engine/scenery/randomize.js b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
index 1c2eb56..6581f38 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/randomize.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
@@ -33,7 +33,7 @@ Scenery.randomize.get_dimensions = function (media_objs){
// Returns a lookup of walls to use, keyed by wall ID.
Scenery.randomize.get_empty_walls = function(wall_list){
// get a list of all walls
- var walls = {};
+ var walls = {}, removed = [];
(wall_list || Walls.list).forEach(function(wall){
walls[wall.id] = wall
@@ -44,6 +44,7 @@ Scenery.randomize.get_empty_walls = function(wall_list){
Scenery.forEach(function(scenery){
if (scenery.was_randomly_placed) {
// remove it and reuse this wall?
+ removed.push( scenery.serialize() )
Scenery.remove( scenery.id )
}
else {
@@ -52,7 +53,7 @@ Scenery.randomize.get_empty_walls = function(wall_list){
})
}
- return walls
+ return { walls: walls, removed: removed }
}
// Randomly place a set of media objects on empty walls.
@@ -60,7 +61,10 @@ Scenery.randomize.get_empty_walls = function(wall_list){
// Optionally takes a list of walls to use.
Scenery.randomize.add = function (media_objs, wall_list) {
var media_list = Scenery.randomize.get_dimensions(media_objs)
- var walls = Scenery.randomize.get_empty_walls(wall_list)
+ var empty_data = Scenery.randomize.get_empty_walls(wall_list)
+ var walls = empty_data.walls
+ var removed = empty_data.removed
+ var added = []
var wall_ids = _.keys(walls)
if (! wall_ids.length) { return }
@@ -93,6 +97,7 @@ Scenery.randomize.add = function (media_objs, wall_list) {
index: 0,
})
scenery.was_randomly_placed = true
+ added.push(scenery.serialize())
}
else {
// artwork won't fit anywhere??
@@ -100,4 +105,11 @@ Scenery.randomize.add = function (media_objs, wall_list) {
return false
})
+
+ UndoStack.push({
+ type: "randomize-scenery",
+ undo: { added: added, removed: removed },
+ redo: { added: added, removed: removed },
+ })
+
} \ No newline at end of file
diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js
index 8b85d02..1232780 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/undo.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js
@@ -121,7 +121,7 @@
})
},
},
-
+
//
{
@@ -166,6 +166,34 @@
Minotaur.watch( app.router.editorView.settings )
},
},
+ {
+ type: "randomize-scenery",
+ undo: function(state){
+ state.added.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.removed)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+ Scenery.resize.hide()
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ state.removed.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.added)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
])
})()
diff --git a/public/assets/javascripts/ui/_router.js b/public/assets/javascripts/ui/_router.js
index 4219a28..3532428 100644
--- a/public/assets/javascripts/ui/_router.js
+++ b/public/assets/javascripts/ui/_router.js
@@ -89,6 +89,7 @@ var SiteRouter = Router.extend({
layoutEditor: function(e, name){
app.mode.builder = true
app.launch()
+ if (app.unsupported) return
this.builderView = app.controller = new BuilderView()
this.builderView.load(name)
@@ -117,6 +118,7 @@ var SiteRouter = Router.extend({
app.mode.editor = true
app.launch()
+ if (app.unsupported) return
layout = slugify(layout)
@@ -137,6 +139,7 @@ var SiteRouter = Router.extend({
projectEditor: function(e, name){
app.mode.editor = true
app.launch()
+ if (app.unsupported) return
this.editorView = app.controller = new EditorView()
this.editorView.load(name)
@@ -145,6 +148,7 @@ var SiteRouter = Router.extend({
projectViewer: function(e, name){
app.mode.editor = true
app.launch()
+ if (app.unsupported) return
this.readerView = app.controller = new ReaderView()
this.readerView.load(name)
diff --git a/public/assets/javascripts/ui/editor/ColorControl.js b/public/assets/javascripts/ui/editor/ColorControl.js
index 9ab2623..54a6a2e 100644
--- a/public/assets/javascripts/ui/editor/ColorControl.js
+++ b/public/assets/javascripts/ui/editor/ColorControl.js
@@ -47,7 +47,12 @@ var ColorControl = View.extend({
$swatch.css("background-color","rgb(" + color + ")")
$swatch.data('color', color)
this.$colors.append($swatch)
- }.bind(this))
+ }.bind(this))
+
+ if ($.browser.mozilla) {
+ $("#floor-color").parent().hide()
+ $("#ceiling-color").parent().hide()
+ }
},
modes: [ "wall", "outline", "floor", "ceiling" ],
diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js
index 026607a..b319404 100644
--- a/public/assets/javascripts/ui/editor/EditorSettings.js
+++ b/public/assets/javascripts/ui/editor/EditorSettings.js
@@ -18,6 +18,7 @@ var EditorSettings = FormView.extend({
"click [data-role='clear-project']": 'clear',
"click [data-role='destroy-project']": 'destroy',
"click [data-role='toggle-map']": 'toggleMap',
+ "click [data-role='view-project']": 'viewProject',
"click #startText": "setStartPosition",
"click #moveText": "confirmStartPosition",
"click #confirmText": "setStartPosition",
@@ -217,11 +218,25 @@ var EditorSettings = FormView.extend({
this.isVisible = true
},
+ viewAfterSave: false,
+ viewProject: function(e){
+ e.preventDefault()
+ Minotaur.unwatch(this)
+ Minotaur.hide()
+ this.viewAfterSave = true
+ this.save()
+ },
+
success: function(data){
this.$id.val(data._id)
this.$name.val(data.name)
this.action = this.updateAction
+ if (this.viewAfterSave) {
+ window.location.pathname = "/project/" + data.slug
+ return
+ }
+
Minotaur.unwatch(this)
Minotaur.hide()
diff --git a/public/assets/javascripts/ui/editor/EditorToolbar.js b/public/assets/javascripts/ui/editor/EditorToolbar.js
index 277718a..a5ad2dd 100644
--- a/public/assets/javascripts/ui/editor/EditorToolbar.js
+++ b/public/assets/javascripts/ui/editor/EditorToolbar.js
@@ -59,7 +59,6 @@ var EditorToolbar = View.extend({
this.resetControls()
this.toggleMap(false)
this.parent.mediaViewer.show()
- this.parent.mediaUpload.show()
},
resetMode: function(){
diff --git a/public/assets/javascripts/ui/editor/EditorView.js b/public/assets/javascripts/ui/editor/EditorView.js
index 4a2f712..50d3650 100644
--- a/public/assets/javascripts/ui/editor/EditorView.js
+++ b/public/assets/javascripts/ui/editor/EditorView.js
@@ -15,6 +15,7 @@ var EditorView = View.extend({
this.info = new BuilderInfo ({ parent: this })
this.mediaViewer = new MediaViewer ({ parent: this })
this.mediaUpload = new MediaUpload ({ parent: this })
+ this.mediaTumblr = new MediaTumblr ({ parent: this })
this.mediaEditor = new MediaEditor ({ parent: this })
this.wallpaperPicker = new WallpaperPicker ({ parent: this })
this.colorControl = new ColorControl ({ parent: this })
diff --git a/public/assets/javascripts/ui/editor/MediaTumblr.js b/public/assets/javascripts/ui/editor/MediaTumblr.js
new file mode 100644
index 0000000..47419ae
--- /dev/null
+++ b/public/assets/javascripts/ui/editor/MediaTumblr.js
@@ -0,0 +1,53 @@
+
+var MediaTumblr = ModalView.extend({
+ el: "#tumblrUpload",
+
+ events: {
+ 'mousedown': "stopPropagation",
+ "keydown .url": "enterSubmit",
+ "click .exampleTumblr": "loadExample",
+ },
+
+ initialize: function(opt){
+ this.__super__.initialize.call(this)
+ this.parent = opt.parent
+ this.$url = this.$(".url")
+ },
+
+ show: function(){
+ this.$el.addClass("active")
+ this.$url.val("")
+ },
+
+ hide: function(){
+ this.$el.removeClass("active")
+ },
+
+ enterSubmit: function(e){
+ e.stopPropagation()
+ if (e.keyCode == 13) {
+ e.preventDefault()
+ var url = this.$tumblrUrl.val()
+ this.loadTumblr(url)
+ }
+ },
+
+ loadTumblr: function(url){
+ Parser.tumblr(url, function(media_list){
+ console.log(media_list)
+ this.parent.mediaViewer.$foundMediaContainer.empty()
+ media_list.reverse().forEach(function(media){
+ this.parent.mediaViewer.add(media, this.parent.mediaViewer.$foundMediaContainer)
+ }.bind(this))
+ }.bind(this))
+ },
+
+ loadExample: function(e){
+ e.preventDefault()
+ var name = $(e.currentTarget).html()
+ var url = "http://" + name + ".tumblr.com/"
+ this.$url.val(url)
+ this.loadTumblr(url)
+ },
+
+}) \ No newline at end of file
diff --git a/public/assets/javascripts/ui/editor/MediaUpload.js b/public/assets/javascripts/ui/editor/MediaUpload.js
index 9ae90e3..d09e38c 100644
--- a/public/assets/javascripts/ui/editor/MediaUpload.js
+++ b/public/assets/javascripts/ui/editor/MediaUpload.js
@@ -1,6 +1,6 @@
var MediaUpload = UploadView.extend({
- el: ".fileUpload",
+ el: "#fileUpload",
createAction: "/api/media/new",
uploadAction: "/api/media/upload",
diff --git a/public/assets/javascripts/ui/editor/MediaViewer.js b/public/assets/javascripts/ui/editor/MediaViewer.js
index 029252d..2ae5104 100644
--- a/public/assets/javascripts/ui/editor/MediaViewer.js
+++ b/public/assets/javascripts/ui/editor/MediaViewer.js
@@ -38,11 +38,11 @@ var MediaViewer = ModalView.extend({
this.$deleteMedia = this.$("#deleteMedia")
this.$viewMore = this.$(".viewMore")
this.$noMedia = this.$(".noMedia")
-
- this.$tumblrUrl = this.$("#tumblr-url")
},
+ mode: "user",
wallpaperToggle: function(){
+ this.mode = "wallpaper"
this.$wallpaperMedia.addClass("active")
this.$foundMedia.addClass("inactive")
this.$myMedia.addClass("inactive").removeClass('active')
@@ -51,29 +51,34 @@ var MediaViewer = ModalView.extend({
},
foundToggle: function(){
+ this.mode = "found"
this.$wallpaperMedia.removeClass("active")
this.$foundMedia.addClass("active")
this.$myMedia.addClass("inactive").removeClass('active')
this.$("a").removeClass("active")
this.$foundToggle.addClass("active")
+ this.parent.mediaUpload.hide()
+ this.parent.mediaTumblr.show()
},
userToggle: function(){
+ this.mode = "user"
this.$wallpaperMedia.removeClass("active")
this.$foundMedia.removeClass("active")
this.$myMedia.removeClass("inactive").addClass('active')
this.$("a").removeClass("active")
this.$userToggle.addClass("active")
+ this.parent.mediaUpload.show()
+ this.parent.mediaTumblr.hide()
},
show: function(){
if (! this.loaded) {
this.load()
- this.loadTrending()
+ // this.loadTrending()
}
else {
- this.parent.cursor.message("media")
- this.__super__.show.call(this)
+ this.reallyShow()
}
},
@@ -81,13 +86,26 @@ var MediaViewer = ModalView.extend({
this.__super__.hide.call(this)
this.deleteArmed(false)
this.parent.mediaUpload.hide()
+ this.parent.mediaTumblr.hide()
this.parent.cursor.message('start')
},
+
+ reallyShow: function(){
+ this.__super__.show.call(this)
+ if (this.mode == "user") {
+ this.userToggle()
+ }
+ else {
+ this.foundToggle()
+ }
+ this.parent.cursor.message("media")
+ },
load: function(){
$.get("/api/media/user", { offset: this.offset, limit: this.perPage }, this.populate.bind(this))
},
-
+
+/*
loadTrending: function(){
var trending_imagery = [
'https://d1ycxz9plii3tb.cloudfront.net/post_images/52ec0e20c9dc24f1d8000067/large.jpg',
@@ -121,6 +139,7 @@ var MediaViewer = ModalView.extend({
if (img.complete && ! loaded) { img.onload() }
}.bind(this))
},
+*/
randomize: function(){
var $divs = this.$(".active .container").find(".mediaContainer").toArray()
@@ -157,8 +176,7 @@ var MediaViewer = ModalView.extend({
}
else {
this.loaded = true
- this.parent.cursor.message("media")
- this.__super__.show.call(this)
+ this.reallyShow()
}
},
@@ -294,16 +312,4 @@ var MediaViewer = ModalView.extend({
_followCursor(e)
},
- enterTumblrUrl: function(e){
- e.stopPropagation()
- if (e.keyCode !== 13) { return }
- var url = this.$tumblrUrl.val()
- Parser.tumblr(url, function(media_list){
- console.log(media_list)
- this.$foundMediaContainer.empty()
- media_list.reverse().forEach(function(media){
- this.add(media, this.$foundMediaContainer)
- }.bind(this))
- }.bind(this))
- },
})
diff --git a/public/assets/javascripts/ui/editor/WallpaperPicker.js b/public/assets/javascripts/ui/editor/WallpaperPicker.js
index e2aaeb7..3640d6d 100644
--- a/public/assets/javascripts/ui/editor/WallpaperPicker.js
+++ b/public/assets/javascripts/ui/editor/WallpaperPicker.js
@@ -5,6 +5,7 @@ var WallpaperPicker = UploadView.extend({
mediaTag: "wallpaper",
createAction: "/api/media/new",
uploadAction: "/api/media/upload",
+ destroyAction: "/api/media/destroy",
events: {
"contextmenu": 'contextmenu',
@@ -51,8 +52,6 @@ var WallpaperPicker = UploadView.extend({
this.load()
}
}
- // toggle the class that makes the cursor a paintbucket
- // $("body").removeClass("pastePaper")
},
load: function(){
@@ -78,6 +77,7 @@ var WallpaperPicker = UploadView.extend({
var swatch = document.createElement("div")
swatch.className = "swatch"
swatch.style.backgroundImage = "url(" + media.url + ")"
+ swatch.setAttribute("data-id", media._id)
this.$swatches.append(swatch)
this.$swatches.show()
this.$(".txt").hide()
@@ -104,23 +104,41 @@ var WallpaperPicker = UploadView.extend({
},
pick: function(e){
- app.tube('cancel-wallpaper')
var $swatch = $(e.currentTarget)
- this.follow( e, $swatch.css('background-image') )
- this.parent.presets.modified = true
+ if (Scenery.nextWallpaper == "none") {
+ var _id = $swatch[0].getAttribute("data-id")
+ $swatch.remove()
+ this.destroy(_id, function(){})
+ }
+ else {
+ app.tube('cancel-wallpaper')
+ this.follow( e, $swatch.css('background-image') )
+ this.parent.presets.modified = true
+ }
},
remove: function(e){
if (Scenery.nextWallpaper) {
+ // remove red class to the wallpaper
Scenery.nextWallpaper = null
app.tube('cancel-wallpaper')
}
else {
+ // add red class to the wallpaper
this.follow( e, "none" )
$(".floatingSwatch").addClass("scissors")
+ this.$el.addClass("deleteArmed")
}
},
+ destroy: function(_id, cb){
+ $.ajax({
+ type: "delete",
+ url: this.destroyAction,
+ data: { _id: _id, _csrf: $("[name=_csrf]").val() }
+ }).complete(cb || function(){})
+ },
+
contextmenu: function(e){
if (Scenery.nextWallpaper) {
e.preventDefault()
@@ -159,6 +177,7 @@ var WallpaperPicker = UploadView.extend({
app.off('cancel-wallpaper', _hideCursor)
$floatingSwatch.removeClass("scissors").hide()
$(".floodMessage").hide()
+ base.$el.removeClass("deleteArmed")
}
function _floodRoom (e) {
if (e.keyCode == 13) {
diff --git a/public/assets/javascripts/ui/lib/ModalView.js b/public/assets/javascripts/ui/lib/ModalView.js
index f70fbb3..6f1c729 100644
--- a/public/assets/javascripts/ui/lib/ModalView.js
+++ b/public/assets/javascripts/ui/lib/ModalView.js
@@ -14,10 +14,8 @@ var ModalView = View.extend({
show: function(){
$(".mediaDrawer").removeClass("active")
-
- if (! this.usesFileUpload) {
- $(".fileUpload").removeClass("active")
- }
+ $(".fileUpload").removeClass("active")
+
if (this.fixedClose) {
$("#fixed_close").addClass("active")
$("#fixed_close").bind("click", this.hide.bind(this))