Code coverage report for code/stores/palette-store.coffee

Statements: 52.63% (50 / 95)      Branches: 18.75% (3 / 16)      Functions: 42.86% (12 / 28)      Lines: 50.55% (46 / 91)      Ignored: none     

All files » code/stores/ » palette-store.coffee
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 1911 1 1 1       1               1       1 1   1         1 1     1 1 7     1 1 1 1 1     8 8 8     8 8 8 8 8 8                                                                 1 1 1 1 1                                     2 2 2 2                                                             1     1     8     1               1 1   1                                         1         1  
resizeImage    = require '../utils/resize-image'
initialPalette = require '../data/initial-palette'
initialLibrary = require '../data/internal-library'
UndoRedo       = require '../utils/undo-redo'
 
 
# TODO: Maybe loadData goes into some other action-set
paletteActions = Reflux.createActions(
  [
    "addToPalette", "loadData", "selectPaletteIndex",
    "deselect", "restoreSelection", "itemDropped",
    "update", "deleteSelected"
  ]
)
 
paletteStore   = Reflux.createStore
  listenables: [paletteActions]
 
  init: ->
    @initializeLibrary()
    @initializePalette()
    # prepare a template for new library items
    @blankMetadata =
      source: 'external'
      title: 'blank'
      link: ''
      license: ''
    @imageMetadata = _.clone @blankMetadata, true
    @undoManger = UndoRedo.instance debug:true
 
  initializeLibrary: ->
    @library = {}
    for node in initialLibrary
      @addToLibrary node
 
  initializePalette: ->
    @palette = []
    for node in initialPalette
      @addToPalette node
    @selectPaletteIndex(0)
    @updateChanges()
 
  standardizeNode: (node) ->
    node.image    ||= ""
    node.key      ||= node.image.substr(0,400)
    node.metadata ||= _.clone @blankMetadata, true
 
  addToLibrary: (node) ->
    Eunless @inLibrary(node)
      @standardizeNode(node)
      @library[node.key] = node
      resizeImage node.image, (dataUrl) ->
        node.image = dataUrl
      log.info "library: #{@library}"
 
  onLoadData: (data) ->
    # reload the palette
    @palette = []
    if data.palette
      for p_item in data.palette by -1
        @addToPalette p_item
    @updateChanges()
 
  onUpdate: (data) ->
    if @selectedPaletteItem
      @selectedPaletteItem = _.merge @selectedPaletteItem, data
    else
      @selectedPaletteItem = data
    @updateChanges()
 
 
  onDeleteSelected: ->
    paletteItem = @selectedPaletteItem
    if paletteItem
 
      @undoManger.createAndExecuteCommand 'deletePaletteItem',
        execute: =>
          @palette = _.without @palette, paletteItem
          @deselect()
          @updateChanges()
        undo: =>
          @addToPalette(paletteItem)
          @updateChanges()
 
  addToPalette: (node) ->
    # ensure its in our library first
    @addToLibrary(node)
    Eif not @inPalette node
      @palette.push node
      @moveToFront(@palette.length-1)
      @selectPaletteIndex(0)
 
  onAddToPalette: (node) ->
    @undoManger.createAndExecuteCommand 'addPaletteItem',
      execute: =>
        @addToPalette(node)
        @updateChanges()
      undo:  =>
        @palette = _.without @palette, node
        @deselect()
        @updateChanges()
 
 
  onSelectPaletteIndex: (index) ->
    # @moveToFront(index) if we want to add the selected item to front
    @selectPaletteIndex(index)
    @updateChanges()
 
  selectPaletteIndex: (index) ->
    @lastSelection = @selectedIndex = index
    @selectedPaletteItem  = @palette[index]
    Eif @selectedPaletteItem
      @selectedPaletteImage = @selectedPaletteItem.image
    else
      @deselect() # if we tried to select something non-existent, deselect.
 
  deselect: ->
    @lastSelection = @selectedIndex
    @selectedPaletteIndex = -1
    @selectedPaletteItem  = null
 
  onDeselect: ->
    @deselect()
    # @updateChanges()
 
  onRestoreSelection: ->
    if @lastSelection > -1
      @selectPaletteIndex @lastSelection
    else @selectPaletteIndex 0
    @updateChanges()
 
  onSetImageMetadata: (image, metadata) ->
    log.info "Set Image metadata called"
    @addToLibrary(image)
    libraryItem = @inLibrary(image)
    if libraryItem
      libraryItem.metadata = metadata
      @imageMetadata = libraryItem.metadata
      @updateChanges()
    else
      alert "cant find library item"
 
  moveToFront: (index) ->
    @palette.splice(0, 0, @palette.splice(index, 1)[0])
 
  inPalette: (node) ->
    _.find @palette, {key: node.key}
 
  inLibrary: (node) ->
    @library[node.key]
 
  updateChanges: ->
    data =
      palette: @palette
      library: @library
      selectedPaletteIndex: @selectedIndex
      selectedPaletteItem: @selectedPaletteItem
      selectedPaletteImage: @selectedPaletteImage
      imageMetadata: @imageMetadata
 
    log.info "Sending changes to listeners: #{JSON.stringify(data)}"
    @trigger(data)
 
mixin =
  getInitialState: ->
    palette: paletteStore.palette
    library: paletteStore.library
    selectedPaletteItem: paletteStore.selectedPaletteItem
    selectedPaletteIndex: paletteStore.selectedPaletteIndex
    selectedPaletteImage: paletteStore.selectedPaletteImage
    imageMetadata: paletteStore.imageMetadata
 
  componentDidMount: ->
    paletteStore.listen @onPaletteChange
 
  onPaletteChange: (status) ->
    @setState
      palette: status.palette
      library: status.library
      selectedPaletteIndex: status.selectedPaletteIndex
      selectedPaletteItem: status.selectedPaletteItem
      selectedPaletteImage: status.selectedPaletteImage
      imageMetadata: status.imageMetadata
 
module.exports =
  actions: paletteActions
  store: paletteStore
  mixin: mixin
 
window.PaletteStore = module.exports