X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fledger-line-engraver.cc;h=e5bd582a07317f67c4b9cced82ac62c1da39d41c;hb=804385793dcad0400e6b7ccfe006fece27e5feac;hp=19b00a56bbdd02d4ba59eb3206c67238fe0e946a;hpb=7f6816438d66f6d70db5b68454d80656a0f3f131;p=lilypond.git diff --git a/lily/ledger-line-engraver.cc b/lily/ledger-line-engraver.cc index 19b00a56bb..e5bd582a07 100644 --- a/lily/ledger-line-engraver.cc +++ b/lily/ledger-line-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2004--2005 Han-Wen Nienhuys + (c) 2004--2006 Han-Wen Nienhuys */ #include "pointer-group-interface.hh" @@ -14,19 +14,21 @@ class Ledger_line_engraver : public Engraver { Spanner *span_; - + vector ledgered_grobs_; + public: TRANSLATOR_DECLARATIONS (Ledger_line_engraver); protected: virtual void finalize (); void process_music (); - - DECLARE_ACKNOWLEDGER(ledgered); - DECLARE_ACKNOWLEDGER(staff_symbol); + + DECLARE_ACKNOWLEDGER (ledgered); + DECLARE_ACKNOWLEDGER (staff_symbol); void start_spanner (); void stop_spanner (); + void stop_translation_timestep (); }; Ledger_line_engraver::Ledger_line_engraver () @@ -38,14 +40,34 @@ void Ledger_line_engraver::start_spanner () { assert (!span_); - span_ = make_spanner ("LedgerLineSpanner", SCM_EOL); + span_ = make_spanner ("LedgerLineSpanner", SCM_EOL); span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); } +void +Ledger_line_engraver::stop_translation_timestep () +{ + if (span_) + { + for (vsize i = 0; i < ledgered_grobs_.size (); i++) + { + if (!to_boolean (ledgered_grobs_[i]->get_property ("no-ledgers"))) + Pointer_group_interface::add_grob (span_, + ly_symbol2scm ("note-heads"), + ledgered_grobs_[i]); + } + } + + ledgered_grobs_.clear (); +} + void Ledger_line_engraver::process_music () { + /* + Need to do this, otherwise the first note might miss ledgers. + */ if (!span_) start_spanner (); } @@ -53,7 +75,7 @@ Ledger_line_engraver::process_music () void Ledger_line_engraver::finalize () { - stop_spanner(); + stop_spanner (); } void @@ -62,6 +84,7 @@ Ledger_line_engraver::stop_spanner () if (span_) { span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + Pointer_group_interface::set_ordered (span_, ly_symbol2scm ("elements"), false); span_ = 0; } } @@ -69,10 +92,10 @@ Ledger_line_engraver::stop_spanner () void Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s) { - Spanner *sym = dynamic_cast (s.grob ()); + Spanner *sym = dynamic_cast (s.grob ()); if (!span_ - || span_->get_bound (LEFT) != sym->get_bound (LEFT)) + || (span_->get_bound (LEFT) != sym->get_bound (LEFT))) { stop_spanner (); start_spanner (); @@ -82,21 +105,15 @@ Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s) void Ledger_line_engraver::acknowledge_ledgered (Grob_info s) { - if (span_) - { - if (!to_boolean (s.grob ()->get_property ("no-ledgers"))) - Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"), - s.grob ()); - } + ledgered_grobs_.push_back (s.grob ()); } #include "translator.icc" -ADD_ACKNOWLEDGER(Ledger_line_engraver,ledgered); -ADD_ACKNOWLEDGER(Ledger_line_engraver,staff_symbol); +ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered); +ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol); ADD_TRANSLATOR (Ledger_line_engraver, "Creates the spanner to draw ledger lines, and notices objects that need ledger lines", - /* creats*/ "LedgerLineSpanner", - /* accepts */ "", - /* reads */ "", + /* create */ "LedgerLineSpanner", + /* read */ "", /* write */ "")