Merge pull request #794 from gintau/feature/loading-views

Refactor CocoView
This commit is contained in:
Scott Erickson 2014-04-07 14:55:14 -07:00
commit 5c6a0bc252
2 changed files with 116 additions and 105 deletions

160
.gitignore vendored
View file

@ -1,80 +1,80 @@
### If you add something here, copy it to the end of .npmignore, too. ###
# Python
*.pyc
*.pyo
# OS X
.DS_Store
Icon?
._*
.Spotlight-V100
.Trashes
# Windows
Thumbs.db
# Emacs
*.*~
*.#
.#*
*#
# Vim
.*.sw[a-z]
*.un~i
# Sublime
*.sublime-project
*.sublime-workspace
# NPM packages folder.
node_modules/
bower_components/
# Some other random stuff
always-ignore extensions
*.diff
*.err
*.orig
*.log
*.rej
*.vi
*.sass-cache
# OS or Editor folders
.cache
.project
.settings
.tmproj
.idea
nbproject
# Brunch folder for temporary files.
tmp/
# Brunch output
public/
# Redis?
dump.rdb
# Mongo
mongo/
# Karma coverage
coverage/
# Floo
.floo
FLOOBITS_README.md
# mongodb
db/
bin/node/
bin/mongo/
# windows
/SCOCODE.bat
### If you add something here, copy it to the end of .npmignore, too. ###
-### If you add something here, copy it to the end of .npmignore, too. ###
-
-# Python
-*.pyc
-*.pyo
-
-# OS X
-.DS_Store
-Icon?
-._*
-.Spotlight-V100
-.Trashes
-
-# Windows
-Thumbs.db
-
-# Emacs
-*.*~
-*.#
-.#*
-*#
-
-# Vim
-.*.sw[a-z]
-*.un~i
-
-# Sublime
-*.sublime-project
-*.sublime-workspace
-
-# NPM packages folder.
-node_modules/
-bower_components/
-
-# Some other random stuff
-always-ignore extensions
-*.diff
-*.err
-*.orig
-*.log
-*.rej
-*.vi
-*.sass-cache
-
-# OS or Editor folders
-.cache
-.project
-.settings
-.tmproj
-.idea
-nbproject
-
-# Brunch folder for temporary files.
-tmp/
-
-# Brunch output
-public/
-
-# Redis?
-dump.rdb
-
-# Mongo
-mongo/
-
-# Karma coverage
-coverage/
-
-# Floo
-.floo
-FLOOBITS_README.md
-
-# mongodb
-db/
-bin/node/
-bin/mongo/
-
-# windows
-/SCOCODE.bat
-
-### If you add something here, copy it to the end of .npmignore, too. ###

View file

@ -11,7 +11,6 @@ makeScopeName = -> "view-scope-#{classCount++}"
doNothing = ->
module.exports = class CocoView extends Backbone.View
startsLoading: false
cache: false # signals to the router to keep this view around
template: -> ''
@ -89,7 +88,7 @@ module.exports = class CocoView extends Backbone.View
return @template if _.isString(@template)
@$el.html @template(@getRenderData())
@afterRender()
@showLoading() if @startsLoading or @loading() # TODO: Remove startsLoading entirely
@showLoading() if @loading()
@$el.i18n()
@
@ -108,25 +107,45 @@ module.exports = class CocoView extends Backbone.View
# Resource and request loading management for any given view
addResourceToLoad: (modelOrCollection, name, value=1) ->
@loadProgress.resources.push {resource:modelOrCollection, value:value, name:name}
@listenToOnce modelOrCollection, 'sync', @updateProgress
res = {resource:modelOrCollection, value:value, name:name, loaded: modelOrCollection.loaded}
@loadProgress.resources.push res
@loadProgress.denom += value
@listenToOnce modelOrCollection, 'sync', ()=>
# Sprite builder only works after rendering, if callback creates sprite, we need to update progress first.
res.loaded = true
@updateProgress(res)
@listenTo modelOrCollection, 'error', @onResourceLoadFailed
@updateProgress()
@updateProgress(res)
addRequestToLoad: (jqxhr, name, retryFunc, value=1) ->
@loadProgress.requests.push {request:jqxhr, value:value, name: name, retryFunc: retryFunc}
jqxhr.done @updateProgress
jqxhr.fail @onRequestLoadFailed
res = {request:jqxhr, value:value, name: name, retryFunc: retryFunc, loaded:false}
@loadProgress.requests.push res
@loadProgress.denom += value
jqxhr.done ()=>
res.loaded = true
@updateProgress(res)
jqxhr.fail ()=>
@onRequestLoadFailed(jqxhr)
addSomethingToLoad: (name, value=1) ->
@loadProgress.somethings.push {loaded: false, name: name, value: value}
@updateProgress()
res = {name: name, value: value, loaded: false}
@loadProgress.somethings.push res
@loadProgress.denom += value
@updateProgress(res)
somethingLoaded: (name) ->
r = _.find @loadProgress.somethings, {name: name}
return console.error 'Could not find something called', name if not r
r.loaded = true
@updateProgress(name)
@updateProgress(r)
loading: ->
return false if @loaded
@ -138,27 +157,19 @@ module.exports = class CocoView extends Backbone.View
return true if not r.loaded
return false
updateProgress: =>
console.debug 'Loaded', r.name if arguments[0] and r = _.find @loadProgress.resources, {resource:arguments[0]}
console.debug 'Loaded', r.name if arguments[2] and r = _.find @loadProgress.requests, {request:arguments[2]}
console.debug 'Loaded', r.name if arguments[0] and r = _.find @loadProgress.somethings, {name:arguments[0]}
updateProgress: (r)=>
console.debug 'Loaded', r.name, r.loaded
denom = 0
denom += r.value for r in @loadProgress.resources
denom += r.value for r in @loadProgress.requests
denom += r.value for r in @loadProgress.somethings
denom = @loadProgress.denom
@loadProgress.num += r.value if r.loaded
num = @loadProgress.num
num += r.value for r in @loadProgress.resources when r.resource.loaded
num += r.value for r in @loadProgress.requests when r.request.status
num += r.value for r in @loadProgress.somethings when r.loaded
#console.log 'update progress', @, num, denom, arguments
progress = if denom then num / denom else 0
# sometimes the denominator isn't known from the outset, so make sure the overall progress only goes up
@loadProgress.progress = progress if progress > @loadProgress.progress
@updateProgressBar()
if num is denom and not @loaded
@loaded = true
if num is denom
@onLoaded()
updateProgressBar: =>