From 03b46f3958e567c7f935a434453e9499e4983eff Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Fri, 16 Jan 2015 09:01:06 -0800 Subject: [PATCH] Add local storage for certain UI state --- src/scripts/constants.coffee | 1 + .../controllers/item_page_controller.coffee | 10 ++++ src/scripts/models/mod_pack.coffee | 4 ++ src/scripts/models/storage.coffee | 51 +++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 src/scripts/models/storage.coffee diff --git a/src/scripts/constants.coffee b/src/scripts/constants.coffee index 818d35d39..70dc0e493 100644 --- a/src/scripts/constants.coffee +++ b/src/scripts/constants.coffee @@ -34,6 +34,7 @@ Event.load.failed = 'load:failed' # controller, error message Event.load.finished = 'load:finished' # controller Event.remove = 'remove' # collection, item... Event.route = 'route' +Event.sort = 'sort' exports.Url = Url = {} Url.itemIcon = _.template "/data/<%= modSlug %>/images/<%= itemSlug %>.png" diff --git a/src/scripts/controllers/item_page_controller.coffee b/src/scripts/controllers/item_page_controller.coffee index 7f6932637..01fc32d48 100644 --- a/src/scripts/controllers/item_page_controller.coffee +++ b/src/scripts/controllers/item_page_controller.coffee @@ -7,11 +7,13 @@ All rights reserved. BaseController = require './base_controller' CraftingTableController = require './crafting_table_controller' +{Event} = require '../constants' ImageLoader = require './image_loader' InventoryController = require './inventory_controller' ItemPage = require '../models/item_page' ModPackController = require './mod_pack_controller' NameFinder = require '../models/name_finder' +Storage = require '../models/storage' ######################################################################################################################## @@ -20,10 +22,12 @@ module.exports = class ItemPageController extends BaseController constructor: (options={})-> options.model ?= new ItemPage options.imageLoader ?= new ImageLoader defaultUrl:'/images/unknown.png' + options.storage ?= new Storage storage:window.localStorage options.templateName = 'item_page' super options @imageLoader = options.imageLoader + @storage = options.storage # Event Methods ################################################################################ @@ -32,6 +36,12 @@ module.exports = class ItemPageController extends BaseController # 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: -> @wantController = @addChild InventoryController, '.want', editable: true diff --git a/src/scripts/models/mod_pack.coffee b/src/scripts/models/mod_pack.coffee index 54dcab29c..a18e1796d 100644 --- a/src/scripts/models/mod_pack.coffee +++ b/src/scripts/models/mod_pack.coffee @@ -115,7 +115,11 @@ module.exports = class ModPack extends BaseModel loadModVersionData: (data)-> modVersion = @_parser.parse data @modVersions.push modVersion + @trigger Event.add, modVersion, this + @modVersions.sort (a, b)-> a.compareTo b + @trigger Event.sort, this + modVersion.on Event.change, => @trigger Event.change, this return modVersion diff --git a/src/scripts/models/storage.coffee b/src/scripts/models/storage.coffee new file mode 100644 index 000000000..b36864b46 --- /dev/null +++ b/src/scripts/models/storage.coffee @@ -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}"