/**
* BlockLabel block resides inside a scene or timeline
* @class BlockLabel
* @extends Block
* @constructor
* @param {string} i_placement location where objects resides which can be scene or timeline
* @param {string} i_campaign_timeline_chanel_player_id required and set as block id when block is inserted onto timeline_channel
* @return {Object} Block instance
*/
define(['jquery', 'backbone', 'Block'], function ($, Backbone, Block) {
var BlockLabel = Block.extend({
/**
Constructor
@method initialize
**/
constructor: function (options) {
var self = this;
self.m_blockType = 3241;
_.extend(options, {blockType: self.m_blockType})
Block.prototype.constructor.call(this, options);
self._initSubPanel(Elements.BLOCK_LABEL_COMMON_PROPERTIES);
self.m_labelFontSelector = self.m_blockProperty.getLabelFontSelector();
self._listenInputChange();
self._listenFontSelectionChange();
self._listenMouseEntersSceneCanvas();
},
/**
When user changes a URL link for the feed, update the msdb
@method _listenInputChange
@return none
**/
_listenInputChange: function () {
var self = this;
self.m_inputChangeHandler = function () {
if (!self.m_selected)
return;
var text = $(Elements.LABEL_TEXT).val();
text = BB.lib.cleanProbCharacters(text, 1);
var domPlayerData = self._getBlockPlayerData();
var xSnippet = $(domPlayerData).find('Label');
var xSnippetText = $(xSnippet).find('Text');
if (text == xSnippetText.text())
return;
$(xSnippetText).text(text);
self._setBlockPlayerData(domPlayerData);
};
$(Elements.LABEL_TEXT).on("mousemove", self.m_inputChangeHandler);
/*self._labelEnterKey = _.debounce(function (e) {
if (!self.m_selected)
return;
//if (e.which == 13)
self.m_inputChangeHandler(e);
e.preventDefault();
}, 750);
$(Elements.LABEL_TEXT).on("keydown", self._labelEnterKey);*/
},
/**
Load up property values in the common panel
@method _populate
@return none
**/
_populate: function () {
var self = this;
var domPlayerData = self._getBlockPlayerData();
var xSnippet = $(domPlayerData).find('Label');
var xSnippetText = $(xSnippet).find('Text');
var xSnippetFont = $(xSnippet).find('Font');
$(Elements.LABEL_TEXT).val(xSnippetText.text());
self.m_labelFontSelector.setConfig({
bold: xSnippetFont.attr('fontWeight') == 'bold' ? true : false,
italic: xSnippetFont.attr('fontStyle') == 'italic' ? true : false,
underline: xSnippetFont.attr('textDecoration') == 'underline' ? true : false,
alignment: xSnippetFont.attr('textAlign'),
font: xSnippetFont.attr('fontFamily'),
color: BB.lib.colorToHex(BB.lib.decimalToHex(xSnippetFont.attr('fontColor'))),
size: xSnippetFont.attr('fontSize')
});
},
/**
Listen to changes in font UI selection from Block property and take action on changes
@method _listenFontSelectionChange
**/
_listenMouseEntersSceneCanvas: function () {
var self = this;
BB.comBroker.listenWithNamespace(BB.EVENTS.MOUSE_ENTERS_CANVAS, self, function (e) {
if (!self.m_selected)
return;
$(Elements.LABEL_TEXT).blur();
});
},
/**
Listen to changes in font UI selection from Block property and take action on changes
@method _listenFontSelectionChange
**/
_listenFontSelectionChange: function () {
var self = this;
BB.comBroker.listenWithNamespace(BB.EVENTS.FONT_SELECTION_CHANGED, self, function (e) {
if (!self.m_selected || e.caller !== self.m_labelFontSelector)
return;
var config = e.edata;
var domPlayerData = self._getBlockPlayerData();
var xSnippet = $(domPlayerData).find('Label');
var xSnippetFont = $(xSnippet).find('Font');
config.bold == true ? xSnippetFont.attr('fontWeight', 'bold') : xSnippetFont.attr('fontWeight', 'normal');
config.italic == true ? xSnippetFont.attr('fontStyle', 'italic') : xSnippetFont.attr('fontStyle', 'normal');
config.underline == true ? xSnippetFont.attr('textDecoration', 'underline') : xSnippetFont.attr('textDecoration', 'none');
xSnippetFont.attr('fontColor', BB.lib.colorToDecimal(config.color));
xSnippetFont.attr('fontSize', config.size);
xSnippetFont.attr('fontFamily', config.font);
xSnippetFont.attr('textAlign', config.alignment);
self._setBlockPlayerData(domPlayerData);
});
},
/**
Populate the common block properties panel, called from base class if exists
@method _loadBlockSpecificProps
@return none
**/
_loadBlockSpecificProps: function () {
var self = this;
self._populate();
this._viewSubPanel(Elements.BLOCK_LABEL_COMMON_PROPERTIES);
},
/**
Convert the block into a fabric js compatible object
@Override
@method fabricateBlock
@param {number} i_canvasScale
@param {function} i_callback
**/
fabricateBlock: function (i_canvasScale, i_callback) {
var self = this;
var domPlayerData = self._getBlockPlayerData();
var layout = $(domPlayerData).find('Layout');
var label = $(domPlayerData).find('Label');
var text = $(label).find('Text').text();
var font = $(label).find('Font');
var url = ('https:' === document.location.protocol ? 'https' : 'http') + '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
//$.getScript(src, function (data) {
// console.log(data);
//});
var t = new fabric.IText(text, {
fontSize: $(font).attr('fontSize'),
//fontFamily: 'Graduate',
//fontFamily: 'Jolly Lodger',
//fontFamily: 'Arial',
fontFamily: $(font).attr('fontFamily'),
fill: '#' + BB.lib.decimalToHex($(font).attr('fontColor')),
textDecoration: $(font).attr('textDecoration'),
fontWeight: $(font).attr('fontWeight'),
fontStyle: $(font).attr('fontStyle'),
textAlign: $(font).attr('textAlign'),
top: 5,
left: 5
});
// calculate block so it can always contain the text it holds and doesn't bleed
self.m_minSize.w = t.width < 50 ? 50 : t.width * 1.2;
self.m_minSize.h = t.height < 50 ? 50 : t.height * 1.2;
var w = parseInt(layout.attr('width')) < self.m_minSize.w ? self.m_minSize.w : parseInt(layout.attr('width'));
var h = parseInt(layout.attr('height')) < self.m_minSize.h ? self.m_minSize.h : parseInt(layout.attr('height'));
var rec = self._fabricRect(w, h, domPlayerData);
var o = self._fabricateOptions(parseInt(layout.attr('y')), parseInt(layout.attr('x')), w, h, parseInt(layout.attr('rotation')));
//var group = new fabric.Group([ rec, t ], o);
//_.extend(self, group);
rec.originX = 'center';
rec.originY = 'center';
t.top = 0 - (rec.height / 2);
t.left = 0 - (rec.width / 2);
_.extend(self, o);
self.add(rec);
self.add(t);
self._fabricAlpha(domPlayerData);
self._fabricLock();
self['canvasScale'] = i_canvasScale;
//$.ajax({
// url: url,
// async: false,
// dataType: "script",
// complete: function(e){
// setTimeout(i_callback,1)
// }
//});
setTimeout(i_callback,1);
var direction = $(font).attr('textAlign');
switch (direction) {
case 'left': {
break;
}
case 'center': {
t.set({
textAlign: direction,
originX: direction,
left: 0
});
break;
}
case 'right': {
t.set({
textAlign: direction,
originX: direction,
left: rec.width / 2
});
break;
}
}
// todo: add shadow
//http://jsfiddle.net/Kienz/fgWNL/
//http://jsfiddle.net/fabricjs/7gvJG/
//http://jsfiddle.net/5KKQ2/
//t.set('shadow', {
// color: 'black',
// blur: 1,
// offsetX:3,
// offsetY: 1
//});({ color: 'rgba(12,12,12,1)' });
//rec.set('shadow', {
// color: 'black',
// blur: 1,
// offsetX:3,
// offsetY: 1
//});
},
/**
Delete this block
@method deleteBlock
@params {Boolean} i_memoryOnly if true only remove from existance but not from msdb
**/
deleteBlock: function (i_memoryOnly) {
var self = this;
$(Elements.LABEL_TEXT).off("mousemove", self.m_inputChangeHandler);
//$(Elements.LABEL_TEXT).off("keydown", self.m_inputChangeHandler);
$(Elements.LABEL_TEXT).off("blur", self.m_inputChangeHandler);
BB.comBroker.stopListenWithNamespace(BB.EVENTS.FONT_SELECTION_CHANGED, self);
BB.comBroker.stopListenWithNamespace(BB.EVENTS.MOUSE_ENTERS_CANVAS, self);
self._deleteBlock(i_memoryOnly);
}
});
return BlockLabel;
});