diff --git a/build/bundle.js b/build/bundle.js index 0aeea41c..88ff7a3a 100644 --- a/build/bundle.js +++ b/build/bundle.js @@ -4602,13 +4602,17 @@ var Sandbox = Backbone.View.extend({ // we don't even need a reference to this, // everything will be handled via event baton :DDDDDDDDD + var whenLevelOpen = Q.defer(); var Level = require('../level').Level; + var currentLevel = new Level({ - level: levelJSON + level: levelJSON, + deferred: whenLevelOpen }); - setTimeout(function() { + + whenLevelOpen.promise.then(function() { command.finishWith(deferred); - }, this.getAnimationTime()); + }); }, exitLevel: function(command, deferred) { @@ -6444,7 +6448,6 @@ var DisabledMap = require('../level/disabledMap').DisabledMap; var Command = require('../models/commandModel').Command; var GitShim = require('../git/gitShim').GitShim; -var ModalAlert = require('../views').ModalAlert; var MultiView = require('../views/multiView').MultiView; var CanvasTerminalHolder = require('../views').CanvasTerminalHolder; var ConfirmCancelTerminal = require('../views').ConfirmCancelTerminal; @@ -6472,6 +6475,28 @@ var Level = Sandbox.extend({ Level.__super__.initialize.apply(this, [options]); this.startOffCommand(); + + this.handleOpen(); + }, + + handleOpen: function() { + this.options.deferred = this.options.deferred || Q.defer(); + + // if there is a multiview in the beginning, open that + // and let it resolve our deferred + if (this.level.startDialog) { + new MultiView(_.extend( + {}, + this.level.startDialog, + { deferred: this.options.deferred } + )); + return; + } + + // otherwise, resolve after a 700 second delay + setTimeout(_.bind(function() { + this.options.deferred.resolve(); + }, this), this.getAnimationTime() * 1.2); }, initName: function(options) { @@ -15488,6 +15513,9 @@ LevelArbiter.prototype.validateLevel = function(level) { throw new Error('I need this field for a level: ' + field); } }); + if (this.levelMap[level.id]) { + throw new Error('woah that level already exists!'); + } }; LevelArbiter.prototype.getSequences = function() { @@ -15557,6 +15585,19 @@ exports.sequenceInfo = { require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { id: 'intro1', name: 'Introduction #1', + startDialog: { + childViews: [{ + type: 'GitDemonstrationView', + options: { + beforeMarkdowns: [ + '## Committing in Git', + '', + 'This is whats up with ```git commit```' + ], + command: 'git commit' + } + }] + }, goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', hint: 'Try checking out a branch named after Charlie Sheen' @@ -15566,7 +15607,7 @@ require.define("/src/levels/intro/1.js",function(require,module,exports,__dirnam }); require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'intro2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', @@ -15577,7 +15618,7 @@ require.define("/src/levels/intro/2.js",function(require,module,exports,__dirnam }); require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'rebase1', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', @@ -15588,7 +15629,7 @@ require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirna }); require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'rebase2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', @@ -15729,17 +15770,17 @@ var SeriesView = BaseView.extend({ // this is a bit hacky, it really should be some nice model // property changing but it's the 11th hour... var toLoop = this.$('div.levelIcon').each(function(index, el) { - var id = el.id; + var id = $(el).attr('data-id'); $(el).toggleClass('solved', Main.getLevelArbiter().isLevelSolved(id)); }); }, click: function(ev) { - if (!ev || !ev.srcElement || !ev.srcElement.id) { + if (!ev || !ev.srcElement) { console.warn('wut, no id'); return; } - var id = ev.srcElement.id; + var id = $(ev.srcElement).attr('data-id'); this.navEvents.trigger('clickedID', id); } }); @@ -18722,6 +18763,9 @@ LevelArbiter.prototype.validateLevel = function(level) { throw new Error('I need this field for a level: ' + field); } }); + if (this.levelMap[level.id]) { + throw new Error('woah that level already exists!'); + } }; LevelArbiter.prototype.getSequences = function() { @@ -18851,7 +18895,6 @@ var DisabledMap = require('../level/disabledMap').DisabledMap; var Command = require('../models/commandModel').Command; var GitShim = require('../git/gitShim').GitShim; -var ModalAlert = require('../views').ModalAlert; var MultiView = require('../views/multiView').MultiView; var CanvasTerminalHolder = require('../views').CanvasTerminalHolder; var ConfirmCancelTerminal = require('../views').ConfirmCancelTerminal; @@ -18879,6 +18922,28 @@ var Level = Sandbox.extend({ Level.__super__.initialize.apply(this, [options]); this.startOffCommand(); + + this.handleOpen(); + }, + + handleOpen: function() { + this.options.deferred = this.options.deferred || Q.defer(); + + // if there is a multiview in the beginning, open that + // and let it resolve our deferred + if (this.level.startDialog) { + new MultiView(_.extend( + {}, + this.level.startDialog, + { deferred: this.options.deferred } + )); + return; + } + + // otherwise, resolve after a 700 second delay + setTimeout(_.bind(function() { + this.options.deferred.resolve(); + }, this), this.getAnimationTime() * 1.2); }, initName: function(options) { @@ -19457,13 +19522,17 @@ var Sandbox = Backbone.View.extend({ // we don't even need a reference to this, // everything will be handled via event baton :DDDDDDDDD + var whenLevelOpen = Q.defer(); var Level = require('../level').Level; + var currentLevel = new Level({ - level: levelJSON + level: levelJSON, + deferred: whenLevelOpen }); - setTimeout(function() { + + whenLevelOpen.promise.then(function() { command.finishWith(deferred); - }, this.getAnimationTime()); + }); }, exitLevel: function(command, deferred) { @@ -21617,17 +21686,17 @@ var SeriesView = BaseView.extend({ // this is a bit hacky, it really should be some nice model // property changing but it's the 11th hour... var toLoop = this.$('div.levelIcon').each(function(index, el) { - var id = el.id; + var id = $(el).attr('data-id'); $(el).toggleClass('solved', Main.getLevelArbiter().isLevelSolved(id)); }); }, click: function(ev) { - if (!ev || !ev.srcElement || !ev.srcElement.id) { + if (!ev || !ev.srcElement) { console.warn('wut, no id'); return; } - var id = ev.srcElement.id; + var id = $(ev.srcElement).attr('data-id'); this.navEvents.trigger('clickedID', id); } }); @@ -24469,6 +24538,19 @@ require("/src/levels/index.js"); require.define("/src/levels/intro/1.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { id: 'intro1', name: 'Introduction #1', + startDialog: { + childViews: [{ + type: 'GitDemonstrationView', + options: { + beforeMarkdowns: [ + '## Committing in Git', + '', + 'This is whats up with ```git commit```' + ], + command: 'git commit' + } + }] + }, goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', hint: 'Try checking out a branch named after Charlie Sheen' @@ -24479,7 +24561,7 @@ require.define("/src/levels/intro/1.js",function(require,module,exports,__dirnam require("/src/levels/intro/1.js"); require.define("/src/levels/intro/2.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'intro2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', @@ -24491,7 +24573,7 @@ require.define("/src/levels/intro/2.js",function(require,module,exports,__dirnam require("/src/levels/intro/2.js"); require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'rebase1', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', @@ -24503,7 +24585,7 @@ require.define("/src/levels/rebase/1.js",function(require,module,exports,__dirna require("/src/levels/rebase/1.js"); require.define("/src/levels/rebase/2.js",function(require,module,exports,__dirname,__filename,process,global){exports.level = { - id: 'intro1', + id: 'rebase2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', diff --git a/src/index.html b/src/index.html index 00b794cb..4249d31a 100644 --- a/src/index.html +++ b/src/index.html @@ -191,10 +191,10 @@

<% for (var i = 0; i < ids.length; i++) { %> -
-
+
+
-
+
<%= i + 1 %>
diff --git a/src/js/level/arbiter.js b/src/js/level/arbiter.js index 13e67a03..232a6f45 100644 --- a/src/js/level/arbiter.js +++ b/src/js/level/arbiter.js @@ -84,6 +84,9 @@ LevelArbiter.prototype.validateLevel = function(level) { throw new Error('I need this field for a level: ' + field); } }); + if (this.levelMap[level.id]) { + throw new Error('woah that level already exists!'); + } }; LevelArbiter.prototype.getSequences = function() { diff --git a/src/js/level/index.js b/src/js/level/index.js index 4892059b..e1e5f964 100644 --- a/src/js/level/index.js +++ b/src/js/level/index.js @@ -14,7 +14,6 @@ var DisabledMap = require('../level/disabledMap').DisabledMap; var Command = require('../models/commandModel').Command; var GitShim = require('../git/gitShim').GitShim; -var ModalAlert = require('../views').ModalAlert; var MultiView = require('../views/multiView').MultiView; var CanvasTerminalHolder = require('../views').CanvasTerminalHolder; var ConfirmCancelTerminal = require('../views').ConfirmCancelTerminal; @@ -42,6 +41,28 @@ var Level = Sandbox.extend({ Level.__super__.initialize.apply(this, [options]); this.startOffCommand(); + + this.handleOpen(); + }, + + handleOpen: function() { + this.options.deferred = this.options.deferred || Q.defer(); + + // if there is a multiview in the beginning, open that + // and let it resolve our deferred + if (this.level.startDialog) { + new MultiView(_.extend( + {}, + this.level.startDialog, + { deferred: this.options.deferred } + )); + return; + } + + // otherwise, resolve after a 700 second delay + setTimeout(_.bind(function() { + this.options.deferred.resolve(); + }, this), this.getAnimationTime() * 1.2); }, initName: function(options) { diff --git a/src/js/level/sandbox.js b/src/js/level/sandbox.js index 22fbb050..a9175694 100644 --- a/src/js/level/sandbox.js +++ b/src/js/level/sandbox.js @@ -134,13 +134,17 @@ var Sandbox = Backbone.View.extend({ // we don't even need a reference to this, // everything will be handled via event baton :DDDDDDDDD + var whenLevelOpen = Q.defer(); var Level = require('../level').Level; + var currentLevel = new Level({ - level: levelJSON + level: levelJSON, + deferred: whenLevelOpen }); - setTimeout(function() { + + whenLevelOpen.promise.then(function() { command.finishWith(deferred); - }, this.getAnimationTime()); + }); }, exitLevel: function(command, deferred) { diff --git a/src/js/views/levelDropdownView.js b/src/js/views/levelDropdownView.js index 41f2cf95..59b3a9e3 100644 --- a/src/js/views/levelDropdownView.js +++ b/src/js/views/levelDropdownView.js @@ -129,17 +129,17 @@ var SeriesView = BaseView.extend({ // this is a bit hacky, it really should be some nice model // property changing but it's the 11th hour... var toLoop = this.$('div.levelIcon').each(function(index, el) { - var id = el.id; + var id = $(el).attr('data-id'); $(el).toggleClass('solved', Main.getLevelArbiter().isLevelSolved(id)); }); }, click: function(ev) { - if (!ev || !ev.srcElement || !ev.srcElement.id) { + if (!ev || !ev.srcElement) { console.warn('wut, no id'); return; } - var id = ev.srcElement.id; + var id = $(ev.srcElement).attr('data-id'); this.navEvents.trigger('clickedID', id); } }); diff --git a/src/levels/intro/1.js b/src/levels/intro/1.js index 9d496961..d738ee5f 100644 --- a/src/levels/intro/1.js +++ b/src/levels/intro/1.js @@ -1,6 +1,19 @@ exports.level = { id: 'intro1', name: 'Introduction #1', + startDialog: { + childViews: [{ + type: 'GitDemonstrationView', + options: { + beforeMarkdowns: [ + '## Committing in Git', + '', + 'This is whats up with ```git commit```' + ], + command: 'git commit' + } + }] + }, goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', hint: 'Try checking out a branch named after Charlie Sheen' diff --git a/src/levels/intro/2.js b/src/levels/intro/2.js index 9d496961..fbeda24a 100644 --- a/src/levels/intro/2.js +++ b/src/levels/intro/2.js @@ -1,5 +1,5 @@ exports.level = { - id: 'intro1', + id: 'intro2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', diff --git a/src/levels/rebase/1.js b/src/levels/rebase/1.js index 9d496961..d4b913cd 100644 --- a/src/levels/rebase/1.js +++ b/src/levels/rebase/1.js @@ -1,5 +1,5 @@ exports.level = { - id: 'intro1', + id: 'rebase1', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', diff --git a/src/levels/rebase/2.js b/src/levels/rebase/2.js index 9d496961..3a688514 100644 --- a/src/levels/rebase/2.js +++ b/src/levels/rebase/2.js @@ -1,5 +1,5 @@ exports.level = { - id: 'intro1', + id: 'rebase2', name: 'Introduction #1', goalTreeString: '{"branches":{"master":{"target":"C1","id":"master"},"win":{"target":"C2","id":"win"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"win","id":"HEAD"}}', solutionCommand: 'git checkout -b win; git commit', diff --git a/todo.txt b/todo.txt index ed8e08e4..690571c7 100644 --- a/todo.txt +++ b/todo.txt @@ -13,6 +13,7 @@ Cases to handle / things to edit Small things to implement: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +[x] optional multiview on start Minor Bugs to fix: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~