From 43af2bebd1de70f0e2f5627815812dbfd01a5c9a Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Tue, 5 Aug 2014 15:30:07 -0400 Subject: cutting out stuff for mobile --- public/assets/javascripts/rectangles/models/rect.js | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'public/assets/javascripts/rectangles/models/rect.js') diff --git a/public/assets/javascripts/rectangles/models/rect.js b/public/assets/javascripts/rectangles/models/rect.js index 590440a..58469bc 100644 --- a/public/assets/javascripts/rectangles/models/rect.js +++ b/public/assets/javascripts/rectangles/models/rect.js @@ -107,6 +107,10 @@ Rect.prototype.eq = function(r){ return this.x.eq(r.x) && this.y.eq(r.y) } + Rect.prototype.zero = function(){ + this.a.zero() + this.b.zero() + } Rect.prototype.nearEdge = function (x, y, r) { var edges = 0 if (x < this.x.a+r) { -- cgit v1.2.3-70-g09d2 From 838ccfe6c2125e464d3c95c6e222e7e762dc8fd2 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Tue, 12 Aug 2014 18:19:33 -0400 Subject: undo stack for undo/redo --- public/assets/javascripts/rectangles/_env.js | 14 +++++++++ .../javascripts/rectangles/engine/map/ui_editor.js | 21 +++++++++++-- .../javascripts/rectangles/engine/scenery/undo.js | 34 +++++++++++++++++----- .../assets/javascripts/rectangles/models/rect.js | 4 +++ .../assets/javascripts/rectangles/models/room.js | 8 +++++ .../assets/javascripts/rectangles/models/vec2.js | 4 +++ .../assets/javascripts/rectangles/models/wall.js | 2 -- public/assets/javascripts/rectangles/util/keys.js | 6 ++-- .../javascripts/rectangles/util/permissions.js | 13 ++++++--- .../javascripts/ui/builder/BuilderToolbar.js | 9 +++++- views/partials/scripts.ejs | 2 ++ 11 files changed, 98 insertions(+), 19 deletions(-) (limited to 'public/assets/javascripts/rectangles/models/rect.js') diff --git a/public/assets/javascripts/rectangles/_env.js b/public/assets/javascripts/rectangles/_env.js index 3cfe969..4b14a21 100644 --- a/public/assets/javascripts/rectangles/_env.js +++ b/public/assets/javascripts/rectangles/_env.js @@ -35,6 +35,20 @@ environment.init = function(){ zoom: -4.8 }) } + + keys.on("z", function(e){ + e.preventDefault() + if (e.ctrlKey || e.metaKey) { + if (e.shiftKey) { + var canRedo = UndoStack.redo() + console.log("can redo", canRedo) + } + else { + var canUndo = UndoStack.undo() + console.log("can undo", canUndo) + } + } + }) } environment.update = function(t){ map.update() diff --git a/public/assets/javascripts/rectangles/engine/map/ui_editor.js b/public/assets/javascripts/rectangles/engine/map/ui_editor.js index 016a8ad..4b5f784 100644 --- a/public/assets/javascripts/rectangles/engine/map/ui_editor.js +++ b/public/assets/javascripts/rectangles/engine/map/ui_editor.js @@ -30,6 +30,7 @@ Map.UI.Editor = function(map){ // function down (e, cursor){ + var room cursor.x.div(map.dimensions.a).add(0.5).mul(map.dimensions.a / map.zoom).add(map.center.a) cursor.y.div(map.dimensions.b).sub(0.5).mul(map.dimensions.b / map.zoom).sub(map.center.b) @@ -52,8 +53,17 @@ 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]) + + room = intersects[0] + + UndoStack.push({ + type: "destroy-room", + prev: room.clone(), + next: { id: room.id }, + }) + + Rooms.remove(room) + app.tube("builder-destroy-room", room) return } else if (intersects.length) { @@ -151,6 +161,13 @@ Map.UI.Editor = function(map){ cursor.x.abs().quantize(1) cursor.y.abs().quantize(1) var room = Rooms.add_with_rect( cursor ) + + UndoStack.push({ + type: "create-room", + prev: { id: room.id }, + next: room.clone() + }) + app.tube("builder-pick-room", room) } } diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js index fb221f5..b10a101 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/undo.js +++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js @@ -25,24 +25,44 @@ // { - type: "create-rectangle", - undo: function(state){ + type: "create-room", + undo: function(room){ + Rooms.remove(room) + Rooms.clipper.update() }, - redo: function(state){ + redo: function(room){ + Rooms.add(room) + Rooms.clipper.update() + app.tube("builder-pick-room", room) }, }, { - type: "update-rectangle", + type: "update-room", undo: function(state){ + var room = Rooms.list[state.id] + room.rect.assign( state.rect ) + room.height = state.height + Rooms.clipper.update() + app.tube("builder-pick-room", room) }, redo: function(state){ + var room = Rooms.list[state.id] + room.rect.assign( state.rect ) + room.height = state.height + Rooms.clipper.update() + app.tube("builder-pick-room", room) }, }, { - type: "destroy-rectangle", - undo: function(state){ + type: "destroy-room", + undo: function(room){ + Rooms.add(room) + Rooms.clipper.update() + app.tube("builder-pick-room", room) }, - redo: function(state){ + redo: function(room){ + Rooms.remove(room) + Rooms.clipper.update() }, }, diff --git a/public/assets/javascripts/rectangles/models/rect.js b/public/assets/javascripts/rectangles/models/rect.js index 58469bc..0642a65 100644 --- a/public/assets/javascripts/rectangles/models/rect.js +++ b/public/assets/javascripts/rectangles/models/rect.js @@ -39,6 +39,10 @@ Rect.prototype.clone = function(){ return new Rect( this.x.clone(), this.y.clone() ) } + Rect.prototype.assign = function(r) { + this.x.copy(r.x) + this.y.copy(r.y) + } Rect.prototype.center = function(){ return new vec2(this.x.midpoint(), this.y.midpoint()) } diff --git a/public/assets/javascripts/rectangles/models/room.js b/public/assets/javascripts/rectangles/models/room.js index c2850ba..6c0e1bb 100644 --- a/public/assets/javascripts/rectangles/models/room.js +++ b/public/assets/javascripts/rectangles/models/room.js @@ -40,6 +40,14 @@ this.focused = false } + Room.prototype.clone = function(){ + return new Room ({ + id: this.id, + rect: this.rect.clone(), + height: this.height, + }) + } + Room.prototype.toString = function(){ return this.rect.toString() } diff --git a/public/assets/javascripts/rectangles/models/vec2.js b/public/assets/javascripts/rectangles/models/vec2.js index 104c6f7..214feb9 100644 --- a/public/assets/javascripts/rectangles/models/vec2.js +++ b/public/assets/javascripts/rectangles/models/vec2.js @@ -17,6 +17,10 @@ vec2.prototype.clone = function(){ return new vec2(this.a, this.b) } + vec2.prototype.assign = function(v){ + this.a = v.a + this.b = v.b + } vec2.prototype.abs = function(){ if (this.b < this.a) { this.invert() diff --git a/public/assets/javascripts/rectangles/models/wall.js b/public/assets/javascripts/rectangles/models/wall.js index 027d5f5..91e7c18 100644 --- a/public/assets/javascripts/rectangles/models/wall.js +++ b/public/assets/javascripts/rectangles/models/wall.js @@ -146,8 +146,6 @@ window.Wall = (function(){ if (shouldFlip) { sortedWalls = sortedWalls.reverse() } - -console.log(sortedWalls.map(function(z){return useX ? z.x : z.z}).join(" ")) var len = sortedWalls.length diff --git a/public/assets/javascripts/rectangles/util/keys.js b/public/assets/javascripts/rectangles/util/keys.js index 5a5c9d2..62d763f 100644 --- a/public/assets/javascripts/rectangles/util/keys.js +++ b/public/assets/javascripts/rectangles/util/keys.js @@ -19,7 +19,7 @@ var keys = (function(){ break; default: if (keys.debug) console.log(key) - base.tube(key) + base.tube(key, e) break; } }) @@ -158,8 +158,8 @@ var keys = (function(){ 'backslash' : '220', 'closebracket' : '221', 'single_quote' : '222' - } - var KEY_NAMES = invert_hash(KEYCODES) + }, + KEY_NAMES = invert_hash(KEYCODES) return base })() \ No newline at end of file diff --git a/public/assets/javascripts/rectangles/util/permissions.js b/public/assets/javascripts/rectangles/util/permissions.js index 394b7d6..1b5a1b5 100644 --- a/public/assets/javascripts/rectangles/util/permissions.js +++ b/public/assets/javascripts/rectangles/util/permissions.js @@ -26,14 +26,12 @@ Permissions.prototype.assign = function (key, state) { Permissions.prototype.add = function (key) { var base = this - base[op] = true - return state + base[key] = true } Permissions.prototype.remove = function (key) { var base = this - base[op] = true - return state + base[key] = true } Permissions.prototype.clear = function () { @@ -42,3 +40,10 @@ Permissions.prototype.clear = function () { base[op] = false }) } + +Permissions.prototype.log = function () { + var base = this + base.keys.forEach(function(op){ + console.log(op, base[op]) + }) +} \ No newline at end of file diff --git a/public/assets/javascripts/ui/builder/BuilderToolbar.js b/public/assets/javascripts/ui/builder/BuilderToolbar.js index 239b05e..2eb7590 100644 --- a/public/assets/javascripts/ui/builder/BuilderToolbar.js +++ b/public/assets/javascripts/ui/builder/BuilderToolbar.js @@ -14,7 +14,14 @@ var BuilderToolbar = View.extend({ initialize: function(opt){ this.parent = opt.parent - map.ui.permissions.toggle() + this.resetPermissions() + }, + + resetPermissions: function(){ + map.ui.permissions.clear() + map.ui.permissions.add("create") + map.ui.permissions.add("move") + map.ui.permissions.add("resize") }, toggleMap: function(){ diff --git a/views/partials/scripts.ejs b/views/partials/scripts.ejs index a1f51ef..b63d1bf 100644 --- a/views/partials/scripts.ejs +++ b/views/partials/scripts.ejs @@ -28,6 +28,7 @@ + @@ -44,6 +45,7 @@ + -- cgit v1.2.3-70-g09d2 From b8b208d219cf782c39d054ad741724c6995a0b62 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Tue, 12 Aug 2014 18:49:01 -0400 Subject: undo stuff working on rooms editor --- .../javascripts/rectangles/engine/map/ui_editor.js | 45 +++++++++++++++++----- .../javascripts/rectangles/engine/scenery/undo.js | 6 +-- .../assets/javascripts/rectangles/models/rect.js | 4 +- .../assets/javascripts/rectangles/models/room.js | 6 +-- public/assets/javascripts/rectangles/util/undo.js | 3 ++ 5 files changed, 46 insertions(+), 18 deletions(-) (limited to 'public/assets/javascripts/rectangles/models/rect.js') diff --git a/public/assets/javascripts/rectangles/engine/map/ui_editor.js b/public/assets/javascripts/rectangles/engine/map/ui_editor.js index 4b5f784..c5c996c 100644 --- a/public/assets/javascripts/rectangles/engine/map/ui_editor.js +++ b/public/assets/javascripts/rectangles/engine/map/ui_editor.js @@ -58,7 +58,7 @@ Map.UI.Editor = function(map){ UndoStack.push({ type: "destroy-room", - prev: room.clone(), + prev: room.copy(), next: { id: room.id }, }) @@ -165,23 +165,36 @@ Map.UI.Editor = function(map){ UndoStack.push({ type: "create-room", prev: { id: room.id }, - next: room.clone() + next: room.copy() }) app.tube("builder-pick-room", room) } } - if (base.resizing) { - base.dragging.rect.resize() - } - else if (base.dragging) { - base.dragging.rect.translate() - } - + if (base.resizing || base.dragging) { + + var oldState = base.dragging.copy() + + if (base.resizing) { + base.dragging.rect.resize() + } + else if (base.dragging) { + base.dragging.rect.translate() + } + + UndoStack.push({ + type: "update-room", + prev: oldState, + next: base.dragging.copy() + }) + } + base.creating = base.dragging = base.resizing = false } + var wheelState, wheelTimeout + function mousewheel (e, val, delta){ var cursor = base.mouse.cursor @@ -190,8 +203,20 @@ Map.UI.Editor = function(map){ }) if (intersects.length) { + wheelState = wheelState || intersects[0].copy() + intersects[0].height = clamp( ~~(intersects[0].height - delta), height_min, height_max ) - Rooms.clipper.update() + + clearTimeout(wheelTimeout) + wheelTimeout = setTimeout(function(){ + UndoStack.push({ + type: "update-room", + prev: wheelState, + next: intersects[0].copy() + }) + Rooms.clipper.update() + wheelState = null + }, 500) } else { map.set_zoom(map.zoom_exponent - delta/20) diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js index b10a101..4bdb2c4 100644 --- a/public/assets/javascripts/rectangles/engine/scenery/undo.js +++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js @@ -31,7 +31,7 @@ Rooms.clipper.update() }, redo: function(room){ - Rooms.add(room) + Rooms.add(new Room(room)) Rooms.clipper.update() app.tube("builder-pick-room", room) }, @@ -56,7 +56,7 @@ { type: "destroy-room", undo: function(room){ - Rooms.add(room) + Rooms.add(new Room(room)) Rooms.clipper.update() app.tube("builder-pick-room", room) }, @@ -77,4 +77,4 @@ }, ]) -})() \ No newline at end of file +})() diff --git a/public/assets/javascripts/rectangles/models/rect.js b/public/assets/javascripts/rectangles/models/rect.js index 0642a65..3f94740 100644 --- a/public/assets/javascripts/rectangles/models/rect.js +++ b/public/assets/javascripts/rectangles/models/rect.js @@ -40,8 +40,8 @@ return new Rect( this.x.clone(), this.y.clone() ) } Rect.prototype.assign = function(r) { - this.x.copy(r.x) - this.y.copy(r.y) + this.x.assign(r.x) + this.y.assign(r.y) } Rect.prototype.center = function(){ return new vec2(this.x.midpoint(), this.y.midpoint()) diff --git a/public/assets/javascripts/rectangles/models/room.js b/public/assets/javascripts/rectangles/models/room.js index 6c0e1bb..aa18f6d 100644 --- a/public/assets/javascripts/rectangles/models/room.js +++ b/public/assets/javascripts/rectangles/models/room.js @@ -40,12 +40,12 @@ this.focused = false } - Room.prototype.clone = function(){ - return new Room ({ + Room.prototype.copy = function(){ + return { id: this.id, rect: this.rect.clone(), height: this.height, - }) + } } Room.prototype.toString = function(){ diff --git a/public/assets/javascripts/rectangles/util/undo.js b/public/assets/javascripts/rectangles/util/undo.js index 5d8593c..dfc74dc 100644 --- a/public/assets/javascripts/rectangles/util/undo.js +++ b/public/assets/javascripts/rectangles/util/undo.js @@ -1,6 +1,7 @@ (function(){ var UndoStack = function(){ + this.debug = true this.stack = [] this.types = {} this.pointer = -1 @@ -17,6 +18,7 @@ UndoStack.prototype.undo = function(){ if (this.pointer == -1) return false var action = this.stack[this.pointer] + this.debug && console.log("undo", action.type) this.types[ action.type ].undo(action.prev) this.pointer-- return this.pointer > -1 @@ -25,6 +27,7 @@ if (this.pointer == this.stack.length-1) return false this.pointer++ var action = this.stack[this.pointer] + this.debug && console.log("redo", action.type) this.types[ action.type ].redo(action.next) return this.pointer < this.stack.length-1 } -- cgit v1.2.3-70-g09d2