mm-git/backbone-graph

View on GitHub
src/Model/rangeData.coffee

Summary

Maintainability
Test Coverage
require('./property')
Backbone = require('backbone')

GraphData = require('./graphData')

class RangeData extends Backbone.Model
  # options =
  #   width: w
  #   scale: scaleDataObject
  #   axis: axisDataObject
  #   offset: offsetDataObject
  #   targetGraph: graphLineDataObject
  #   rangeColor: "#RRGGBB"
  #   rangeOpacity: o
  initialize: (options) ->
    @set('start', 0)
    @set('end', 0)
    @set('selected', false)

  @property "start",
    get: ->
      @get('start')

  @property "end",
    get: ->
      @get('end')

  @property "selected",
    get: ->
      @get('selected')
    set: (status) ->
      @set('selected', status)

  @property "rangeColor",
    get: ->
      @get('rangeColor')

  @property "rangeOpacity",
    get: ->
      @get('rangeOpacity')

  @property "screenStart",
    get: ->
      @_getScreenX(@get('start'))

  @property "screenEnd",
    get: ->
      @_getScreenX(@get('end'))

  autoSelectX: (screenX) ->
    if @get('targetGraph').type != GraphData.TYPE.LINE
      return null

    graphX = @_getGraphX(screenX)
    if graphX.rangeOver == true
      return

    range = @get('targetGraph').getAutoRange(graphX.x)
    if range == null
      return

    range.selected = true
    @set(range)

  selectStartX: (screenX) ->
    if @get('targetGraph').type != GraphData.TYPE.LINE
      return null

    graphX = @_getGraphX(screenX)
    if @selected
      @set({start: graphX.x})
    else
      @set({
        start: graphX.x
        end: graphX.x
        selected: true
      })

  selectEndX: (screenX) ->
    if @get('targetGraph').type != GraphData.TYPE.LINE
      return null

    graphX = @_getGraphX(screenX)
    @set({end: graphX.x})

  determineSelection: ->
    if @get('targetGraph').type != GraphData.TYPE.LINE
      return null

    if @start > @end
      @set({
        start: @end
        end: @start
      })

    @get('targetGraph').setRange({
      start: @start
      end: @end
      selected: @selected
    })

  shiftX: (differenceX) ->
    GraphView = require('../View/graphView')

    width = @get('width') * @get('scale').scale / 100 - GraphView.ORIGIN_OFFSET_Y
    graphDifferenceX = differenceX * @get('axis').max / width

    if @start + graphDifferenceX < 0
      @set({
        start: 0
        end: @end - @start
      })
    else if @end + graphDifferenceX > @get('axis').max
      @set({
        start: @start + @get('axis').max - @end
        end: @get('axis').max
      })
    else
      @set({
        start: @start + graphDifferenceX
        end: @end + graphDifferenceX
      })

  deselect: ->
    @selected = false

  _getGraphX: (screenX) ->
    GraphView = require('../View/graphView')

    width = @get('width') * @get('scale').scale / 100 - GraphView.ORIGIN_OFFSET_Y
    clickPosX = screenX - @get('offset').offset
    if clickPosX > width
      return {
        x : @get('axis').max
        rangeOver: true
      }
    else if clickPosX < 0
      return {
        x : 0
        rangeOver: true
      }

    return {
      x: clickPosX * @get('axis').max / width
      rangeOver: false
    }

  _getScreenX: (graphX) ->
    GraphView = require('../View/graphView')

    width = @get('width') * @get('scale').scale / 100 - GraphView.ORIGIN_OFFSET_Y
    return width * graphX / @get('axis').max + @get('offset').offset


module.exports = RangeData