From f461aeca957396a0e337fc8329a1ca6f99d2c5c9 Mon Sep 17 00:00:00 2001 From: Nick Winter <livelily@gmail.com> Date: Tue, 4 Nov 2014 19:03:35 -0800 Subject: [PATCH] Implemented new playback scrubber textures. --- .../images/level/scrubber_background.png | Bin 19807 -> 13366 bytes app/styles/base.sass | 38 +----- app/styles/play/level.sass | 8 -- app/styles/play/level/goals.sass | 2 +- app/styles/play/level/multiplayer-status.sass | 2 + app/styles/play/level/playback.sass | 115 +++++++++------- app/styles/play/spectate.sass | 8 -- app/templates/play/level/goals.jade | 2 +- app/templates/play/level/hud.jade | 2 - app/templates/play/level/playback.jade | 50 +++---- app/views/play/level/LevelPlaybackView.coffee | 129 +++++++----------- 11 files changed, 141 insertions(+), 215 deletions(-) diff --git a/app/assets/images/level/scrubber_background.png b/app/assets/images/level/scrubber_background.png index a70abeb975a3de45c7d5e9318ff60535b0b78996..517a4c8c46bca5b355abdbb0ddc4b192883e8d11 100644 GIT binary patch literal 13366 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 literal 19807 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 IM6N<$g6O;~7ytkO diff --git a/app/styles/base.sass b/app/styles/base.sass index 0acc6fb48..581dd249a 100644 --- a/app/styles/base.sass +++ b/app/styles/base.sass @@ -153,40 +153,6 @@ a cursor: pointer -// Bigger versions of some Bootstrap icons -// TODO: make the non-white versions of these if we ever need them -.icon.big - background-image: url(/images/pages/base/glyphicons-simplified.png) - -.icon-white.big - background-image: url(/images/pages/base/glyphicons-simplified.png) - -.icon.big, .icon-white.big - width: 19px - height: 19px - line-height: 19px - -.icon-pause.big - background-position: -114px 0px - -.icon-play.big - background-position: -95px 0px - -.icon-repeat.big - background-position: -76px 0px - -.icon-volume-off.big - background-position: -57px 0px - -.icon-volume-down.big - background-position: -38px 0px - -.icon-volume-up.big - background-position: -19px 0px - -.icon-cog.big - background-position: 0px 0px - // loading screens for everything but the play view .loading-screen .progress @@ -339,3 +305,7 @@ kbd &.gem-60 width: 60px height: 60px + +.popover + border-image: url(/images/level/popover_background.png) 29 39 fill stretch + border-width: 15px 20px diff --git a/app/styles/play/level.sass b/app/styles/play/level.sass index 2a1fc972d..3ba3274b6 100644 --- a/app/styles/play/level.sass +++ b/app/styles/play/level.sass @@ -144,14 +144,6 @@ $level-resize-transition-time: 0.5s left: -3px bottom: 0 - #hud-top-gradient - top: -32px - background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) - left: 0 - right: 0 - bottom: 0 - height: 3px - #canvas-left-gradient left: 0px width: 5px diff --git a/app/styles/play/level/goals.sass b/app/styles/play/level/goals.sass index 94aef8605..b65998a21 100644 --- a/app/styles/play/level/goals.sass +++ b/app/styles/play/level/goals.sass @@ -9,7 +9,7 @@ background: transparent url(/images/level/goals_background.png) background-size: 100% 100% - padding: 19px 17px 6px 25px + padding: 19px 17px 2px 25px z-index: 3 font-size: 14px diff --git a/app/styles/play/level/multiplayer-status.sass b/app/styles/play/level/multiplayer-status.sass index 0e16da6bf..c0fe93828 100644 --- a/app/styles/play/level/multiplayer-status.sass +++ b/app/styles/play/level/multiplayer-status.sass @@ -4,6 +4,8 @@ // TODO: Replace this devart with nice shinies #multiplayer-status-view + position: absolute + .player-count color: white .players-available diff --git a/app/styles/play/level/playback.sass b/app/styles/play/level/playback.sass index 2434fb1af..92e5a2c81 100644 --- a/app/styles/play/level/playback.sass +++ b/app/styles/play/level/playback.sass @@ -2,50 +2,52 @@ @import "app/styles/bootstrap/variables" #playback-view + $playback-button-color: rgb(248, 197, 146) + // When 75% alpha, it will look like the rgb(194, 154, 114) from Heald's design width: 55% - height: 30px + height: 60px + padding-top: 17px position: relative - background: #383434 - // Counteract 50px height of absolutely positioned control bar. - margin-top: 50px + background: transparent url(/images/level/scrubber_background.png) + background-size: 100% 100% + // Counteract 50px height of absolutely positioned control bar, but overlap by 10px of jagged transparent top. + margin-top: 50px - 10px + z-index: 2 button - height: 26px + font-size: 26px + margin-left: 10px background: transparent - @include opacity(0.50) - i + @include opacity(0.75) + color: $playback-button-color + text-shadow: 1px 1px 0px black + + .glyphicon position: relative button:hover - @include opacity(0.75) - + @include opacity(1) + #play-button, #volume-button, #music-button float: left - margin-left: 2px - margin-top: 2px - width: 25px position: relative #music-button - @include opacity(0.25) - font-size: 20px + @include opacity(0.5) span position: relative left: -3px top: -2px &:hover - @include opacity(0.50) + @include opacity(0.75) &.music-on - @include opacity(0.50) + @include opacity(0.75) &:hover - @include opacity(0.75) + @include opacity(1) #play-button, #volume-button - i + .glyphicon display: none - position: absolute - left: 2px - top: 2px #settings-button padding-left: 4px @@ -54,51 +56,58 @@ #playback-settings float: right position: relative - top: 2px - margin-right: 2px - ul i + margin-right: 10px + ul button margin: 0 10px li:hover background: #add8e6 - #play-button.disabled i - @include opacity(0.5) - #play-button.playing i.icon-pause + #play-button.disabled .glyphicon + @include opacity(0.75) + #play-button.playing .glyphicon-pause display: inline-block - #play-button.paused i.icon-play + #play-button.paused .glyphicon-play display: inline-block - #play-button.ended i.icon-repeat + #play-button.ended .glyphicon-repeat display: inline-block - #volume-button.vol-up i.icon-volume-up + #volume-button.vol-up .glyphicon.glyphicon-volume-up display: inline-block - #volume-button.vol-off i.icon-volume-off + #volume-button.vol-off .glyphicon.glyphicon-volume-off display: inline-block - @include opacity(0.50) + @include opacity(0.75) &:hover - @include opacity(0.75) - #volume-button.vol-down i.icon-volume-down + @include opacity(1) + #volume-button.vol-down .glyphicon.glyphicon-volume-down display: inline-block .scrubber position: absolute - left: 100px - top: 0px + left: 170px + top: 21px bottom: 0px - right: 125px + right: 175px + background: rgb(3, 3, 3) + height: 28px + border: 1px solid rgb(67, 67, 44) + border-radius: 14px + + .scrubber-inner + border: 1px solid rgb(44, 38, 29) + width: 100% + height: 100% + border-radius: 14px + padding: 6px 8px .progress float: left width: 100% - height: 14px - margin-top: 8px + height: 12px cursor: pointer overflow: visible border: 1px solid #444 - // Remove gradient background in favor of solid fill - background-color: #888 - background-image: none - border-radius: 0 + background: rgb(80, 67, 53) + border-radius: 6px border: 0 // Can't do this transition because handle then jitters, but would be good for streaming. //@include transition(width .2s linear) @@ -113,19 +122,19 @@ @include transition(width .0s linear) position: relative // Remove gradient background in favor of solid fill - background-color: #67A4C8 - //background-image: none // gradient looks kind of cool though; keep it in + background: rgb(245, 170, 49) + border: 1px solid rgb(62, 45, 16) + border-radius: 6px .scrubber-handle cursor: pointer position: absolute - right: -16px - top: -9px - background: transparent url(/images/level/playback_thumb.png) - width: 32px - height: 32px - // z: above the gradient line bordering the playback bar - z-index: 6 + right: -18px + top: -11px + background: transparent url(/images/level/scrubber_knob.png) + background-size: contain + width: 36px + height: 36px .ui-slider-handle height: 100% @@ -140,3 +149,5 @@ body.ipad #playback-view #playback-settings display: none + .scrubber + right: 25px diff --git a/app/styles/play/spectate.sass b/app/styles/play/spectate.sass index 227b86db0..d102a7197 100644 --- a/app/styles/play/spectate.sass +++ b/app/styles/play/spectate.sass @@ -124,14 +124,6 @@ left: -3px bottom: 0 - #hud-top-gradient - top: -32px - background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.8*$GI) 100%) - left: 0 - right: 0 - bottom: 0 - height: 3px - #canvas-left-gradient left: 0px width: 5px diff --git a/app/templates/play/level/goals.jade b/app/templates/play/level/goals.jade index d1e0b689c..5186106dd 100644 --- a/app/templates/play/level/goals.jade +++ b/app/templates/play/level/goals.jade @@ -1,6 +1,6 @@ ul#primary-goals-list div.goals-status - strong(data-i18n="play_level.goals") Goals + span(data-i18n="play_level.goals") Goals span.spr : span(data-i18n="play_level.success").secret.goal-status.success Success! span(data-i18n="play_level.incomplete").secret.goal-status.incomplete Incomplete diff --git a/app/templates/play/level/hud.jade b/app/templates/play/level/hud.jade index 5153f1379..5e093bf04 100644 --- a/app/templates/play/level/hud.jade +++ b/app/templates/play/level/hud.jade @@ -1,5 +1,3 @@ -#hud-top-gradient.gradient - .center .thang-canvas-wrapper.thang-elem diff --git a/app/templates/play/level/playback.jade b/app/templates/play/level/playback.jade index 5502f78cb..5d494cb67 100644 --- a/app/templates/play/level/playback.jade +++ b/app/templates/play/level/playback.jade @@ -1,45 +1,29 @@ button.btn.btn-xs.btn-inverse#play-button.paused(title="Ctrl/Cmd + P: Toggle level play/pause") - i.icon-play.icon-white.big - i.icon-pause.icon-white.big - i.icon-repeat.icon-white.big + .glyphicon.glyphicon-play + .glyphicon.glyphicon-pause + .glyphicon.glyphicon-repeat button.btn.btn-xs.btn-inverse#volume-button(title="Adjust volume") - i.icon-volume-off.icon-white.big - i.icon-volume-down.icon-white.big - i.icon-volume-up.icon-white.big + .glyphicon.glyphicon-volume-off + .glyphicon.glyphicon-volume-down + .glyphicon.glyphicon-volume-up button.btn.btn-xs.btn-inverse#music-button(title="Toggle Music") span ♫ .scrubber - .progress.secret#timeProgress - .progress-bar - .scrubber-handle - .popover.fade.top.in#timePopover - .arrow - h3.popover-title - .popover-content + .scrubber-inner + .progress.secret#timeProgress + .progress-bar + .scrubber-handle + .popover.fade.top.in#timePopover + .arrow + h3.popover-title + .popover-content .btn-group.dropup#playback-settings button.btn.btn-xs.btn-inverse.toggle-fullscreen(title="Toggle fullscreen") - i.icon-fullscreen.icon-white + .glyphicon.glyphicon-fullscreen button.btn.btn-xs.btn-inverse#zoom-in-button(title="Zoom In (or scroll down)") - i.icon-zoom-in.icon-white + .glyphicon.glyphicon-zoom-in button.btn.btn-xs.btn-inverse#zoom-out-button(title="Zoom Out (or scroll up)") - i.icon-zoom-out.icon-white - button.btn.btn-xs.btn-inverse.dropdown-toggle(data-toggle="dropdown")#settings-button - i.icon-cog.icon-white.big - ul.dropdown-menu - if me.get('name') == "Nick" - li(title="Ctrl/Cmd + \\: Toggle debug display").selectable#debug-toggle - i.icon-globe - | Debug Mode - i.icon-ok.secret - li.selectable#view-keyboard-shortcuts - i.icon-info-sign - span(data-i18n="play_level.keyboard_shortcuts") Key Shortcuts - li.selectable#edit-wizard-settings - i.icon-user - span(data-i18n="play_level.customize_wizard") Customize Wizard - li.selectable#edit-editor-config - i.icon-edit - span(data-i18n="play_level.editor_config") Editor Config + .glyphicon.glyphicon-zoom-out diff --git a/app/views/play/level/LevelPlaybackView.coffee b/app/views/play/level/LevelPlaybackView.coffee index 81bf36555..31b495642 100644 --- a/app/views/play/level/LevelPlaybackView.coffee +++ b/app/views/play/level/LevelPlaybackView.coffee @@ -17,7 +17,6 @@ module.exports = class LevelPlaybackView extends CocoView 'level:scrub-forward': 'onScrubForward' 'level:scrub-back': 'onScrubBack' 'level:set-volume': 'onSetVolume' - 'level:set-debug': 'onSetDebug' 'surface:frame-changed': 'onFrameChanged' 'god:new-world-created': 'onNewWorld' 'god:streaming-world-updated': 'onNewWorld' @@ -28,10 +27,6 @@ module.exports = class LevelPlaybackView extends CocoView 'real-time-multiplayer:manual-cast': 'onRealTimeMultiplayerCast' events: - 'click #debug-toggle': 'onToggleDebug' - 'click #edit-wizard-settings': 'onEditWizardSettings' - 'click #edit-editor-config': 'onEditEditorConfig' - 'click #view-keyboard-shortcuts': 'onViewKeyboardShortcuts' 'click #music-button': 'onToggleMusic' 'click #zoom-in-button': -> Backbone.Mediator.publish 'camera:zoom-in', {} unless @shouldIgnore() 'click #zoom-out-button': -> Backbone.Mediator.publish 'camera:zoom-out', {} unless @shouldIgnore() @@ -52,59 +47,6 @@ module.exports = class LevelPlaybackView extends CocoView '⌘+], ctrl+]': 'onScrubForward' '⌘+⇧+], ctrl+⇧+]': 'onSingleScrubForward' - # popover that shows at the current mouse position on the progressbar, using the bootstrap popover. - # Could make this into a jQuery plugins itself theoretically. - class HoverPopup extends $.fn.popover.Constructor - constructor: () -> - @enabled = true - @shown = false - @type = 'HoverPopup' - @options = - placement: 'top' - container: 'body' - animation: true - html: true - delay: - show: 400 - @$element = $('#timeProgress') - @$tip = $('#timePopover') - - @content = '' - - getContent: -> @content - - show: -> - unless @shown - super() - @shown = true - - updateContent: (@content) -> - @setContent() - @$tip.addClass('fade top in') - - onHover: (@e) -> - pos = @getPosition() - actualWidth = @$tip[0].offsetWidth - actualHeight = @$tip[0].offsetHeight - calculatedOffset = - top: pos.top - actualHeight - left: pos.left + pos.width / 2 - actualWidth / 2 - this.applyPlacement(calculatedOffset, 'top') - - getPosition: -> - top: @$element.offset().top - left: if @e? then @e.pageX else @$element.offset().left - height: 0 - width: 0 - - hide: -> - super() - @shown = false - - disable: -> - super() - @hide() - constructor: -> super(arguments...) me.on('change:music', @updateMusicButton, @) @@ -192,20 +134,6 @@ module.exports = class LevelPlaybackView extends CocoView @currentTime = 0 @lastLoadedFrameCount = loadedFrameCount - onToggleDebug: -> - return if @shouldIgnore() - flag = $('#debug-toggle i.icon-ok') - Backbone.Mediator.publish('level:set-debug', {debug: flag.hasClass('invisible')}) - - onEditWizardSettings: -> - Backbone.Mediator.publish 'level:edit-wizard-settings', {} - - onEditEditorConfig: -> - @openModalView new EditorConfigModal session: @options.session - - onViewKeyboardShortcuts: -> - @openModalView new KeyboardShortcutsModal() - onDisableControls: (e) -> if not e.controls or 'playback' in e.controls @disabled = true @@ -340,10 +268,6 @@ module.exports = class LevelPlaybackView extends CocoView Backbone.Mediator.publish 'level:set-letterbox', on: false Backbone.Mediator.publish 'playback:real-time-playback-ended', {} - onSetDebug: (e) -> - flag = $('#debug-toggle i.icon-ok') - flag.toggleClass 'invisible', not e.debug - # to refactor hookUpScrubber: -> @@ -423,3 +347,56 @@ module.exports = class LevelPlaybackView extends CocoView $(window).off('resize', @onWindowResize) @onWindowResize = null super() + +# popover that shows at the current mouse position on the progressbar, using the bootstrap popover. +# Could make this into a jQuery plugins itself theoretically. +class HoverPopup extends $.fn.popover.Constructor + constructor: () -> + @enabled = true + @shown = false + @type = 'HoverPopup' + @options = + placement: 'top' + container: 'body' + animation: true + html: true + delay: + show: 400 + @$element = $('#timeProgress') + @$tip = $('#timePopover') + + @content = '' + + getContent: -> @content + + show: -> + unless @shown + super() + @shown = true + + updateContent: (@content) -> + @setContent() + @$tip.addClass('fade top in') + + onHover: (@e) -> + pos = @getPosition() + actualWidth = @$tip[0].offsetWidth + actualHeight = @$tip[0].offsetHeight + calculatedOffset = + top: pos.top - actualHeight + left: pos.left + pos.width / 2 - actualWidth / 2 + this.applyPlacement(calculatedOffset, 'top') + + getPosition: -> + top: @$element.offset().top + left: if @e? then @e.pageX else @$element.offset().left + height: 0 + width: 0 + + hide: -> + super() + @shown = false + + disable: -> + super() + @hide()