]> git.donarmstrong.com Git - lilypond.git/blob - lily/vertical-align-engraver.cc
patch::: 1.3.18.jcn1
[lilypond.git] / lily / vertical-align-engraver.cc
1 /*
2   vertical-align-grav.cc -- implement Vertical_align_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "translator-group.hh"
10 #include "axis-group-engraver.hh"
11 #include "paper-column.hh"
12 #include "vertical-align-engraver.hh"
13 #include "axis-align-spanner.hh"
14 #include "axis-group-spanner.hh"
15 #include "span-bar.hh"
16
17 ADD_THIS_TRANSLATOR (Vertical_align_engraver);
18
19 Vertical_align_engraver::Vertical_align_engraver()
20 {
21   valign_p_ =0;
22 }
23
24 void
25 Vertical_align_engraver::do_creation_processing()
26 {
27   valign_p_ =new Axis_align_spanner;
28   valign_p_->set_axis (Y_AXIS);
29   valign_p_->stacking_dir_ = DOWN;
30   
31   valign_p_->set_bounds(LEFT,get_staff_info().command_pcol_l ());
32   announce_element (Score_element_info (valign_p_ , 0));
33 }
34
35 void
36 Vertical_align_engraver::do_removal_processing()
37 {
38   SCM dist (get_property ("maxVerticalAlign", 0));
39   if (gh_number_p(dist))
40     {
41       valign_p_->threshold_interval_[BIGGER]  = gh_scm2double (dist);
42     }
43
44   dist = get_property ("minVerticalAlign", 0);
45   if (gh_number_p(dist))
46     {
47       valign_p_->threshold_interval_[SMALLER]  = gh_scm2double (dist);
48     }
49
50   dist = get_property ("alignmentReference",0);
51   if (isdir_b (dist))
52     {
53       valign_p_->align_dir_ = to_dir (dist);
54     }
55   valign_p_->set_bounds(RIGHT,get_staff_info().command_pcol_l ());
56   typeset_element (valign_p_);
57   valign_p_ =0;
58 }
59
60
61 bool
62 Vertical_align_engraver::qualifies_b (Score_element_info i) const
63 {
64   int sz = i.origin_trans_l_arr_.size()  ;
65
66
67   Axis_group_element * elt = dynamic_cast<Axis_group_element *> (i.elem_l_);
68
69   return sz > 1 && elt && elt->axes_[0] == Y_AXIS && !elt->parent_l (Y_AXIS);
70 }
71
72 void
73 Vertical_align_engraver::acknowledge_element (Score_element_info i)
74 {
75   if (qualifies_b (i))
76     {
77       valign_p_->add_element (i.elem_l_);
78     }
79   else if (dynamic_cast<Span_bar*>(i.elem_l_) && i.origin_trans_l_arr_.size ())
80     {
81       i.elem_l_->add_dependency (valign_p_);
82     }  
83 }
84