Pastakhov has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/333587 )

Change subject: Add icon:hover parameter
......................................................................

Add icon:hover parameter

Change-Id: Ia80e1336676917e5b66cc04d05b470ec011294a3
---
M includes/BaseMapService.php
M includes/mapelements/Marker.php
M resources/multimaps.js
M services/Google/ext.google.js
M services/Leaflet/ext.leaflet.js
M services/Yandex/ext.yandex.js
6 files changed, 173 insertions(+), 27 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MultiMaps 
refs/changes/87/333587/1

diff --git a/includes/BaseMapService.php b/includes/BaseMapService.php
index 366154b..90ff3f4 100644
--- a/includes/BaseMapService.php
+++ b/includes/BaseMapService.php
@@ -115,6 +115,8 @@
                'circles',
        );
 
+       static protected $mapid = 0;
+
        /**
         * Array of map properties available for definition
         * @var array
@@ -130,6 +132,7 @@
                'title',
                'text',
                'icon',
+               'icon:hover',
                'color',
                'weight',
                'opacity',
@@ -161,12 +164,10 @@
         * @return string
         */
        public function render() {
-               static $mapid = 0;
-
                $output = \Html::rawElement(
                                'div',
                                array(
-                                       'id' => 'multimaps_map' . $mapid++,
+                                       'id' => 'multimaps_map' . 
self::$mapid++,
                                        'style' => 
'width:'.htmlspecialchars($this->width).'; 
height:'.htmlspecialchars($this->height).'; background-color: #cccccc; 
overflow: hidden;',
                                        'class' => 'multimaps-map' . 
($this->classname != '' ? " multimaps-map-$this->classname" : ''),
                                        ),
@@ -261,7 +262,7 @@
 
                $matches = array();
                foreach ($param as $value) {
-                       if( preg_match('/^\s*(\w+)\s*=\s*(.+)\s*$/s', $value, 
$matches) ) {
+                       if( preg_match('/^\s*(\w+:?\w*)\s*=\s*(.+)\s*$/s', 
$value, $matches) ) {
                                $name = strtolower($matches[1]);
                                if( array_search($name, 
$this->availableMapElements) !== false ) {
                                        $this->addMapElement($name, 
$matches[2]);
@@ -472,7 +473,6 @@
                                        $this->errormessages[] = \wfMessage( 
'multimaps-unable-parse-parameter', $name, $value )->escaped();
                                }
                                return true;
-                               break;
                        case 'icon':
                                $marker = new Marker();
                                if ( $marker->setProperty('icon', $value) ) {
@@ -498,15 +498,37 @@
                                        $this->errormessages = array_merge( 
$this->errormessages, $marker->getErrorMessages() );
                                }
                                return true;
-                               break;
+                       case 'icon:hover':
+                               $marker = new Marker();
+                               if ( $marker->setProperty('icon:hover', $value) 
) {
+                                       if ( $marker->hovericon !== null ) {
+                                               $this->properties['hoverIcon'] 
= $marker->hovericon;
+                                       }
+                                       if ( $marker->hoversize !== null ) {
+                                               
$this->properties['hoverIconSize'] = $marker->hoversize;
+                                       }
+                                       if ( $marker->hoveranchor !== null ) {
+                                               
$this->properties['hoverIconAnchor'] = $marker->hoveranchor;
+                                       }
+                                       if ( $marker->hovershadow !== null ) {
+                                               
$this->properties['hoverIconShadow'] = $marker->hovershadow;
+                                       }
+                                       if ( $marker->hovershSize !== null ) {
+                                               
$this->properties['hoverIconShSize'] = $marker->hovershSize;
+                                       }
+                                       if ( $marker->hovershAnchor !== null ) {
+                                               
$this->properties['hoverIconShAnchor'] = $marker->hovershAnchor;
+                                       }
+                               } else {
+                                       $this->errormessages = array_merge( 
$this->errormessages, $marker->getErrorMessages() );
+                               }
+                               return true;
                        case 'height':
                                $this->height = $value;
                                return true;
-                               break;
                        case 'width':
                                $this->width = $value;
                                return true;
-                               break;
                        case 'bounds':
                                //TODO
                                break;
@@ -518,7 +540,6 @@
                                        $this->properties[$name] = $value;
                                }
                                return true;
-                               break;
                }
                return false;
        }
diff --git a/includes/mapelements/Marker.php b/includes/mapelements/Marker.php
index 5471342..41120ef 100644
--- a/includes/mapelements/Marker.php
+++ b/includes/mapelements/Marker.php
@@ -22,7 +22,7 @@
 
                $this->availableProperties = array_merge(
                                $this->availableProperties,
-                               array( 'icon' )
+                               array( 'icon', 'icon:hover' )
                                );
        }
 
@@ -38,8 +38,15 @@
                global $egMultiMaps_CoordinatesSeparator, 
$egMultiMaps_OptionsSeparator,
                                $egMultiMaps_IconPath, 
$egMultiMaps_IconAllowFromDirectory;
 
-               if ( strtolower($name) != 'icon' ) {
+               $lowerName = strtolower($name);
+               if ( $lowerName !== 'icon' && $lowerName !== 'icon:hover' ) {
                        return parent::setProperty( $name, $value );
+               }
+
+               if ( $lowerName === 'icon:hover' ) {
+                       $prefix = 'hover';
+               } else {
+                       $prefix = '';
                }
 
                // Explode icon, it containt 'icon', 'size', 'anchor', 
'shadow', 'shSize', 'shAnchor'
@@ -67,7 +74,7 @@
                                        return false;
                                }
                        }
