Fixed iPad scrubber positioning. Reworked spell debug progress stepper to use drags instead of hover. Hiding spell debug progress stepper based on level, not statements executed.

This commit is contained in:
Nick Winter 2014-11-05 17:34:46 -08:00
parent 8edde2f470
commit aa9c3b5eaa
6 changed files with 61 additions and 25 deletions

View file

@ -309,3 +309,10 @@ kbd
.popover
border-image: url(/images/level/popover_background.png) 29 39 fill stretch
border-width: 15px 20px
html.no-borderimage
.popover
border: 0
background: transparent url(/images/level/popover_background.png)
background-size: 100% 100%
padding: 10px 20px

View file

@ -147,6 +147,9 @@
background: transparent none
body.ipad #playback-view
// Counteract 50px height of absolutely positioned control bar, but overlap by 20px of jagged transparent top.
margin-top: 50px - 30px
#playback-settings
display: none
.scrubber

View file

@ -75,14 +75,23 @@
.metrics
display: none
top: 30px
top: 0px
position: absolute
z-index: 10
pointer-events: none
padding: 10px
background: transparent url(/images/level/popover_background.png)
background-size: 100% 100%
border-image: url(/images/level/popover_background.png) 29 39 fill stretch
padding: 0
border-width: 15px 20px
font-variant: small-caps
text-overflow: ellipsis
font-size: 13px
white-space: nowrap
html.no-borderimage
.spell-toolbar-view
.metrics
top: 30px
border: 0
background: transparent url(/images/level/popover_background.png)
background-size: 100% 100%
padding: 10px 20px

View file

@ -203,7 +203,7 @@ module.exports = class SpellPaletteView extends CocoView
# Assign any unassigned properties to the hero itself.
for owner, storage of propStorage
for prop in _.reject(@thang[storage] ? [], (prop) -> itemsByProp[prop] or prop[0] is '_') # no private properties
if prop is 'say' and @options.level.get('slug') in ['dungeons-of-kithgard', 'gems-in-the-deep', 'forgetful-gemsmith', 'shadow-guard', 'kounter-kithwise', 'crawlways-of-kithgard', 'true-names', 'favorable-odds', 'the-raised-sword', 'the-first-kithmaze', 'haunted-kithmaze', 'descending-further', 'the-second-kithmaze', 'dread-door', 'known-enemy', 'master-of-names', 'lowly-kithmen', 'closing-the-distance', 'tactical-strike', 'the-final-kithmaze', 'the-gauntlet']
if prop is 'say' and @options.level.get('slug') in ['dungeons-of-kithgard', 'gems-in-the-deep', 'forgetful-gemsmith', 'shadow-guard', 'kounter-kithwise', 'crawlways-of-kithgard', 'true-names', 'favorable-odds', 'the-raised-sword', 'the-first-kithmaze', 'haunted-kithmaze', 'descending-further', 'the-second-kithmaze', 'dread-door', 'known-enemy', 'master-of-names', 'lowly-kithmen', 'closing-the-distance', 'tactical-strike', 'the-final-kithmaze', 'the-gauntlet', 'kithgard-gates']
continue
propsByItem['Hero'] ?= []
propsByItem['Hero'].push owner: owner, prop: prop, item: itemThangTypes[@thang.spriteName]

View file

