777:Landing light switch modification
[fg:toms-fgdata.git] / Nasal / canvas / api.nas.2.8
1 # Canvas backward support for using 3.0 API with FlightGear 2.8
2
3 (func {
4
5 # 2.8 uses multiple properties for representing a color. Also different names
6 # are used for the colors and no CSS syntax like #rrggbb are supported.
7 var color_components = ["red", "green", "blue", "alpha"];
8 var setColorNodes = func(obj, name, color)
9 {
10   if( size(color) == 1 )
11     color = color[0];
12
13   if( typeof(color) != "vector" )
14     debug.warn("Wrong type for color");
15   else if( size(color) < 3 or size(color) > 4 )
16     debug.warn("Color needs 3 or 4 values (RGB or RGBA)");
17   else
18   {
19     var node = obj._node.getNode(name, 1);
20     for(var i = 0; i < size(color_components); i += 1)
21       node.getNode(color_components[i], 1)
22           .setDoubleValue( i < size(color) ? color[i]
23                                            : 1 ); # default alpha is 1
24   }
25
26   return obj;
27 };
28
29 Element.setColor = func setColorNodes(me, "color", arg);
30 Element.setColorFill = func {
31   setColorNodes(me, "color-fill", arg);
32   me.setBool("fill", 1);
33 };
34 Path.setColor = Element.setColor;
35 Path.setColorFill = Element.setColorFill;
36 Text.setColor = Element.setColor;
37 Text.setColorFill = Element.setColorFill;
38
39 #
40 Canvas.setColorBackground = func()
41 {
42   me._node = me.texture;
43   setColorNodes(me, "color-background", arg);
44 };
45
46 # 2.8 uses multiple properties instead of a single string property
47 Canvas.setStrokeDashArray = func(pattern)
48 {
49   me._node.removeChildren('stroke-dasharray');
50
51   if( typeof(pattern) == 'vector' )
52     me._node.setValues({'stroke-dasharray': pattern});
53   else
54     debug.warn("setStrokeDashArray: vector expected!");
55
56   return me;
57 };
58
59 # Create a canvas object from the given node. Used instead of ghost available
60 # in newer FG versions.
61 var makeCanvas = func(node)
62 {
63   return {
64     _node_ghost: node._g,
65     createGroup: func props.wrapNode(me._node_ghost).addChild("group", 0, 0)._g
66   };
67 };
68
69 # Internal helper for creating a canvas.
70 #
71 # @note In 2.9+ this function is replaced by a C++ function. This
72 #       implementation is just used as fallback for 2.8 and for usage
73 #       in other programs.
74 canvas._newCanvasGhost = func()
75 {
76   return makeCanvas( Canvas.property_root.addChild("texture", 0, 0) );
77 };
78
79 # Internal helper for retrieving an existing canvas.
80 #
81 canvas._getCanvasGhost = func(arg_ghost)
82 {
83   var arg = props.wrapNode(arg_ghost);
84
85   # get a canvas specified by its root node
86   if( Canvas.property_root.getPath() == arg.getParent().getPath() )
87     var node = Canvas.property_root.getChild("texture", arg.getIndex());
88
89   # get a canvas by its name
90   else if( (var name = arg.getChild("name")) != nil )
91   {
92     name = name.getValue();
93     var node = nil;
94     foreach(var c; Canvas.property_root.getChildren("texture"))
95     {
96       if( c.getValue("name") == name )
97         node_canvas = c;
98     }
99   }
100
101   # get a canvas by its index
102   else if( (var index = arg.getChild("index")) != nil )
103     var node = Canvas.property_root.getChild("texture", index.getValue());
104
105   if( node == nil )
106     return nil;
107
108   return makeCanvas( node );
109 };
110
111 print("Canvas API: FlightGear 2.8 backward support loaded.");
112
113 })();