2 # helpers for creating canvas-based multi-function-displays (MFDs)
4 # NOTE: this file should NOT contain anything that is specific to a single device
5 # move device-specific code into gpsmap196.nas, edit gpsmap196.pages to extend pages
7 # TODO: keep on extending this for instruments/frameworks like:
10 # - Avidyne/Entegra (extra500)
14 var initPage = func(group, page, filename) {
15 canvas.parsesvg(var new_page = group.createChild("group", page), filename);
20 var MFDPageElement = {
30 # MFD page helper class,needs to be implemented by all pages
31 # currently assumes that each page is SVG based (requires filenames)
33 new: func(root, page, filename) {
34 var m = {parents:[MFDPage]};
36 m.group = initPage(root, page, filename); # FIXME
39 hide: func me.group.hide(),
40 show: func me.group.show(),
42 handleEvent: func die("abstract handleEvent() method not yet implemented by sub-class:",me.page),
49 # TODO: add button handling here, along with event management
52 var m ={parents:[MFDPageMgr]};
61 foreach(var l; me.listeners)
64 # FIXME: this is just to support all those button listeners for now ...
65 # will replace it sooner or later with a helper class for managing buttons/keys
66 registerEvent: func (node) {
67 append(me.listeners, setlistener(node, func me.handleEvents() ));
69 registerPage: func(name, class) {
70 # call the constructor for the class to create a new page
71 append(me.pagelist, me.pages[name]=class.new(me.root, name, me));
72 # initialize if needed
73 if (typeof(me.active) == nil) me.active=name;
80 setActivePage: func(name) {
81 # hide the currently active page
82 if (me.active and (var curr=me.pages[me.active]) != nil) curr.hide();
83 # set the new active page
87 #me.subscribe( me.getActivePage().subscribe() );
89 getActivePageName: func return me.active,
90 getActivePage: func return me.pages[me.active],
91 update: func me.pages[me.active].show(),
92 isSubscribedEvent: func(event) {
93 foreach(var ev; me.getActivePage().subscribe()) {
94 if (ev == event) return 1;
100 # TODO: we can filter events here to process them via the page manager
101 # and not pass them through onto the page ...
102 makeEventHandler: func(event) {
104 # dispatch events to active page
105 if(me.isSubscribedEvent(event))
106 me.getActivePage().handleEvent(event);
108 print(event, " (handled by page mgr) Active page was:", me.getActivePageName());