-                       $this->properties['icon'] = htmlspecialchars( $v, 
ENT_NOQUOTES );
+                       $this->properties[$prefix . 'icon'] = htmlspecialchars( 
$v, ENT_NOQUOTES );
                }
 
                // Icon size
@@ -80,7 +87,7 @@
                                $this->errormessages[] = \wfMessage( 
'multimaps-marker-incorrect-icon-size', $v, $value )->escaped();
                                return false;
                        }
-                       $this->properties['size'] = $v;
+                       $this->properties[$prefix . 'size'] = $v;
                }
 
                // Icon anchor
@@ -93,7 +100,7 @@
                                $this->errormessages[] = \wfMessage( 
'multimaps-marker-incorrect-icon-anchor', $v, $value )->escaped();
                                return false;
                        }
-                       $this->properties['anchor'] = $v;
+                       $this->properties[$prefix . 'anchor'] = $v;
                }
 
                // Shadow URL
@@ -115,7 +122,7 @@
                                        return false;
                                }
                        }
-                       $this->properties['shadow'] = htmlspecialchars( $v, 
ENT_NOQUOTES );
+                       $this->properties[$prefix . 'shadow'] = 
htmlspecialchars( $v, ENT_NOQUOTES );
                }
 
                // Shadow size
@@ -128,7 +135,7 @@
                                $this->errormessages[] = \wfMessage( 
'multimaps-marker-incorrect-shadow-size', $v, $value )->escaped();
                                return false;
                        }
-                       $this->properties['shSize'] = $v;
+                       $this->properties[$prefix . 'shSize'] = $v;
                }
 
                // Shadow anchor
@@ -141,7 +148,7 @@
                                $this->errormessages[] = \wfMessage( 
'multimaps-marker-incorrect-shadow-anchor', $v, $value )->escaped();
                                return false;
                        }
-                       $this->properties['shAnchor'] = $v;
+                       $this->properties[$prefix . 'shAnchor'] = $v;
                }
 
                return true;
diff --git a/resources/multimaps.js b/resources/multimaps.js
index aa12c02..7df07f8 100644
--- a/resources/multimaps.js
+++ b/resources/multimaps.js
@@ -35,6 +35,24 @@
                        if (globalOptions.iconShAnchor && 
!elementoptions.shAnchor) {
                                elementoptions.shAnchor = 
globalOptions.iconShAnchor;
                        }
+                       if (globalOptions.hoverIcon && 
!elementoptions.hovericon) {
+                               elementoptions.hovericon = 
globalOptions.hoverIcon;
+                       }
+                       if (globalOptions.hoverIconSize && 
!elementoptions.hoversize) {
+                               elementoptions.hoversize = 
globalOptions.hoverIconSize;
+                       }
+                       if (globalOptions.hoverIconAnchor && 
!elementoptions.hoveranchor) {
+                               elementoptions.hoveranchor = 
globalOptions.hoverIconAnchor;
+                       }
+                       if (globalOptions.hoverIconShadow && 
!elementoptions.hovershadow) {
+                               elementoptions.hovershadow = 
globalOptions.hoverIconShadow;
+                       }
+                       if (globalOptions.hoverIconShSize && 
!elementoptions.hovershSize) {
+                               elementoptions.hovershSize = 
globalOptions.hoverIconShSize;
+                       }
+                       if (globalOptions.hoverIconShAnchor && 
!elementoptions.hovershAnchor) {
+                               elementoptions.hovershAnchor = 
globalOptions.hoverIconShAnchor;
+                       }
                        break;
                case 'polygon':
                case 'circle':
