mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-28 13:50:07 -04:00
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:
parent
8edde2f470
commit
aa9c3b5eaa
6 changed files with 61 additions and 25 deletions
app
styles
views/play/level/tome
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue