]> git.donarmstrong.com Git - lilypond.git/blob - lily/axis-group-interface.cc
release: 1.3.53
[lilypond.git] / lily / axis-group-interface.cc
1 /*   
2   axis-group-interface.cc --  implement Axis_group_interface
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "axis-group-interface.hh"
11 #include "score-element.hh"
12 #include "dimension-cache.hh"
13
14 Axis_group_interface::Axis_group_interface (Score_element*s)
15 {
16   elt_l_ = s;
17 }
18
19 Axis_group_interface
20 Axis_group_interface (Score_element*s)
21 {
22   return Axis_group_interface (s);
23 }
24
25 void
26 Axis_group_interface::add_element (Score_element *e)
27 {
28
29   // ugh. used_b_ should be junked.
30   elt_l_->used_b_ = true;
31   e->used_b_ = true;
32
33   for (SCM ax = elt_l_->get_elt_property ("axes"); ax != SCM_EOL ; ax = gh_cdr (ax))
34     {
35       Axis a = (Axis) gh_scm2int (gh_car (ax));
36       
37       if (!e->parent_l (a))
38         e->set_parent (elt_l_, a);
39     }
40
41   Group_interface (elt_l_).add_element (e);
42   elt_l_->add_dependency (e);
43 }
44
45
46 bool
47 Axis_group_interface::axis_b (Axis a )const
48 {
49   return elt_l_->dim_cache_[a]->extent_callback_l_ == group_extent_callback;
50 }
51
52 Interval
53 Axis_group_interface::relative_group_extent (Axis a, Score_element *common, SCM elts)
54 {
55   Interval r;
56   for (SCM s = elts; gh_pair_p (s); s = gh_cdr (s))
57     {
58       Score_element * se = unsmob_element (gh_car (s));
59       Interval dims = se->extent (a);
60       if (!dims.empty_b ())
61         r.unite (dims + se->relative_coordinate (common, a));
62     }
63   return r;
64 }
65
66 Interval
67 Axis_group_interface::group_extent_callback (Dimension_cache const *c) 
68 {
69   Axis a = c->axis ();
70   Score_element * me = c->element_l ();
71   Score_element * common = me;
72
73   for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
74     {
75       Score_element * se = unsmob_element (gh_car (s));
76       common = se->common_refpoint (common, a);
77     }
78
79   Real my_coord = me->relative_coordinate (common, a);
80   Interval r (relative_group_extent (a, common, me->get_elt_property ("elements")));
81
82   return r - my_coord;
83 }
84
85 void
86 Axis_group_interface::set_interface ()
87 {
88   if (!has_interface_b ())
89     {
90       elt_l_->set_elt_property ("elements", SCM_EOL);
91       elt_l_->set_elt_property ("transparent", SCM_BOOL_T); //  junk this?
92       elt_l_->set_elt_property ("axes" , SCM_EOL);
93       group (elt_l_, "interfaces").add_thing (ly_symbol2scm ("Axis_group"));
94     }
95 }
96
97 void
98 Axis_group_interface::set_axes (Axis a1, Axis a2)
99 {
100   // set_interface () ? 
101
102   SCM ax = gh_cons (gh_int2scm (a1), SCM_EOL);
103   if (a1 != a2)
104     ax= gh_cons (gh_int2scm (a2), ax);
105
106   
107   elt_l_->set_elt_property ("axes", ax);
108
109   if (a1 != X_AXIS && a2 != X_AXIS)
110     elt_l_->set_extent_callback (0, X_AXIS);
111   if (a1 != Y_AXIS && a2 != Y_AXIS)
112     elt_l_->set_extent_callback (0, Y_AXIS);
113   
114   elt_l_->dim_cache_[a1]->set_extent_callback (Axis_group_interface::group_extent_callback);
115   elt_l_->dim_cache_[a2]->set_extent_callback (Axis_group_interface::group_extent_callback);
116 }
117
118 Link_array<Score_element> 
119 Axis_group_interface::get_children ()
120 {
121   Link_array<Score_element> childs;
122   childs.push (elt_l_) ;
123
124   if (!has_interface_b ())
125     return childs;
126   
127   for (SCM ep = elt_l_->get_elt_property ("elements"); gh_pair_p (ep); ep = gh_cdr (ep))
128     {
129       Score_element* e = unsmob_element (gh_car (ep));
130       if (e)
131         childs.concat (Axis_group_interface (e).get_children ());
132     }
133   
134   return childs;
135 }
136
137 bool
138 Axis_group_interface::has_interface_b ()
139 {
140   SCM ifs = elt_l_->get_elt_property ("interfaces");
141
142   if (!gh_pair_p (ifs ))
143     return false;
144   return scm_memq (ly_symbol2scm ("Axis_group"),ifs)  != SCM_BOOL_F;
145 }
146
147