This introduces the new crafting page design featuring a new vertical layout and list display of all crafting steps. It also makes it easy to move items between the have/need sections and even from each step into your inventory (causing a new crafting plan to be created which doesn't plan on making that item). * Convert the `BaseController.hide` and `show` methods to be much more robust in the use of CSS transitions (using a timer in case a transition doesn't actually fire). * Change `hide`/`show` to use events for communicating animation state instead of callbacks * Convert several controllers to fire events for communication with parent controllers instead of accepting functions. * Rewrite the `CraftPageController`, `CraftPage` model and related Jade/SCSS files to implement the new design. * Alter the `InventoryController` and `StackController` to allow a variety of action buttons, and for the events from those action buttons to bubble up to parent controllers * Add the `StepController` and its related model, template, and style sheet as part of the new craft page. * Tweak the `ItemSelectorController` and related files to allow for a variety of styles for the launcher button
140 lines
4.8 KiB
CoffeeScript
140 lines
4.8 KiB
CoffeeScript
###
|
|
Crafting Guide - inventory_controller.coffee
|
|
|
|
Copyright (c) 2014-2015 by Redwood Labs
|
|
All rights reserved.
|
|
###
|
|
|
|
BaseController = require './base_controller'
|
|
ImageLoader = require './image_loader'
|
|
ItemSelectorController = require './item_selector_controller'
|
|
NameFinder = require '../models/name_finder'
|
|
StackController = require './stack_controller'
|
|
{Duration} = require '../constants'
|
|
{Event} = require '../constants'
|
|
{Key} = require '../constants'
|
|
|
|
########################################################################################################################
|
|
|
|
###
|
|
Events:
|
|
clear(this)
|
|
change(this)
|
|
add(this, itemSlug)
|
|
button:first(this, itemSlug)
|
|
button:second(this, itemSlug)
|
|
###
|
|
module.exports = class InventoryController extends BaseController
|
|
|
|
@MAX_QUANTITY = 9999
|
|
|
|
@ONLY_DIGITS = /^[0-9]*$/
|
|
|
|
constructor: (options={})->
|
|
if not options.imageLoader? then throw new Error 'options.imageLoader is required'
|
|
if not options.model? then throw new Error 'options.model is required'
|
|
if not options.modPack? then throw new Error 'options.modPack is required'
|
|
|
|
@imageLoader = options.imageLoader
|
|
@modPack = options.modPack
|
|
|
|
@editable = options.editable ?= true
|
|
@icon = options.icon ?= '/images/chest_front.png'
|
|
@firstButtonType = options.firstButtonType ?= null
|
|
@isAcceptable = options.isAcceptable ?= null
|
|
@secondButtonType = options.secondButtonType ?= null
|
|
@shouldEnableButton = options.shouldEnableButton ?= (model, button)-> true
|
|
@title = options.title ?= 'Inventory'
|
|
|
|
options.templateName = 'inventory'
|
|
super options
|
|
|
|
@_stackControllers = []
|
|
|
|
@listenTo @modPack, Event.change, => @refresh()
|
|
|
|
# Event Methods ################################################################################
|
|
|
|
onClearButtonClicked: ->
|
|
@model.clear()
|
|
@trigger Event.clear, this
|
|
@trigger Event.change, this
|
|
|
|
onFirstButtonClicked: (stackController)->
|
|
@trigger Event.button.first, this, stackController?.model?.itemSlug
|
|
|
|
onItemChosen: (itemSlug)->
|
|
@model.add itemSlug, 1
|
|
@trigger Event.add, this, itemSlug
|
|
@trigger Event.change, this
|
|
|
|
onSecondButtonClicked: (stackController)->
|
|
@trigger Event.button.second, this, stackController?.model?.itemSlug
|
|
|
|
# BaseController Overrides #####################################################################
|
|
|
|
onDidRender: ->
|
|
@selector = @addChild ItemSelectorController, '.view__item_selector',
|
|
isAcceptable: @isAcceptable
|
|
modPack: @modPack,
|
|
onChoseItem: (itemSlug)=> @onItemChosen(itemSlug)
|
|
|
|
@$clearButton = @$('button.clear')
|
|
@$icon = @$('.icon')
|
|
@$itemContainer = @$('.item_container')
|
|
@$title = @$('h2 p')
|
|
super
|
|
|
|
refresh: ->
|
|
if @editable
|
|
@selector.show()
|
|
else
|
|
@selector.hide()
|
|
|
|
@$icon.attr 'src', @icon
|
|
@$title.html @title
|
|
@$clearButton.disabled = @model.isEmpty
|
|
|
|
@_refreshStacks()
|
|
|
|
super
|
|
|
|
# Backbone.View Overrides ######################################################################
|
|
|
|
events: ->
|
|
return _.extend super,
|
|
'click button.clear': 'onClearButtonClicked'
|
|
'click button.first': 'onFirstButtonClicked'
|
|
'click button.second': 'onSecondButtonClicked'
|
|
|
|
# Private Methods ##############################################################################
|
|
|
|
_refreshStacks: ->
|
|
@_stackControllers ?= []
|
|
index = 0
|
|
|
|
@model.each (stack)=>
|
|
controller = @_stackControllers[index]
|
|
if not controller?
|
|
controller = new StackController
|
|
editable: @editable
|
|
firstButtonType: @firstButtonType
|
|
imageLoader: @imageLoader
|
|
model: stack
|
|
modPack: @modPack
|
|
secondButtonType: @secondButtonType
|
|
shouldEnableButton: @shouldEnableButton
|
|
controller.on Event.change, => @trigger Event.change, this
|
|
controller.on Event.button.first, (c)=> @onFirstButtonClicked(c)
|
|
controller.on Event.button.second, (c)=> @onSecondButtonClicked(c)
|
|
controller.render()
|
|
|
|
@_stackControllers.push controller
|
|
@$itemContainer.append controller.$el
|
|
else
|
|
controller.model = stack
|
|
index += 1
|
|
|
|
while @_stackControllers.length > index
|
|
@_stackControllers.pop().remove()
|