From d1eac35a4f8eaaa98948de7135cee56d1f6a85a0 Mon Sep 17 00:00:00 2001 From: George Saines Date: Mon, 1 Sep 2014 14:09:39 -0700 Subject: [PATCH 01/24] fixed transparency issue with thang image --- app/assets/images/pages/community/thang.png | Bin 31579 -> 31487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/assets/images/pages/community/thang.png b/app/assets/images/pages/community/thang.png index 15346482f66f92e23bdc5a4a52ec76a0ba6180f5..1d6ef69fa05724e7420e0af17944c3a389f394e6 100644 GIT binary patch delta 31475 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 X;CisThjPY_00000NkvXXu0mjfL^x63 From d8ef2f85967f7084416582d361c12dc8559f3acd Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 15:00:14 -0700 Subject: [PATCH 02/24] Made new related achievements open in a new tab in the level editor. --- app/templates/editor/level/modal/new-achievement.jade | 5 +++++ app/views/editor/level/RelatedAchievementsView.coffee | 4 +++- app/views/editor/level/modals/NewAchievementModal.coffee | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/templates/editor/level/modal/new-achievement.jade b/app/templates/editor/level/modal/new-achievement.jade index dfcc39cbc..fef533444 100644 --- a/app/templates/editor/level/modal/new-achievement.jade +++ b/app/templates/editor/level/modal/new-achievement.jade @@ -21,3 +21,8 @@ block modal-body-content label input(type="checkbox", name="queryOptions" id="#{goal.id}" value="#{goal.id}") span.spl= goal.name + +block modal-footer + .modal-footer + button.btn(data-dismiss="modal", data-i18n="common.cancel") Cancel + button#save-new-achievement-link.btn.btn-primary.new-model-submit(data-i18n="common.create") Create diff --git a/app/views/editor/level/RelatedAchievementsView.coffee b/app/views/editor/level/RelatedAchievementsView.coffee index c4bf75e3c..d9fa28a42 100644 --- a/app/views/editor/level/RelatedAchievementsView.coffee +++ b/app/views/editor/level/RelatedAchievementsView.coffee @@ -35,7 +35,9 @@ module.exports = class RelatedAchievementsView extends CocoView c onNewAchievementSaved: (achievement) -> - app.router.navigate('/editor/achievement/' + (achievement.get('slug') or achievement.id), {trigger: true}) + # We actually open the new tab in NewAchievementModal, so we don't replace this window. + #url = '/editor/achievement/' + (achievement.get('slug') or achievement.id) + #app.router.navigate(, {trigger: true}) # Let's open a new tab instead. makeNewAchievement: -> modal = new NewAchievementModal model: Achievement, modelLabel: 'Achievement', level: @level diff --git a/app/views/editor/level/modals/NewAchievementModal.coffee b/app/views/editor/level/modals/NewAchievementModal.coffee index dba9a0e93..ad022c4f4 100644 --- a/app/views/editor/level/modals/NewAchievementModal.coffee +++ b/app/views/editor/level/modals/NewAchievementModal.coffee @@ -8,6 +8,9 @@ module.exports = class NewAchievementModal extends NewModelModal template: template plain: false + events: + 'click #save-new-achievement-link': 'onAchievementSubmitted' + constructor: (options) -> super options @level = options.level @@ -18,6 +21,11 @@ module.exports = class NewAchievementModal extends NewModelModal console.debug 'level', c.level c + onAchievementSubmitted: (e) -> + slug = _.string.slugify @$el.find('#name').val() + url = "/editor/achievement/#{slug}" + window.open url, '_blank' + createQuery: -> checked = @$el.find('[name=queryOptions]:checked') checkedValues = ($(check).val() for check in checked) From e02431b26beeeddb8537c682bf52c5f8b3612863 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 15:25:00 -0700 Subject: [PATCH 03/24] Fixed color group saving in Thang editor. --- app/schemas/subscriptions/editor.coffee | 3 +++ app/views/editor/thang/ThangTypeColorsTabView.coffee | 1 + app/views/editor/thang/ThangTypeEditView.coffee | 7 +++++++ 3 files changed, 11 insertions(+) diff --git a/app/schemas/subscriptions/editor.coffee b/app/schemas/subscriptions/editor.coffee index 865f51071..852429b6b 100644 --- a/app/schemas/subscriptions/editor.coffee +++ b/app/schemas/subscriptions/editor.coffee @@ -56,3 +56,6 @@ module.exports = 'editor:thang-type-kind-changed': c.object {required: ['kind']}, kind: {type: 'string'} + + 'editor:thang-type-color-groups-changed': c.object {required: ['colorGroups']}, + colorGroups: {type: 'object'} diff --git a/app/views/editor/thang/ThangTypeColorsTabView.coffee b/app/views/editor/thang/ThangTypeColorsTabView.coffee index 69651b1ae..7dc85b6b8 100644 --- a/app/views/editor/thang/ThangTypeColorsTabView.coffee +++ b/app/views/editor/thang/ThangTypeColorsTabView.coffee @@ -136,6 +136,7 @@ module.exports = class ThangTypeColorsTabView extends CocoView onColorGroupsChanged: => @thangType.set('colorGroups', @colorGroups.data) + Backbone.Mediator.publish 'editor:thang-type-color-groups-changed', colorGroups: @colorGroups.data onColorGroupSelected: (e, selected) => @$el.find('#color-group-settings').toggle selected.length > 0 diff --git a/app/views/editor/thang/ThangTypeEditView.coffee b/app/views/editor/thang/ThangTypeEditView.coffee index 6d74534ab..6014300d2 100644 --- a/app/views/editor/thang/ThangTypeEditView.coffee +++ b/app/views/editor/thang/ThangTypeEditView.coffee @@ -44,6 +44,7 @@ module.exports = class ThangTypeEditView extends RootView 'keyup .play-with-level-input': 'onPlayLevelKeyUp' subscriptions: + 'editor:thang-type-color-groups-changed': 'onColorGroupsChanged' 'editor:save-new-version': 'saveNewThangType' # init / render @@ -102,6 +103,11 @@ module.exports = class ThangTypeEditView extends RootView onComponentsChanged: (components) => @thangType.set 'components', components + onColorGroupsChanged: (e) -> + @temporarilyIgnoringChanges = true + @treema.set 'colorGroups', e.colorGroups + @temporarilyIgnoringChanges = false + makeDot: (color) -> circle = new createjs.Shape() circle.graphics.beginFill(color).beginStroke('black').drawCircle(0, 0, 5) @@ -383,6 +389,7 @@ module.exports = class ThangTypeEditView extends RootView @lastKind = data.kind pushChangesToPreview: => + return if @temporarilyIgnoringChanges # TODO: This doesn't delete old Treema keys you deleted for key, value of @treema.data @thangType.set(key, value) From 55bac798ee696705d4e1aaa238f14d5efbdcebc1 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 14:52:56 -0700 Subject: [PATCH 04/24] Cleared out the thangs tab view mobile handling and just made the left and right columns toggleable all the time. The surface now fills the whole width. --- app/lib/surface/Surface.coffee | 2 +- app/styles/editor/level/add-thangs-view.sass | 76 +++++ app/styles/editor/level/thangs-tab-view.sass | 85 ++++++ app/styles/editor/level/thangs_tab.sass | 265 ------------------ .../{add_thangs.jade => add-thangs-view.jade} | 0 app/templates/editor/level/edit.jade | 4 +- .../editor/level/thangs-tab-view.jade | 22 ++ app/templates/editor/level/thangs_tab.jade | 39 --- .../editor/level/thangs/AddThangsView.coffee | 6 +- .../editor/level/thangs/ThangsTabView.coffee | 34 +-- 10 files changed, 199 insertions(+), 334 deletions(-) create mode 100644 app/styles/editor/level/add-thangs-view.sass create mode 100644 app/styles/editor/level/thangs-tab-view.sass delete mode 100644 app/styles/editor/level/thangs_tab.sass rename app/templates/editor/level/{add_thangs.jade => add-thangs-view.jade} (100%) create mode 100644 app/templates/editor/level/thangs-tab-view.jade delete mode 100644 app/templates/editor/level/thangs_tab.jade diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee index a3762e125..73685a846 100644 --- a/app/lib/surface/Surface.coffee +++ b/app/lib/surface/Surface.coffee @@ -428,7 +428,7 @@ module.exports = Surface = class Surface extends CocoClass pageHeight = $('#page-container').height() - $('#control-bar-view').outerHeight() - $('#playback-view').outerHeight() newWidth = Math.min pageWidth, pageHeight * aspectRatio newHeight = newWidth / aspectRatio - else if $('#editor-level-thangs-tab-view') + else if $('#thangs-tab-view') newWidth = $('#canvas-wrapper').width() newHeight = newWidth / aspectRatio else diff --git a/app/styles/editor/level/add-thangs-view.sass b/app/styles/editor/level/add-thangs-view.sass new file mode 100644 index 000000000..63b7b1b92 --- /dev/null +++ b/app/styles/editor/level/add-thangs-view.sass @@ -0,0 +1,76 @@ +@import "../../bootstrap/mixins" + +#add-thangs-view + $addPaletteIconColumns: 6 + $addPaletteIconWidth: 40px + $addPaletteIconPadding: 0px + $addPaletteIconMargin: 4px + $addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 20 + + width: $addPaletteWidth + background: white + box-sizing: border-box + position: absolute + right: 0 + top: 0 + bottom: 0 + padding: 5px + border: 1px solid + + input + width: 100% + margin-top: 5px + + #thangs-list + position: absolute + left: 8px + top: 80px + bottom: 0px + overflow: scroll + margin: 0 + + h3 + margin: 0 0 10px + width: 100% + + h4 + margin: 0 0 10px + clear: both + padding: 5px + background: rgba(150, 150, 150, 0.5) + width: $addPaletteWidth - 20px + box-sizing: border-box + + .clearfix + margin-bottom: 20px + + .add-thang-palette-icon + position: relative + float: left + background: white + padding: $addPaletteIconPadding + margin: $addPaletteIconMargin + cursor: pointer + width: $addPaletteIconWidth + height: $addPaletteIconWidth + + img + position: absolute + width: $addPaletteIconWidth + height: $addPaletteIconWidth + transition: box-shadow 0.25s ease-out + + &:hover + $hoverScaleIncreaseFactor: 0.2 + outline: 1px dotted blue + img + left: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth + top: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth + width: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth + height: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth + + &.selected + outline: 1px solid blue + @include box-shadow(0px 5px 25px rgba(79, 79, 213, 0.6)) + background: #add8e6 + diff --git a/app/styles/editor/level/thangs-tab-view.sass b/app/styles/editor/level/thangs-tab-view.sass new file mode 100644 index 000000000..4233fdc56 --- /dev/null +++ b/app/styles/editor/level/thangs-tab-view.sass @@ -0,0 +1,85 @@ +@import "../../bootstrap/mixins" + +#thangs-tab-view + $extantThangsWidth: 300px + + position: absolute + top: 0 + bottom: 0 + overflow: hidden + left: 0 + right: 0 + + #thangs-container-toggle + left: 0 + + #thangs-palette-toggle + right: 0 + + .toggle + position: absolute + z-index: 12 + padding: 8px + + .thangs-container + background: white + width: $extantThangsWidth + position: absolute + left: 0 + top: 0 + bottom: 0 + z-index: 11 + padding: 5px + border: 1px solid black + + h3 + text-align: right + margin: 0 + + .editor-nano-container + height: 90% + position: relative + top: 20px + #thangs-treema + position: absolute + top: 37px + left: 0 + right: 0 + bottom: 0 + overflow: scroll + margin: 0 + outline: thin + border: none + border-top: 1px solid black + + .treema-children .treema-row * + cursor: pointer !important + + .world-container + margin-left: 0 + margin-right: 0 + box-sizing: border-box + + .world-container + position: relative + + #canvas-wrapper + width: 100% + position: relative + text-align: center + + #randomize-button + position: absolute + top: 45% + height: 40px + + + + // Below snatched from play/level.sass; should refactor? + + canvas#surface + background-color: #ddd + width: 100% + display: block + z-index: 1 + border: 1px solid black diff --git a/app/styles/editor/level/thangs_tab.sass b/app/styles/editor/level/thangs_tab.sass deleted file mode 100644 index 53ea9902e..000000000 --- a/app/styles/editor/level/thangs_tab.sass +++ /dev/null @@ -1,265 +0,0 @@ -@import "../../bootstrap/mixins" - -$mobile: 1050px - -#editor-level-thangs-tab-view - $addPaletteIconColumns: 3 - $extantThangsWidth: 300px - $addPaletteIconWidth: 40px - $addPaletteIconPadding: 0px - $addPaletteIconMargin: 4px - $addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 20 - - #toggle - display: none - position: absolute - z-index: 11 - left: -14px - @media screen and (max-width: $mobile) - display: block - - .toggle - left: 0 - - .toggle - display: none - float: none - z-index: 11 - position: absolute - right: -14px - z-index: 11 - margin: 0 - padding: 8px - @media screen and (max-width: $mobile) - display: block - - .thangs-column - background-color: #E4CF8C - - @media screen and (max-width: $mobile) - display: block - - h3 - @media screen and (max-width: $mobile) - display: none - - #all-thangs - display: block - @media screen and (max-width: $mobile) - display: none - - .thangs-container - width: $extantThangsWidth - position: absolute - left: 0 - top: 0 - bottom: 0 - z-index: 11 - @media screen and (max-width: $mobile) - width: auto - left: 18px - bottom: -18px - - .btn-group - margin: 0 - @media screen and (max-width: $mobile) - margin: 5px - - h3 - margin: 0 -20px 0 0 - - .editor-nano-container - height: 90% - position: relative - top: 20px - #thangs-treema - height: 100% - width: 100% - position: absolute - left: 0 - right: 0 - bottom: 0 - overflow: scroll - margin: 0 - outline: thin - @media screen and (max-width: $mobile) - margin: 5px - top: 40px - - &.hide-except-Unit - .treema-node - display: none - .treema-node.treema-Unit - display: block - - &.hide-except-Doodad - .treema-node - display: none - .treema-node.treema-Doodad - display: block - - &.hide-except-Floor - .treema-node - display: none - .treema-node.treema-Floor - display: block - - &.hide-except-Wall - .treema-node - display: none - .treema-node.treema-Wall - display: block - - &.hide-except-Item - .treema-node - display: none - .treema-node.treema-Item - display: block - - &.hide-except-Misc - .treema-node - display: none - .treema-node.treema-Misc - display: block - - .treema-children .treema-row * - cursor: pointer !important - - .world-container - margin-left: $extantThangsWidth - margin-right: $addPaletteWidth - @media screen and (max-width: $mobile) - margin-left: 0 - margin-right: 0 - padding: 0 20px - box-sizing: border-box - - h3 - margin: 0 -10px 0 0 - text-align: center - - .add-thangs-palette - width: $addPaletteWidth - box-sizing: border-box - position: absolute - right: 0 - top: 0 - bottom: 0 - @media screen and (max-width: $mobile) - display: none - right: 18px - z-index: 11 - width: $addPaletteWidth + 10 - bottom: -15px - //height: auto - //padding-bottom: 10px - - input - width: $addPaletteWidth - margin: 0 - margin-top: 5px - padding-left: 5px - @media screen and (max-width: $mobile) - margin: 0 5px - - #thangs-list-container - height: 90% - - #thangs-list - position: relative - right: 0 - top: 10px - bottom: 10px - overflow: scroll - height: 100% - margin: 0 - @media screen and (max-width: $mobile) - margin: 0 5px - - h3 - margin: 0 -20px 0 0 - width: 100% - - h4 - margin: 0 0 10px - clear: both - padding: 5px - background: rgba(150, 150, 150, 0.5) - width: $addPaletteWidth - 20px - box-sizing: border-box - - .clearfix - margin-bottom: 20px - - .add-thang-palette-icon - position: relative - float: left - background: white - padding: $addPaletteIconPadding - margin: $addPaletteIconMargin - cursor: pointer - width: $addPaletteIconWidth - height: $addPaletteIconWidth - - img - position: absolute - width: $addPaletteIconWidth - height: $addPaletteIconWidth - transition: box-shadow 0.25s ease-out - - &:hover - $hoverScaleIncreaseFactor: 0.2 - outline: 1px dotted blue - img - left: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth - top: -($hoverScaleIncreaseFactor / 2) * $addPaletteIconWidth - width: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth - height: (1 + $hoverScaleIncreaseFactor) * $addPaletteIconWidth - - &.selected - outline: 1px solid blue - @include box-shadow(0px 5px 25px rgba(79, 79, 213, 0.6)) - background: #add8e6 - - .world-container - position: relative - - #canvas-wrapper - width: 100% - position: relative - text-align: center - - #randomize-button - position: absolute - top: 45% - height: 40px - - - - // Below snatched from play/level.sass; should refactor? - - canvas#surface - background-color: #ddd - width: 100% - display: block - z-index: 1 - - $GI: 0.5 // gradient intensity; can tweak this 0-1 - - .gradient - position: absolute - z-index: 10 - - #canvas-left-gradient - left: 0px - width: 5px - background: linear-gradient(to left, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) - bottom: 0 - top: 0 - - #canvas-top-gradient - top: 0 - height: 5px - left: 0 - right: 0 - background: linear-gradient(to top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) diff --git a/app/templates/editor/level/add_thangs.jade b/app/templates/editor/level/add-thangs-view.jade similarity index 100% rename from app/templates/editor/level/add_thangs.jade rename to app/templates/editor/level/add-thangs-view.jade diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index f6d2fb663..32a4bc012 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -18,7 +18,7 @@ block header ul.nav.navbar-nav.nav-tabs li.active - a(href="#editor-level-thangs-tab-view", data-toggle="tab", data-i18n="editor.level_tab_thangs") Thangs + a(href="#thangs-tab-view", data-toggle="tab", data-i18n="editor.level_tab_thangs") Thangs li a(href="#editor-level-scripts-tab-view", data-toggle="tab", data-i18n="editor.level_tab_scripts") Scripts li @@ -115,7 +115,7 @@ block header block outer_content .outer-content div.tab-content#level-editor-tabs - div.tab-pane.active#editor-level-thangs-tab-view + div.tab-pane.active#thangs-tab-view div.tab-pane#editor-level-scripts-tab-view diff --git a/app/templates/editor/level/thangs-tab-view.jade b/app/templates/editor/level/thangs-tab-view.jade new file mode 100644 index 000000000..8c4e17bb5 --- /dev/null +++ b/app/templates/editor/level/thangs-tab-view.jade @@ -0,0 +1,22 @@ +button.toggle.btn-primary#thangs-container-toggle + span.icon-list +button.toggle.btn-primary#thangs-palette-toggle + span.icon-plus +.thangs-container.hide#all-thangs + h3(data-i18n="editor.level_tab_thangs_title") Current Thangs + #thangs-treema(title="Double click to configure a thang") + +.world-container + #canvas-wrapper + button.btn.btn-primary(id="randomize-button", data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize", title="Randomize Terrain") Randomize + ul.dropdown-menu#contextmenu + li#delete + a(data-i18n="editor.delete") Delete + li#duplicate + a(data-i18n="editor.duplicate") Duplicate + canvas(width=924, height=589)#surface + #canvas-left-gradient.gradient + #canvas-top-gradient.gradient + +#add-thangs-view +#level-thang-edit-view.secret \ No newline at end of file diff --git a/app/templates/editor/level/thangs_tab.jade b/app/templates/editor/level/thangs_tab.jade deleted file mode 100644 index c46e51363..000000000 --- a/app/templates/editor/level/thangs_tab.jade +++ /dev/null @@ -1,39 +0,0 @@ -div#toggle - button.navbar-toggle.toggle.btn-primary#thangs-container-toggle(type="button", data-toggle="collapse", data-target="#all-thangs") - span.icon-list -button.navbar-toggle.toggle.btn-primary#thangs-palette-toggle(type="button", data-toggle="collapse", data-target="#add-thangs-column") - span.icon-plus -.thangs-container.thangs-column#all-thangs - h3(data-i18n="editor.level_tab_thangs_title") Current Thangs - .btn-group(data-toggle="buttons-radio")#extant-thangs-filter - button.btn.btn-primary(data-i18n="editor.level_tab_thangs_all") All - button.btn.btn-primary(value="Unit", title="Unit") - i.icon-user - button.btn.btn-primary(value="Wall", title="Wall") - i.icon-home - button.btn.btn-primary(value="Floor", title="Floor") - i.icon-globe - button.btn.btn-primary(value="Doodad", title="Doodad") - i.icon-leaf - button.btn.btn-primary(value="Item", title="Item") - i.icon-gift - button.btn.btn-primary(value="Misc", title="Misc") - i.icon-question-sign - .editor-nano-container.nano - #thangs-treema.nano-content(title="Double click to configure a thang") - -.world-container.thangs-column - h3(data-i18n="editor.level_tab_thangs_conditions") Starting Conditions - #canvas-wrapper - button.btn.btn-primary(id="randomize-button", data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize", title="Randomize Terrain") Randomize - ul.dropdown-menu#contextmenu - li#delete - a(data-i18n="editor.delete") Delete - li#duplicate - a(data-i18n="editor.duplicate") Duplicate - canvas(width=924, height=589)#surface - #canvas-left-gradient.gradient - #canvas-top-gradient.gradient - -.add-thangs-palette.thangs-column#add-thangs-column -#level-thang-edit-view.secret \ No newline at end of file diff --git a/app/views/editor/level/thangs/AddThangsView.coffee b/app/views/editor/level/thangs/AddThangsView.coffee index c2c017c15..bd71f776e 100644 --- a/app/views/editor/level/thangs/AddThangsView.coffee +++ b/app/views/editor/level/thangs/AddThangsView.coffee @@ -1,5 +1,5 @@ CocoView = require 'views/kinds/CocoView' -add_thangs_template = require 'templates/editor/level/add_thangs' +add_thangs_template = require 'templates/editor/level/add-thangs-view' ThangType = require 'models/ThangType' CocoCollection = require 'collections/CocoCollection' @@ -11,8 +11,8 @@ class ThangTypeSearchCollection extends CocoCollection @url += "&term=#{term}" if term module.exports = class AddThangsView extends CocoView - id: 'add-thangs-column' - className: 'add-thangs-palette thangs-column' + id: 'add-thangs-view' + className: 'add-thangs-palette hide' template: add_thangs_template events: diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index 0231c7993..17e2fecef 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -1,6 +1,6 @@ CocoView = require 'views/kinds/CocoView' AddThangsView = require './AddThangsView' -thangs_template = require 'templates/editor/level/thangs_tab' +thangs_template = require 'templates/editor/level/thangs-tab-view' Level = require 'models/Level' ThangType = require 'models/ThangType' LevelComponent = require 'models/LevelComponent' @@ -23,7 +23,7 @@ class ThangTypeSearchCollection extends CocoCollection model: ThangType module.exports = class ThangsTabView extends CocoView - id: 'editor-level-thangs-tab-view' + id: 'thangs-tab-view' className: 'tab-pane active' template: thangs_template @@ -48,7 +48,7 @@ module.exports = class ThangsTabView extends CocoView 'click #delete': 'onDeleteClicked' 'click #duplicate': 'onDuplicateClicked' 'click #thangs-container-toggle': 'toggleThangsContainer' -# 'click #thangs-palette-toggle': 'toggleThangsPalette' + 'click #thangs-palette-toggle': 'toggleThangsPalette' # 'click .add-thang-palette-icon': 'toggleThangsPalette' shortcuts: @@ -95,17 +95,6 @@ module.exports = class ThangsTabView extends CocoView context.groups = groups context - onWindowResize: (e) -> - $('#thangs-list').height('100%') - thangsHeaderHeight = $('#thangs-header').height() - oldHeight = $('#thangs-list').height() - if $(document).width() < 1050 - $('#thangs-list').height(oldHeight - thangsHeaderHeight - 40) - else - $('#thangs-list').height(oldHeight - thangsHeaderHeight - 80) - $('#all-thangs').collapse 'show' - $('#add-thangs-column').collapse 'show' - undo: (e) -> if not @editThangView then @thangsTreema.undo() else @editThangView.undo() @@ -279,7 +268,7 @@ module.exports = class ThangsTabView extends CocoView selectAddThang: (e, forceDeselect=false) => return if e? and $(e.target).closest('#thang-search').length # Ignore if you're trying to search thangs - return unless (e? and $(e.target).closest('#editor-level-thangs-tab-view').length) or key.isPressed('esc') or forceDeselect + return unless (e? and $(e.target).closest('#thangs-tab-view').length) or key.isPressed('esc') or forceDeselect if e then target = $(e.target) else target = @$el.find('.add-thangs-palette') # pretend to click on background if no event return true if target.attr('id') is 'surface' target = target.closest('.add-thang-palette-icon') @@ -458,7 +447,8 @@ module.exports = class ThangsTabView extends CocoView thangData = @thangsTreema.get "id=#{e.thangID}" @editThangView = new LevelThangEditView thangData: thangData, level: @level, world: @world, supermodel: @supermodel # supermodel needed for checkForMissingSystems @insertSubView @editThangView - @$el.find('.thangs-column').hide() + @$el.find('>').hide() + @editThangView.$el.show() Backbone.Mediator.publish 'editor:view-switched', {} onLevelThangEdited: (e) -> @@ -469,7 +459,7 @@ module.exports = class ThangsTabView extends CocoView @removeSubView @editThangView @editThangView = null @onThangsChanged() - @$el.find('.thangs-column').show() + @$el.find('>').show() preventDefaultContextMenu: (e) -> return unless $(e.target).closest('#canvas-wrapper').length @@ -493,11 +483,10 @@ module.exports = class ThangsTabView extends CocoView @selectAddThangType @selectedExtantThang.spriteName, @selectedExtantThang toggleThangsContainer: (e) -> - $('#all-thangs').toggle() + $('#all-thangs').toggleClass('hide') toggleThangsPalette: (e) -> - $('#add-thangs-column').toggle() - @onWindowResize e + $('#add-thangs-view').toggleClass('hide') class ThangsNode extends TreemaNode.nodeMap.array valueClass: 'treema-array-replacement' @@ -526,11 +515,8 @@ class ThangNode extends TreemaObjectNode s = "#{data.thangType}" if isObjectID s unless name = ThangNode.thangNameMap[s] - thangType = _.find @settings.supermodel.getModels(ThangType), (m) -> m.get('original') is s and m.get('kind') + thangType = _.find @settings.supermodel.getModels(ThangType), (m) -> m.get('original') is s name = ThangNode.thangNameMap[s] = thangType.get 'name' - ThangNode.thangKindMap[s] = thangType.get 'kind' - kind = ThangNode.thangKindMap[s] - @$el.addClass "treema-#{kind}" s = name s += ' - ' + data.id if data.id isnt s if pos From 7f9ac5e573174689deb5571bec1d4c379ce5a948 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 16:02:30 -0700 Subject: [PATCH 05/24] Fixed a few bugs where default hero level type wasn't getting pulled. --- app/views/editor/component/ThangComponentConfigView.coffee | 2 +- app/views/editor/level/thangs/LevelThangEditView.coffee | 4 ++-- app/views/editor/level/thangs/ThangsTabView.coffee | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/editor/component/ThangComponentConfigView.coffee b/app/views/editor/component/ThangComponentConfigView.coffee index 6b447ab5a..343a75017 100644 --- a/app/views/editor/component/ThangComponentConfigView.coffee +++ b/app/views/editor/component/ThangComponentConfigView.coffee @@ -52,7 +52,7 @@ module.exports = class ThangComponentConfigView extends CocoView schema.default ?= {} _.merge schema.default, @additionalDefaults if @additionalDefaults - if @level?.get('type') is 'hero' + if @level?.get('type', true) is 'hero' schema.required = [] treemaOptions = supermodel: @supermodel diff --git a/app/views/editor/level/thangs/LevelThangEditView.coffee b/app/views/editor/level/thangs/LevelThangEditView.coffee index 42fca453a..245e9cad9 100644 --- a/app/views/editor/level/thangs/LevelThangEditView.coffee +++ b/app/views/editor/level/thangs/LevelThangEditView.coffee @@ -42,8 +42,8 @@ module.exports = class LevelThangEditView extends CocoView supermodel: @supermodel level: @level world: @world - - if @level.get('type') is 'hero' then options.thangType = thangType + + if @level.get('type', true) is 'hero' then options.thangType = thangType @thangComponentEditView = new ThangComponentsEditView options @listenTo @thangComponentEditView, 'components-changed', @onComponentsChanged diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index 17e2fecef..550e4ce2d 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -394,7 +394,7 @@ module.exports = class ThangsTabView extends CocoView thang.isSelectable = not thang.isLand for thang in @world.thangs # let us select walls and such @surface?.setWorld @world @selectAddThangType @addThangType, @cloneSourceThang if @addThangType # make another addThang sprite, since the World just refreshed - + # update selection, since the thangs have been remade if @selectedExtantThang @selectedExtantSprite = @surface.spriteBoss.sprites[@selectedExtantThang.id] @@ -419,14 +419,14 @@ module.exports = class ThangsTabView extends CocoView if batchInsert if thangType.get('name') is 'Hero Placeholder' thangID = 'Hero Placeholder' - return if @level.get('type') isnt 'hero' or @thangsTreema.get "id=#{thangID}" + return if @level.get('type', true) isnt 'hero' or @thangsTreema.get "id=#{thangID}" else thangID = "Random #{thangType.get('name')} #{@thangsBatch.length}" else thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @thangsTreema.get "id=#{thangID}" if @cloneSourceThang components = _.cloneDeep @thangsTreema.get "id=#{@cloneSourceThang.id}/components" - else if @level.get('type') is 'hero' + else if @level.get('type', true) is 'hero' components = [] # Load them all from default ThangType Components else components = _.cloneDeep thangType.get('components') ? [] From c70ffbeef51e95bc3db075a6aaaff7a37b827bc8 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 16:41:31 -0700 Subject: [PATCH 06/24] Fixed onBackground for surface:stage-mouse-down events. --- app/lib/surface/Surface.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/lib/surface/Surface.coffee b/app/lib/surface/Surface.coffee index 73685a846..d06a80b08 100644 --- a/app/lib/surface/Surface.coffee +++ b/app/lib/surface/Surface.coffee @@ -482,7 +482,10 @@ module.exports = Surface = class Surface extends CocoClass onMouseDown: (e) => return if @disabled - onBackground = not @stage.hitTest e.stageX, e.stageY + newPos = @camera.screenToCanvas({x: e.stageX, y: e.stageY}) + # getObject(s)UnderPoint is broken, so we have to use the private method to get what we want + onBackground = not @stage._getObjectsUnderPoint(newPos.x, newPos.y, null, true) + worldPos = @camera.screenToWorld x: e.stageX, y: e.stageY event = onBackground: onBackground, x: e.stageX, y: e.stageY, originalEvent: e, worldPos: worldPos Backbone.Mediator.publish 'surface:stage-mouse-down', event From b20b819a1fc6bd29ab91f057a3a0727ca41f4a47 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 16:42:53 -0700 Subject: [PATCH 07/24] Tweaked a few styles on the ThangsTabView. --- app/styles/editor/level/add-thangs-view.sass | 2 +- app/styles/editor/level/thangs-tab-view.sass | 13 +++++++++---- app/templates/editor/level/thangs-tab-view.jade | 4 ++-- app/views/editor/level/thangs/AddThangsView.coffee | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/app/styles/editor/level/add-thangs-view.sass b/app/styles/editor/level/add-thangs-view.sass index 63b7b1b92..2defc3fa6 100644 --- a/app/styles/editor/level/add-thangs-view.sass +++ b/app/styles/editor/level/add-thangs-view.sass @@ -5,7 +5,7 @@ $addPaletteIconWidth: 40px $addPaletteIconPadding: 0px $addPaletteIconMargin: 4px - $addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 20 + $addPaletteWidth: ($addPaletteIconWidth + 2 * $addPaletteIconPadding + 2 * $addPaletteIconMargin) * $addPaletteIconColumns + 26 width: $addPaletteWidth background: white diff --git a/app/styles/editor/level/thangs-tab-view.sass b/app/styles/editor/level/thangs-tab-view.sass index 4233fdc56..e7fcfd035 100644 --- a/app/styles/editor/level/thangs-tab-view.sass +++ b/app/styles/editor/level/thangs-tab-view.sass @@ -2,19 +2,24 @@ #thangs-tab-view $extantThangsWidth: 300px - position: absolute top: 0 bottom: 0 overflow: hidden left: 0 right: 0 + margin: -15px + #thangs-container-toggle, #thangs-palette-toggle + top: 5px + #thangs-container-toggle - left: 0 + left: 5px + box-shadow: 1px 1px 5px black #thangs-palette-toggle - right: 0 + right: 5px + box-shadow: -1px 1px 5px black .toggle position: absolute @@ -50,7 +55,7 @@ margin: 0 outline: thin border: none - border-top: 1px solid black + padding-top: 0 .treema-children .treema-row * cursor: pointer !important diff --git a/app/templates/editor/level/thangs-tab-view.jade b/app/templates/editor/level/thangs-tab-view.jade index 8c4e17bb5..0e2a7a228 100644 --- a/app/templates/editor/level/thangs-tab-view.jade +++ b/app/templates/editor/level/thangs-tab-view.jade @@ -1,6 +1,6 @@ -button.toggle.btn-primary#thangs-container-toggle +button.toggle.btn#thangs-container-toggle span.icon-list -button.toggle.btn-primary#thangs-palette-toggle +button.toggle.btn#thangs-palette-toggle span.icon-plus .thangs-container.hide#all-thangs h3(data-i18n="editor.level_tab_thangs_title") Current Thangs diff --git a/app/views/editor/level/thangs/AddThangsView.coffee b/app/views/editor/level/thangs/AddThangsView.coffee index bd71f776e..aeba64f92 100644 --- a/app/views/editor/level/thangs/AddThangsView.coffee +++ b/app/views/editor/level/thangs/AddThangsView.coffee @@ -12,7 +12,7 @@ class ThangTypeSearchCollection extends CocoCollection module.exports = class AddThangsView extends CocoView id: 'add-thangs-view' - className: 'add-thangs-palette hide' + className: 'add-thangs-palette' template: add_thangs_template events: From fa0f904fbb5cff2ca14c7b8dcee57d87f27a5e71 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 16:48:16 -0700 Subject: [PATCH 08/24] Fixed a couple bugs with Achievements not getting schema defaults. --- app/models/Achievement.coffee | 2 +- app/templates/editor/level/related-achievements.jade | 6 +++--- app/views/achievements/AchievementPopup.coffee | 4 ++-- app/views/editor/level/LevelFeedbackView.coffee | 2 +- app/views/editor/level/modals/NewAchievementModal.coffee | 1 - 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/models/Achievement.coffee b/app/models/Achievement.coffee index 93434d728..b4dc4c0e8 100644 --- a/app/models/Achievement.coffee +++ b/app/models/Achievement.coffee @@ -20,7 +20,7 @@ module.exports = class Achievement extends CocoModel 4: 'achievement-gold' 5: 'achievement-diamond' - getStyle: -> Achievement.styleMapping[@get 'difficulty'] + getStyle: -> Achievement.styleMapping[@get 'difficulty', true] @defaultImageURL: '/images/achievements/default.png' diff --git a/app/templates/editor/level/related-achievements.jade b/app/templates/editor/level/related-achievements.jade index 3d0ff9c34..33ff9230f 100644 --- a/app/templates/editor/level/related-achievements.jade +++ b/app/templates/editor/level/related-achievements.jade @@ -18,6 +18,6 @@ else td(style="width: 20px") img.achievement-icon-small(src=achievement.getImageURL() alt="#{achievement.get('name') icon") td - a(href="/editor/achievement/#{achievement.get('slug')}")= achievement.get('name') - td= achievement.get('description') - td= achievement.get('worth') + a(href="/editor/achievement/#{achievement.get('slug')}")= achievement.get('name', true) + td= achievement.get('description', true) + td= achievement.get('worth', true) diff --git a/app/views/achievements/AchievementPopup.coffee b/app/views/achievements/AchievementPopup.coffee index 82e464734..ba2b60add 100644 --- a/app/views/achievements/AchievementPopup.coffee +++ b/app/views/achievements/AchievementPopup.coffee @@ -26,11 +26,11 @@ module.exports = class AchievementPopup extends CocoView nextLevelXP = User.expForLevel(nextLevel) totalExpNeeded = nextLevelXP - currentLevelExp expFunction = @achievement.getExpFunction() - currentXP = me.get 'points' + currentXP = me.get 'points', true if @achievement.isRepeatable() achievedXP = expFunction(@earnedAchievement.get('previouslyAchievedAmount')) * @achievement.get('worth') if @achievement.isRepeatable() else - achievedXP = @achievement.get 'worth' + achievedXP = @achievement.get 'worth', true previousXP = currentXP - achievedXP leveledUp = currentXP - achievedXP < currentLevelExp #console.debug 'Leveled up' if leveledUp diff --git a/app/views/editor/level/LevelFeedbackView.coffee b/app/views/editor/level/LevelFeedbackView.coffee index fa6a0884a..a7cb666ba 100644 --- a/app/views/editor/level/LevelFeedbackView.coffee +++ b/app/views/editor/level/LevelFeedbackView.coffee @@ -37,7 +37,7 @@ module.exports = class LevelFeedbackView extends CocoView context.allFeedback = [] context.averageRating = 0 context.totalRatings = 0 - if @allFeedback + if @allFeedback?.models.length context.allFeedback = (m.attributes for m in @allFeedback.models when @allFeedback.models.length < 20 or m.get('review')) context.averageRating = _.reduce((m.get('rating') for m in @allFeedback.models), (acc, x) -> acc + (x ? 5)) / (@allFeedback.models.length) context.totalRatings = @allFeedback.models.length diff --git a/app/views/editor/level/modals/NewAchievementModal.coffee b/app/views/editor/level/modals/NewAchievementModal.coffee index ad022c4f4..69847e26b 100644 --- a/app/views/editor/level/modals/NewAchievementModal.coffee +++ b/app/views/editor/level/modals/NewAchievementModal.coffee @@ -18,7 +18,6 @@ module.exports = class NewAchievementModal extends NewModelModal getRenderData: -> c = super() c.level = @level - console.debug 'level', c.level c onAchievementSubmitted: (e) -> From daca7b54f37cf2e793c3223664ae103e6d5affb6 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 16:50:09 -0700 Subject: [PATCH 09/24] Refactored SystemTabView names, hid the add button in the systems tab. --- .../level/{systems_tab.sass => systems-tab-view.sass} | 5 ++++- app/templates/editor/level/edit.jade | 4 ++-- .../level/{systems_tab.jade => systems-tab-view.jade} | 0 app/views/editor/level/systems/SystemsTabView.coffee | 7 ++----- 4 files changed, 8 insertions(+), 8 deletions(-) rename app/styles/editor/level/{systems_tab.sass => systems-tab-view.sass} (96%) rename app/templates/editor/level/{systems_tab.jade => systems-tab-view.jade} (100%) diff --git a/app/styles/editor/level/systems_tab.sass b/app/styles/editor/level/systems-tab-view.sass similarity index 96% rename from app/styles/editor/level/systems_tab.sass rename to app/styles/editor/level/systems-tab-view.sass index 594050534..1f7abe54a 100644 --- a/app/styles/editor/level/systems_tab.sass +++ b/app/styles/editor/level/systems-tab-view.sass @@ -1,4 +1,4 @@ -#editor-level-systems-tab-view +#systems-tab-view h3 margin-top: 0 @media screen and (max-width: 800px) @@ -28,6 +28,9 @@ @media screen and (max-width: 800px) z-index: 10 bottom: -35px + + .treema-add-child + display: none .treema-children .treema-row * cursor: pointer !important diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index 32a4bc012..918596422 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -26,7 +26,7 @@ block header li a(href="#editor-level-components-tab-view", data-toggle="tab", data-i18n="editor.level_tab_components")#components-tab Components li - a(href="#editor-level-systems-tab-view", data-toggle="tab", data-i18n="editor.level_tab_systems") Systems + a(href="#systems-tab-view", data-toggle="tab", data-i18n="editor.level_tab_systems") Systems li a(href="#editor-level-patches", data-toggle="tab")#patches-tab span(data-i18n="resources.patches").spr Patches @@ -123,7 +123,7 @@ block outer_content div.tab-pane#editor-level-components-tab-view - div.tab-pane#editor-level-systems-tab-view + div.tab-pane#systems-tab-view div.tab-pane#editor-level-patches .patches-view diff --git a/app/templates/editor/level/systems_tab.jade b/app/templates/editor/level/systems-tab-view.jade similarity index 100% rename from app/templates/editor/level/systems_tab.jade rename to app/templates/editor/level/systems-tab-view.jade diff --git a/app/views/editor/level/systems/SystemsTabView.coffee b/app/views/editor/level/systems/SystemsTabView.coffee index 78809330b..8f7336946 100644 --- a/app/views/editor/level/systems/SystemsTabView.coffee +++ b/app/views/editor/level/systems/SystemsTabView.coffee @@ -1,5 +1,5 @@ CocoView = require 'views/kinds/CocoView' -template = require 'templates/editor/level/systems_tab' +template = require 'templates/editor/level/systems-tab-view' Level = require 'models/Level' LevelSystem = require 'models/LevelSystem' LevelSystemEditView = require './LevelSystemEditView' @@ -8,7 +8,7 @@ AddLevelSystemModal = require './AddLevelSystemModal' {ThangTypeNode} = require './../treema_nodes' module.exports = class SystemsTabView extends CocoView - id: 'editor-level-systems-tab-view' + id: 'systems-tab-view' template: template className: 'tab-pane' @@ -49,7 +49,6 @@ module.exports = class SystemsTabView extends CocoView insertedDefaults = true systems = @getSortedByName systems treemaOptions = - # TODO: somehow get rid of the + button, or repurpose it to open the AddLevelSystemModal instead supermodel: @supermodel schema: Level.schema.properties.systems data: systems @@ -153,8 +152,6 @@ class LevelSystemNode extends TreemaObjectNode grabDBComponent: -> data = @getData() - unless _.isString data.original - return alert('Press the "Add System" button at the bottom instead of the "+". Sorry.') @system = @settings.supermodel.getModelByOriginalAndMajorVersion(LevelSystem, data.original, data.majorVersion) console.error 'Couldn\'t find system for', data.original, data.majorVersion, 'from models', @settings.supermodel.models unless @system From 6394482c349c9eacdb3e9db30a277b06157a6373 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 16:58:34 -0700 Subject: [PATCH 10/24] Unjanking getCurrentView. --- app/views/editor/level/LevelEditView.coffee | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/views/editor/level/LevelEditView.coffee b/app/views/editor/level/LevelEditView.coffee index a6d6af179..b9150d98a 100644 --- a/app/views/editor/level/LevelEditView.coffee +++ b/app/views/editor/level/LevelEditView.coffee @@ -135,11 +135,10 @@ module.exports = class LevelEditView extends RootView @$el.find('#redo-button').attr('title', 'Redo ' + redoDescription + ' (Ctrl+Shift+Z)') getCurrentView: -> - tabText = _.string.underscored $('li.active')[0]?.textContent - currentView = @subviews["editor_level_#{tabText}_tab_view"] - if tabText is 'patches' then currentView = @patchesView - if tabText is 'documentation' then currentView = @subviews.docs_components_view - currentView + currentViewID = @$el.find('.tab-pane.active').attr('id') + return @patchesView if currentViewID is 'editor-level-patches' + currentViewID = 'components-documentation-view' if currentViewID is 'editor-level-documentation' + return @subviews[_.string.underscored(currentViewID)] startPatchingLevel: (e) -> @openModalView new SaveVersionModal({model: @level}) From 3fd9cb89ef5cfdcc03364ce223ed644b8fd31229 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 17:26:02 -0700 Subject: [PATCH 11/24] Refactored LevelSystem/ComponentEditViews' files, and fixed their configSchema treemas not to edit raw model data directly. --- .../component/{edit.sass => level-component-edit-view.sass} | 2 +- .../level/system/{edit.sass => level-system-edit-view.sass} | 2 +- .../component/{edit.jade => level-component-edit-view.jade} | 0 app/templates/editor/level/components_tab.jade | 2 +- .../level/system/{edit.jade => level-system-edit-view.jade} | 0 app/templates/editor/level/systems-tab-view.jade | 2 +- .../editor/level/components/LevelComponentEditView.coffee | 6 +++--- app/views/editor/level/systems/LevelSystemEditView.coffee | 6 +++--- 8 files changed, 10 insertions(+), 10 deletions(-) rename app/styles/editor/level/component/{edit.sass => level-component-edit-view.sass} (93%) rename app/styles/editor/level/system/{edit.sass => level-system-edit-view.sass} (93%) rename app/templates/editor/level/component/{edit.jade => level-component-edit-view.jade} (100%) rename app/templates/editor/level/system/{edit.jade => level-system-edit-view.jade} (100%) diff --git a/app/styles/editor/level/component/edit.sass b/app/styles/editor/level/component/level-component-edit-view.sass similarity index 93% rename from app/styles/editor/level/component/edit.sass rename to app/styles/editor/level/component/level-component-edit-view.sass index 978c286e5..cb5d0a7f0 100644 --- a/app/styles/editor/level/component/edit.sass +++ b/app/styles/editor/level/component/level-component-edit-view.sass @@ -1,4 +1,4 @@ -#editor-level-component-edit-view +#level-component-edit-view nav margin-bottom: 0 diff --git a/app/styles/editor/level/system/edit.sass b/app/styles/editor/level/system/level-system-edit-view.sass similarity index 93% rename from app/styles/editor/level/system/edit.sass rename to app/styles/editor/level/system/level-system-edit-view.sass index 92f015d9e..35670470c 100644 --- a/app/styles/editor/level/system/edit.sass +++ b/app/styles/editor/level/system/level-system-edit-view.sass @@ -1,4 +1,4 @@ -#editor-level-system-edit-view +#level-system-edit-view nav margin-bottom: 0 diff --git a/app/templates/editor/level/component/edit.jade b/app/templates/editor/level/component/level-component-edit-view.jade similarity index 100% rename from app/templates/editor/level/component/edit.jade rename to app/templates/editor/level/component/level-component-edit-view.jade diff --git a/app/templates/editor/level/components_tab.jade b/app/templates/editor/level/components_tab.jade index 235cb9f71..94a0dfcfc 100644 --- a/app/templates/editor/level/components_tab.jade +++ b/app/templates/editor/level/components_tab.jade @@ -11,4 +11,4 @@ span.icon-plus span.text(data-i18n="editor.level_component_btn_new") Create New Component - #editor-level-component-edit-view + #level-component-edit-view diff --git a/app/templates/editor/level/system/edit.jade b/app/templates/editor/level/system/level-system-edit-view.jade similarity index 100% rename from app/templates/editor/level/system/edit.jade rename to app/templates/editor/level/system/level-system-edit-view.jade diff --git a/app/templates/editor/level/systems-tab-view.jade b/app/templates/editor/level/systems-tab-view.jade index bba7b57d8..be6f7b384 100644 --- a/app/templates/editor/level/systems-tab-view.jade +++ b/app/templates/editor/level/systems-tab-view.jade @@ -11,7 +11,7 @@ span.icon-file span.text(data-i18n="editor.level_systems_btn_new") Create New System - #editor-level-system-edit-view + #level-system-edit-view button.btn.btn-primary#add-system-button span.icon-plus diff --git a/app/views/editor/level/components/LevelComponentEditView.coffee b/app/views/editor/level/components/LevelComponentEditView.coffee index 898c88f0f..db2779d73 100644 --- a/app/views/editor/level/components/LevelComponentEditView.coffee +++ b/app/views/editor/level/components/LevelComponentEditView.coffee @@ -1,12 +1,12 @@ CocoView = require 'views/kinds/CocoView' -template = require 'templates/editor/level/component/edit' +template = require 'templates/editor/level/component/level-component-edit-view' LevelComponent = require 'models/LevelComponent' ComponentVersionsModal = require 'views/editor/component/ComponentVersionsModal' PatchesView = require 'views/editor/PatchesView' SaveVersionModal = require 'views/modal/SaveVersionModal' module.exports = class LevelComponentEditView extends CocoView - id: 'editor-level-component-edit-view' + id: 'level-component-edit-view' template: template editableSettings: ['name', 'description', 'system', 'codeLanguage', 'dependencies', 'propertyDocumentation', 'i18n'] @@ -69,7 +69,7 @@ module.exports = class LevelComponentEditView extends CocoView @updatePatchButton() buildConfigSchemaTreema: -> - configSchema = @levelComponent.get 'configSchema' + configSchema = $.extend true, {}, @levelComponent.get 'configSchema' if configSchema.properties # Alphabetize (#1297) propertyNames = _.keys configSchema.properties diff --git a/app/views/editor/level/systems/LevelSystemEditView.coffee b/app/views/editor/level/systems/LevelSystemEditView.coffee index e50a37e4a..8286185ec 100644 --- a/app/views/editor/level/systems/LevelSystemEditView.coffee +++ b/app/views/editor/level/systems/LevelSystemEditView.coffee @@ -1,12 +1,12 @@ CocoView = require 'views/kinds/CocoView' -template = require 'templates/editor/level/system/edit' +template = require 'templates/editor/level/system/level-system-edit-view' LevelSystem = require 'models/LevelSystem' SystemVersionsModal = require 'views/editor/level/systems/SystemVersionsModal' PatchesView = require 'views/editor/PatchesView' SaveVersionModal = require 'views/modal/SaveVersionModal' module.exports = class LevelSystemEditView extends CocoView - id: 'editor-level-system-edit-view' + id: 'level-system-edit-view' template: template editableSettings: ['name', 'description', 'codeLanguage', 'dependencies', 'propertyDocumentation', 'i18n'] @@ -66,7 +66,7 @@ module.exports = class LevelSystemEditView extends CocoView treemaOptions = supermodel: @supermodel schema: LevelSystem.schema.properties.configSchema - data: @levelSystem.get 'configSchema' + data: $.extend true, {}, @levelSystem.get 'configSchema' callbacks: {change: @onConfigSchemaEdited} treemaOptions.readOnly = me.get('anonymous') @configSchemaTreema = @$el.find('#config-schema-treema').treema treemaOptions From 23516175d47f6eee4d070bd240f45c26e6f4f6e0 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 17:28:40 -0700 Subject: [PATCH 12/24] Adding default IDs to new goals. --- app/views/editor/achievement/AchievementEditView.coffee | 3 --- app/views/editor/level/settings/SettingsTabView.coffee | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/views/editor/achievement/AchievementEditView.coffee b/app/views/editor/achievement/AchievementEditView.coffee index 0825c9de6..cf50026a5 100644 --- a/app/views/editor/achievement/AchievementEditView.coffee +++ b/app/views/editor/achievement/AchievementEditView.coffee @@ -15,9 +15,6 @@ module.exports = class AchievementEditView extends RootView 'click #recalculate-button': 'confirmRecalculation' 'click #delete-button': 'confirmDeletion' - subscriptions: - 'save-new': 'saveAchievement' - constructor: (options, @achievementID) -> super options @achievement = new Achievement(_id: @achievementID) diff --git a/app/views/editor/level/settings/SettingsTabView.coffee b/app/views/editor/level/settings/SettingsTabView.coffee index fc6e02d91..26ef6948b 100644 --- a/app/views/editor/level/settings/SettingsTabView.coffee +++ b/app/views/editor/level/settings/SettingsTabView.coffee @@ -61,6 +61,15 @@ module.exports = class SettingsTabView extends CocoView if (terrain = @settingsTreema.data.terrain) isnt @lastTerrain @lastTerrain = terrain Backbone.Mediator.publish 'editor:terrain-changed', terrain: terrain + for goal, index in @settingsTreema.data.goals ? [] + continue if goal.id + goalIndex = index + goalID = "goal-#{goalIndex}" + goalID = "goal-#{++goalIndex}" while _.find @settingsTreema.get("goals"), id: goalID + @settingsTreema.disableTracking() + @settingsTreema.set "/goals/#{index}/id", goalID + @settingsTreema.set "/goals/#{index}/name", _.string.humanize goalID + @settingsTreema.enableTracking() onThangsEdited: (e) -> # Update in-place so existing Treema nodes refer to the same array. From 5b0e996f932b5b827c004d4aaefe92fa5d17e8f7 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 17:46:52 -0700 Subject: [PATCH 13/24] Think I may have fixed the color group setting issue again. --- app/models/CocoModel.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 44a99bee3..4345ae728 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -154,7 +154,10 @@ class CocoModel extends Backbone.Model markToRevert: -> if @type() is 'ThangType' - @_revertAttributes = _.clone @attributes # No deep clones for these! + # Don't deep clone the raw vector data, but do deep clone everything else. + @_revertAttributes = _.clone @attributes + for smallProp, value of @attributes when value and smallProp isnt 'raw' + @_revertAttributes[smallProp] = _.cloneDeep value else @_revertAttributes = $.extend(true, {}, @attributes) From 4a100a501ae060f4d9d78423599b79804390a4bd Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 17:38:52 -0700 Subject: [PATCH 14/24] Fixed a bug with new levels in the level editor. --- app/models/Level.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/Level.coffee b/app/models/Level.coffee index fc49d8dfb..ffd81cfac 100644 --- a/app/models/Level.coffee +++ b/app/models/Level.coffee @@ -30,7 +30,7 @@ module.exports = class Level extends CocoModel denormalize: (supermodel, session) -> o = $.extend true, {}, @attributes - if @get('type', true) is 'hero' + if o.thangs and @get('type', true) is 'hero' # TOOD: figure out if/when/how we are doing this for non-Hero levels that aren't expecting denormalization. for levelThang in o.thangs @denormalizeThang(levelThang, supermodel, session) From 621c684c74afd9052f877ae481b02f2f9bd914a0 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 17:52:44 -0700 Subject: [PATCH 15/24] Tweaked the randomize buttons and modal (also changing it to "generate terrain" and refactoring related files accordingly). --- app/locale/en.coffee | 2 +- ...omize.sass => generate-terrain-modal.sass} | 7 +++-- app/styles/editor/level/thangs-tab-view.sass | 12 ++++---- app/templates/editor/level/edit.jade | 2 +- ...omize.jade => generate-terrain-modal.jade} | 1 + .../editor/level/thangs-tab-view.jade | 6 ++-- ...dal.coffee => GenerateTerrainModal.coffee} | 29 ++++++++++--------- .../editor/level/thangs/ThangsTabView.coffee | 4 +-- 8 files changed, 34 insertions(+), 29 deletions(-) rename app/styles/editor/level/modal/{terrain_randomize.sass => generate-terrain-modal.sass} (96%) rename app/templates/editor/level/modal/{terrain_randomize.jade => generate-terrain-modal.jade} (98%) rename app/views/editor/level/modals/{TerrainRandomizeModal.coffee => GenerateTerrainModal.coffee} (96%) diff --git a/app/locale/en.coffee b/app/locale/en.coffee index 0be68564c..a54115787 100644 --- a/app/locale/en.coffee +++ b/app/locale/en.coffee @@ -557,7 +557,7 @@ grassy: "Grassy" fork_title: "Fork New Version" fork_creating: "Creating Fork..." - randomize: "Randomize" + generate_terrain: "Generate Terrain" more: "More" wiki: "Wiki" live_chat: "Live Chat" diff --git a/app/styles/editor/level/modal/terrain_randomize.sass b/app/styles/editor/level/modal/generate-terrain-modal.sass similarity index 96% rename from app/styles/editor/level/modal/terrain_randomize.sass rename to app/styles/editor/level/modal/generate-terrain-modal.sass index b6d1064e1..e6b0e06ed 100644 --- a/app/styles/editor/level/modal/terrain_randomize.sass +++ b/app/styles/editor/level/modal/generate-terrain-modal.sass @@ -1,13 +1,16 @@ -#terrain-randomize-modal +#generate-terrain-modal .choose-option margin-bottom: 15px - width: 100% + width: 48% + margin-right: 1% + margin-left: 1% height: 200px overflow: hidden background: white border: 1px solid #333 position: relative + float: left -webkit-transition: opacity 0.3s ease-in-out -moz-transition: opacity 0.3s ease-in-out diff --git a/app/styles/editor/level/thangs-tab-view.sass b/app/styles/editor/level/thangs-tab-view.sass index e7fcfd035..9966135fb 100644 --- a/app/styles/editor/level/thangs-tab-view.sass +++ b/app/styles/editor/level/thangs-tab-view.sass @@ -12,6 +12,9 @@ #thangs-container-toggle, #thangs-palette-toggle top: 5px + position: absolute + z-index: 12 + padding: 8px #thangs-container-toggle left: 5px @@ -21,11 +24,6 @@ right: 5px box-shadow: -1px 1px 5px black - .toggle - position: absolute - z-index: 12 - padding: 8px - .thangs-container background: white width: $extantThangsWidth @@ -73,10 +71,10 @@ position: relative text-align: center - #randomize-button + .generate-terrain-button position: absolute top: 45% - height: 40px + //height: 40px diff --git a/app/templates/editor/level/edit.jade b/app/templates/editor/level/edit.jade index 918596422..a19d17eff 100644 --- a/app/templates/editor/level/edit.jade +++ b/app/templates/editor/level/edit.jade @@ -94,7 +94,7 @@ block header li(class=anonymous ? "disabled": "") a(data-toggle="coco-modal", data-target="modal/RevertModal", data-i18n="editor.revert")#revert-button Revert li(class=anonymous ? "disabled": "") - a(data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize")#randomize-button Randomize + a(data-toggle="coco-modal", data-target="editor/level/modals/GenerateTerrainModal", data-i18n="editor.generate_terrain").generate-terrain-button Generate Terrain li(class=anonymous ? "disabled": "") a(data-i18n="editor.pop_i18n")#pop-level-i18n-button Populate i18n li.divider diff --git a/app/templates/editor/level/modal/terrain_randomize.jade b/app/templates/editor/level/modal/generate-terrain-modal.jade similarity index 98% rename from app/templates/editor/level/modal/terrain_randomize.jade rename to app/templates/editor/level/modal/generate-terrain-modal.jade index a4e45b2f2..e97cd739f 100644 --- a/app/templates/editor/level/modal/terrain_randomize.jade +++ b/app/templates/editor/level/modal/generate-terrain-modal.jade @@ -13,4 +13,5 @@ block modal-body-content span(data-i18n="editor."+size) #{size} div.preset-name.capitalize span(data-i18n="editor."+preset.type) #{preset.type} + .clearfix block modal-footer diff --git a/app/templates/editor/level/thangs-tab-view.jade b/app/templates/editor/level/thangs-tab-view.jade index 0e2a7a228..34fcd3963 100644 --- a/app/templates/editor/level/thangs-tab-view.jade +++ b/app/templates/editor/level/thangs-tab-view.jade @@ -1,6 +1,6 @@ -button.toggle.btn#thangs-container-toggle +button.btn#thangs-container-toggle span.icon-list -button.toggle.btn#thangs-palette-toggle +button.btn#thangs-palette-toggle span.icon-plus .thangs-container.hide#all-thangs h3(data-i18n="editor.level_tab_thangs_title") Current Thangs @@ -8,7 +8,7 @@ button.toggle.btn#thangs-palette-toggle .world-container #canvas-wrapper - button.btn.btn-primary(id="randomize-button", data-toggle="coco-modal", data-target="editor/level/modals/TerrainRandomizeModal", data-i18n="editor.randomize", title="Randomize Terrain") Randomize + button.generate-terrain-button.btn.btn-info.btn-lg(data-toggle="coco-modal", data-target="editor/level/modals/GenerateTerrainModal", data-i18n="editor.generate_terrain", title="Generate Terrain") Generate Terrain ul.dropdown-menu#contextmenu li#delete a(data-i18n="editor.delete") Delete diff --git a/app/views/editor/level/modals/TerrainRandomizeModal.coffee b/app/views/editor/level/modals/GenerateTerrainModal.coffee similarity index 96% rename from app/views/editor/level/modals/TerrainRandomizeModal.coffee rename to app/views/editor/level/modals/GenerateTerrainModal.coffee index 94a772706..c2637bd00 100644 --- a/app/views/editor/level/modals/TerrainRandomizeModal.coffee +++ b/app/views/editor/level/modals/GenerateTerrainModal.coffee @@ -1,5 +1,5 @@ ModalView = require 'views/kinds/ModalView' -template = require 'templates/editor/level/modal/terrain_randomize' +template = require 'templates/editor/level/modal/generate-terrain-modal' CocoModel = require 'models/CocoModel' clusters = { @@ -229,11 +229,14 @@ thangSizes = { }} -module.exports = class TerrainRandomizeModal extends ModalView - id: 'terrain-randomize-modal' +module.exports = class GenerateTerrainModal extends ModalView + id: 'generate-terrain-modal' template: template + plain: true + modalWidthPercent: 90 + events: - 'click .choose-option': 'onRandomize' + 'click .choose-option': 'onGenerate' onRevertModel: (e) -> id = $(e.target).val() @@ -241,25 +244,25 @@ module.exports = class TerrainRandomizeModal extends ModalView $(e.target).closest('tr').remove() @reloadOnClose = true - onRandomize: (e) -> + onGenerate: (e) -> target = $(e.target) presetType = target.attr 'data-preset-type' presetSize = target.attr 'data-preset-size' - @randomizeThangs presetType, presetSize + @generateThangs presetType, presetSize Backbone.Mediator.publish 'editor:random-terrain-generated', thangs: @thangs, terrain: presets[presetType].terrainName @hide() - randomizeThangs: (presetName, presetSize) -> + generateThangs: (presetName, presetSize) -> @falseCount = 0 preset = presets[presetName] presetSize = presetSizes[presetSize] @thangs = [] @rects = [] - @randomizeFloor preset, presetSize - @randomizeBorder preset, presetSize, preset.borderNoise - @randomizeDecorations preset, presetSize + @generateFloor preset, presetSize + @generateBorder preset, presetSize, preset.borderNoise + @generateDecorations preset, presetSize - randomizeFloor: (preset, presetSize) -> + generateFloor: (preset, presetSize) -> for i in _.range(0, presetSize.x, thangSizes.floorSize.x) for j in _.range(0, presetSize.y, thangSizes.floorSize.y) @thangs.push { @@ -271,7 +274,7 @@ module.exports = class TerrainRandomizeModal extends ModalView 'margin': clusters[preset.floors].margin } - randomizeBorder: (preset, presetSize, noiseFactor=1) -> + generateBorder: (preset, presetSize, noiseFactor=1) -> for i in _.range(0, presetSize.x, thangSizes.borderSize.x) for j in _.range(preset.borderThickness) # Bottom wall @@ -349,7 +352,7 @@ module.exports = class TerrainRandomizeModal extends ModalView } continue - randomizeDecorations: (preset, presetSize)-> + generateDecorations: (preset, presetSize)-> for name, decoration of preset.decorations for num in _.range(presetSize.sizeFactor * _.random(decoration.num[0], decoration.num[1])) if @['build'+name] isnt undefined diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index 550e4ce2d..d51c86573 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -152,7 +152,7 @@ module.exports = class ThangsTabView extends CocoView oldHeight = $('#thangs-list').height() $('#thangs-list').height(oldHeight - thangsHeaderHeight) if data.thangs?.length - @$el.find('#randomize-button').hide() + @$el.find('.generate-terrain-button').hide() initSurface: -> surfaceCanvas = $('canvas#surface', @$el) @@ -415,7 +415,7 @@ module.exports = class ThangsTabView extends CocoView @thangsBatch = [] addThang: (thangType, pos, batchInsert=false) -> - @$el.find('#randomize-button').hide() + @$el.find('.generate-terrain-button').hide() if batchInsert if thangType.get('name') is 'Hero Placeholder' thangID = 'Hero Placeholder' From 5b57fa5c7115914b465e2ff56a9e6a1919b6be74 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 18:08:18 -0700 Subject: [PATCH 16/24] Tweaked the color selection for thang types. --- app/styles/editor/thang/colors_tab.sass | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/styles/editor/thang/colors_tab.sass b/app/styles/editor/thang/colors_tab.sass index f6de2398e..9dbcb8209 100644 --- a/app/styles/editor/thang/colors_tab.sass +++ b/app/styles/editor/thang/colors_tab.sass @@ -25,12 +25,17 @@ $height: 550px box-sizing: border-box button - width: 20px - height: 25px - border: 2px solid white - margin: 1px + width: 36px + height: 36px + margin: 7px + padding: 0 + + border: 7px solid white &.selected + width: 48px + height: 48px + margin: 1px border: 2px solid black #controls From 6eb23349d0b5476500a96a2f8fe1dd13da1b7727 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 18:08:35 -0700 Subject: [PATCH 17/24] Center camera when level loaded in level editor. --- app/views/editor/level/thangs/ThangsTabView.coffee | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index d51c86573..192109f91 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -167,7 +167,17 @@ module.exports = class ThangsTabView extends CocoView } @surface.playing = false @surface.setWorld @world - @surface.camera.zoomTo({x: 262, y: -164}, 1.66, 0) + @centerCamera() + + centerCamera: -> + [width, height] = @world.size() + width = Math.max width, 80 + height = Math.max height, 68 + {left, top, right, bottom} = @world.getBounds() + center = x: left + width / 2, y: bottom + height / 2 + sup = @surface.camera.worldToSurface center + zoom = 0.94 * 92.4 / width # Zoom 1.0 lets us see 92.4 meters. + @surface.camera.zoomTo(sup, zoom, 0) destroy: -> @selectAddThangType null From 681cc4656fc1355a9b07531e6f561628c99aa669 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 18:28:02 -0700 Subject: [PATCH 18/24] Fixed a bug with revertAttributes getting set during SuperModel duplicate model merging. --- app/models/CocoModel.coffee | 6 +++--- app/models/SuperModel.coffee | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 4345ae728..8091035d8 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -61,11 +61,11 @@ class CocoModel extends Backbone.Model else super(attribute) - set: -> + set: (attributes, options) -> delete @attributesWithDefaults inFlux = @loading or not @loaded - @markToRevert() unless inFlux or @_revertAttributes - res = super(arguments...) + @markToRevert() unless inFlux or @_revertAttributes or @project or options?.silent + res = super attributes, options @saveBackup() if @saveBackups and (not inFlux) and @hasLocalChanges() res diff --git a/app/models/SuperModel.coffee b/app/models/SuperModel.coffee index 07cafff46..930612edb 100644 --- a/app/models/SuperModel.coffee +++ b/app/models/SuperModel.coffee @@ -120,7 +120,7 @@ module.exports = class SuperModel extends Backbone.Model cachedModel = @getModelByURL(model.getURL()) if cachedModel clone = $.extend true, {}, model.attributes - cachedModel.set(clone, {silent: true}) + cachedModel.set(clone, {silent: true, fromMerge: true}) console.debug "Updated cached model <#{cachedModel.get('name') or cachedModel.getURL()}> with new data" else @registerModel(model) From 2c2316fff5e8fab48a03ada67a4383ad1311cb79 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Tue, 2 Sep 2014 18:42:41 -0700 Subject: [PATCH 19/24] Non-integer frame offsets, okay, sure. --- app/schemas/subscriptions/play.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/schemas/subscriptions/play.coffee b/app/schemas/subscriptions/play.coffee index 9ffedd3b6..5120ae2d5 100644 --- a/app/schemas/subscriptions/play.coffee +++ b/app/schemas/subscriptions/play.coffee @@ -38,8 +38,8 @@ module.exports = time: {type: 'number', minimum: 0} ratio: {type: 'number', minimum: 0, maximum: 1} ratioOffset: {type: 'number'} - frameOffset: {type: 'integer'} - scrubDuration: {type: 'integer', minimum: 0} + frameOffset: {type: 'number'} + scrubDuration: {type: 'number', minimum: 0} 'level:select-sprite': c.object {}, thangID: {type: ['string', 'null', 'undefined']} From 9af460cf426c56506495b377956fa27ea58ad111 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 18:43:02 -0700 Subject: [PATCH 20/24] Fixed #330 --- app/views/editor/level/thangs/LevelThangEditView.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/editor/level/thangs/LevelThangEditView.coffee b/app/views/editor/level/thangs/LevelThangEditView.coffee index 245e9cad9..fd3bafaf7 100644 --- a/app/views/editor/level/thangs/LevelThangEditView.coffee +++ b/app/views/editor/level/thangs/LevelThangEditView.coffee @@ -24,7 +24,7 @@ module.exports = class LevelThangEditView extends CocoView options ?= {} super options @world = options.world - @thangData = options.thangData ? {} + @thangData = $.extend true, {}, options.thangData ? {} @level = options.level @oldID = @thangData.id @@ -59,7 +59,7 @@ module.exports = class LevelThangEditView extends CocoView saveThang: (e) -> # Make sure it validates first? - Backbone.Mediator.publish 'editor:level-thang-edited', thangData: @thangData, thangID: @oldID + Backbone.Mediator.publish 'editor:level-thang-edited', thangData: $.extend(true, {}, @thangData), thangID: @oldID navigateToAllThangs: -> Backbone.Mediator.publish 'editor:level-thang-done-editing', {} From a494d1f2c42e5e1f2f9a6a64f7a7b8b9223829ac Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Tue, 2 Sep 2014 19:47:43 -0700 Subject: [PATCH 21/24] Fixed the walls not updating when they are randomly generated. --- app/views/editor/level/thangs/ThangsTabView.coffee | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index 192109f91..e8c86616a 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -239,8 +239,17 @@ module.exports = class ThangsTabView extends CocoView @thangsBatch = [] nonRandomThangs = (thang for thang in @thangsTreema.get('') when not /Random/.test thang.id) @thangsTreema.set '', nonRandomThangs + + listening = {} for thang in e.thangs @selectAddThangType thang.id + + # kind of a hack to get the walls to show up correctly when they load. + # might also fix other thangs who need to show up looking a certain way based on thang type components + unless @addThangType.isFullyLoaded() or listening[@addThangType.cid] + listening[@addThangType.cid] = true + @listenToOnce @addThangType, 'build-complete', @onThangsChanged + @addThang @addThangType, thang.pos, true @batchInsert() @selectAddThangType null @@ -394,6 +403,7 @@ module.exports = class ThangsTabView extends CocoView Thang.resetThangIDs() # TODO: find some way to do this when we delete from treema, too onThangsChanged: (e) => + console.log 'on thangs changed' @level.set 'thangs', @thangsTreema.data return if @editThangView serializedLevel = @level.serialize @supermodel From 1888e9ea92e7ac84157115e579da34de8c46f1b8 Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 3 Sep 2014 08:44:46 -0700 Subject: [PATCH 22/24] Removed a log. --- app/views/editor/level/thangs/ThangsTabView.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index e8c86616a..f1108c93b 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -403,7 +403,6 @@ module.exports = class ThangsTabView extends CocoView Thang.resetThangIDs() # TODO: find some way to do this when we delete from treema, too onThangsChanged: (e) => - console.log 'on thangs changed' @level.set 'thangs', @thangsTreema.data return if @editThangView serializedLevel = @level.serialize @supermodel From 975c6ad2a6c8f1488492870a79302504fb8194ff Mon Sep 17 00:00:00 2001 From: Scott Erickson Date: Wed, 3 Sep 2014 09:33:21 -0700 Subject: [PATCH 23/24] Optimized level serialization a bit more to make placing and moving thangs around in the level editor more fluid. --- app/models/Level.coffee | 30 ++++++++++++++----- .../editor/level/thangs/ThangsTabView.coffee | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/app/models/Level.coffee b/app/models/Level.coffee index ffd81cfac..1336b8594 100644 --- a/app/models/Level.coffee +++ b/app/models/Level.coffee @@ -8,13 +8,13 @@ module.exports = class Level extends CocoModel @schema: require 'schemas/models/level' urlRoot: '/db/level' - serialize: (supermodel, session) -> - o = @denormalize supermodel, session + serialize: (supermodel, session, cached=false) -> + o = @denormalize supermodel, session # hot spot to optimize # Figure out Components - o.levelComponents = $.extend true, [], (lc.attributes for lc in supermodel.getModels LevelComponent) + o.levelComponents = if cached then @getCachedLevelComponents(supermodel) else $.extend true, [], (lc.attributes for lc in supermodel.getModels LevelComponent) @sortThangComponents o.thangs, o.levelComponents, 'Level Thang' - @fillInDefaultComponentConfiguration o.thangs, o.levelComponents + @fillInDefaultComponentConfiguration o.thangs, o.levelComponents # hot spot to optimize # Figure out Systems systemModels = $.extend true, [], (ls.attributes for ls in supermodel.getModels LevelSystem) @@ -22,12 +22,28 @@ module.exports = class Level extends CocoModel @fillInDefaultSystemConfiguration o.systems # Figure out ThangTypes' Components - o.thangTypes = (original: tt.get('original'), name: tt.get('name'), components: $.extend(true, [], tt.get('components')) for tt in supermodel.getModels ThangType) + tmap = {} + tmap[t.thangType] = true for t in o.thangs + o.thangTypes = (original: tt.get('original'), name: tt.get('name'), components: $.extend(true, [], tt.get('components')) for tt in supermodel.getModels ThangType when tmap[tt.get('original')] or tt.isFullyLoaded()) @sortThangComponents o.thangTypes, o.levelComponents, 'ThangType' @fillInDefaultComponentConfiguration o.thangTypes, o.levelComponents - + o - + + cachedLevelComponents: null + + getCachedLevelComponents: (supermodel) -> + @cachedLevelComponents ?= {} + levelComponents = supermodel.getModels LevelComponent + newLevelComponents = [] + for levelComponent in levelComponents + if levelComponent.hasLocalChanges() + newLevelComponents.push $.extend(true, {}, levelComponent.attributes) + continue + @cachedLevelComponents[levelComponent.id] ?= @cachedLevelComponents[levelComponent.id] = $.extend(true, {}, levelComponent.attributes) + newLevelComponents.push(@cachedLevelComponents[levelComponent.id]) + newLevelComponents + denormalize: (supermodel, session) -> o = $.extend true, {}, @attributes if o.thangs and @get('type', true) is 'hero' diff --git a/app/views/editor/level/thangs/ThangsTabView.coffee b/app/views/editor/level/thangs/ThangsTabView.coffee index f1108c93b..a6ab707c1 100644 --- a/app/views/editor/level/thangs/ThangsTabView.coffee +++ b/app/views/editor/level/thangs/ThangsTabView.coffee @@ -405,7 +405,7 @@ module.exports = class ThangsTabView extends CocoView onThangsChanged: (e) => @level.set 'thangs', @thangsTreema.data return if @editThangView - serializedLevel = @level.serialize @supermodel + serializedLevel = @level.serialize @supermodel, null, true try @world.loadFromLevel serializedLevel, false catch error From c1a7b70849f580382511d4b402be8872389abb75 Mon Sep 17 00:00:00 2001 From: Nick Winter Date: Wed, 3 Sep 2014 10:58:43 -0700 Subject: [PATCH 24/24] Missed committing part of previous fix. --- app/models/CocoModel.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/CocoModel.coffee b/app/models/CocoModel.coffee index 8091035d8..ff601bcb5 100644 --- a/app/models/CocoModel.coffee +++ b/app/models/CocoModel.coffee @@ -64,7 +64,7 @@ class CocoModel extends Backbone.Model set: (attributes, options) -> delete @attributesWithDefaults inFlux = @loading or not @loaded - @markToRevert() unless inFlux or @_revertAttributes or @project or options?.silent + @markToRevert() unless inFlux or @_revertAttributes or @project or options?.fromMerge res = super attributes, options @saveBackup() if @saveBackups and (not inFlux) and @hasLocalChanges() res