fix test tooltip
[fg:canvas-hackers-fgdata.git] / Aircraft / Instruments-3d / GPSmap196 / mfd.nas
1 ##
2 # helpers for creating canvas-based multi-function-displays (MFDs)
3
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
6 #
7 # TODO: keep on extending this for instruments/frameworks like:
8 #
9 #       - navdisplay.mfd
10 #       - Avidyne/Entegra (extra500)
11 #       - kln89
12 #       - Primus G1000
13
14 var initPage = func(group, page, filename) {
15         canvas.parsesvg(var new_page = group.createChild("group", page), filename);
16         new_page.hide();
17         return new_page;
18 };
19
20 var MFDPageElement = {
21         new: func() {
22         },
23         update:func() {
24         },
25         del: func() {
26         },
27 };
28
29 ###
30 # MFD page helper class,needs to be implemented by all pages
31 # currently assumes that each page is SVG based (requires filenames)
32 var MFDPage = {
33         new: func(root, page, filename) {
34                 var m = {parents:[MFDPage]};
35                 m.page = page;
36                 m.group = initPage(root, page, filename); # FIXME
37                 return m;
38         },
39         hide: func me.group.hide(),
40         show: func me.group.show(),
41
42         handleEvent: func die("abstract handleEvent() method not yet implemented by sub-class:",me.page),
43 };
44
45
46
47 ##
48 # manages MFD pages
49 # TODO: add button handling here, along with event management
50 var MFDPageMgr = {
51         new: func(root) {
52                 var m ={parents:[MFDPageMgr]};
53                 m.active=nil;
54                 m.pagelist = [];
55                 m.pages = {};
56                 m.listeners = [];
57                 m.root = root;
58                 return m;
59         },
60         del: func {
61                 foreach(var l; me.listeners)
62                         removelistener(l);
63         },
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() ));
68         },
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;   
74         },
75         nextPage: func {
76         },
77         prevPage: func {
78
79         },
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
84                 me.active=name;
85                 # and show it
86                 me.update();
87                 #me.subscribe( me.getActivePage().subscribe() );
88         },
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;
95         }
96         return 0;
97                 
98         },
99
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) {
103                 return func {
104                         # dispatch events to active page 
105                         if(me.isSubscribedEvent(event))
106                                 me.getActivePage().handleEvent(event);
107                         
108                         print(event, " (handled by page mgr) Active page was:", me.getActivePageName());
109                 }
110         },
111 };
112
113