diff --git a/src/css/main.scss b/src/css/main.scss index ba3bb22d0..ce7c15770 100644 --- a/src/css/main.scss +++ b/src/css/main.scss @@ -59,7 +59,7 @@ h2 { * { display: inline; } img { - position: relative; height: 7.5em; width: 7.5em; + position: relative; height: 6em; width: 6em; margin-right: 1em; vertical-align: bottom; } diff --git a/src/css/templates/recipe_catalog.scss b/src/css/templates/recipe_catalog.scss index b28df4748..f28405243 100644 --- a/src/css/templates/recipe_catalog.scss +++ b/src/css/templates/recipe_catalog.scss @@ -14,14 +14,19 @@ All rights reserved. position: absolute; right: 1em; } - input { border: 0; width: 90%; } + input { border: 0; font-size: 1.5em; width: 90%; } table { background: white; margin: 0 auto; width: 98%; - td { height: 3em; padding: 0 1em; position: relative; vertical-align: middle; } + td { + height: 3em; padding: 0 1em; position: relative; vertical-align: middle; + + p { font-size: 1.5em; } + } + td:nth-child(1) { width: 30%; } td:nth-child(2) { width: 70%; border-left: 0.1em solid $color-brick-light; } } diff --git a/src/data/applied_energetics.json b/src/data/applied_energetics.json index e152021e4..6fcecf3cc 100644 --- a/src/data/applied_energetics.json +++ b/src/data/applied_energetics.json @@ -1,8 +1,10 @@ { - "name": "Applied Energetics", - "description": "Applied Energetics rv12-b, by AlgorithmX2", + "version": 1, + "mod_name": "Applied Energetics", + "mod_version": "rv-12b", + "description": "Crafting recipes from Applied Energetics, by AlgorithmX2", "recipes": [ - + { "output": [[1, "Grind Stone"]], "input": [[3, "Certus Quartz Dust"], [3, "Stone"], [2, "Cobblestone"],[1, "Wooden Gear"]], diff --git a/src/data/buildcraft.json b/src/data/buildcraft.json index 0c68485cc..0a891aa20 100644 --- a/src/data/buildcraft.json +++ b/src/data/buildcraft.json @@ -1,6 +1,8 @@ { - "name": "BuildCraft", - "description": "Crafting recipes from BuildCraft 3, by SpaceToad", + "version": 1, + "mod_name": "BuildCraft", + "mod_version": "3.0", + "description": "Crafting recipes from BuildCraft, by SpaceToad", "recipes": [ { "output": [[1, "Advanced Crafting Table"]], diff --git a/src/data/gravisuite.json b/src/data/gravisuite.json index dfedf77e0..d5466aeef 100644 --- a/src/data/gravisuite.json +++ b/src/data/gravisuite.json @@ -1,5 +1,7 @@ { - "name": "GraviSuite", + "version": 1, + "mod_name": "GraviSuite", + "mod_version": "unknown", "description": "Crafting recipes from GraviSuite, by flotschi301", "recipes": [ { diff --git a/src/data/industrial_craft.json b/src/data/industrial_craft.json index 00f9bddd1..cb131a3d9 100644 --- a/src/data/industrial_craft.json +++ b/src/data/industrial_craft.json @@ -1,6 +1,8 @@ { - "name": "Industrial Craft", - "description": "Crafting recipes from IndustrialCraft 2, by Alblaka", + "version": 1, + "mod_name": "Industrial Craft", + "mod_version": "2.0", + "description": "Crafting recipes from IndustrialCraft, by Alblaka", "recipes": [ { "output": [[1, "Static Boots"]], diff --git a/src/data/more_blocks.json b/src/data/more_blocks.json index 919adea09..730fd2285 100644 --- a/src/data/more_blocks.json +++ b/src/data/more_blocks.json @@ -1,5 +1,7 @@ { - "name": "MoreBlocks", + "version": 1, + "mod_name": "MoreBlocks", + "mod_version": "1.0", "description": "Crafting recipes from More Blocks Mod, by MCE626", "recipes": [ { diff --git a/src/data/thermal_expansion.json b/src/data/thermal_expansion.json index 92b66d3a7..ac9a38c5c 100644 --- a/src/data/thermal_expansion.json +++ b/src/data/thermal_expansion.json @@ -1,5 +1,7 @@ { - "name": "Thermal Expansion", + "version": 1, + "mod_name": "Thermal Expansion", + "mod_version": "2.x", "description": "Crafting Recipes from Thermal Expansion, by King Lemming and the CoFH team", "recipes": [ { diff --git a/src/data/vanilla.json b/src/data/vanilla.json index 02cc20856..a0796430f 100644 --- a/src/data/vanilla.json +++ b/src/data/vanilla.json @@ -1,5 +1,7 @@ { - "name": "Vanilla Recipes", + "version": 1, + "mod_name": "Minecraft", + "mod_version": "1.6.4", "description": "Crafting recipes from vanilla Minecraft (in progress)", "recipes": [ { diff --git a/src/scripts/constants.coffee b/src/scripts/constants.coffee index 546023138..218a1daaa 100644 --- a/src/scripts/constants.coffee +++ b/src/scripts/constants.coffee @@ -15,10 +15,20 @@ exports.Opacity = Opacity = {} Opacity.hidden = 1e-6 Opacity.shown = 1 -exports.Event = Event = {} -Event.book = {} -Event.book.load = {} -Event.book.load.started = 'book:load:started' # controller, url -Event.book.load.succeeded = 'book:load:succeeded' # controller, book -Event.book.load.failed = 'book:load:failed' # controller, error message -Event.book.load.finished = 'book:load:finished' # controller +exports.Event = Event = {} +Event.change = 'change' +Event.load = {} +Event.load.started = 'book:load:started' # controller, url +Event.load.succeeded = 'book:load:succeeded' # controller, book +Event.load.failed = 'book:load:failed' # controller, error message +Event.load.finished = 'book:load:finished' # controller + +exports.DefaultBookUrls = DefaultBookUrls = [ + '/data/vanilla.json' + '/data/applied_energetics.json' + '/data/buildcraft.json' + '/data/gravisuite.json' + '/data/industrial_craft.json' + '/data/more_blocks.json' + '/data/thermal_expansion.json' +] diff --git a/src/scripts/controllers/base_controller.coffee b/src/scripts/controllers/base_controller.coffee index ee481fb6b..fe66afae7 100644 --- a/src/scripts/controllers/base_controller.coffee +++ b/src/scripts/controllers/base_controller.coffee @@ -12,6 +12,9 @@ views = require '../views' module.exports = class BaseController extends Backbone.View constructor: (options={})-> + Object.defineProperty this, 'model', get:@getModel, set:@setModel + + @_model = null @_rendered = false @_parent = options.parent @_children = [] @@ -35,10 +38,40 @@ module.exports = class BaseController extends Backbone.View # Event Methods ################################################################################ + onDidModelChange: -> + @_tryRefresh() + + onDidModelSync: -> + @_tryRefresh() + onWillRender: -> # do nothing onDidRender: -> - @refresh() + @_tryRefresh() + + onWillShow: -> # do nothing + + onDidShow: -> # do nothing + + onWillChangeModel: (oldModel, newModel)-> + if oldModel?.on? + @stopListening oldModel + if newModel?.on? + @listenTo newModel, 'sync', (e)=> @onDidModelSync e + @listenTo newModel, 'change', (e)=> @onDidModelChange e + return true + + # Property Methods ############################################################################# + + getModel: -> + return @_model + + setModel: (newModel)-> + return if @model is newModel + return unless @onWillChangeModel @_model, newModel + + @_model = newModel + @_tryRefresh() # Backbone.View Overrides ###################################################################### @@ -75,3 +108,7 @@ module.exports = class BaseController extends Backbone.View _loadTemplate: (templateName)-> if templateName? @_template = views[templateName] + + _tryRefresh: -> + return unless @_rendered + @refresh() diff --git a/src/scripts/controllers/landing_page_controller.coffee b/src/scripts/controllers/landing_page_controller.coffee index c9052fa07..ac9b795f1 100644 --- a/src/scripts/controllers/landing_page_controller.coffee +++ b/src/scripts/controllers/landing_page_controller.coffee @@ -1,5 +1,5 @@ ### -# Crafting Guide - crafting_guide_controller.coffee +# Crafting Guide - landing_page_controller.coffee # # Copyright (c) 2014 by Redwood Labs # All rights reserved. @@ -21,5 +21,5 @@ module.exports = class LandingPageController extends BaseController # BaseController Overrides ##################################################################### onDidRender: -> - @recipeBooksController = @addChild RecipeCatalogController, '.view__recipe_catalog' + @recipeBooksController = @addChild RecipeCatalogController, '.view__recipe_catalog', model:@model.catalog super diff --git a/src/scripts/controllers/recipe_book_controller.coffee b/src/scripts/controllers/recipe_book_controller.coffee new file mode 100644 index 000000000..c1c85e871 --- /dev/null +++ b/src/scripts/controllers/recipe_book_controller.coffee @@ -0,0 +1,28 @@ +### +# Crafting Guide - recipe_book_controller.coffee +# +# Copyright (c) 2014 by Redwood Labs +# All rights reserved. +### + +BaseController = require './base_controller' + +######################################################################################################################## + +module.exports = class RecipeBookController extends BaseController + + constructor: (options={})-> + if not options.model? then throw new Error "options.model is required" + options.templateName = 'recipe_book' + super options + + # BaseController Overrides ##################################################################### + + onDidRender: -> + @$name = @$('td:nth-child(1) p') + @$description = @$('td:nth-child(2) p') + super + + refresh: -> + @$name.html "#{@model.modName} (#{@model.modVersion})" + @$description.html "#{@model.description}" diff --git a/src/scripts/controllers/recipe_catalog_controller.coffee b/src/scripts/controllers/recipe_catalog_controller.coffee index e20b8089d..63a80ca44 100644 --- a/src/scripts/controllers/recipe_catalog_controller.coffee +++ b/src/scripts/controllers/recipe_catalog_controller.coffee @@ -5,12 +5,36 @@ # All rights reserved. ### -BaseController = require './base_controller' +BaseController = require './base_controller' +RecipeBookController = require './recipe_book_controller' ######################################################################################################################## module.exports = class RecipeCatalogController extends BaseController constructor: (options={})-> + if not options.model? then throw new Error "options.model is required" + @_bookControllers = [] + options.templateName = 'recipe_catalog' super options + + # BaseController Overrides ##################################################################### + + onDidRender: -> + @$table = @$('table') + super + + refresh: -> + @$('table tr:not(:last-child)').remove() + return unless @model? + + @_bookControllers = [] + for i in [@model.books.length-1..0] by -1 + book = @model.books[i] + controller = new RecipeBookController model:book + controller.render() + @_bookControllers.push controller + @$table.prepend controller.$el + + super diff --git a/src/scripts/crafting_guide_router.coffee b/src/scripts/crafting_guide_router.coffee index ce971d19e..22ac41aeb 100644 --- a/src/scripts/crafting_guide_router.coffee +++ b/src/scripts/crafting_guide_router.coffee @@ -41,14 +41,15 @@ module.exports = class CraftingGuideRouter extends Backbone.Router show = => @_page = controller + controller.onWillShow() controller.render() - # controller.$el.css 'opacity', Opacity.hidden $pageContent = $('.page') $pageContent.empty() $pageContent.append controller.$el - controller.$el.fadeIn showDuration + controller.$el.fadeIn showDuration, -> + controller.onDidShow() if @_mainController? showDuration = Duration.fast diff --git a/src/scripts/models/recipe_catalog.coffee b/src/scripts/models/recipe_catalog.coffee index ad5a30f53..a9be601f6 100644 --- a/src/scripts/models/recipe_catalog.coffee +++ b/src/scripts/models/recipe_catalog.coffee @@ -5,9 +5,10 @@ # All rights reserved. ### -BaseModel = require './base_model' -{Event} = require '../constants' -RecipeBookParser = require './recipe_book_parser' +BaseModel = require './base_model' +{DefaultBookUrls} = require '../constants' +{Event} = require '../constants' +RecipeBookParser = require './recipe_book_parser' ######################################################################################################################## @@ -18,35 +19,51 @@ module.exports = class RecipeCatalog extends BaseModel super attributes, options @_parser = new RecipeBookParser + if @books.length is 0 + @loadAllBooks DefaultBookUrls # Public Methods ############################################################################### loadBook: (url)-> - @trigger Event.book.load.started, this, url - $.ajax - url: url - dataType: 'json' - success: (data, status, xhr)=> @onBookLoaded(data, status, xhr) - error: (xhr, status, error)=> @onBookLoadFailed(error, status, xhr) + w.promise (resolve, reject)=> + @trigger Event.load.started, this, url + $.ajax + url: url + dataType: 'json' + success: (data, status, xhr)=> + resolve @onBookLoaded(url, data, status, xhr) + error: (xhr, status, error)=> + reject @onBookLoadFailed(url, error, status, xhr) + + loadAllBooks: (urlList)-> + promises = (@loadBook(url) for url in urlList) + return w.settle promises # Event Methods ################################################################################ - onBookLoaded: (data, status, xhr)-> + onBookLoaded: (url, data, status, xhr)-> try - @books.push @_parser.parse data - _(@books).sortBy 'name' + book = @_parser.parse data + @books.push book + @books.sort (a, b)-> + return 0 if a.modName is b.modName + return if a.modName < b.modName then -1 else +1 - logger.info "loaded recipe book: #{book}" - @trigger Event.book.load.succeeded, this, book - @trigger Event.book.load.finished, this + logger.info "loaded recipe book from #{url}: #{book}" + @trigger Event.load.succeeded, this, book + @trigger Event.load.finished, this + @trigger Event.change, this + + return book catch e - @onBookLoadFailed error, status, xhr + @onBookLoadFailed url, e, status, xhr - - onBookLoadFailed: (error, status, xhr)-> - logger.error "failed to load recipe book: #{error}" - @trigger Event.book.load.failed, this, error.message - @trigger Event.book.load.finished, this + onBookLoadFailed: (url, error, status, xhr)-> + message = if error.stack? then error.stack else error + logger.error "failed to load recipe book from #{url}: #{message}" + @trigger Event.load.failed, this, error.message + @trigger Event.load.finished, this + return error # Object Overrides ############################################################################# diff --git a/src/scripts/views.js b/src/scripts/views.js index d4d321650..7261fbd2d 100644 --- a/src/scripts/views.js +++ b/src/scripts/views.js @@ -11,13 +11,22 @@ var jade_indent = []; buf.push("\n
\n
\n
\n
");;return buf.join(""); }; +this["JST"]["recipe_book"] = function template(locals) { +var buf = []; +var jade_mixins = {}; +var jade_interp; + +var jade_indent = []; +buf.push("\n\n \n

\n \n \n

\n \n");;return buf.join(""); +}; + this["JST"]["recipe_catalog"] = function template(locals) { var buf = []; var jade_mixins = {}; var jade_interp; var jade_indent = []; -buf.push("\n
\n

\n

Recipe Catalog

\n

\n \n \n \n \n \n
 \n \n \n
\n
\n

\n
\n
");;return buf.join(""); +buf.push("\n
\n

\n

Recipe Catalog

\n

\n \n \n \n \n \n
 \n \n \n
\n
\n

\n
\n
");;return buf.join(""); }; this["JST"]["test"] = function template(locals) { diff --git a/src/templates/recipe_book.jade b/src/templates/recipe_book.jade new file mode 100644 index 000000000..443e7f6c1 --- /dev/null +++ b/src/templates/recipe_book.jade @@ -0,0 +1,10 @@ +//- +//- Crafting Guide - recipe_book.jade +//- +//- Copyright (c) 2014 by Redwood Labs +//- All rights reserved. +//- + +tr + td: p + td: p diff --git a/src/templates/recipe_catalog.jade b/src/templates/recipe_catalog.jade index b7190380b..5d51a5e2a 100644 --- a/src/templates/recipe_catalog.jade +++ b/src/templates/recipe_catalog.jade @@ -10,7 +10,7 @@ img(src="/images/bookshelf.png") p Recipe Catalog - table.books + table tr td   td