2014-01-03 13:32:13 -05:00
|
|
|
module.exports = class CoordinateDisplay extends createjs.Container
|
|
|
|
layerPriority: -10
|
|
|
|
subscriptions:
|
|
|
|
'surface:mouse-moved': 'onMouseMove'
|
|
|
|
'surface:mouse-out': 'onMouseOut'
|
|
|
|
'surface:mouse-over': 'onMouseOver'
|
2014-03-12 20:50:59 -04:00
|
|
|
'surface:stage-mouse-down': 'onMouseDown'
|
2014-01-03 13:32:13 -05:00
|
|
|
'camera:zoom-updated': 'onZoomUpdated'
|
|
|
|
|
|
|
|
constructor: (options) ->
|
|
|
|
super()
|
|
|
|
@initialize()
|
|
|
|
@camera = options.camera
|
|
|
|
console.error "CoordinateDisplay needs camera." unless @camera
|
|
|
|
@build()
|
2014-02-23 12:55:40 -05:00
|
|
|
@show = _.debounce @show, 125
|
2014-01-03 13:32:13 -05:00
|
|
|
Backbone.Mediator.subscribe(channel, @[func], @) for channel, func of @subscriptions
|
|
|
|
|
|
|
|
destroy: ->
|
|
|
|
Backbone.Mediator.unsubscribe(channel, @[func], @) for channel, func of @subscriptions
|
2014-02-22 19:58:54 -05:00
|
|
|
@show = null
|
|
|
|
@destroyed = true
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
build: ->
|
|
|
|
@mouseEnabled = @mouseChildren = false
|
|
|
|
@addChild @label = new createjs.Text("", "20px Arial", "#003300")
|
|
|
|
@label.name = 'position text'
|
|
|
|
@label.shadow = new createjs.Shadow("#FFFFFF", 1, 1, 0)
|
|
|
|
|
|
|
|
onMouseOver: (e) -> @mouseInBounds = true
|
|
|
|
onMouseOut: (e) -> @mouseInBounds = false
|
|
|
|
|
|
|
|
onMouseMove: (e) ->
|
2014-03-12 21:50:09 -04:00
|
|
|
if @mouseInBounds and key.shift
|
|
|
|
$('#surface').addClass('flag-cursor') unless $('#surface').hasClass('flag-cursor')
|
|
|
|
else if @mouseInBounds
|
|
|
|
$('#surface').removeClass('flag-cursor') if $('#surface').hasClass('flag-cursor')
|
2014-01-03 13:32:13 -05:00
|
|
|
wop = @camera.canvasToWorld x: e.x, y: e.y
|
|
|
|
wop.x = Math.round(wop.x)
|
|
|
|
wop.y = Math.round(wop.y)
|
|
|
|
return if wop.x is @lastPos?.x and wop.y is @lastPos?.y
|
|
|
|
@lastPos = wop
|
|
|
|
@hide()
|
|
|
|
@show() # debounced
|
|
|
|
|
2014-03-12 20:50:59 -04:00
|
|
|
onMouseDown: (e) ->
|
|
|
|
return unless key.shift
|
|
|
|
wop = @camera.canvasToWorld x: e.x, y: e.y
|
|
|
|
wop.x = Math.round wop.x
|
|
|
|
wop.y = Math.round wop.y
|
|
|
|
Backbone.Mediator.publish 'surface:coordinate-selected', wop
|
|
|
|
|
2014-01-03 13:32:13 -05:00
|
|
|
onZoomUpdated: (e) ->
|
|
|
|
@hide()
|
|
|
|
@show()
|
|
|
|
|
|
|
|
hide: ->
|
|
|
|
return unless @label.parent
|
|
|
|
@removeChild @label
|
|
|
|
@uncache()
|
|
|
|
|
|
|
|
show: =>
|
2014-02-22 19:58:54 -05:00
|
|
|
return unless @mouseInBounds and @lastPos and not @destroyed
|
2014-01-03 13:32:13 -05:00
|
|
|
@label.text = "(#{@lastPos.x}, #{@lastPos.y})"
|
|
|
|
[width, height] = [@label.getMeasuredWidth(), @label.getMeasuredHeight()]
|
|
|
|
@label.regX = width / 2
|
|
|
|
@label.regY = height / 2
|
|
|
|
sup = @camera.worldToSurface @lastPos
|
|
|
|
@x = sup.x
|
2014-02-25 15:38:47 -05:00
|
|
|
@y = sup.y - 7
|
2014-01-03 13:32:13 -05:00
|
|
|
@addChild @label
|
|
|
|
@cache -width / 2, -height / 2, width, height
|
|
|
|
Backbone.Mediator.publish 'surface:coordinates-shown', {}
|