X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Farpeggio-engraver.cc;h=1cc143dbd7beb9144decf9f80d1d58b4f88cd245;hb=fa938d4b51ccb3c18e489b395838f2587b531ec2;hp=dccb27e6bac92a6ac2e4afc8ee4a5517ac1684a9;hpb=c36e72d6b4f840837d7923a61e537b24695b5388;p=lilypond.git diff --git a/lily/arpeggio-engraver.cc b/lily/arpeggio-engraver.cc index dccb27e6ba..1cc143dbd7 100644 --- a/lily/arpeggio-engraver.cc +++ b/lily/arpeggio-engraver.cc @@ -1,74 +1,107 @@ -/* +/* arpeggio-engraver.cc -- implement Arpeggio_engraver - + source file of the GNU LilyPond music typesetter - - (c) 2000 Jan Nieuwenhuizen - */ + + (c) 2000--2006 Jan Nieuwenhuizen +*/ #include "engraver.hh" -#include "group-interface.hh" -#include "item.hh" + +#include "pointer-group-interface.hh" #include "arpeggio.hh" #include "stem.hh" +#include "rhythmic-head.hh" +#include "side-position-interface.hh" +#include "stream-event.hh" +#include "note-column.hh" + +#include "translator.icc" class Arpeggio_engraver : public Engraver { public: - VIRTUAL_COPY_CONS (Translator); - Arpeggio_engraver (); + TRANSLATOR_DECLARATIONS (Arpeggio_engraver); + void acknowledge_stem (Grob_info); + void acknowledge_rhythmic_head (Grob_info); + void acknowledge_note_column (Grob_info); protected: - virtual void acknowledge_element (Score_element_info); - virtual void process_acknowledged (); - virtual void do_pre_move_processing (); - + void process_music (); + void stop_translation_timestep (); + DECLARE_TRANSLATOR_LISTENER (arpeggio); private: - Item* arpeggio_; - Link_array stems_; + Item *arpeggio_; + Stream_event *arpeggio_event_; }; Arpeggio_engraver::Arpeggio_engraver () { arpeggio_ = 0; + arpeggio_event_ = 0; } -void -Arpeggio_engraver::acknowledge_element (Score_element_info info) +IMPLEMENT_TRANSLATOR_LISTENER (Arpeggio_engraver, arpeggio); +void Arpeggio_engraver::listen_arpeggio (Stream_event *ev) { - if (Stem::has_interface (info.elem_l_)) - { - stems_.push (info.elem_l_); - } + arpeggio_event_ = ev; } void -Arpeggio_engraver::process_acknowledged () +Arpeggio_engraver::acknowledge_stem (Grob_info info) { - if (!arpeggio_ && !stems_.empty ()) + if (arpeggio_) { - arpeggio_ = new Item (get_property ("Arpeggio")); - Pointer_group_interface pgi (arpeggio_, "stems"); - for (int i = 0; i < stems_.size (); i++) - { - pgi.add_element (stems_[i]); - arpeggio_->add_dependency (stems_[i]); - } - announce_element (arpeggio_, 0); + if (!arpeggio_->get_parent (Y_AXIS)) + arpeggio_->set_parent (info.grob (), Y_AXIS); + + Pointer_group_interface::add_grob (arpeggio_, + ly_symbol2scm ("stems"), + info.grob ()); } } +void +Arpeggio_engraver::acknowledge_rhythmic_head (Grob_info info) +{ + if (arpeggio_) + + /* + We can't catch local key items (accidentals) from Voice context, + see Local_key_engraver + */ + Side_position_interface::add_support (arpeggio_, info.grob ()); +} void -Arpeggio_engraver::do_pre_move_processing () +Arpeggio_engraver::acknowledge_note_column (Grob_info info) { if (arpeggio_) + info.grob ()->set_object ("arpeggio", arpeggio_->self_scm ()); +} + +void +Arpeggio_engraver::process_music () +{ + if (arpeggio_event_) { - typeset_element (arpeggio_); - arpeggio_ = 0; + arpeggio_ = make_item ("Arpeggio", arpeggio_event_->self_scm ()); } - stems_.clear (); } +void +Arpeggio_engraver::stop_translation_timestep () +{ + arpeggio_ = 0; + arpeggio_event_ = 0; +} -ADD_THIS_TRANSLATOR (Arpeggio_engraver); +ADD_ACKNOWLEDGER (Arpeggio_engraver, stem); +ADD_ACKNOWLEDGER (Arpeggio_engraver, rhythmic_head); +ADD_ACKNOWLEDGER (Arpeggio_engraver, note_column); +ADD_TRANSLATOR (Arpeggio_engraver, + /* doc */ "Generate an Arpeggio symbol", + /* create */ "Arpeggio", + /* accept */ "arpeggio-event", + /* read */ "", + /* write */ "");