APIs

Show:
/**
 This generic class manages a set of elements all designed to provide user with UI for font selection
 @class FontSelector
 @constructor
 @return {Object} instantiated FontSelector
 **/
define(['jquery', 'backbone', 'minicolors', 'spinner', 'Fonts'], function ($, Backbone, minicolors, spinner, Fonts) {

    BB.SERVICES.FONT_SELECTOR = 'FontSelector';

    var FontSelector = BB.View.extend({

        /**
         Init the ChannelList component and enable sortable channels UI via drag and drop operations.
         @method initialize
         **/
        initialize: function () {
            var self = this;

            self.fontList = new Fonts().getFonts();

            self.m_config = {
                bold: false,
                italic: false,
                underline: false,
                alignment: 'left',
                font: 'Arial',
                color: '#428bca',
                size: 12
            };

            self.m_colorSelector = undefined;
            self.m_fontSizeSelector = undefined;
            self.m_fontSizeInput = undefined;

            self.m_colorSettings = {
                animationSpeed: 50,
                animationEasing: 'swing',
                change: $.proxy(self._onColorSelected, self),
                changeDelay: 100,
                control: 'hue',
                value: '#428bca',
                defaultValue: '#428bca',
                hide: null,
                hideSpeed: 100,
                inline: false,
                letterCase: 'lowercase',
                opacity: false,
                position: 'bottom left',
                show: null,
                showSpeed: 100,
                theme: 'bootstrap'
            };

            _.extend(self.m_colorSettings, self.options['colorSettings']);
            self.$el = $(Elements.TEMPLATE_FONT_SELECTOR).clone()
            self.el = self.$el[0];
            $(self.options.appendTo).append(self.el).fadeIn('fast');
            self.$el.show();

            self._initColorSelector();
            self._initFontSelector();
            self._initFontSizeSelector();
            self._initFontList();
            self._delegateAnnounceChange();
            var currID = self.$el.attr('id');
            self.$el.attr('id', _.uniqueId(currID));
        },

        /**
         Global event catcher for UI buttons / selection
         @method events
         **/
        events: {
            'click': '_onClick', 'focusout': function (e) {
                var self = this;
                if ($(e.target).is("input")) {
                    self.m_config.size = self.m_fontSizeInput.val();
                    self._fontModified();
                    return false;
                }
            }
        },

        /**
         Announce changes to font props
         @method _delegateAnnounceChange
         **/
        _delegateAnnounceChange: function () {
            var self = this;
            self._fontModified = _.debounce(function (e) {
                BB.comBroker.fire(BB.EVENTS.FONT_SELECTION_CHANGED, self, self, self.m_config);
            }, 50);
        },

        /**
         Redraw UI with updated config data provided in json format
         @method render
         @param {Object} i_config
         **/
        _render: function () {
            var self = this;

            self._deSelectFontAlignments();
            // self.m_colorSelector.minicolors('value', self.m_config.color);
            $('.minicolors-swatch-color', self.$el).css({'backgroundColor': self.m_config.color});

            var buttonBold = self.m_colorSelector = self.$el.find('[name="bold"]');
            self.m_config.bold == true ? buttonBold.addClass('active') : buttonBold.removeClass('active');

            var buttonUnderline = self.m_colorSelector = self.$el.find('[name="underline"]');
            self.m_config.underline == true ? buttonUnderline.addClass('active') : buttonUnderline.removeClass('active');

            var buttonItalic = self.m_colorSelector = self.$el.find('[name="italic"]');
            self.m_config.italic == true ? buttonItalic.addClass('active') : buttonItalic.removeClass('active');

            self.m_fontSizeSelector.spinner('value', parseInt(self.m_config.size));

            var buttonName = 'align' + BB.lib.capitaliseFirst(self.m_config.alignment);
            var buttonAlignment = self.m_colorSelector = self.$el.find('[name="' + buttonName + '"]');
            $(buttonAlignment).addClass('active');

            $('option:contains("' + self.m_config.font + '")', self.$el).prop('selected', 'selected');
            // $('#selDiv option:contains("Selection 1")')
        },

        /**
         Initialize the font size spinner UI selector
         @method i_config
         **/
        _initFontSizeSelector: function () {
            var self = this;
            self.m_fontSizeInput = self.$el.find(Elements.CLASS_SPINNER_INPUT);
            self.m_fontSizeSelector = self.m_fontSizeInput.closest('div');
            self.m_fontSizeSelector.spinner({value: self.m_config.size, min: 1, max: 127, step: 1});
        },

        /**
         Initialize the minicolors UI widget under this created instance
         @method _initColorSelector
         **/
        _initColorSelector: function () {
            var self = this;
            self.m_colorSelector = self.$el.find(Elements.CLASS_FONT_SELECTOR_MINICOLOR);
            self.m_colorSelector.minicolors(self.m_colorSettings);
        },

        /**
         Font selection
         @method _initFontSelector
         @param {Number} i_playerData
         @return {Number} Unique clientId.
         **/
        _initFontSelector: function () {
            var self = this;

            $('.spinner-input', self.$el).on('focusin', function(){
                $('.spinner-input', self.$el).one('mouseout', function() {
                    $('.spinner-input', self.$el).blur();
                    self._fontModified();
                });
            });

            $(Elements.CLASS_FONT_SELECTION, self.$el).on('change', function (e) {
                var font = $(e.target).val();
                if (font != self.m_config.font) {
                    self.m_config.font = font;
                    console.log(self.m_config.font);
                    BB.comBroker.fire(BB.EVENTS.FONT_SELECTION_CHANGED, self, self, self.m_config);
                }
            });
        },

        /**
         Build list of available fonts to chose from
         @method fontList
         **/
        _initFontList: function () {
            var self = this;
            var snippet = '';
            $.each(self.fontList, function (k, v) {
                snippet = snippet + '\n<option>' + v + '</option>';
            });
            $(Elements.CLASS_FONT_SELECTION, self.$el).append(snippet);
        },

        /**
         On new color selected by minicolors
         @method _onColorSelected
         @param {String} i_color
         **/
        _onColorSelected: function (i_color) {
            var self = this;
            self.m_config.color = i_color;
            BB.comBroker.fire(BB.EVENTS.FONT_SELECTION_CHANGED, self, self, self.m_config);
        },

        /**
         On new font selected by drop down
         @method _onFontSelected
         @param {Element} i_target
         **/
        _onFontSelected: function (i_target) {
            var self = this;
            return false;
        },

        /**
         Deselect all font alignments buttons so all are unpressed
         @method i_target
         **/
        _deSelectFontAlignments: function () {
            var self = this;
            self.$el.find(Elements.CLASS_FONT_ALIGNMENT).removeClass('active');
        },

        /**
         Catch all event for any UI that is clicked within this view so we can deal with each action as per the target firing the event
         @method _onClick
         @param {Event} e
         **/
        _onClick: function (e) {
            var self = this;

            if ($(e.target).is("select")) {
                e.preventDefault();
                return;
            }

            var $button = $(e.target).closest('button');
            var buttonName = $button.attr('name');

            if (_.isUndefined(buttonName))
                return;

            switch (buttonName) {
                case 'bold':
                {
                    $button.hasClass('active') == true ? self.m_config.bold = false : self.m_config.bold = true;
                    $button.toggleClass('active');
                    break;
                }
                case 'underline':
                {
                    $button.hasClass('active') == true ? self.m_config.underline = false : self.m_config.underline = true;
                    $button.toggleClass('active');
                    break;
                }
                case 'italic':
                {
                    $button.hasClass('active') == true ? self.m_config.italic = false : self.m_config.italic = true;
                    $button.toggleClass('active');
                    break;
                }
                case 'alignLeft':
                {
                    self._deSelectFontAlignments();
                    self.m_config.alignment = 'left';
                    $button.toggleClass('active');
                    break;
                }
                case 'alignRight':
                {
                    self._deSelectFontAlignments();
                    self.m_config.alignment = 'right';
                    $button.toggleClass('active');
                    break;
                }
                case 'alignCenter':
                {
                    self._deSelectFontAlignments();
                    self.m_config.alignment = 'center';
                    $button.toggleClass('active');
                    break;
                }
                case 'fontSizeUp':
                {
                    self.m_config.size = self.m_fontSizeInput.val();
                    break;
                }
                case 'fontSizeDown':
                {
                    self.m_config.size = self.m_fontSizeInput.val();
                    break;
                }
            }

            self._fontModified();
            return false;
        },

        /**
         Set the configuration data for this font selector component
         @method setConfig
         @param {Object} i_config
         **/
        setConfig: function (i_config) {
            var self = this;
            self.m_config = i_config;
            self._render()
        }
    });

    return FontSelector;

});