]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/break-align-engraver.cc
release: 1.3.43
[lilypond.git] / lily / break-align-engraver.cc
index 44d94270a6028544137528c2e1774f5fe6ca33e6..9f2047dfdadbd68969439d812eef544cd7c1112e 100644 (file)
@@ -3,13 +3,15 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 #include "engraver.hh"
 #include "protected-scm.hh"
 #include "break-align-item.hh"
-#include "axis-group-item.hh"
+#include "align-interface.hh"
+#include "axis-group-interface.hh"
+#include "dimension-cache.hh"
 
 class Break_align_engraver : public Engraver
 {
@@ -33,14 +35,14 @@ void
 Break_align_engraver::add_column (SCM smob)
 {
   Score_element * e = unsmob_element (smob);
-  align_l_->add_element (e);
+  Align_interface (align_l_).add_element (e);
   typeset_element (e);
 }
 
 void
 Break_align_engraver::do_pre_move_processing ()
 {
-  SCM order = get_property ("breakAlignOrder", 0);
+  SCM order = get_property ("breakAlignOrder");
   for (; gh_pair_p (order); order = gh_cdr (order))
     {
       SCM p = scm_assoc ( gh_car (order), column_alist_);
@@ -87,36 +89,56 @@ Break_align_engraver::acknowledge_element (Score_element_info inf)
       if (!breakable)
        return ;
 
-      SCM al = item_l->remove_elt_property ("break-aligned");
-      if (!gh_boolean_p (al ) || !gh_scm2bool (al))
+      SCM align_name = item_l->remove_elt_property ("break-align-symbol");
+      if (!gh_symbol_p (align_name))
        return ;
 
-      
       if (!align_l_)
        {
          align_l_ = new Break_align_item;
          align_l_->set_elt_property ("breakable", SCM_BOOL_T);
          announce_element (Score_element_info (align_l_,0));
+
+
+         Item * edge = new Item;
+         SCM edge_sym = ly_symbol2scm ("Left_edge_item");
+         edge->set_elt_property ("break-align-symbol", edge_sym);
+
+         /*
+           If the element is empty, it will be ignored in the break
+           alignment stuff.
+
+           TODO: switch off ignoring empty stuff?
+         */
+         edge->dim_cache_[X_AXIS]->set_extent_callback (Dimension_cache::point_dimension_callback);
+         
+         align_l_->set_elt_property ("group-center-element", edge->self_scm_);
+
+         announce_element (Score_element_info(edge, 0));
+         column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm_);
        }
 
-      SCM name = ly_str02scm (inf.elem_l_->name());
-      SCM s = scm_assoc (name, column_alist_);
+      SCM s = scm_assoc (align_name, column_alist_);
+
+      Item * group = 0;
 
-      Axis_group_item * group = 0;
       if (s != SCM_BOOL_F)
        {
          Score_element *e =  unsmob_element (gh_cdr(s));
-         group = dynamic_cast<Axis_group_item*> (e);
+         group = dynamic_cast<Item*> (e);
        }
       else
        {
-         group = new Axis_group_item;
-         group->set_axes (X_AXIS,X_AXIS);
-         group->set_elt_property ("origin", name);
+         group = new Item;
+
+         Axis_group_interface (group).set_interface ();
+         Axis_group_interface (group).set_axes (X_AXIS,X_AXIS);
+
+         group->set_elt_property ("break-align-symbol", align_name);
          group->set_parent (align_l_, Y_AXIS);
          announce_element (Score_element_info (group, 0));
-         column_alist_ = scm_assoc_set_x (column_alist_, name, group->self_scm_);
+         column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm_);
        }
-      group->add_element (item_l);
+      Axis_group_interface (group).add_element (item_l);
     }
 }