UNPKG

leaflet-contextmenu

Version:
109 lines (85 loc) 2.94 kB
L.Mixin.ContextMenu = { bindContextMenu: function (options) { L.setOptions(this, options); this._initContextMenu(); return this; }, unbindContextMenu: function (){ this.off('contextmenu', this._showContextMenu, this); return this; }, addContextMenuItem: function (item) { this.options.contextmenuItems.push(item); }, removeContextMenuItemWithIndex: function (index) { var items = []; for (var i = 0; i < this.options.contextmenuItems.length; i++) { if (this.options.contextmenuItems[i].index == index){ items.push(i); } } var elem = items.pop(); while (elem !== undefined) { this.options.contextmenuItems.splice(elem,1); elem = items.pop(); } }, replaceContextMenuItem: function (item) { this.removeContextMenuItemWithIndex(item.index); this.addContextMenuItem(item); }, _initContextMenu: function () { this._items = []; this.on('contextmenu', this._showContextMenu, this); }, _showContextMenu: function (e) { var itemOptions, data, pt, i, l; if (this._map.contextmenu) { data = L.extend({relatedTarget: this}, e); pt = this._map.mouseEventToContainerPoint(e.originalEvent); if (!this.options.contextmenuInheritItems) { this._map.contextmenu.hideAllItems(); } for (i = 0, l = this.options.contextmenuItems.length; i < l; i++) { itemOptions = this.options.contextmenuItems[i]; this._items.push(this._map.contextmenu.insertItem(itemOptions, itemOptions.index)); } this._map.once('contextmenu.hide', this._hideContextMenu, this); this._map.contextmenu.showAt(pt, data); } }, _hideContextMenu: function () { var i, l; for (i = 0, l = this._items.length; i < l; i++) { this._map.contextmenu.removeItem(this._items[i]); } this._items.length = 0; if (!this.options.contextmenuInheritItems) { this._map.contextmenu.showAllItems(); } } }; var classes = [L.Marker, L.Path], defaultOptions = { contextmenu: false, contextmenuItems: [], contextmenuInheritItems: true }, cls, i, l; for (i = 0, l = classes.length; i < l; i++) { cls = classes[i]; // L.Class should probably provide an empty options hash, as it does not test // for it here and add if needed if (!cls.prototype.options) { cls.prototype.options = defaultOptions; } else { cls.mergeOptions(defaultOptions); } cls.addInitHook(function () { if (this.options.contextmenu) { this._initContextMenu(); } }); cls.include(L.Mixin.ContextMenu); }