X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fledger-line-engraver.cc;h=e5bd582a07317f67c4b9cced82ac62c1da39d41c;hb=30e335ef53c04c48a840e1c2be1ad546331767ff;hp=b1f5b3aed63f13f64e484478af694684616f42a3;hpb=332da9f4d25f9f63a3222efc87fae06b0c7abbdd;p=lilypond.git diff --git a/lily/ledger-line-engraver.cc b/lily/ledger-line-engraver.cc index b1f5b3aed6..e5bd582a07 100644 --- a/lily/ledger-line-engraver.cc +++ b/lily/ledger-line-engraver.cc @@ -1,64 +1,119 @@ -/* - ledger-line-engraver.cc -- implement Ledger_line_engraver = - +/* + ledger-line-engraver.cc -- implement Ledger_line_engraver + source file of the GNU LilyPond music typesetter - - (c) 2004 Han-Wen Nienhuys - + + (c) 2004--2006 Han-Wen Nienhuys */ -#include "group-interface.hh" +#include "pointer-group-interface.hh" #include "spanner.hh" #include "engraver.hh" +#include "staff-symbol.hh" class Ledger_line_engraver : public Engraver { - Spanner * span_; - + Spanner *span_; + vector ledgered_grobs_; + public: TRANSLATOR_DECLARATIONS (Ledger_line_engraver); protected: virtual void finalize (); - virtual void process_music (); - virtual void acknowledge_grob (Grob_info); + void process_music (); + + DECLARE_ACKNOWLEDGER (ledgered); + DECLARE_ACKNOWLEDGER (staff_symbol); + + void start_spanner (); + void stop_spanner (); + void stop_translation_timestep (); }; -Ledger_line_engraver::Ledger_line_engraver() +Ledger_line_engraver::Ledger_line_engraver () { span_ = 0; } void -Ledger_line_engraver::process_music () +Ledger_line_engraver::start_spanner () { - if (!span_) + assert (!span_); + + span_ = make_spanner ("LedgerLineSpanner", SCM_EOL); + span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); +} + +void +Ledger_line_engraver::stop_translation_timestep () +{ + if (span_) { - span_ = make_spanner("LedgerLineSpanner", SCM_EOL); - - span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); + 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 (); } void Ledger_line_engraver::finalize () +{ + stop_spanner (); +} + +void +Ledger_line_engraver::stop_spanner () { if (span_) - span_->set_bound (RIGHT,unsmob_grob (get_property ("currentCommandColumn"))); + { + span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + Pointer_group_interface::set_ordered (span_, ly_symbol2scm ("elements"), false); + span_ = 0; + } } +void +Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s) +{ + Spanner *sym = dynamic_cast (s.grob ()); + + if (!span_ + || (span_->get_bound (LEFT) != sym->get_bound (LEFT))) + { + stop_spanner (); + start_spanner (); + } +} void -Ledger_line_engraver::acknowledge_grob (Grob_info s) +Ledger_line_engraver::acknowledge_ledgered (Grob_info s) { - 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 ()); } -ENTER_DESCRIPTION (Ledger_line_engraver, - "Creates the spanner to draw ledger lines, and notices objects that need ledger lines", - /* creats*/ "LedgerLineSpanner", - /* accepts */ "", - /* acks */ "ledgered-interface", // ledgered-interface? - /* reads */ "", - /* write */ "") + +#include "translator.icc" + +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", + /* create */ "LedgerLineSpanner", + /* read */ "", + /* write */ "")