X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-head-line-engraver.cc;h=b489af8b148fa9d18f15495646a96899b2451d1c;hb=de2793fd6c4b5a4a8625d3afcab00f46c17bf58f;hp=c8533b8e48835c0ecb4f168a87f18bdd7ebd9024;hpb=2804f8f79e01dc606ce067bffda2d966524e6e36;p=lilypond.git diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index c8533b8e48..b489af8b14 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -3,24 +3,23 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Jan Nieuwenhuizen + (c) 2000--2004 Jan Nieuwenhuizen */ #include "engraver.hh" #include "group-interface.hh" #include "item.hh" -#include "musical-request.hh" +#include "event.hh" #include "spanner.hh" #include "stem.hh" #include "rhythmic-head.hh" #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" -#include "translator-group.hh" +#include "context.hh" -/** - Create line-spanner grobs for glissandi (and possibly other) lines - that connect note heads. +/** + Create line-spanner grobs for lines that connect note heads. TODO: have the line commit suicide if the notes are connected with either slur or beam. @@ -29,19 +28,16 @@ class Note_head_line_engraver : public Engraver { public: - TRANSLATOR_DECLARATIONS(Note_head_line_engraver); + TRANSLATOR_DECLARATIONS (Note_head_line_engraver); protected: virtual void acknowledge_grob (Grob_info); - virtual void create_grobs (); + virtual void process_acknowledged_grobs (); virtual void stop_translation_timestep (); - virtual bool try_music (Music *); private: Spanner* line_; - Request* req_; - Request* last_req_; - Translator* last_staff_; + Context* last_staff_; bool follow_; Grob* head_; Grob* last_head_; @@ -50,41 +46,26 @@ private: Note_head_line_engraver::Note_head_line_engraver () { line_ = 0; - req_ = 0; - last_req_ = 0; follow_ = false; head_ = 0; last_head_ = 0; last_staff_ = 0; } -bool -Note_head_line_engraver::try_music (Music* m) -{ - if (!req_) - { - if (Glissando_req *r = dynamic_cast (m)) - { - req_ = r; - return true; - } - } - return false; -} - void Note_head_line_engraver::acknowledge_grob (Grob_info info) { - if (Rhythmic_head::has_interface (info.grob_l_)) + if (Rhythmic_head::has_interface (info.grob_)) { - head_ = info.grob_l_; + head_ = info.grob_; if (to_boolean (get_property ("followVoice"))) { - Translator_group * tr = daddy_trans_l_; - while (tr && tr->type_str_ != "Staff") - tr = tr->daddy_trans_l_ ; + Context * tr = context (); + while (tr && !tr->is_alias (ly_symbol2scm ( "Staff"))) + tr = tr->get_parent_context () ; - if (tr && tr->type_str_ == "Staff" && tr != last_staff_) + if (tr + && tr->is_alias (ly_symbol2scm ("Staff")) && tr != last_staff_) { if (last_head_) follow_ = true; @@ -96,10 +77,9 @@ Note_head_line_engraver::acknowledge_grob (Grob_info info) void -Note_head_line_engraver::create_grobs () +Note_head_line_engraver::process_acknowledged_grobs () { - if (!line_ && (follow_ || last_req_) && last_head_ && head_ - && (last_head_ != head_)) + if (!line_ && follow_ && last_head_ && head_) { /* TODO: Don't follow if there's a beam. @@ -107,22 +87,11 @@ Note_head_line_engraver::create_grobs () Should probably store follow_ in line_, and suicide at some later point */ if (follow_) - line_ = new Spanner (get_property ("VoiceFollower")); - else - line_ = new Spanner (get_property ("Glissando")); + line_ = make_spanner ("VoiceFollower", head_->self_scm ()); line_->set_bound (LEFT, last_head_); line_->set_bound (RIGHT, head_); - - /* Note, mustn't set y-parent of breakable symbol to simple item: - one of the two broken parts won't have an y-parent! */ - /* X parent is set by set_bound */ - line_->set_parent (Staff_symbol_referencer::staff_symbol_l (last_head_), - Y_AXIS); - - SCM c = last_req_? last_req_->self_scm () : SCM_EOL; - announce_grob(line_, c); - last_req_ = 0; + follow_ = false; } @@ -131,29 +100,20 @@ Note_head_line_engraver::create_grobs () void Note_head_line_engraver::stop_translation_timestep () { - if (line_) - { - typeset_grob (line_); - line_ = 0; - } + line_ = 0; if (head_) last_head_ = head_; head_ = 0; - - if (req_) - { - last_req_ = req_; - req_ =0; - } } -ENTER_DESCRIPTION(Note_head_line_engraver, -/* descr */ "Engrave a line between two note heads, for example a glissando. -If followVoice is set, staff switches also generate a line.", +ENTER_DESCRIPTION (Note_head_line_engraver, +/* descr */ "Engrave a line between two note heads, for example a glissando. If " +" followVoice is set, staff switches also generate a line.", /* creats*/ "Glissando VoiceFollower", +/* accepts */ "glissando-event", /* acks */ "rhythmic-head-interface", /* reads */ "followVoice", /* write */ "");