From 636a8d061ca38a0fe58ce91408c657910889fd58 Mon Sep 17 00:00:00 2001 From: Andrew Miner Date: Thu, 28 Apr 2016 22:38:04 -0700 Subject: [PATCH] Don't show page until fully loaded --- src/client/models/base_model.coffee | 33 ++++++++++++++++++++++++-- src/client/models/game/mod.coffee | 7 ++++-- src/client/models/game/mod_pack.coffee | 19 ++++++++++----- src/client/models/game/recipe.coffee | 6 ++++- src/client/site/index.jade | 2 +- src/client/site/site_controller.coffee | 6 +++-- src/client/styles/classes.scss | 4 ++++ 7 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/client/models/base_model.coffee b/src/client/models/base_model.coffee index 3f8c279ab..8da42e281 100644 --- a/src/client/models/base_model.coffee +++ b/src/client/models/base_model.coffee @@ -9,6 +9,9 @@ module.exports = class BaseModel extends Backbone.Model + @_loadingQueue = [] + @_isDraining = false + constructor: (attributes={}, options={})-> options.logEvents ?= true super attributes, options @@ -72,8 +75,7 @@ module.exports = class BaseModel extends Backbone.Model if @fileCache? @loading = @fileCache.loading.then => if @fileCache.hasFile url - @onLoadSucceeded @fileCache.getFile(url), 'success', {url:url} - return w.resolve(true) + return @_addToLoadingQueue @fileCache.getFile(url), 'success', {url:url} else @loading = loadFromServer() else @@ -98,3 +100,30 @@ module.exports = class BaseModel extends Backbone.Model toString: -> return "#{@constructor.name}.#{@cid}" + + # Private Methods ############################################################################## + + _addToLoadingQueue: (text, status, xhr)-> + deferred = w.defer() + + BaseModel._loadingQueue.push resolve:deferred.resolve, func:(=> @onLoadSucceeded text, status, xhr) + @_drainLoadingQueue() + return deferred.promise + + _drainLoadingQueue: -> + return if @_isDraining + @_isDraining = true + + drainDelay = 50 + drain = => + toLoad = BaseModel._loadingQueue.shift() + if not toLoad? + @_isDraining = false + else + toLoad.func() + toLoad.resolve(true) + + _.delay drain, drainDelay + + _.delay drain, drainDelay + diff --git a/src/client/models/game/mod.coffee b/src/client/models/game/mod.coffee index d26e87907..aebfe2148 100644 --- a/src/client/models/game/mod.coffee +++ b/src/client/models/game/mod.coffee @@ -29,8 +29,6 @@ module.exports = class Mod extends BaseModel @_modVersions = [] @_tutorials = [] - @once c.event.sync, => @_verifyActiveModVersion() - # Class Methods ################################################################################## @Version: Version = @@ -144,6 +142,9 @@ module.exports = class Mod extends BaseModel for modVersion in @_modVersions callback modVersion + getAllModVersions: -> + return @_modVersions[..] + getModVersion: (version)-> return null if version is Mod.Version.None return @_modVersions[0] if version is Mod.Version.Latest @@ -202,6 +203,8 @@ module.exports = class Mod extends BaseModel @_parser ?= new ModParser model:this @_parser.parse text + @_verifyActiveModVersion() + return null # prevent calling `set` url: -> diff --git a/src/client/models/game/mod_pack.coffee b/src/client/models/game/mod_pack.coffee index 8b7fd2b39..10aba6bd3 100644 --- a/src/client/models/game/mod_pack.coffee +++ b/src/client/models/game/mod_pack.coffee @@ -6,9 +6,10 @@ # BaseModel = require '../base_model' -SimpleInventory = require '../crafting/simple_inventory' +Mod = require './mod' ModVersionParser = require '../parsing/mod_version_parser' Recipe = require './recipe' +SimpleInventory = require '../crafting/simple_inventory' ######################################################################################################################## @@ -165,12 +166,18 @@ module.exports = class ModPack extends BaseModel # Private Methods ############################################################################## _onModVersionLoaded: (modVersion)-> - working = true - @eachMod (mod)-> - mod.eachModVersion (modVersion)-> - working = working and (modVersion.isUnloaded or modVersion.isLoading) + mods = @getAllMods() + return true unless mods.length > 0 - return if working + for mod in mods + modVersions = mod.getAllModVersions() + return true unless modVersions.length > 0 + continue if mod.activeVersion is Mod.Version.None + + activeModVersion = mod.activeModVersion + return true unless activeModVersion? + return true if activeModVersion.isUnloaded + return true if activeModVersion.isLoading @trigger c.event.change, this @trigger c.event.sync, this diff --git a/src/client/models/game/recipe.coffee b/src/client/models/game/recipe.coffee index 7e52c6e9f..a3416a42f 100644 --- a/src/client/models/game/recipe.coffee +++ b/src/client/models/game/recipe.coffee @@ -212,7 +212,11 @@ module.exports = class Recipe extends BaseModel _computeQuantities: (pattern)-> quantityMap = {} - for c in pattern.split '' + index = 0 + while index < pattern.length + c = pattern[index] + index += 1 + continue if c is '.' continue if c is ' ' diff --git a/src/client/site/index.jade b/src/client/site/index.jade index b6e0f7aea..9d2ca638f 100644 --- a/src/client/site/index.jade +++ b/src/client/site/index.jade @@ -21,7 +21,7 @@ html .page .view__header - .content(style="display: none") + .content.hidden .content-loading img(src="/images/wait.gif") diff --git a/src/client/site/site_controller.coffee b/src/client/site/site_controller.coffee index 0cf7b832f..d921be6d7 100644 --- a/src/client/site/site_controller.coffee +++ b/src/client/site/site_controller.coffee @@ -53,8 +53,8 @@ module.exports = class SiteController extends BaseController if global.env isnt 'prerender' @modPack.once c.event.sync, => - @$pageContent.css 'display', '' - @$pageContentLoading.css 'display', 'none' + @$pageContent.removeClass 'hidden' + @$pageContentLoading.addClass 'hidden' loadCurrentUser: -> @client.fetchCurrentUser() @@ -144,6 +144,8 @@ module.exports = class SiteController extends BaseController $pageContent = $('.page > .content') $pageContent.removeClass() $pageContent.addClass 'content' + if not @$pageContentLoading.hasClass 'hidden' + $pageContent.addClass 'hidden' window.scrollTo 0, 0 diff --git a/src/client/styles/classes.scss b/src/client/styles/classes.scss index 0bef669c9..59006e2ed 100644 --- a/src/client/styles/classes.scss +++ b/src/client/styles/classes.scss @@ -69,6 +69,10 @@ } } +.hidden { + display: none !important; +} + .page > .content { min-height: $size-skyscraper-height; }