@ -11,8 +11,12 @@ module.exports = class SpellToolbarView extends CocoView
'tome:spell-step-forward': 'onStepForward'
events:
'mousemove .spell-progress': 'onProgressHover'
'mouseout .spell-progress': 'onProgressMouseOut'
'mousedown .spell-progress': 'onProgressMouseDown'
'mouseup .spell-progress': 'onProgressMouseUp'
'mousemove .spell-progress': 'onProgressMouseMove'
'tapstart .spell-progress': 'onProgressTapStart'
'tapend .spell-progress': 'onProgressTapEnd'
'tapmove .spell-progress': 'onProgressTapMove'
'click .step-backward': 'onStepBackward'
'click .step-forward': 'onStepForward'
@ -68,26 +72,38 @@ module.exports = class SpellToolbarView extends CocoView
statementIndex = Math.floor ratio * total
@setStatementIndex statementIndex unless statementIndex is @statementIndex
onProgressHover: (e) ->
return @onProgressHoverLong(e) if @maintainIndexHover
@lastHoverEvent = e
@hoverTimeout = _.delay @onProgressHoverLong, @progressHoverDelay unless @hoverTimeout
onProgressMouseDown: (e) ->
@dragging = true
@scrubProgress e
Backbone.Mediator.publish 'level:set-playing', playing: false
onProgressHoverLong: (e) =>
e ?= @lastHoverEvent
@hoverTimeout = null
offsetX = e.offsetX or e.clientX - $(e.target).offset().left
@setStatementRatio offsetX / @$el.find('.progress').width()
onProgressMouseUp: (e) ->
@dragging = false
onProgressMouseMove: (e) ->
return unless @dragging
@scrubProgress e
onProgressTapStart: (e, touchData) ->
# Haven't tested tap versions, don't even need them for iPad app, but hey, it worked for the playback scrubber.
@dragging = true
@scrubProgress e, touchData
onProgressTapEnd: (e, touchData) ->
@dragging = false
onProgressTapMove: (e, touchData) ->
return unless @dragging
@scrubProgress e, touchData
scrubProgress: (e, touchData) ->
screenOffsetX = e.clientX ? touchData?.position.x ? 0
offsetX = screenOffsetX - @$el.find('.spell-progress').offset().left
offsetX = Math.max offsetX, 0
@setStatementRatio offsetX / @$el.find('.spell-progress').width()
@updateTime()
@maintainIndexHover = true
@updateScroll()
onProgressMouseOut: (e) ->
@maintainIndexHover = false
if @hoverTimeout
clearTimeout @hoverTimeout
@hoverTimeout = null
onStepBackward: (e) -> @step -1
onStepForward: (e) -> @step 1
step: (delta) ->
@ -95,6 +111,7 @@ module.exports = class SpellToolbarView extends CocoView
@setStatementIndex @statementIndex + delta
@updateTime() if @statementTime isnt lastTime
@updateScroll()
Backbone.Mediator.publish 'level:set-playing', playing: false
updateTime: ->
@maintainIndexScrub = true
@ -112,7 +129,7 @@ module.exports = class SpellToolbarView extends CocoView
return if callState is @callState and statementIndex is @statementIndex
return unless @callState = callState
@suppressMetricsUpdates = true
if not @maintainIndexHover and not @maintainIndexScrub and statementIndex? and callState.statements[statementIndex]?.userInfo.time isnt @statementTime
if not @maintainIndexScrub and not @dragging and statementIndex? and callState.statements[statementIndex]?.userInfo.time isnt @statementTime
@setStatementIndex statementIndex
else
@setStatementRatio @statementRatio

View file

@ -716,7 +716,7 @@ module.exports = class SpellView extends CocoView
@aceSession.removeGutterDecoration row, 'executed'
@decoratedGutter[row] = ''
lastExecuted = _.last executed
showToolbarView = executed.length and (@spell.name isnt 'plan' or @spellThang.castAether.metrics.statementsExecuted > 20)
showToolbarView = executed.length and @spellThang.castAether.metrics.statementsExecuted > 3 and not (@options.level.get('slug') in ['dungeons-of-kithgard', 'gems-in-the-deep', 'forgetful-gemsmith', 'shadow-guard', 'kounter-kithwise', 'crawlways-of-kithgard', 'true-names', 'favorable-odds', 'the-raised-sword', 'the-first-kithmaze', 'haunted-kithmaze', 'descending-further', 'the-second-kithmaze', 'dread-door', 'known-enemy', 'master-of-names', 'lowly-kithmen', 'closing-the-distance', 'tactical-strike', 'the-final-kithmaze', 'the-gauntlet', 'kithgard-gates'])
if showToolbarView
statementIndex = Math.max 0, lastExecuted.length - 1