]> git.donarmstrong.com Git - lilypond.git/commitdiff
Change the behavior of nested StaffGroupers.
authorJoe Neeman <joeneeman@gmail.com>
Thu, 3 Mar 2011 00:25:51 +0000 (11:25 +1100)
committerJoe Neeman <joeneeman@gmail.com>
Thu, 3 Mar 2011 00:25:51 +0000 (11:25 +1100)
Now staffgroup-staff-spacing is used for the spacing before the
first staff of a nested staff-group.

input/regression/page-spacing-staff-group-nested.ly
lily/axis-group-interface.cc
lily/include/staff-grouper-interface.hh
lily/staff-grouper-interface.cc
lily/vertical-align-engraver.cc

index 95124a7cbd2aef8c5c5024070a83b076f37c3351..8a11e330b5ca6090abd8866511b35ed757ca6055 100644 (file)
@@ -6,7 +6,10 @@
 
 \score {
  <<
-   \new StaffGroup <<
+   \new StaffGroup \with {
+     \override StaffGrouper #'staffgroup-staff-spacing #'basic-distance = #15
+   }
+   <<
      \new Staff {
        c'1
      }
index 520d024516a5f350eee316028114e2684f61ab90..0b399fd2482e5fa8ef9da603a416471dd9281ac8 100644 (file)
@@ -773,11 +773,11 @@ Axis_group_interface::calc_maybe_pure_staff_staff_spacing (Grob *me, bool pure,
 
   if (grouper)
     {
-      Grob *last_in_group = Staff_grouper_interface::get_maybe_pure_last_grob (grouper, pure, start, end);
-      if (me == last_in_group)
-       return grouper->get_maybe_pure_property ("staffgroup-staff-spacing", pure, start, end);
-      else
+      bool within_group = Staff_grouper_interface::maybe_pure_within_group (grouper, me, pure, start, end);
+      if (within_group)
        return grouper->get_maybe_pure_property ("staff-staff-spacing", pure, start, end);
+      else
+       return grouper->get_maybe_pure_property ("staffgroup-staff-spacing", pure, start, end);
     }
   return me->get_maybe_pure_property ("default-staff-staff-spacing", pure, start, end);
 }
index 3562ca0e5d2063b1196ba6781dd6804df39f02c7..d26169e4bd6107d05cc99cd888e65560eaf72b59 100644 (file)
@@ -27,7 +27,7 @@ class Staff_grouper_interface
 public:
   DECLARE_GROB_INTERFACE ();
 
-  static Grob *get_maybe_pure_last_grob (Grob *, bool, int, int);
+  static bool maybe_pure_within_group (Grob *, Grob *child, bool, int, int);
 };
 
 #endif /* STAFF_GROUPER_INTERFACE_HH */
index ec204fbf9bc70bda428f74427498b02b647951b9..803e1ee82dcfa4958f94b2f2f94efc644b15bafb 100644 (file)
 #include "page-layout-problem.hh"
 #include "pointer-group-interface.hh"
 
-Grob*
-Staff_grouper_interface::get_maybe_pure_last_grob (Grob *me, bool pure, int start, int end)
+/* Checks whether the child grob is in the "interior" of this staff-grouper.
+   This is the case if the next spaceable, living child after the given one
+   belongs to the group.
+*/
+bool
+Staff_grouper_interface::maybe_pure_within_group (Grob *me, Grob *child, bool pure, int start, int end)
 {
   extract_grob_set (me, "elements", elts);
-  for (vsize i = elts.size (); i--;)
-    if (Page_layout_problem::is_spaceable (elts[i])
-       && ((pure && !Hara_kiri_group_spanner::request_suicide (me, start, end))
-           || (!pure && elts[i]->is_live ())))
-      return elts[i];
 
-  return 0;
+  vector<Grob*>::const_iterator i = find (elts, child);
+
+  if (i == elts.end ())
+    return false;
+
+  for (++i; i != elts.end (); ++i)
+    if (Page_layout_problem::is_spaceable (*i)
+       && ((pure && !Hara_kiri_group_spanner::request_suicide (*i, start, end))
+           || (!pure && (*i)->is_live ())))
+      return me == unsmob_grob ((*i)->get_object ("staff-grouper"));
+
+  // If there was no spaceable, living child after me, I don't
+  // count as within the group.
+  return false;
 }
 
 ADD_INTERFACE (Staff_grouper_interface,
index 094967d98dc30518c576dbdc4cdf0ee0dfdf8ebd..9a6e3afa30c8e58aff8e92e3168c23d504fa3755 100644 (file)
@@ -163,9 +163,10 @@ Vertical_align_engraver::acknowledge_axis_group (Grob_info i)
            }
        }
     }
-  else if (qualifies (i) && !unsmob_grob (i.grob ()->get_object ("staff-grouper")))
+  else if (qualifies (i))
     {
       Pointer_group_interface::add_grob (valign_, ly_symbol2scm ("elements"), i.grob ());
-      i.grob ()->set_object ("staff-grouper", valign_->self_scm ());
+      if (!unsmob_grob (i.grob ()->get_object ("staff-grouper")))
+       i.grob ()->set_object ("staff-grouper", valign_->self_scm ());
     }
 }