Add local storage for certain UI state

This commit is contained in:
Andrew Miner
2015-01-16 09:01:06 -08:00
parent 33b9214386
commit 03b46f3958
4 changed files with 66 additions and 0 deletions
+1
View File
@@ -34,6 +34,7 @@ Event.load.failed = 'load:failed' # controller, error message
Event.load.finished = 'load:finished' # controller Event.load.finished = 'load:finished' # controller
Event.remove = 'remove' # collection, item... Event.remove = 'remove' # collection, item...
Event.route = 'route' Event.route = 'route'
Event.sort = 'sort'
exports.Url = Url = {} exports.Url = Url = {}
Url.itemIcon = _.template "/data/<%= modSlug %>/images/<%= itemSlug %>.png" Url.itemIcon = _.template "/data/<%= modSlug %>/images/<%= itemSlug %>.png"
@@ -7,11 +7,13 @@ All rights reserved.
BaseController = require './base_controller' BaseController = require './base_controller'
CraftingTableController = require './crafting_table_controller' CraftingTableController = require './crafting_table_controller'
{Event} = require '../constants'
ImageLoader = require './image_loader' ImageLoader = require './image_loader'
InventoryController = require './inventory_controller' InventoryController = require './inventory_controller'
ItemPage = require '../models/item_page' ItemPage = require '../models/item_page'
ModPackController = require './mod_pack_controller' ModPackController = require './mod_pack_controller'
NameFinder = require '../models/name_finder' NameFinder = require '../models/name_finder'
Storage = require '../models/storage'
######################################################################################################################## ########################################################################################################################
@@ -20,10 +22,12 @@ module.exports = class ItemPageController extends BaseController
constructor: (options={})-> constructor: (options={})->
options.model ?= new ItemPage options.model ?= new ItemPage
options.imageLoader ?= new ImageLoader defaultUrl:'/images/unknown.png' options.imageLoader ?= new ImageLoader defaultUrl:'/images/unknown.png'
options.storage ?= new Storage storage:window.localStorage
options.templateName = 'item_page' options.templateName = 'item_page'
super options super options
@imageLoader = options.imageLoader @imageLoader = options.imageLoader
@storage = options.storage
# Event Methods ################################################################################ # Event Methods ################################################################################
@@ -32,6 +36,12 @@ module.exports = class ItemPageController extends BaseController
# BaseController Overrides ##################################################################### # BaseController Overrides #####################################################################
onWillRender: ->
@storage.register 'crafting-plan', @model.plan, 'includingTools'
@model.modPack.on Event.add, (modVersion)=>
@storage.register "mod-version:#{modVersion.slug}", modVersion, 'enabled'
super
onDidRender: -> onDidRender: ->
@wantController = @addChild InventoryController, '.want', @wantController = @addChild InventoryController, '.want',
editable: true editable: true
+4
View File
@@ -115,7 +115,11 @@ module.exports = class ModPack extends BaseModel
loadModVersionData: (data)-> loadModVersionData: (data)->
modVersion = @_parser.parse data modVersion = @_parser.parse data
@modVersions.push modVersion @modVersions.push modVersion
@trigger Event.add, modVersion, this
@modVersions.sort (a, b)-> a.compareTo b @modVersions.sort (a, b)-> a.compareTo b
@trigger Event.sort, this
modVersion.on Event.change, => @trigger Event.change, this modVersion.on Event.change, => @trigger Event.change, this
return modVersion return modVersion
+51
View File
@@ -0,0 +1,51 @@
###
Crafting Guide - storage.coffee
Copyright (c) 2015 by Redwood Labs
All rights reserved.
###
########################################################################################################################
module.exports = class Storage
constructor: (options={})->
options.storage ?= window.sessionStorage
@storage = options.storage
@_models = {}
# Public Methods ###############################################################################
register: (key, model, properties...)->
modelData = @_models[key]
if not modelData? then modelData = @_models[key] = model:model, properties:{}
makeStoreMethod = (k, m, p)=> return => @_store(k, m, p)
for property in properties
continue if modelData.properties[property]?
modelData.properties[property] = property
@_load key, model, property
model.on "change:#{property}", makeStoreMethod(key, model, property)
unregister: (key, property)->
modelData = @_models[key]
return unless modelData?
delete modelData.properties[key]
# Private Methods ##############################################################################
_load: (key, model, property)->
value = @storage.getItem "#{key}:#{property}"
value = JSON.parse(value) if value?
logger.verbose "loaded #{value} from #{key}:#{property}"
return unless value?
model[property] = value
_store: (key, model, property)->
value = JSON.stringify model[property]
@storage.setItem "#{key}:#{property}", value
logger.verbose "stored #{value} into #{key}:#{property}"