2014-07-17 20:20:11 -04:00
|
|
|
|
CocoView = require 'views/kinds/CocoView'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
template = require 'templates/play/level/tome/spell_palette_entry'
|
|
|
|
|
{me} = require 'lib/auth'
|
|
|
|
|
filters = require 'lib/image_filter'
|
2014-07-23 10:02:45 -04:00
|
|
|
|
DocFormatter = require './DocFormatter'
|
2014-02-16 18:30:00 -05:00
|
|
|
|
|
2014-07-17 20:20:11 -04:00
|
|
|
|
module.exports = class SpellPaletteEntryView extends CocoView
|
2014-01-03 13:32:13 -05:00
|
|
|
|
tagName: 'div' # Could also try <code> instead of <div>, but would need to adjust colors
|
|
|
|
|
className: 'spell-palette-entry-view'
|
|
|
|
|
template: template
|
2014-02-16 18:30:00 -05:00
|
|
|
|
popoverPinned: false
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
|
|
subscriptions:
|
2014-06-30 22:16:26 -04:00
|
|
|
|
'surface:frame-changed': 'onFrameChanged'
|
|
|
|
|
'tome:palette-hovered': 'onPaletteHovered'
|
|
|
|
|
'tome:palette-pin-toggled': 'onPalettePinToggled'
|
2014-02-23 19:34:03 -05:00
|
|
|
|
'tome:spell-debug-property-hovered': 'onSpellDebugPropertyHovered'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
|
|
events:
|
2014-02-16 18:30:00 -05:00
|
|
|
|
'mouseenter': 'onMouseEnter'
|
|
|
|
|
'mouseleave': 'onMouseLeave'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
'click': 'onClick'
|
|
|
|
|
|
|
|
|
|
constructor: (options) ->
|
|
|
|
|
super options
|
|
|
|
|
@thang = options.thang
|
2014-06-26 01:56:39 -04:00
|
|
|
|
@docFormatter = new DocFormatter options
|
|
|
|
|
@doc = @docFormatter.doc
|
2014-06-25 23:19:11 -04:00
|
|
|
|
|
2014-02-12 19:42:09 -05:00
|
|
|
|
getRenderData: ->
|
|
|
|
|
c = super()
|
|
|
|
|
c.doc = @doc
|
|
|
|
|
c
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
|
|
afterRender: ->
|
|
|
|
|
super()
|
2014-02-12 19:42:09 -05:00
|
|
|
|
@$el.addClass(@doc.type)
|
|
|
|
|
@$el.popover(
|
2014-02-16 18:30:00 -05:00
|
|
|
|
animation: false
|
2014-01-03 13:32:13 -05:00
|
|
|
|
html: true
|
2014-02-20 13:39:16 -05:00
|
|
|
|
placement: 'top'
|
2014-02-16 18:30:00 -05:00
|
|
|
|
trigger: 'manual' # Hover, until they click, which will then pin it until unclick.
|
2014-06-26 01:56:39 -04:00
|
|
|
|
content: @docFormatter.formatPopover()
|
2014-02-16 18:30:00 -05:00
|
|
|
|
container: '#tome-view'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
)
|
2014-01-30 19:36:36 -05:00
|
|
|
|
@$el.on 'show.bs.popover', =>
|
2014-02-20 13:39:16 -05:00
|
|
|
|
Backbone.Mediator.publish 'tome:palette-hovered', thang: @thang, prop: @doc.name, entry: @
|
2014-02-12 19:42:09 -05:00
|
|
|
|
|
2014-02-16 18:30:00 -05:00
|
|
|
|
onMouseEnter: (e) ->
|
2014-01-03 13:32:13 -05:00
|
|
|
|
# Make sure the doc has the updated Thang so it can regenerate its prop value
|
2014-06-26 01:56:39 -04:00
|
|
|
|
@$el.data('bs.popover').options.content = @docFormatter.formatPopover()
|
2014-01-03 13:32:13 -05:00
|
|
|
|
@$el.popover('setContent')
|
2014-02-20 13:39:16 -05:00
|
|
|
|
@$el.popover 'show' unless @popoverPinned or @otherPopoverPinned
|
2014-02-16 18:30:00 -05:00
|
|
|
|
|
|
|
|
|
onMouseLeave: (e) ->
|
2014-02-20 13:39:16 -05:00
|
|
|
|
@$el.popover 'hide' unless @popoverPinned or @otherPopoverPinned
|
2014-02-16 18:30:00 -05:00
|
|
|
|
|
|
|
|
|
togglePinned: ->
|
|
|
|
|
if @popoverPinned
|
|
|
|
|
@popoverPinned = false
|
|
|
|
|
@$el.add('#tome-view .popover').removeClass 'pinned'
|
2014-02-20 13:39:16 -05:00
|
|
|
|
$('#tome-view .popover .close').remove()
|
2014-02-16 18:30:00 -05:00
|
|
|
|
@$el.popover 'hide'
|
|
|
|
|
else
|
|
|
|
|
@popoverPinned = true
|
2014-02-20 13:39:16 -05:00
|
|
|
|
@$el.popover 'show'
|
2014-02-16 18:30:00 -05:00
|
|
|
|
@$el.add('#tome-view .popover').addClass 'pinned'
|
2014-02-20 13:39:16 -05:00
|
|
|
|
x = $('<button type="button" data-dismiss="modal" aria-hidden="true" class="close">×</button>')
|
|
|
|
|
$('#tome-view .popover').append x
|
|
|
|
|
x.on 'click', @onClick
|
|
|
|
|
Backbone.Mediator.publish 'tome:palette-pin-toggled', entry: @, pinned: @popoverPinned
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
2014-02-20 13:39:16 -05:00
|
|
|
|
onClick: (e) =>
|
2014-08-04 17:02:54 -04:00
|
|
|
|
if key.shift
|
2014-08-05 05:19:15 -04:00
|
|
|
|
Backbone.Mediator.publish 'tome:insert-snippet', doc: @options.doc, language: @options.language, formatted: @doc
|
2014-08-04 17:02:54 -04:00
|
|
|
|
return
|
2014-02-16 18:30:00 -05:00
|
|
|
|
@togglePinned()
|
2014-02-20 13:39:16 -05:00
|
|
|
|
Backbone.Mediator.publish 'tome:palette-clicked', thang: @thang, prop: @doc.name, entry: @
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
|
|
onFrameChanged: (e) ->
|
|
|
|
|
return unless e.selectedThang?.id is @thang.id
|
2014-06-26 01:56:39 -04:00
|
|
|
|
@options.thang = @thang = @docFormatter.options.thang = e.selectedThang # Update our thang to the current version
|
2014-02-11 14:31:02 -05:00
|
|
|
|
|
2014-02-20 13:39:16 -05:00
|
|
|
|
onPaletteHovered: (e) ->
|
|
|
|
|
return if e.entry is @
|
|
|
|
|
@togglePinned() if @popoverPinned
|
|
|
|
|
|
|
|
|
|
onPalettePinToggled: (e) ->
|
|
|
|
|
return if e.entry is @
|
|
|
|
|
@otherPopoverPinned = e.pinned
|
|
|
|
|
|
2014-02-23 19:34:03 -05:00
|
|
|
|
onSpellDebugPropertyHovered: (e) ->
|
|
|
|
|
matched = e.property is @doc.name and e.owner is @doc.owner
|
|
|
|
|
if matched and not @debugHovered
|
|
|
|
|
@debugHovered = true
|
|
|
|
|
@togglePinned() unless @popoverPinned
|
|
|
|
|
else if @debugHovered and not matched
|
|
|
|
|
@debugHovered = false
|
|
|
|
|
@togglePinned() if @popoverPinned
|
|
|
|
|
null
|
|
|
|
|
|
2014-02-11 14:31:02 -05:00
|
|
|
|
destroy: ->
|
2014-02-16 18:30:00 -05:00
|
|
|
|
$('.popover.pinned').remove() if @popoverPinned # @$el.popover('destroy') doesn't work
|
|
|
|
|
@togglePinned() if @popoverPinned
|
|
|
|
|
@$el.popover 'destroy'
|
2014-02-11 14:31:02 -05:00
|
|
|
|
@$el.off()
|
2014-02-12 19:42:09 -05:00
|
|
|
|
super()
|