Add cursor over multiblock display
This commit is contained in:
@@ -13,6 +13,8 @@ BaseController = require './base_controller'
|
|||||||
|
|
||||||
module.exports = class MultiblockController extends BaseController
|
module.exports = class MultiblockController extends BaseController
|
||||||
|
|
||||||
|
@::HOVER_TIMEOUT = 5000 # ms
|
||||||
|
|
||||||
@::IMAGE_SIZE = 48 # px
|
@::IMAGE_SIZE = 48 # px
|
||||||
|
|
||||||
@::X_LAYER_H_SHIFT = -24 # px
|
@::X_LAYER_H_SHIFT = -24 # px
|
||||||
@@ -34,6 +36,7 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
@_blockCache = null
|
@_blockCache = null
|
||||||
@_imageLoader = options.imageLoader
|
@_imageLoader = options.imageLoader
|
||||||
@_modPack = options.modPack
|
@_modPack = options.modPack
|
||||||
|
@_onHovering = options.onHovering ?= (itemDisplay)-> # do nothing
|
||||||
|
|
||||||
# Public Methods ###############################################################################
|
# Public Methods ###############################################################################
|
||||||
|
|
||||||
@@ -53,16 +56,24 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
return false unless @model?
|
return false unless @model?
|
||||||
return @_currentLayer < @model.height - 1
|
return @_currentLayer < @model.height - 1
|
||||||
|
|
||||||
|
# Property Methods #############################################################################
|
||||||
|
|
||||||
|
Object.defineProperties @prototype,
|
||||||
|
currentLayer:
|
||||||
|
get: -> return @_currentLayer
|
||||||
|
|
||||||
# BaseController Overrides #####################################################################
|
# BaseController Overrides #####################################################################
|
||||||
|
|
||||||
onDidRender: ->
|
onDidRender: ->
|
||||||
# do nothing
|
@$outline = @$('.outline')
|
||||||
|
super
|
||||||
|
|
||||||
refresh: ->
|
refresh: ->
|
||||||
@$el.css 'min-height':@_computeMinHeight(), 'min-width':@_computeMinWidth()
|
@$el.css 'min-height':@_computeMinHeight(), 'min-width':@_computeMinWidth()
|
||||||
|
|
||||||
@_refreshBlockCache()
|
@_refreshBlockCache()
|
||||||
@_refreshAllBlocks()
|
@_refreshAllBlocks()
|
||||||
|
super
|
||||||
|
|
||||||
# Private Methods ##############################################################################
|
# Private Methods ##############################################################################
|
||||||
|
|
||||||
@@ -82,7 +93,7 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
top = (pxHeight - @IMAGE_SIZE) + (x * @X_LAYER_V_SHIFT) + (z * @Z_LAYER_V_SHIFT) + (y * @Y_LAYER_V_SHIFT)
|
top = (pxHeight - @IMAGE_SIZE) + (x * @X_LAYER_V_SHIFT) + (z * @Z_LAYER_V_SHIFT) + (y * @Y_LAYER_V_SHIFT)
|
||||||
opacity = 1.0
|
opacity = 1.0
|
||||||
|
|
||||||
zindex = (@model.width - x) + (@model.depth - z) + ((@model.width * @model.depth) * y)
|
zindex = ((@model.width - x) + (@model.depth - z) + ((@model.width * @model.depth) * y)) * 2
|
||||||
|
|
||||||
return left:left, top:top, 'z-index':zindex, opacity:opacity
|
return left:left, top:top, 'z-index':zindex, opacity:opacity
|
||||||
|
|
||||||
@@ -101,6 +112,11 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
rightPosition = @_computePosition 0, 0, @model.depth
|
rightPosition = @_computePosition 0, 0, @model.depth
|
||||||
return rightPosition.left - leftPosition.left
|
return rightPosition.left - leftPosition.left
|
||||||
|
|
||||||
|
_endHovering: ->
|
||||||
|
@$outline.css opacity:0.0
|
||||||
|
@_hoverTimer = null
|
||||||
|
@_onHovering null
|
||||||
|
|
||||||
_randomDropDelay: ->
|
_randomDropDelay: ->
|
||||||
return Math.random() * @MAX_DROP_DELAY
|
return Math.random() * @MAX_DROP_DELAY
|
||||||
|
|
||||||
@@ -134,6 +150,7 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
if not $block?
|
if not $block?
|
||||||
$block = $("<img alt='#{itemDisplay.itemName}' class='block' />")
|
$block = $("<img alt='#{itemDisplay.itemName}' class='block' />")
|
||||||
$block.css position, top:-@IMAGE_SIZE, opacity:0.0
|
$block.css position, top:-@IMAGE_SIZE, opacity:0.0
|
||||||
|
@_registerHoverHandlers $block, y, itemDisplay
|
||||||
@_imageLoader.load itemDisplay.iconUrl, $block
|
@_imageLoader.load itemDisplay.iconUrl, $block
|
||||||
@_blockCache[x][y][z] = $block
|
@_blockCache[x][y][z] = $block
|
||||||
@$el.append $block
|
@$el.append $block
|
||||||
@@ -149,8 +166,23 @@ module.exports = class MultiblockController extends BaseController
|
|||||||
|
|
||||||
_refreshAllBlocks: ->
|
_refreshAllBlocks: ->
|
||||||
return unless @model?
|
return unless @model?
|
||||||
|
if @_endHovering? then @_endHovering()
|
||||||
|
|
||||||
for x in [0...@model.width]
|
for x in [0...@model.width]
|
||||||
for y in [0...@model.height]
|
for y in [0...@model.height]
|
||||||
for z in [0...@model.depth]
|
for z in [0...@model.depth]
|
||||||
@_refreshBlock(x, y, z)
|
@_refreshBlock(x, y, z)
|
||||||
|
|
||||||
|
_registerHoverHandlers: ($el, y, itemDisplay)->
|
||||||
|
startHovering = =>
|
||||||
|
return unless y is @_currentLayer
|
||||||
|
zIndex = parseInt($el.css('z-index')) + 1
|
||||||
|
zIndex = if _.isNaN(zIndex) then 0 else zIndex
|
||||||
|
|
||||||
|
@$outline.css opacity:1.0, top:$el.css('top'), left:$el.css('left'), 'z-index':zIndex
|
||||||
|
@_onHovering itemDisplay
|
||||||
|
|
||||||
|
if @_hoverTimer? then clearTimeout @_hoverTimer
|
||||||
|
@_hoverTimer = setTimeout (=> @_endHovering()), @HOVER_TIMEOUT
|
||||||
|
|
||||||
|
$el.hover startHovering, (->)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ All rights reserved.
|
|||||||
|
|
||||||
_ = require '../underscore_mixins'
|
_ = require '../underscore_mixins'
|
||||||
BaseController = require './base_controller'
|
BaseController = require './base_controller'
|
||||||
|
InventoryController = require './inventory_controller'
|
||||||
MultiblockController = require './multiblock_controller'
|
MultiblockController = require './multiblock_controller'
|
||||||
|
|
||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
@@ -21,42 +22,67 @@ module.exports = class MultiblockViewerController extends BaseController
|
|||||||
|
|
||||||
@_imageLoader = options.imageLoader
|
@_imageLoader = options.imageLoader
|
||||||
@_modPack = options.modPack
|
@_modPack = options.modPack
|
||||||
|
@_hoverTimer = null
|
||||||
|
|
||||||
# Event Methods ################################################################################
|
# Event Methods ################################################################################
|
||||||
|
|
||||||
onBackClicked: ->
|
onBackClicked: ->
|
||||||
return if @backButton.hasClass 'disabled'
|
return if @$backButton.hasClass 'disabled'
|
||||||
@multiblockController.goBackLayer()
|
@multiblockController.goBackLayer()
|
||||||
@refresh()
|
@refresh()
|
||||||
|
|
||||||
onNextClicked: ->
|
onNextClicked: ->
|
||||||
return if @nextButton.hasClass 'disabled'
|
return if @$nextButton.hasClass 'disabled'
|
||||||
@multiblockController.goNextLayer()
|
@multiblockController.goNextLayer()
|
||||||
@refresh()
|
@refresh()
|
||||||
|
|
||||||
|
onBlockHovered: (itemDisplay)->
|
||||||
|
if itemDisplay?
|
||||||
|
@$captionText.html itemDisplay.itemName
|
||||||
|
@_imageLoader.load itemDisplay.iconUrl, @$captionIcon
|
||||||
|
else
|
||||||
|
@$captionText.html ' '
|
||||||
|
@$captionIcon.attr 'src', '/images/empty.png'
|
||||||
|
|
||||||
# BaseController Overrides #####################################################################
|
# BaseController Overrides #####################################################################
|
||||||
|
|
||||||
onDidRender: ->
|
onDidRender: ->
|
||||||
@multiblockController = @addChild MultiblockController, '.view__multiblock',
|
@completeInventoryController = @addChild InventoryController, '.view__inventory.complete',
|
||||||
|
editable: false
|
||||||
imageLoader: @_imageLoader
|
imageLoader: @_imageLoader
|
||||||
modPack: @_modPack
|
modPack: @_modPack
|
||||||
|
|
||||||
@backButton = @$('.button.back')
|
@layerInventoryController = @addChild InventoryController, '.view__inventory.layer',
|
||||||
@nextButton = @$('.button.next')
|
editable: false
|
||||||
|
imageLoader: @_imageLoader
|
||||||
|
modPack: @_modPack
|
||||||
|
|
||||||
|
@multiblockController = @addChild MultiblockController, '.view__multiblock',
|
||||||
|
imageLoader: @_imageLoader
|
||||||
|
modPack: @_modPack
|
||||||
|
onHovering: (itemDisplay)=> @onBlockHovered(itemDisplay)
|
||||||
|
|
||||||
|
@$backButton = @$('.button.back')
|
||||||
|
@$nextButton = @$('.button.next')
|
||||||
|
@$captionText = @$('.caption p')
|
||||||
|
@$captionIcon = @$('.caption img')
|
||||||
super
|
super
|
||||||
|
|
||||||
refresh: ->
|
refresh: ->
|
||||||
|
if @model?
|
||||||
|
@completeInventoryController.model = @model.inventory
|
||||||
|
@layerInventoryController.model = @model.getLayerInventory @multiblockController.currentLayer
|
||||||
@multiblockController.model = @model
|
@multiblockController.model = @model
|
||||||
|
|
||||||
if @multiblockController.hasBackLayer()
|
if @multiblockController.hasBackLayer()
|
||||||
@backButton.removeClass 'disabled'
|
@$backButton.removeClass 'disabled'
|
||||||
else
|
else
|
||||||
@backButton.addClass 'disabled'
|
@$backButton.addClass 'disabled'
|
||||||
|
|
||||||
if @multiblockController.hasNextLayer()
|
if @multiblockController.hasNextLayer()
|
||||||
@nextButton.removeClass 'disabled'
|
@$nextButton.removeClass 'disabled'
|
||||||
else
|
else
|
||||||
@nextButton.addClass 'disabled'
|
@$nextButton.addClass 'disabled'
|
||||||
|
|
||||||
super
|
super
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ All rights reserved.
|
|||||||
|
|
||||||
_ = require '../underscore_mixins'
|
_ = require '../underscore_mixins'
|
||||||
BaseModel = require './base_model'
|
BaseModel = require './base_model'
|
||||||
SimpleInventory = require './simple_inventory'
|
Inventory = require './inventory'
|
||||||
|
|
||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
|
|
||||||
@@ -28,6 +28,12 @@ module.exports = class Multiblock extends BaseModel
|
|||||||
return null if value is undefined
|
return null if value is undefined
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
getLayerInventory: (y)->
|
||||||
|
@_layerInventories ?= []
|
||||||
|
result = @_layerInventories[y]
|
||||||
|
if not result? then result = @_layerInventories[y] = new Inventory
|
||||||
|
return result
|
||||||
|
|
||||||
# Property Methods #############################################################################
|
# Property Methods #############################################################################
|
||||||
|
|
||||||
Object.defineProperties @prototype,
|
Object.defineProperties @prototype,
|
||||||
@@ -45,7 +51,7 @@ module.exports = class Multiblock extends BaseModel
|
|||||||
|
|
||||||
# Private Methods ##############################################################################
|
# Private Methods ##############################################################################
|
||||||
|
|
||||||
_analyzeLayer: (layer, stackCacheLayer)->
|
_analyzeLayer: (layer, y, stackCacheLayer)->
|
||||||
rows = layer.split ' '
|
rows = layer.split ' '
|
||||||
@_depth = Math.max @_depth, rows.length
|
@_depth = Math.max @_depth, rows.length
|
||||||
|
|
||||||
@@ -53,21 +59,21 @@ module.exports = class Multiblock extends BaseModel
|
|||||||
@_width = Math.max @_width, row.length
|
@_width = Math.max @_width, row.length
|
||||||
stackCacheRow = []
|
stackCacheRow = []
|
||||||
stackCacheLayer.push stackCacheRow
|
stackCacheLayer.push stackCacheRow
|
||||||
@_analyzeRow row, stackCacheRow
|
@_analyzeRow row, stackCacheRow, @getLayerInventory(y)
|
||||||
|
|
||||||
_analyzePattern: ->
|
_analyzePattern: ->
|
||||||
@_depth = @_height = @_width = 0
|
@_depth = @_height = @_width = 0
|
||||||
@_inventory = new SimpleInventory
|
@_inventory = new Inventory
|
||||||
@_stackCache = []
|
@_stackCache = []
|
||||||
|
|
||||||
for layer in @layers
|
for layer, y in @layers
|
||||||
stackCacheLayer = []
|
stackCacheLayer = []
|
||||||
@_stackCache.push stackCacheLayer
|
@_stackCache.push stackCacheLayer
|
||||||
@_analyzeLayer layer, stackCacheLayer
|
@_analyzeLayer layer, y, stackCacheLayer
|
||||||
|
|
||||||
@_height = @layers.length
|
@_height = @layers.length
|
||||||
|
|
||||||
_analyzeRow: (row, stackCacheRow)->
|
_analyzeRow: (row, stackCacheRow, layerInventory)->
|
||||||
for cell, x in row.split ''
|
for cell, x in row.split ''
|
||||||
index = parseInt cell
|
index = parseInt cell
|
||||||
stack = null
|
stack = null
|
||||||
@@ -75,5 +81,6 @@ module.exports = class Multiblock extends BaseModel
|
|||||||
if not _.isNaN index
|
if not _.isNaN index
|
||||||
stack = @input[index]
|
stack = @input[index]
|
||||||
@_inventory.add stack.itemSlug, stack.quantity
|
@_inventory.add stack.itemSlug, stack.quantity
|
||||||
|
layerInventory.add stack.itemSlug, stack.quantity
|
||||||
|
|
||||||
stackCacheRow.push stack
|
stackCacheRow.push stack
|
||||||
|
|||||||
@@ -6,3 +6,4 @@
|
|||||||
//-
|
//-
|
||||||
|
|
||||||
.view__multiblock
|
.view__multiblock
|
||||||
|
img.outline(src="/images/outline.png")
|
||||||
@@ -6,6 +6,16 @@
|
|||||||
//-
|
//-
|
||||||
|
|
||||||
.view__multiblock_viewer
|
.view__multiblock_viewer
|
||||||
|
.left
|
||||||
|
h3 Current Layer
|
||||||
|
.view__inventory.layer
|
||||||
|
|
||||||
|
h3 Complete Materials
|
||||||
|
.view__inventory.complete
|
||||||
|
.right
|
||||||
|
.caption
|
||||||
|
img
|
||||||
|
p
|
||||||
.view__multiblock
|
.view__multiblock
|
||||||
.buttons
|
.buttons
|
||||||
.button.back: p back
|
.button.back: p back
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ All rights reserved.
|
|||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.content {
|
body > .content {
|
||||||
background: $color-content;
|
background: $color-content;
|
||||||
box-shadow: 10px 10px 20px #666;
|
box-shadow: 10px 10px 20px #666;
|
||||||
margin: 2em auto;
|
margin: 2em auto;
|
||||||
|
|||||||
@@ -12,4 +12,10 @@ All rights reserved.
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
transition: all $animate-slow cubic-bezier(0.615, -0.090, 0.010, 1.090);
|
transition: all $animate-slow cubic-bezier(0.615, -0.090, 0.010, 1.090);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.outline {
|
||||||
|
position: absolute;
|
||||||
|
opacity: 0.0;
|
||||||
|
transition: opacity $animate-fast;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,21 +6,56 @@ All rights reserved.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
.view__multiblock_viewer {
|
.view__multiblock_viewer {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
border-right: 1px solid $color-gray-light;
|
||||||
|
flex: 1 0 40%;
|
||||||
|
padding: 2em 0 0 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
flex: 0 1 60%;
|
||||||
|
|
||||||
|
.caption {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 1em;
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: none;
|
||||||
|
margin-right: 1em;
|
||||||
|
height: 3.6em;
|
||||||
|
max-width: 3.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.view__multiblock_viewer {
|
.view__multiblock_viewer {
|
||||||
flex: 0 1 100%;
|
flex: 1 1 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.buttons {
|
.buttons {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
margin: 1em 25% 0 25%;
|
margin: 1em 10% 0 10%;
|
||||||
|
|
||||||
.button {
|
.button {
|
||||||
flex: 50%;
|
flex: 50%;
|
||||||
margin: 1em;
|
margin: 1em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
Reference in New Issue
Block a user