nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit b256dece4f1771e0d250310b27a8ddf4393894e0
parent 8d8cb0693aec1bfaa98c0dff75c4a2fee784b94c
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Sat, 19 Nov 2016 14:45:36 +0300

import FuncButtons from https://github.com/MapBBCode/mapbbcode

Diffstat:
Asrc/vendored/mapbbcode/FunctionButton.js | 160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 160 insertions(+), 0 deletions(-)

diff --git a/src/vendored/mapbbcode/FunctionButton.js b/src/vendored/mapbbcode/FunctionButton.js @@ -0,0 +1,160 @@ +import L from 'leaflet'; +/* + * A leaflet button with icon or text and click listener. + */ +L.FunctionButtons = L.Control.extend({ + includes: L.Mixin.Events, + + initialize: function( buttons, options ) { + if( !('push' in buttons && 'splice' in buttons) ) + buttons = [buttons]; + this._buttons = buttons; + if( !options && buttons.length > 0 && 'position' in buttons[0] ) + options = { position: buttons[0].position }; + L.Control.prototype.initialize.call(this, options); + }, + + onAdd: function( map ) { + this._map = map; + this._links = []; + + var container = L.DomUtil.create('div', 'leaflet-bar'); + for( var i = 0; i < this._buttons.length; i++ ) { + var button = this._buttons[i], + link = L.DomUtil.create('a', '', container); + link._buttonIndex = i; // todo: remove? + link.href = button.href || '#'; + if( button.href ) + link.target = 'funcbtn'; + link.style.padding = '0 4px'; + link.style.width = 'auto'; + link.style.minWidth = '20px'; + if( button.bgColor ) + link.style.backgroundColor = button.bgColor; + if( button.title ) + link.title = button.title; + button.link = link; + this._updateContent(i); + + var stop = L.DomEvent.stopPropagation; + L.DomEvent + .on(link, 'click', stop) + .on(link, 'mousedown', stop) + .on(link, 'dblclick', stop); + if( !button.href ) + L.DomEvent + .on(link, 'click', L.DomEvent.preventDefault) + .on(link, 'click', this.clicked, this); + } + + return container; + }, + + _updateContent: function( n ) { + if( n >= this._buttons.length ) + return; + var button = this._buttons[n], + link = button.link, + content = button.content; + if( !link ) + return; + if( content === undefined || content === false || content === null || content === '' ) + link.innerHTML = button.alt || '&nbsp;'; + else if( typeof content === 'string' ) { + var ext = content.length < 4 ? '' : content.substring(content.length - 4), + isData = content.substring(0, 11) === 'data:image/'; + if( ext === '.png' || ext === '.gif' || ext === '.jpg' || isData ) { + link.style.width = '' + (button.imageSize || 26) + 'px'; + link.style.height = '' + (button.imageSize || 26) + 'px'; + link.style.padding = '0'; + link.style.backgroundImage = 'url(' + content + ')'; + link.style.backgroundRepeat = 'no-repeat'; + link.style.backgroundPosition = button.bgPos ? (-button.bgPos[0]) + 'px ' + (-button.bgPos[1]) + 'px' : '0px 0px'; + } else + link.innerHTML = content; + } else { + while( link.firstChild ) + link.removeChild(link.firstChild); + link.appendChild(content); + } + }, + + setContent: function( n, content ) { + if( content === undefined ) { + content = n; + n = 0; + } + if( n < this._buttons.length ) { + this._buttons[n].content = content; + this._updateContent(n); + } + }, + + setTitle: function( n, title ) { + if( title === undefined ) { + title = n; + n = 0; + } + if( n < this._buttons.length ) { + var button = this._buttons[n]; + button.title = title; + if( button.link ) + button.link.title = title; + } + }, + + setBgPos: function( n, bgPos ) { + if( bgPos === undefined ) { + bgPos = n; + n = 0; + } + if( n < this._buttons.length ) { + var button = this._buttons[n]; + button.bgPos = bgPos; + if( button.link ) + button.link.style.backgroundPosition = bgPos ? (-bgPos[0]) + 'px ' + (-bgPos[1]) + 'px' : '0px 0px'; + } + }, + + setHref: function( n, href ) { + if( href === undefined ) { + href = n; + n = 0; + } + if( n < this._buttons.length ) { + var button = this._buttons[n]; + button.href = href; + if( button.link ) + button.link.href = href; + } + }, + + clicked: function(e) { + var link = (window.event && window.event.srcElement) || e.target || e.srcElement; + while( link && 'tagName' in link && link.tagName !== 'A' && !('_buttonIndex' in link ) ) + link = link.parentNode; + if( '_buttonIndex' in link ) { + var button = this._buttons[link._buttonIndex]; + if( button ) { + if( 'callback' in button ) + button.callback.call(button.context); + this.fire('clicked', { idx: link._buttonIndex }); + } + } + } +}); + +L.functionButtons = function( buttons, options ) { + return new L.FunctionButtons(buttons, options); +}; + +/* + * Helper method from the old class. It is not recommended to use it, please use L.functionButtons(). + */ +L.functionButton = function( content, button, options ) { + if( button ) + button.content = content; + else + button = { content: content }; + return L.functionButtons([button], options); +};