\score {
<<
- \new StaffGroup <<
+ \new StaffGroup \with {
+ \override StaffGrouper #'staffgroup-staff-spacing #'basic-distance = #15
+ }
+ <<
\new Staff {
c'1
}
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);
}
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 */
#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,
}
}
}
- 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 ());
}
}