]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/vertical-align-engraver.cc
release: 1.3.0
[lilypond.git] / lily / vertical-align-engraver.cc
index 67fdfda3ddf3e53131ed57cf4d3d72d1a6bf4299..2497fd4f59cc98d5b056c6b73870417f3be96fe3 100644 (file)
@@ -5,11 +5,13 @@
 
   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
-
-#include "p-col.hh"
+#include "translator-group.hh"
+#include "axis-group-engraver.hh"
+#include "paper-column.hh"
 #include "vertical-align-engraver.hh"
-#include "vertical-align-spanner.hh"
-#include "vertical-group-spanner.hh"
+#include "axis-align-spanner.hh"
+#include "axis-group-spanner.hh"
+#include "span-bar.hh"
 
 Vertical_align_engraver::Vertical_align_engraver()
 {
@@ -19,7 +21,10 @@ Vertical_align_engraver::Vertical_align_engraver()
 void
 Vertical_align_engraver::do_creation_processing()
 {
-  valign_p_ =new Vertical_align_spanner;
+  valign_p_ =new Axis_align_spanner;
+  valign_p_->set_axis (Y_AXIS);
+  valign_p_->stacking_dir_ = DOWN;
+  
   valign_p_->set_bounds(LEFT,get_staff_info().command_pcol_l ());
   announce_element (Score_element_info (valign_p_ , 0));
 }
@@ -27,34 +32,58 @@ Vertical_align_engraver::do_creation_processing()
 void
 Vertical_align_engraver::do_removal_processing()
 {
-  Scalar dist (get_property ("maxVerticalAlign", 0));
-  if (dist.length_i () && dist.isnum_b ())
+  SCM dist (get_property ("maxVerticalAlign", 0));
+  if (SCM_NUMBERP(dist))
     {
-      valign_p_->threshold_interval_[BIGGER]  = Real (dist);
+      valign_p_->threshold_interval_[BIGGER]  = gh_scm2double (dist);
     }
 
   dist = get_property ("minVerticalAlign", 0);
-  if (dist.length_i () && dist.isnum_b ())
+  if (SCM_NUMBERP(dist))
     {
-      valign_p_->threshold_interval_[SMALLER]  = Real (dist);
+      valign_p_->threshold_interval_[SMALLER]  = gh_scm2double (dist);
+    }
+
+  dist = get_property ("alignmentReference",0);
+  if (isdir_b (dist))
+    {
+      valign_p_->align_dir_ = to_dir (dist);
     }
-  
   valign_p_->set_bounds(RIGHT,get_staff_info().command_pcol_l ());
   typeset_element (valign_p_);
   valign_p_ =0;
 }
 
+
+bool
+Vertical_align_engraver::qualifies_b (Score_element_info i) const
+{
+#if 0
+  Translator * t =   i.origin_trans_l_arr_[0];
+#endif
+  int sz = i.origin_trans_l_arr_.size()  ;
+
+#if 0 
+  return (sz == 1 && dynamic_cast<Translator_group*> (t))
+    || (sz == 2 && dynamic_cast<Axis_group_engraver*> (t));
+#endif
+
+  Axis_group_element * elt = dynamic_cast<Axis_group_element *> (i.elem_l_);
+
+  return sz > 1 && elt && elt->axes_[0] == Y_AXIS && !elt->parent_l (Y_AXIS);
+}
+
 void
 Vertical_align_engraver::acknowledge_element (Score_element_info i)
 {
-  if (i.origin_grav_l_arr_.size() == 1
-      && dynamic_cast<Vertical_group_spanner *> (i.elem_l_)
-      && !i.elem_l_->parent_l (Y_AXIS))
+  if (qualifies_b (i))
     {
-      assert (!valign_p_->contains_b (i.elem_l_));
-
       valign_p_->add_element (i.elem_l_);
     }
+  else if (dynamic_cast<Span_bar*>(i.elem_l_) && i.origin_trans_l_arr_.size ())
+    {
+      i.elem_l_->add_dependency (valign_p_);
+    }  
 }