diff --git a/services/Google/ext.google.js b/services/Google/ext.google.js
index 1db4300..06357ba 100644
--- a/services/Google/ext.google.js
+++ b/services/Google/ext.google.js
@@ -13,10 +13,10 @@
        * @return {Object} options of map element
        */
        convertPropertiesToOptions: function (properties) {
-               var options = {}, text = false;
+               var options = {}, text = false, iconOptions, hoverIconOptions;
 
                if (properties.icon !== undefined) {
-                       var iconOptions = { url: properties.icon };
+                       iconOptions = { url: properties.icon };
                        if (properties.size !== undefined) {
                                iconOptions.scaledSize = new 
google.maps.Size(properties.size[0], properties.size[1]);
                        }
@@ -35,6 +35,17 @@
                                options.shadow = shadowOptions;
                        }
                }
+
+               if (properties.hovericon !== undefined) {
+                       hoverIconOptions = { url: properties.hovericon };
+                       if (properties.hoversize !== undefined) {
+                               hoverIconOptions.scaledSize = new 
google.maps.Size(properties.hoversize[0], properties.hoversize[1]);
+                       }
+                       if (properties.hoveranchor !== undefined) {
+                               hoverIconOptions.anchor = new 
google.maps.Point(properties.hoveranchor[0], properties.hoveranchor[1]);
+                       }
+               }
+
                if (properties.color !== undefined) {
                        options.strokeColor = properties.color;
                }
@@ -64,7 +75,7 @@
                        text = properties.text;
                }
 
-               return { options: options, text: text };
+               return { options: options, text: text, hoverIconOptions: 
hoverIconOptions };
        },
 
        /**
@@ -74,7 +85,7 @@
        * @param {Object} properties Contains the fields lat, lon, title, text 
and icon
        */
        addMarker: function (map, properties) {
-               var marker, infowindow, value = 
this.convertPropertiesToOptions(properties);
+               var marker, entered, infowindow, value = 
this.convertPropertiesToOptions(properties);
 
                value.options.position = new 
google.maps.LatLng(properties.pos[0].lat, properties.pos[0].lon);
                value.options.map = map;
@@ -87,6 +98,19 @@
                                infowindow.open(marker.get('map'), marker);
                        });
                }
+
+               if ( value.hoverIconOptions ) {
+                       google.maps.event.addListener( marker, 'mouseover', 
function () {
+                               if ( !entered ) {
+                                       marker.setIcon( value.hoverIconOptions 
);
+                                       entered = true;
+                               }
+                       } );
+                       google.maps.event.addListener( marker, 'mouseout', 
function () {
+                               marker.setIcon( value.options.icon );
+                               entered = false;
+                       } );
+               }
        },
 
        addLine: function (map, properties) {
diff --git a/services/Leaflet/ext.leaflet.js b/services/Leaflet/ext.leaflet.js
index 37e6c91..f378ea4 100644
--- a/services/Leaflet/ext.leaflet.js
+++ b/services/Leaflet/ext.leaflet.js
@@ -13,10 +13,10 @@
        * @return {Object} options of map element
        */
        convertPropertiesToOptions: function (properties) {
-               var options = {}, text = false;
+               var options = {}, hoverIcon, text = false, iconOptions, 
hoverIconOptions;
 
                if (properties.icon !== undefined) {
-                       var iconOptions = {     iconUrl: properties.icon };
+                       iconOptions = { iconUrl: properties.icon };
                        if (properties.size !== undefined) {
                                iconOptions.iconSize = properties.size;
                        }
@@ -34,6 +34,27 @@
                        }
                        options.icon = new L.Icon( iconOptions );
                }
+
+               if (properties.hovericon !== undefined) {
+                       hoverIconOptions = { iconUrl: properties.hovericon };
+                       if (properties.hoversize !== undefined) {
+                               hoverIconOptions.iconSize = 
properties.hoversize;
+                       }
+                       if (properties.hoveranchor !== undefined) {
+                               hoverIconOptions.iconAnchor = 
properties.hoveranchor;
+                       }
+                       if (properties.hovershadow !== undefined) {
+                               hoverIconOptions.shadowUrl = 
properties.hovershadow;
+                       }
+                       if (properties.hovershSize !== undefined) {
+                               hoverIconOptions.shadowSize = 
properties.hovershSize;
+                       }
+                       if (properties.hovershAnchor !== undefined) {
+                               hoverIconOptions.shadowAnchor = 
properties.hovershAnchor;
+                       }
+                       hoverIcon = new L.Icon( hoverIconOptions );
+               }
+
                if (properties.color !== undefined) {
                        options.color = properties.color;
                }
@@ -63,7 +84,7 @@
                        text = properties.text;
                }
 
