X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-grouper-interface.cc;h=55162c2bc7cc0cc13a7000351c2f46e879452b0a;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=0eae7e531fbb36738e62a8c46910745a66e68fac;hpb=794dcbdb52faf4292036cd1b0270a956cf4316a3;p=lilypond.git diff --git a/lily/staff-grouper-interface.cc b/lily/staff-grouper-interface.cc index 0eae7e531f..55162c2bc7 100644 --- a/lily/staff-grouper-interface.cc +++ b/lily/staff-grouper-interface.cc @@ -1,31 +1,58 @@ /* - staff-grouper-interface.cc -- implement Staff_grouper_interface + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2009--2015 Joe Neeman - (c) 2009 Joe Neeman + 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 . */ #include "staff-grouper-interface.hh" +#include "hara-kiri-group-spanner.hh" +#include "page-layout-problem.hh" #include "pointer-group-interface.hh" -Grob* -Staff_grouper_interface::get_last_grob (Grob *me) +/* 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 (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 ((*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, - "A grob that collects staves together.", + "A grob that collects staves together.", - /* properties */ - "between-staff-spacing " - "after-last-staff-spacing " - ); + /* properties */ + "staff-staff-spacing " + "staffgroup-staff-spacing " + );