Add a smaller info pane that appears while hovering over planes
This commit is contained in:
parent
b0dc4f8a4f
commit
6c86d4f276
|
@ -121,6 +121,28 @@
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div> <!-- selected_infoblock -->
|
</div> <!-- selected_infoblock -->
|
||||||
|
|
||||||
|
<div id="highlighted_infoblock">
|
||||||
|
<div class="highlightedTitle">
|
||||||
|
<span class="identLarge"><span id="highlighted_callsign">n/a</span></span>
|
||||||
|
<span class="identSmall"><span id="highlighted_icao">n/a</span></span>
|
||||||
|
</div>
|
||||||
|
<div class="highlightedInfo">
|
||||||
|
<div class="infoRow">
|
||||||
|
<div class="infoHeading infoRowTitle">Aircraft Type: </div>
|
||||||
|
<div class="infoData infoRowContent"><span id="higlighted_icaotype">n/a</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="infoRow">
|
||||||
|
<div class="infoHeading infoRowTitle">Altitude: </div>
|
||||||
|
<div class="infoData infoRowContent"><span id="highlighted_altitude">n/a</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="infoRow">
|
||||||
|
<div class="infoHeading infoRowTitle">Speed: </div>
|
||||||
|
<div class="infoData infoRowContent"><span id="highlighted_speed">n/a</span></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div id="map_container">
|
<div id="map_container">
|
||||||
<div id="map_canvas"></div>
|
<div id="map_canvas"></div>
|
||||||
<div id="toggle_sidebar_control" class="ol-unselectable ol-control">
|
<div id="toggle_sidebar_control" class="ol-unselectable ol-control">
|
||||||
|
|
|
@ -13,6 +13,7 @@ var PlanesOrdered = [];
|
||||||
var PlaneFilter = {};
|
var PlaneFilter = {};
|
||||||
var SelectedPlane = null;
|
var SelectedPlane = null;
|
||||||
var SelectedAllPlanes = false;
|
var SelectedAllPlanes = false;
|
||||||
|
var HighlightedPlane = null;
|
||||||
var FollowSelected = false;
|
var FollowSelected = false;
|
||||||
|
|
||||||
var SpecialSquawks = {
|
var SpecialSquawks = {
|
||||||
|
@ -157,6 +158,7 @@ function fetchData() {
|
||||||
selectNewPlanes();
|
selectNewPlanes();
|
||||||
refreshTableInfo();
|
refreshTableInfo();
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
|
|
||||||
if (ReceiverClock) {
|
if (ReceiverClock) {
|
||||||
var rcv = new Date(now * 1000);
|
var rcv = new Date(now * 1000);
|
||||||
|
@ -378,6 +380,7 @@ function end_load_history() {
|
||||||
|
|
||||||
refreshTableInfo();
|
refreshTableInfo();
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
reaper();
|
reaper();
|
||||||
|
|
||||||
// Setup our timer to poll from the server.
|
// Setup our timer to poll from the server.
|
||||||
|
@ -549,6 +552,7 @@ function initialize_map() {
|
||||||
Math.abs(center[1] - selected.position[1]) > 0.0001) {
|
Math.abs(center[1] - selected.position[1]) > 0.0001) {
|
||||||
FollowSelected = false;
|
FollowSelected = false;
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -580,6 +584,28 @@ function initialize_map() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// show the hover box
|
||||||
|
OLMap.on('pointermove', function(evt) {
|
||||||
|
var hex = evt.map.forEachFeatureAtPixel(evt.pixel,
|
||||||
|
function(feature, layer) {
|
||||||
|
return feature.hex;
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
function(layer) {
|
||||||
|
return (layer === iconsLayer);
|
||||||
|
},
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hex) {
|
||||||
|
highlightPlaneByHex(hex);
|
||||||
|
} else {
|
||||||
|
removeHighlight();
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
// Add home marker if requested
|
// Add home marker if requested
|
||||||
if (SitePosition) {
|
if (SitePosition) {
|
||||||
var markerStyle = new ol.style.Style({
|
var markerStyle = new ol.style.Style({
|
||||||
|
@ -712,6 +738,7 @@ function reaper() {
|
||||||
PlanesOrdered = newPlanes;
|
PlanesOrdered = newPlanes;
|
||||||
refreshTableInfo();
|
refreshTableInfo();
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Page Title update function
|
// Page Title update function
|
||||||
|
@ -850,6 +877,48 @@ function refreshSelected() {
|
||||||
$('#selected_photo_link').html(getFlightAwarePhotoLink(selected.registration));
|
$('#selected_photo_link').html(getFlightAwarePhotoLink(selected.registration));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function refreshHighlighted() {
|
||||||
|
// this is following nearly identical logic, etc, as the refreshSelected function, but doing less junk for the highlighted pane
|
||||||
|
var highlighted = false;
|
||||||
|
|
||||||
|
if (typeof HighlightedPlane !== 'undefined' && HighlightedPlane !== null) {
|
||||||
|
highlighted = Planes[HighlightedPlane];
|
||||||
|
}
|
||||||
|
|
||||||
|
// no highlighted plane
|
||||||
|
if (!highlighted) {
|
||||||
|
$('#highlighted_infoblock').hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#highlighted_infoblock').show();
|
||||||
|
|
||||||
|
if (highlighted.flight !== null && highlighted.flight !== "") {
|
||||||
|
$('#highlighted_callsign').text(highlighted.flight);
|
||||||
|
} else {
|
||||||
|
$('#highlighted_callsign').text('n/a');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (highlighted.icaotype !== null) {
|
||||||
|
$('#higlighted_icaotype').text(highlighted.icaotype);
|
||||||
|
} else {
|
||||||
|
$('#higlighted_icaotype').text("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$('#highlighted_speed').text(format_speed_long(highlighted.speed, DisplayUnits));
|
||||||
|
|
||||||
|
$("#highlighted_altitude").text(format_altitude_long(highlighted.altitude, highlighted.vert_rate, DisplayUnits));
|
||||||
|
|
||||||
|
$('#highlighted_icao').text(highlighted.icao.toUpperCase());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeHighlight() {
|
||||||
|
HighlightedPlane = null;
|
||||||
|
refreshHighlighted();
|
||||||
|
}
|
||||||
|
|
||||||
// Refreshes the larger table of all the planes
|
// Refreshes the larger table of all the planes
|
||||||
function refreshTableInfo() {
|
function refreshTableInfo() {
|
||||||
var show_squawk_warning = false;
|
var show_squawk_warning = false;
|
||||||
|
@ -1016,7 +1085,7 @@ function sortBy(id,sc,se) {
|
||||||
function selectPlaneByHex(hex,autofollow) {
|
function selectPlaneByHex(hex,autofollow) {
|
||||||
//console.log("select: " + hex);
|
//console.log("select: " + hex);
|
||||||
// If SelectedPlane has something in it, clear out the selected
|
// If SelectedPlane has something in it, clear out the selected
|
||||||
|
removeHighlight();
|
||||||
if (SelectedAllPlanes) {
|
if (SelectedAllPlanes) {
|
||||||
deselectAllPlanes();
|
deselectAllPlanes();
|
||||||
}
|
}
|
||||||
|
@ -1054,10 +1123,23 @@ function selectPlaneByHex(hex,autofollow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
|
}
|
||||||
|
|
||||||
|
function highlightPlaneByHex(hex) {
|
||||||
|
// if we've selected a plane, don't show the highlighting box
|
||||||
|
if (SelectedPlane != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hex != null) {
|
||||||
|
HighlightedPlane = hex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop through the planes and mark them as selected to show the paths for all planes
|
// loop through the planes and mark them as selected to show the paths for all planes
|
||||||
function selectAllPlanes() {
|
function selectAllPlanes() {
|
||||||
|
HighlightedPlane = null;
|
||||||
// if all planes are already selected, deselect them all
|
// if all planes are already selected, deselect them all
|
||||||
if (SelectedAllPlanes) {
|
if (SelectedAllPlanes) {
|
||||||
deselectAllPlanes();
|
deselectAllPlanes();
|
||||||
|
@ -1083,6 +1165,7 @@ function selectAllPlanes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
|
|
||||||
// on refreshes, try to find new planes and mark them as selected
|
// on refreshes, try to find new planes and mark them as selected
|
||||||
|
@ -1115,6 +1198,7 @@ function deselectAllPlanes() {
|
||||||
SelectedPlane = null;
|
SelectedPlane = null;
|
||||||
SelectedAllPlanes = false;
|
SelectedAllPlanes = false;
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleFollowSelected() {
|
function toggleFollowSelected() {
|
||||||
|
@ -1122,6 +1206,7 @@ function toggleFollowSelected() {
|
||||||
if (FollowSelected && OLMap.getView().getZoom() < 8)
|
if (FollowSelected && OLMap.getView().getZoom() < 8)
|
||||||
OLMap.getView().setZoom(8);
|
OLMap.getView().setZoom(8);
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetMap() {
|
function resetMap() {
|
||||||
|
@ -1305,6 +1390,7 @@ function onDisplayUnitsChanged(e) {
|
||||||
// Refresh data
|
// Refresh data
|
||||||
refreshTableInfo();
|
refreshTableInfo();
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
|
|
||||||
// Redraw range rings
|
// Redraw range rings
|
||||||
if (SitePosition !== null && SitePosition !== undefined && SiteCircles) {
|
if (SitePosition !== null && SitePosition !== undefined && SiteCircles) {
|
||||||
|
@ -1331,6 +1417,7 @@ function onFilterByAltitude(e) {
|
||||||
selectedPlane.clearLines();
|
selectedPlane.clearLines();
|
||||||
selectedPlane.updateMarker();
|
selectedPlane.updateMarker();
|
||||||
refreshSelected();
|
refreshSelected();
|
||||||
|
refreshHighlighted();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -269,24 +269,6 @@ select.error, textarea.error, input.error {
|
||||||
color: rgb(0, 0, 0);
|
color: rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.identLarge
|
|
||||||
{
|
|
||||||
font-family: Helvetica Neue;
|
|
||||||
font-size: 19px;
|
|
||||||
line-height: 20px;
|
|
||||||
color: #002F5D;
|
|
||||||
color: rgb(0, 47, 93);
|
|
||||||
}
|
|
||||||
|
|
||||||
.identSmall
|
|
||||||
{
|
|
||||||
font-family: Helvetica Neue;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 20px;
|
|
||||||
color: #00A0E2;
|
|
||||||
color: rgb(0, 160, 226);
|
|
||||||
}
|
|
||||||
|
|
||||||
.link
|
.link
|
||||||
{
|
{
|
||||||
font-family: Helvetica Neue;
|
font-family: Helvetica Neue;
|
||||||
|
@ -390,4 +372,62 @@ select.error, textarea.error, input.error {
|
||||||
margin-top: 18px;
|
margin-top: 18px;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#highlighted_infoblock {
|
||||||
|
position: absolute;
|
||||||
|
left: 40px;
|
||||||
|
top: 60px;
|
||||||
|
min-width: 168px;
|
||||||
|
background: #ffffff;
|
||||||
|
box-shadow: 4px 4px 10px #444444;
|
||||||
|
cursor: pointer;
|
||||||
|
z-index: 9999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlightedTitle {
|
||||||
|
height: 36px;
|
||||||
|
border-bottom: 1px solid #00A0E2;
|
||||||
|
padding-left: 18px;
|
||||||
|
padding-top: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlightedInfo {
|
||||||
|
padding-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.identLarge {
|
||||||
|
font-family: Helvetica Neue;
|
||||||
|
font-size: 19px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #002F5D;
|
||||||
|
color: rgb(0, 47, 93);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.identSmall {
|
||||||
|
font-family: Helvetica Neue;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #00A0E2;
|
||||||
|
color: rgb(0, 160, 226);
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlightedInfo {
|
||||||
|
padding-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infoRowTitle {
|
||||||
|
display: inline-block;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infoRowContent {
|
||||||
|
display: inline-block;
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.infoRow {
|
||||||
|
padding-top: 10px;
|
||||||
}
|
}
|
Loading…
Reference in a new issue