From: Joe Neeman Date: Thu, 3 Mar 2011 00:25:51 +0000 (+1100) Subject: Change the behavior of nested StaffGroupers. X-Git-Tag: release/2.13.53-1~30 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=b4af54cb24ef6879771323ee0797862a96be885e;p=lilypond.git Change the behavior of nested StaffGroupers. Now staffgroup-staff-spacing is used for the spacing before the first staff of a nested staff-group. --- diff --git a/input/regression/page-spacing-staff-group-nested.ly b/input/regression/page-spacing-staff-group-nested.ly index 95124a7cbd..8a11e330b5 100644 --- a/input/regression/page-spacing-staff-group-nested.ly +++ b/input/regression/page-spacing-staff-group-nested.ly @@ -6,7 +6,10 @@ \score { << - \new StaffGroup << + \new StaffGroup \with { + \override StaffGrouper #'staffgroup-staff-spacing #'basic-distance = #15 + } + << \new Staff { c'1 } diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 520d024516..0b399fd248 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -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); } diff --git a/lily/include/staff-grouper-interface.hh b/lily/include/staff-grouper-interface.hh index 3562ca0e5d..d26169e4bd 100644 --- a/lily/include/staff-grouper-interface.hh +++ b/lily/include/staff-grouper-interface.hh @@ -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 */ diff --git a/lily/staff-grouper-interface.cc b/lily/staff-grouper-interface.cc index ec204fbf9b..803e1ee82d 100644 --- a/lily/staff-grouper-interface.cc +++ b/lily/staff-grouper-interface.cc @@ -23,17 +23,29 @@ #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::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, diff --git a/lily/vertical-align-engraver.cc b/lily/vertical-align-engraver.cc index 094967d98d..9a6e3afa30 100644 --- a/lily/vertical-align-engraver.cc +++ b/lily/vertical-align-engraver.cc @@ -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 ()); } }