X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffootnote-engraver.cc;h=fa488b06d42dd0b7ff8389f58f348186273e2e06;hb=058370efc7e9710f149d0f444328bb1fcd7bdec1;hp=4a2070a6cd5f94da9f379a174e5902f11a4cd532;hpb=08560a1b8076630c4fc6cb9b902614d8b74fd6fc;p=lilypond.git diff --git a/lily/footnote-engraver.cc b/lily/footnote-engraver.cc index 4a2070a6cd..fa488b06d4 100644 --- a/lily/footnote-engraver.cc +++ b/lily/footnote-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011--2012 Mike Solomon + Copyright (C) 2011--2014 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,9 @@ #include "engraver.hh" +#include "music.hh" #include "stream-event.hh" +#include "international.hh" #include "item.hh" #include "pointer-group-interface.hh" #include "spanner.hh" @@ -31,35 +33,20 @@ class Footnote_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Footnote_engraver); - DECLARE_TRANSLATOR_LISTENER (footnote); DECLARE_ACKNOWLEDGER (grob); DECLARE_END_ACKNOWLEDGER (grob); - vector events_; + vector > annotated_spanners_; - void stop_translation_timestep (); void finalize (); - void footnotify (Grob *, Stream_event *); + void footnotify (Grob *, SCM); }; -IMPLEMENT_TRANSLATOR_LISTENER (Footnote_engraver, footnote); -void -Footnote_engraver::listen_footnote (Stream_event *ev) -{ - events_.push_back (ev); -} - -void -Footnote_engraver::stop_translation_timestep () -{ - events_.clear (); -} - void Footnote_engraver::finalize () { - annotated_spanners_.resize (0); + annotated_spanners_.clear (); } Footnote_engraver::Footnote_engraver () @@ -67,13 +54,13 @@ Footnote_engraver::Footnote_engraver () } void -Footnote_engraver::footnotify (Grob *g, Stream_event *event) +Footnote_engraver::footnotify (Grob *g, SCM cause) { Spanner *s = dynamic_cast(g); if (s) { - Spanner *b = make_spanner ("FootnoteSpanner", event->self_scm ()); + Spanner *b = make_spanner ("FootnoteSpanner", cause); b->set_parent (s, Y_AXIS); b->set_parent (s, X_AXIS); Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); @@ -82,7 +69,7 @@ Footnote_engraver::footnotify (Grob *g, Stream_event *event) } else { - Grob *b = make_item ("FootnoteItem", event->self_scm ()); + Grob *b = make_item ("FootnoteItem", cause); b->set_parent (g, Y_AXIS); b->set_parent (g, X_AXIS); } @@ -91,20 +78,22 @@ Footnote_engraver::footnotify (Grob *g, Stream_event *event) void Footnote_engraver::acknowledge_grob (Grob_info info) { - Stream_event *cause = info.event_cause (); + Music *mus = unsmob_music (info.grob ()->get_property ("footnote-music")); - SCM arts = cause ? cause->get_property ("articulations") : SCM_EOL; - for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s)) + if (mus) { - Stream_event *e = unsmob_stream_event (scm_car (s)); - if (e->in_event_class ("footnote-event")) - footnotify (info.grob (), e); - } + if (!mus->is_mus_type ("footnote-event")) + { + mus->origin ()->programming_error (_ ("Must be footnote-event.")); + return; + } - for (vsize i = 0; i < events_.size (); i++) - { - if (info.grob ()->name () == ly_symbol2string (events_[i]->get_property ("symbol"))) - footnotify (info.grob (), events_[i]); + footnotify (info.grob (), mus->to_event ()->unprotect ()); + + // This grob has exhausted its footnote + info.grob ()->set_property ("footnote-music", SCM_EOL); + + return; } }