mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Vendor ruler (#1476)
* Fixes ruler module integrity issues by bringing module into source * Changing ruler stylesheet to vaguely match DCS theme in Liberation * Changelog
This commit is contained in:
parent
0370aa8df5
commit
119d4b9514
@ -36,6 +36,7 @@ Saves from 4.0.0 are compatible with 4.1.0.
|
||||
* **[UI]** Control point name displayed with ground object group name on map.
|
||||
* **[UI]** Buy or Replace will now show the correct price for generated ground objects like sams.
|
||||
* **[UI]** Improved logging for frontline movement to be more descriptive about what happened and why.
|
||||
* **[UI]** Brought ruler map module into source, which should fix file integrity issues with the module.
|
||||
|
||||
## Fixes
|
||||
|
||||
|
||||
@ -25,12 +25,8 @@
|
||||
crossorigin="">
|
||||
</script>
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.jsdelivr.net/gh/gokertanrisever/leaflet-ruler@master/src/leaflet-ruler.css"
|
||||
integrity="sha384-P9DABSdtEY/XDbEInD3q+PlL+BjqPCXGcF8EkhtKSfSTr/dS5PBKa9+/PMkW2xsY"
|
||||
crossorigin="anonymous">
|
||||
<script src="https://cdn.jsdelivr.net/gh/gokertanrisever/leaflet-ruler@master/src/leaflet-ruler.js"
|
||||
integrity="sha384-N2S8y7hRzXUPiepaSiUvBH1ZZ7Tc/ZfchhbPdvOE5v3aBBCIepq9l+dBJPFdo1ZJ"
|
||||
crossorigin="anonymous"></script>
|
||||
href="lib/leaflet-ruler/leaflet-ruler.css">
|
||||
<script src="lib/leaflet-ruler/leaflet-ruler.js"></script>
|
||||
<script src="map.js" defer="defer"></script>
|
||||
<style>
|
||||
body { padding: 0; margin: 0; }
|
||||
|
||||
22
resources/ui/map/lib/leaflet-ruler/LICENSE.md
Normal file
22
resources/ui/map/lib/leaflet-ruler/LICENSE.md
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Goker Tanrisever
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
41
resources/ui/map/lib/leaflet-ruler/leaflet-ruler.css
Normal file
41
resources/ui/map/lib/leaflet-ruler/leaflet-ruler.css
Normal file
@ -0,0 +1,41 @@
|
||||
.leaflet-ruler{
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
background-image: url("ruler.png"); /* <div>Icons made by <a href="https://www.flaticon.com/authors/monkik" title="monkik">monkik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div> */
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
.leaflet-ruler:hover{
|
||||
background-image: url("ruler.png"); /* <div>Icon made by <a href="https://www.flaticon.com/authors/monkik" title="monkik">monkik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div> */
|
||||
}
|
||||
.leaflet-ruler-clicked{
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-image: url("ruler.png");
|
||||
border-color: #5C863F !important;
|
||||
}
|
||||
.leaflet-bar{
|
||||
background-color: #ffffff;
|
||||
}
|
||||
.leaflet-control {
|
||||
cursor: pointer;
|
||||
}
|
||||
.result-tooltip{
|
||||
background-color: white;
|
||||
border-width: medium;
|
||||
border-color: #435466;
|
||||
font-size: smaller;
|
||||
}
|
||||
.moving-tooltip{
|
||||
background-color: rgba(255, 255, 255, .7);
|
||||
background-clip: padding-box;
|
||||
opacity: 0.5;
|
||||
border: dotted;
|
||||
border-color: #435466;
|
||||
font-size: smaller;
|
||||
}
|
||||
.plus-length{
|
||||
padding-left: 45px;
|
||||
}
|
||||
173
resources/ui/map/lib/leaflet-ruler/leaflet-ruler.js
Normal file
173
resources/ui/map/lib/leaflet-ruler/leaflet-ruler.js
Normal file
@ -0,0 +1,173 @@
|
||||
(function(factory, window){
|
||||
"use strict";
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(['leaflet'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
module.exports = factory(require('leaflet'));
|
||||
}
|
||||
if (typeof window !== 'undefined' && window.L) {
|
||||
window.L.Ruler = factory(L);
|
||||
}
|
||||
}(function (L) {
|
||||
"use strict";
|
||||
L.Control.Ruler = L.Control.extend({
|
||||
options: {
|
||||
position: 'topright',
|
||||
circleMarker: {
|
||||
color: 'red',
|
||||
radius: 2
|
||||
},
|
||||
lineStyle: {
|
||||
color: 'red',
|
||||
dashArray: '1,6'
|
||||
},
|
||||
lengthUnit: {
|
||||
display: 'km',
|
||||
decimal: 2,
|
||||
factor: null,
|
||||
label: 'Distance:'
|
||||
},
|
||||
angleUnit: {
|
||||
display: '°',
|
||||
decimal: 2,
|
||||
factor: null,
|
||||
label: 'Bearing:'
|
||||
}
|
||||
},
|
||||
onAdd: function(map) {
|
||||
this._map = map;
|
||||
this._container = L.DomUtil.create('div', 'leaflet-bar');
|
||||
this._container.classList.add('leaflet-ruler');
|
||||
L.DomEvent.disableClickPropagation(this._container);
|
||||
L.DomEvent.on(this._container, 'click', this._toggleMeasure, this);
|
||||
this._choice = false;
|
||||
this._defaultCursor = this._map._container.style.cursor;
|
||||
this._allLayers = L.layerGroup();
|
||||
return this._container;
|
||||
},
|
||||
onRemove: function() {
|
||||
L.DomEvent.off(this._container, 'click', this._toggleMeasure, this);
|
||||
},
|
||||
_toggleMeasure: function() {
|
||||
this._choice = !this._choice;
|
||||
this._clickedLatLong = null;
|
||||
this._clickedPoints = [];
|
||||
this._totalLength = 0;
|
||||
if (this._choice){
|
||||
this._map.doubleClickZoom.disable();
|
||||
L.DomEvent.on(this._map._container, 'keydown', this._escape, this);
|
||||
L.DomEvent.on(this._map._container, 'dblclick', this._closePath, this);
|
||||
this._container.classList.add("leaflet-ruler-clicked");
|
||||
this._clickCount = 0;
|
||||
this._tempLine = L.featureGroup().addTo(this._allLayers);
|
||||
this._tempPoint = L.featureGroup().addTo(this._allLayers);
|
||||
this._pointLayer = L.featureGroup().addTo(this._allLayers);
|
||||
this._polylineLayer = L.featureGroup().addTo(this._allLayers);
|
||||
this._allLayers.addTo(this._map);
|
||||
this._map._container.style.cursor = 'crosshair';
|
||||
this._map.on('click', this._clicked, this);
|
||||
this._map.on('mousemove', this._moving, this);
|
||||
}
|
||||
else {
|
||||
this._map.doubleClickZoom.enable();
|
||||
L.DomEvent.off(this._map._container, 'keydown', this._escape, this);
|
||||
L.DomEvent.off(this._map._container, 'dblclick', this._closePath, this);
|
||||
this._container.classList.remove("leaflet-ruler-clicked");
|
||||
this._map.removeLayer(this._allLayers);
|
||||
this._allLayers = L.layerGroup();
|
||||
this._map._container.style.cursor = this._defaultCursor;
|
||||
this._map.off('click', this._clicked, this);
|
||||
this._map.off('mousemove', this._moving, this);
|
||||
}
|
||||
},
|
||||
_clicked: function(e) {
|
||||
this._clickedLatLong = e.latlng;
|
||||
this._clickedPoints.push(this._clickedLatLong);
|
||||
L.circleMarker(this._clickedLatLong, this.options.circleMarker).addTo(this._pointLayer);
|
||||
if(this._clickCount > 0 && !e.latlng.equals(this._clickedPoints[this._clickedPoints.length - 2])){
|
||||
if (this._movingLatLong){
|
||||
L.polyline([this._clickedPoints[this._clickCount-1], this._movingLatLong], this.options.lineStyle).addTo(this._polylineLayer);
|
||||
}
|
||||
var text;
|
||||
this._totalLength += this._result.Distance;
|
||||
if (this._clickCount > 1){
|
||||
text = '<b>' + this.options.angleUnit.label + '</b> ' + this._result.Bearing.toFixed(this.options.angleUnit.decimal) + ' ' + this.options.angleUnit.display + '<br><b>' + this.options.lengthUnit.label + '</b> ' + this._totalLength.toFixed(this.options.lengthUnit.decimal) + ' ' + this.options.lengthUnit.display;
|
||||
}
|
||||
else {
|
||||
text = '<b>' + this.options.angleUnit.label + '</b> ' + this._result.Bearing.toFixed(this.options.angleUnit.decimal) + ' ' + this.options.angleUnit.display + '<br><b>' + this.options.lengthUnit.label + '</b> ' + this._result.Distance.toFixed(this.options.lengthUnit.decimal) + ' ' + this.options.lengthUnit.display;
|
||||
}
|
||||
L.circleMarker(this._clickedLatLong, this.options.circleMarker).bindTooltip(text, {permanent: true, className: 'result-tooltip'}).addTo(this._pointLayer).openTooltip();
|
||||
}
|
||||
this._clickCount++;
|
||||
},
|
||||
_moving: function(e) {
|
||||
if (this._clickedLatLong){
|
||||
L.DomEvent.off(this._container, 'click', this._toggleMeasure, this);
|
||||
this._movingLatLong = e.latlng;
|
||||
if (this._tempLine){
|
||||
this._map.removeLayer(this._tempLine);
|
||||
this._map.removeLayer(this._tempPoint);
|
||||
}
|
||||
var text;
|
||||
this._addedLength = 0;
|
||||
this._tempLine = L.featureGroup();
|
||||
this._tempPoint = L.featureGroup();
|
||||
this._tempLine.addTo(this._map);
|
||||
this._tempPoint.addTo(this._map);
|
||||
this._calculateBearingAndDistance();
|
||||
this._addedLength = this._result.Distance + this._totalLength;
|
||||
L.polyline([this._clickedLatLong, this._movingLatLong], this.options.lineStyle).addTo(this._tempLine);
|
||||
if (this._clickCount > 1){
|
||||
text = '<b>' + this.options.angleUnit.label + '</b> ' + this._result.Bearing.toFixed(this.options.angleUnit.decimal) + ' ' + this.options.angleUnit.display + '<br><b>' + this.options.lengthUnit.label + '</b> ' + this._addedLength.toFixed(this.options.lengthUnit.decimal) + ' ' + this.options.lengthUnit.display + '<br><div class="plus-length">(+' + this._result.Distance.toFixed(this.options.lengthUnit.decimal) + ')</div>';
|
||||
}
|
||||
else {
|
||||
text = '<b>' + this.options.angleUnit.label + '</b> ' + this._result.Bearing.toFixed(this.options.angleUnit.decimal) + ' ' + this.options.angleUnit.display + '<br><b>' + this.options.lengthUnit.label + '</b> ' + this._result.Distance.toFixed(this.options.lengthUnit.decimal) + ' ' + this.options.lengthUnit.display;
|
||||
}
|
||||
L.circleMarker(this._movingLatLong, this.options.circleMarker).bindTooltip(text, {sticky: true, offset: L.point(0, -40) ,className: 'moving-tooltip'}).addTo(this._tempPoint).openTooltip();
|
||||
}
|
||||
},
|
||||
_escape: function(e) {
|
||||
if (e.keyCode === 27){
|
||||
if (this._clickCount > 0){
|
||||
this._closePath();
|
||||
}
|
||||
else {
|
||||
this._choice = true;
|
||||
this._toggleMeasure();
|
||||
}
|
||||
}
|
||||
},
|
||||
_calculateBearingAndDistance: function() {
|
||||
var f1 = this._clickedLatLong.lat, l1 = this._clickedLatLong.lng, f2 = this._movingLatLong.lat, l2 = this._movingLatLong.lng;
|
||||
var toRadian = Math.PI / 180;
|
||||
// haversine formula
|
||||
// bearing
|
||||
var y = Math.sin((l2-l1)*toRadian) * Math.cos(f2*toRadian);
|
||||
var x = Math.cos(f1*toRadian)*Math.sin(f2*toRadian) - Math.sin(f1*toRadian)*Math.cos(f2*toRadian)*Math.cos((l2-l1)*toRadian);
|
||||
var brng = Math.atan2(y, x)*((this.options.angleUnit.factor ? this.options.angleUnit.factor/2 : 180)/Math.PI);
|
||||
brng += brng < 0 ? (this.options.angleUnit.factor ? this.options.angleUnit.factor : 360) : 0;
|
||||
// distance
|
||||
var R = this.options.lengthUnit.factor ? 6371 * this.options.lengthUnit.factor : 6371; // kilometres
|
||||
var deltaF = (f2 - f1)*toRadian;
|
||||
var deltaL = (l2 - l1)*toRadian;
|
||||
var a = Math.sin(deltaF/2) * Math.sin(deltaF/2) + Math.cos(f1*toRadian) * Math.cos(f2*toRadian) * Math.sin(deltaL/2) * Math.sin(deltaL/2);
|
||||
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
||||
var distance = R * c;
|
||||
this._result = {
|
||||
Bearing: brng,
|
||||
Distance: distance
|
||||
};
|
||||
},
|
||||
_closePath: function() {
|
||||
this._map.removeLayer(this._tempLine);
|
||||
this._map.removeLayer(this._tempPoint);
|
||||
if (this._clickCount <= 1) this._map.removeLayer(this._pointLayer);
|
||||
this._choice = false;
|
||||
L.DomEvent.on(this._container, 'click', this._toggleMeasure, this);
|
||||
this._toggleMeasure();
|
||||
}
|
||||
});
|
||||
L.control.ruler = function(options) {
|
||||
return new L.Control.Ruler(options);
|
||||
};
|
||||
}, window));
|
||||
BIN
resources/ui/map/lib/leaflet-ruler/ruler.png
Normal file
BIN
resources/ui/map/lib/leaflet-ruler/ruler.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 684 B |
Loading…
x
Reference in New Issue
Block a user