-               return { options: options, text: text };
+               return { options: options, text: text, hoverIcon: hoverIcon };
        },
 
        /**
@@ -73,12 +94,25 @@
        * @param {Object} properties Contains the fields lat, lon, title, text 
and icon
        */
        addMarker: function (map, properties) {
-               var marker, value = this.convertPropertiesToOptions(properties);
+               var marker, value = 
this.convertPropertiesToOptions(properties), entered;
 
                marker = L.marker([properties.pos[0].lat, 
properties.pos[0].lon], value.options).addTo(map);
                if (value.text) {
                        marker.bindPopup(value.text);
                }
+
+               if ( value.hoverIcon ) {
+                       marker.on( 'mouseover', function ( e ) {
+                               if ( !entered ) {
+                                       e.target.setIcon( value.hoverIcon );
+                                       entered = true;
+                               }
+                       } );
+                       marker.on( 'mouseout', function ( e ) {
+                               e.target.setIcon( value.options.icon || 
L.Marker.prototype.options.icon );
+                               entered = false;
+                       } );
+               }
        },
 
        addLine: function (map, properties) {
diff --git a/services/Yandex/ext.yandex.js b/services/Yandex/ext.yandex.js
index 0fa8f93..b81dc09 100644
--- a/services/Yandex/ext.yandex.js
+++ b/services/Yandex/ext.yandex.js
@@ -13,7 +13,7 @@
        * @return {Object} options of map element
        */
        convertPropertiesToOptions: function (properties) {
-               var prop = {}, options = {};
+               var prop = {}, options = {}, iconOptions, hoverIconOptions;
 
                if (properties.icon !== undefined) {
                        options.iconImageHref = properties.icon;
@@ -26,6 +26,8 @@
                        if (properties.shadow !== undefined) {
                                options.iconShadow = true;
                                options.iconShadowImageHref = properties.shadow;
+                       } else {
+                               options.iconShadow = false;
                        }
                        if (properties.shSize !== undefined) {
                                options.iconShadowImageSize = properties.shSize;
@@ -33,7 +35,32 @@
                        if (properties.shAnchor !== undefined) {
                                options.iconShadowImageOffset = [ 
-properties.shAnchor[0], -properties.shAnchor[1] ];
                        }
+                       iconOptions = $.extend( {}, options );
                }
+
+
+               if (properties.hovericon !== undefined) {
+                       hoverIconOptions = $.extend( {}, iconOptions, { 
iconImageHref: properties.hovericon } );
+                       if (properties.hoversize !== undefined) {
+                               hoverIconOptions.iconImageSize = 
properties.hoversize;
+                       }
+                       if (properties.hoveranchor !== undefined) {
+                               hoverIconOptions.iconImageOffset = 
properties.hoveranchor;
+                       }
+                       if (properties.hovershadow !== undefined) {
+                               hoverIconOptions.iconShadow = true;
+                               hoverIconOptions.iconShadowImageHref = 
properties.hovershadow;
+                       } else {
+                               hoverIconOptions.iconShadow = false;
+                       }
+                       if (properties.hovershSize !== undefined) {
+                               hoverIconOptions.iconShadowImageSize = 
properties.hovershSize;
+                       }
+                       if (properties.hovershAnchor !== undefined) {
+                               hoverIconOptions.iconShadowImageOffset = 
properties.hovershAnchor;
+                       }
+               }
+
                if (properties.color !== undefined) {
                        options.strokeColor = properties.color;
                }
@@ -63,7 +90,7 @@
                        prop.balloonContent = properties.text;
                }
 
-               return { properties: prop, options: options };
+               return { properties: prop, options: options, iconOptions: 
iconOptions, hoverIconOptions: hoverIconOptions };
        },
 
        /**
@@ -77,6 +104,21 @@
 
                marker = new ymaps.Placemark([properties.pos[0].lat, 
properties.pos[0].lon], value.properties, value.options);
                map.geoObjects.add(marker);
+
+               if ( value.hoverIconOptions ) {
+                       marker.events
+                                       .add( 'mouseenter', function ( e ) {
+                                               e.get( 'target' ).options.set( 
value.hoverIconOptions );
+                                       } )
+                                       .add( 'mouseleave', function ( e ) {
+                                               var options = e.get( 'target' 
).options;
+                                               if ( value.iconOptions ) {
+                                                       options.set( 
value.iconOptions );
+                                               } else {
+                                                       options.unsetAll();
+                                               }
+                                       } );
+               }
        },
 
        addLine: function (map, properties) {

-- 
To view, visit https://gerrit.wikimedia.org/r/333587
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia80e1336676917e5b66cc04d05b470ec011294a3
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MultiMaps
Gerrit-Branch: master
Gerrit-Owner: Pastakhov <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to