]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/vertical-align-engraver.cc
Change the behavior of nested StaffGroupers.
[lilypond.git] / lily / vertical-align-engraver.cc
index 8b8d04ea0cb8cc6cbab90c8b81f11828bcfe9ac6..9a6e3afa30c8e58aff8e92e3168c23d504fa3755 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  vertical-align-engraver.cc -- implement Vertical_align_engraver
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "context.hh"
@@ -33,21 +44,32 @@ protected:
   void process_music ();
   virtual void finalize ();
   virtual void initialize ();
+
+  bool top_level_;
 };
 
 ADD_ACKNOWLEDGER (Vertical_align_engraver, axis_group);
 ADD_TRANSLATOR (Vertical_align_engraver,
-               "Catch groups (staffs, lyrics lines, etc.) and stack "
-               "them vertically.",
-               /* create */ "VerticalAlignment",
-               /* accept */ "",
-               /* read */ "",
-               /* write */ "");
+               /* doc */
+               "Catch groups (staves, lyrics lines, etc.) and stack them"
+               " vertically.",
+
+               /* create */
+               "VerticalAlignment ",
+
+               /* read */
+               "alignAboveContext "
+               "alignBelowContext ",
+
+               /* write */
+               ""
+               );
 
 Vertical_align_engraver::Vertical_align_engraver ()
 {
   valign_ = 0;
   id_to_group_hashtab_ = SCM_EOL;
+  top_level_ = false;
 }
 
 void
@@ -67,7 +89,9 @@ Vertical_align_engraver::process_music ()
 {
   if (!valign_)
     {
-      valign_ = make_spanner ("VerticalAlignment", SCM_EOL);
+      top_level_ = to_boolean (get_property ("topLevelAlignment"));
+
+      valign_ = make_spanner (top_level_ ? "VerticalAlignment" : "StaffGrouper", SCM_EOL);
       valign_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));
       Align_interface::set_ordered (valign_);
     }
@@ -90,17 +114,18 @@ Vertical_align_engraver::qualifies (Grob_info i) const
 
   return sz > 0 && Axis_group_interface::has_interface (i.grob ())
     && !i.grob ()->get_parent (Y_AXIS)
+    && !to_boolean (i.grob ()->get_property ("no-alignment"))
     && Axis_group_interface::has_axis (i.grob (), Y_AXIS);
 }
 
 void
 Vertical_align_engraver::acknowledge_axis_group (Grob_info i)
 {
-  if (qualifies (i))
+  if (top_level_ && qualifies (i))
     {
       string id = i.context ()->id_string ();
 
-      scm_hash_set_x (id_to_group_hashtab_, scm_makfrom0str (id.c_str ()),
+      scm_hash_set_x (id_to_group_hashtab_, ly_string2scm (id),
                      i.grob ()->self_scm ());
 
       SCM before_id = i.context ()->get_property ("alignAboveContext");
@@ -126,14 +151,22 @@ Vertical_align_engraver::acknowledge_axis_group (Grob_info i)
              if (arr[i] == before_grob)
                {
                  arr.insert (arr.begin () + i, added);
+                 added->set_property ("staff-affinity", scm_from_int (DOWN));
                  break;
                }
              else if (arr[i] == after_grob)
                {
                  arr.insert (arr.begin () + i + 1, added);
+                 added->set_property ("staff-affinity", scm_from_int (UP));
                  break;
                }
            }
        }
     }
+  else if (qualifies (i))
+    {
+      Pointer_group_interface::add_grob (valign_, ly_symbol2scm ("elements"), i.grob ());
+      if (!unsmob_grob (i.grob ()->get_object ("staff-grouper")))
+       i.grob ()->set_object ("staff-grouper", valign_->self_scm ());
+    }
 }