X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkeep-alive-together-engraver.cc;h=6875cd022fa68cf9e57eb4328c6d5af9f81952ed;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=b53b91eca439613324de54c69d5275b75bd7e568;hpb=1de3d397c18622b6061402fef18e625701712bc5;p=lilypond.git diff --git a/lily/keep-alive-together-engraver.cc b/lily/keep-alive-together-engraver.cc index b53b91eca4..6875cd022f 100644 --- a/lily/keep-alive-together-engraver.cc +++ b/lily/keep-alive-together-engraver.cc @@ -22,23 +22,23 @@ #include "engraver.hh" #include "grob.hh" #include "grob-array.hh" +#include "international.hh" #include "translator.icc" -using std::vector; - class Keep_alive_together_engraver: public Engraver { vector group_spanners_; public: TRANSLATOR_DECLARATIONS (Keep_alive_together_engraver); - DECLARE_ACKNOWLEDGER (hara_kiri_group_spanner); + void acknowledge_hara_kiri_group_spanner (Grob_info); virtual void finalize (); }; -Keep_alive_together_engraver::Keep_alive_together_engraver () +Keep_alive_together_engraver::Keep_alive_together_engraver (Context *c) + : Engraver (c) { } @@ -66,12 +66,44 @@ Keep_alive_together_engraver::finalize () { if (i == j) continue; + + if (scm_is_symbol (this_layer)) + { + if (scm_is_eq (this_layer, ly_symbol2scm ("any"))) + { + // layer is kept alive by any other layer + live->add (group_spanners_[j]); + continue; + } + else if (scm_is_eq (this_layer, ly_symbol2scm ("above"))) + { + // layer is kept alive by the layer preceding it + if (i == j + 1) + live->add (group_spanners_[j]); + continue; + } + else if (scm_is_eq (this_layer, ly_symbol2scm ("below"))) + { + // layer is kept alive by the layer following it + if (i == j - 1) + live->add (group_spanners_[j]); + continue; + } + else + { + group_spanners_[i]->warning (_f ("unknown remove-layer value `%s'", + ly_symbol2string (this_layer).c_str ())); + continue; + } + } + SCM that_layer = group_spanners_[j]->get_property ("remove-layer"); + if (scm_is_false (that_layer)) continue; if (!scm_is_integer (this_layer)) { - // Unspecified layers are kept alive by anything else + // unset layers are kept alive by all but ignored layers live->add (group_spanners_[j]); continue; } @@ -90,7 +122,12 @@ Keep_alive_together_engraver::finalize () } } -ADD_ACKNOWLEDGER (Keep_alive_together_engraver, hara_kiri_group_spanner); + +void +Keep_alive_together_engraver::boot () +{ + ADD_ACKNOWLEDGER (Keep_alive_together_engraver, hara_kiri_group_spanner); +} ADD_TRANSLATOR (Keep_alive_together_engraver, /* doc */