6099592a98
Using new knockout feature "deferred updates" saves us many redundant UI updates
253 lines
8.8 KiB
JavaScript
253 lines
8.8 KiB
JavaScript
require.config({
|
|
baseUrl : '.',
|
|
paths : {
|
|
jquery : '3rdparty/jquery/jquery-1.11.2.min',
|
|
'jquery-ui' : '3rdparty/jquery/ui',
|
|
knockout : '3rdparty/knockout/knockout-3.4.0',
|
|
kojqui : '3rdparty/knockout-jqueryui',
|
|
sprintf : '3rdparty/sprintf/sprintf.min',
|
|
leaflet : '3rdparty/leaflet-0.7.7/leaflet',
|
|
geodesic : '3rdparty/leaflet-0.7.7/Leaflet.Geodesic.min',
|
|
text : '3rdparty/require/text',
|
|
flot : '3rdparty/flot/jquery.flot',
|
|
flotresize : '3rdparty/flot/jquery.flot.resize',
|
|
flottime : '3rdparty/flot/jquery.flot.time',
|
|
fgcommand : 'lib/fgcommand',
|
|
props : 'lib/props2',
|
|
knockprops : 'lib/knockprops',
|
|
sammy : '3rdparty/sammy-latest.min',
|
|
aircraft : '../aircraft-dir',
|
|
pagedown : '3rdparty/pagedown',
|
|
clockpicker : '3rdparty/clockpicker/jquery-clockpicker.min',
|
|
stamen : 'http://maps.stamen.com/js/tile.stamen',
|
|
},
|
|
waitSeconds : 30,
|
|
});
|
|
|
|
require([
|
|
'knockout', 'jquery', 'sammy', 'fgcommand', 'themeswitch', 'kojqui/button', 'kojqui/buttonset', 'kojqui/selectmenu',
|
|
'jquery-ui/sortable', 'flot', 'leaflet', 'knockprops'
|
|
], function(ko, jquery, Sammy, fgcommand) {
|
|
|
|
ko.options.deferUpdates = true;
|
|
|
|
|
|
ko.utils.knockprops.setAliases({
|
|
|
|
// time
|
|
gmt : "/sim/time/gmt",
|
|
timeWarp : "/sim/time/warp",
|
|
// flight
|
|
pitch : "/orientation/pitch-deg",
|
|
roll : "/orientation/roll-deg",
|
|
heading : "/orientation/heading-magnetic-deg",
|
|
"true-heading" : "/orientation/heading-deg",
|
|
altitude : "/position/altitude-ft",
|
|
latitude : "/position/latitude-deg",
|
|
longitude : "/position/longitude-deg",
|
|
airspeed : "/velocities/airspeed-kt",
|
|
groundspeed : "/velocities/groundspeed-kt",
|
|
slip : "/instrumentation/slip-skid-ball/indicated-slip-skid",
|
|
cg : "/fdm/jsbsim/inertia/cg-x-in",
|
|
weight : "/fdm/jsbsim/inertia/weight-lbs",
|
|
|
|
// radio settings
|
|
com1stn : "/instrumentation/comm/station-name",
|
|
com1use : "/instrumentation/comm/frequencies/selected-mhz",
|
|
com1sby : "/instrumentation/comm/frequencies/standby-mhz",
|
|
com1stn : "/instrumentation/comm/station-name",
|
|
com2stn : "/instrumentation/comm[1]/station-name",
|
|
com2use : "/instrumentation/comm[1]/frequencies/selected-mhz",
|
|
com2sby : "/instrumentation/comm[1]/frequencies/standby-mhz",
|
|
com2stn : "/instrumentation/comm[1]/station-name",
|
|
nav1use : "/instrumentation/nav/frequencies/selected-mhz",
|
|
nav1sby : "/instrumentation/nav/frequencies/standby-mhz",
|
|
nav1stn : "/instrumentation/nav/nav-id",
|
|
nav2use : "/instrumentation/nav[1]/frequencies/selected-mhz",
|
|
nav2sby : "/instrumentation/nav[1]/frequencies/standby-mhz",
|
|
nav2stn : "/instrumentation/nav[1]/nav-id",
|
|
adf1use : "/instrumentation/adf/frequencies/selected-khz",
|
|
adf1sby : "/instrumentation/adf/frequencies/standby-khz",
|
|
adf1stn : "/instrumentation/adf/ident",
|
|
dme1use : "/instrumentation/dme/frequencies/selected-mhz",
|
|
dme1dst : "/instrumentation/dme/indicated-distance-nm",
|
|
xpdrcod : "/instrumentation/transponder/id-code",
|
|
// weather
|
|
"ac-wdir" : "/environment/wind-from-heading-deg",
|
|
"ac-wspd" : "/environment/wind-speed-kt",
|
|
"ac-visi" : "/environment/visibility-m",
|
|
"ac-temp" : "/environment/temperature-degc",
|
|
"ac-dewp" : "/environment/dewpoint-degc",
|
|
"gnd-wdir" : "/environment/config/boundary/entry/wind-from-heading-deg",
|
|
"gnd-wspd" : "/environment/config/boundary/entry/wind-speed-kt",
|
|
"gnd-visi" : "/environment/config/boundary/entry/visibility-m",
|
|
"gnd-temp" : "/environment/config/boundary/entry/temperature-degc",
|
|
"gnd-dewp" : "/environment/config/boundary/entry/dewpoint-degc",
|
|
"metar-valid" : "/environment/metar/valid",
|
|
});
|
|
|
|
function PhiViewModel(topics) {
|
|
var self = this;
|
|
self.widgets = ko.observableArray([
|
|
"METAR", "PFD", "Radiostack", "Small Map", "Stopwatch"
|
|
]);
|
|
|
|
self.topics = topics;
|
|
|
|
self.selectedTopic = ko.observable();
|
|
self.selectedSubtopic = ko.observable();
|
|
|
|
self.selectTopic = function(topic) {
|
|
location.hash = topic;
|
|
}
|
|
|
|
self.refresh = function() {
|
|
location.reload();
|
|
}
|
|
|
|
self.doPause = function() {
|
|
fgcommand.pause();
|
|
}
|
|
|
|
self.doUnpause = function() {
|
|
fgcommand.unpause();
|
|
}
|
|
|
|
jquery("#widgetarea").sortable({
|
|
handle : ".widget-handle",
|
|
axis : "y",
|
|
cursor : "move",
|
|
});
|
|
// jquery("#widgetarea").disableSelection();
|
|
|
|
// Client-side routes
|
|
Sammy(function() {
|
|
this.get('#:topic', function() {
|
|
self.selectedTopic(this.params.topic);
|
|
self.selectedSubtopic('');
|
|
});
|
|
|
|
this.get('#:topic/:subtopic', function() {
|
|
self.selectedTopic(this.params.topic);
|
|
self.selectedSubtopic(this.params.subtopic);
|
|
});
|
|
// empty route
|
|
this.get('', function() {
|
|
this.app.runRoute('get', '#' + self.topics[0]);
|
|
});
|
|
}).run();
|
|
|
|
}
|
|
ko.components.register('sidebarwidget', {
|
|
require : 'widgets/sidebarwidget'
|
|
});
|
|
|
|
ko.components.register('Small Map', {
|
|
require : 'widgets/map'
|
|
});
|
|
|
|
ko.components.register('Radiostack', {
|
|
require : 'widgets/radiostack'
|
|
});
|
|
|
|
ko.components.register('AircraftMarker', {
|
|
require : 'widgets/AircraftMarker'
|
|
});
|
|
|
|
ko.components.register('METAR', {
|
|
require : 'widgets/metar'
|
|
});
|
|
|
|
ko.components.register('PFD', {
|
|
require : 'widgets/efis'
|
|
});
|
|
|
|
ko.components.register('Stopwatch', {
|
|
require : 'widgets/Stopwatch'
|
|
});
|
|
|
|
ko.components.register('dualarcgauge', {
|
|
require : 'instruments/DualArcGauge'
|
|
})
|
|
|
|
ko.bindingHandlers.flotchart = {
|
|
init : function(element, valueAccessor, allBindings) {
|
|
// This will be called when the binding is first applied to an
|
|
// element
|
|
// Set up any initial state, event handlers, etc. here
|
|
var value = valueAccessor() || {};
|
|
|
|
if (value.hover && typeof (value.hover) === 'function') {
|
|
jquery(element).bind("plothover", function(event, pos, item) {
|
|
value.hover.call(jquery(this).data("flotplot"), pos, item);
|
|
});
|
|
}
|
|
if (value.click && typeof (value.click) === 'function') {
|
|
jquery(element).bind("plotclick", function(event, pos, item) {
|
|
value.click.call(jquery(this).data("flotplot"), pos, item);
|
|
});
|
|
}
|
|
},
|
|
|
|
update : function(element, valueAccessor, allBindings) {
|
|
var value = valueAccessor() || {};
|
|
var data = ko.unwrap(value.data);
|
|
var options = ko.unwrap(value.options);
|
|
var plot = jquery.plot(element, data, options);
|
|
jquery(element).data("flotplot", plot);
|
|
var postUpdate = ko.unwrap(value.postUpdate);
|
|
if (postUpdate) {
|
|
postUpdate.call(value, element);
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
jquery.get('/config.json', null, function(config) {
|
|
|
|
var userConfig = {}
|
|
// merge user config into global config
|
|
var jqxhr = jquery.get('/fg-home/Phi/config.json', null, function(data) {
|
|
userConfig = data;
|
|
}).always(function(){
|
|
for ( var p in userConfig.plugins ) {
|
|
config.plugins[p] = userConfig.plugins[p];
|
|
}
|
|
|
|
var topics = [];
|
|
if (config && config.plugins ) {
|
|
for ( var p in config.plugins ) {
|
|
var plugin = config.plugins[p];
|
|
if (plugin.component) {
|
|
if (false == ko.components.isRegistered(p)) {
|
|
ko.components.register(p, { require: plugin.component });
|
|
}
|
|
}
|
|
|
|
topics.push(p);
|
|
}
|
|
}
|
|
|
|
topics.sort(function(a,b) {
|
|
indexa = config.plugins[a].index || 0;
|
|
indexb = config.plugins[b].index || 0;
|
|
return indexa - indexb;
|
|
});
|
|
ko.applyBindings(new PhiViewModel(topics), document.getElementById('wrapper'));
|
|
});
|
|
});
|
|
|
|
|
|
jquery("#toolbar").click(function() {
|
|
jquery("#content").animate({
|
|
top : 0
|
|
}, 1000, null, function() {
|
|
jquery(".htabs").css('background', '#427EBF url("images/FI_logo.svg") no-repeat scroll left center');
|
|
});
|
|
jquery("#widgetarea").animate({
|
|
top : 29
|
|
}, 1000);
|
|
});
|
|
|
|
});
|