X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-head-line-engraver.cc;h=52ac159c93b2a6411b7bba03dc0ca2deb18f76fc;hb=0817e0513d1016ff22a633b6fee20ddba2a062f2;hp=57e62f5e6deee6632aa785aae11373aae1eb4a0b;hpb=c1b378edc5bd3fa8df8c5b4abeaaefe4f2771d75;p=lilypond.git diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index 57e62f5e6d..52ac159c93 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2001 Jan Nieuwenhuizen */ #include "engraver.hh" @@ -11,6 +11,7 @@ #include "item.hh" #include "musical-request.hh" #include "spanner.hh" +#include "stem.hh" #include "rhythmic-head.hh" #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" @@ -19,13 +20,16 @@ /** Create line-spanner grobs for glissandi (and possibly other) lines that connect note heads. - */ + + TODO: have the line commit suicide if the notes are connected with + either slur or beam. + +*/ class Note_head_line_engraver : public Engraver { public: - VIRTUAL_COPY_CONS (Translator); - Note_head_line_engraver (); + TRANSLATOR_DECLARATIONS(Note_head_line_engraver); protected: virtual void acknowledge_grob (Grob_info); @@ -38,6 +42,7 @@ private: Request* req_; Request* last_req_; Translator* last_staff_; + bool follow_; Grob* head_; Grob* last_head_; }; @@ -47,6 +52,7 @@ 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; @@ -69,47 +75,55 @@ Note_head_line_engraver::try_music (Music* m) void Note_head_line_engraver::acknowledge_grob (Grob_info info) { - if (Rhythmic_head::has_interface (info.elem_l_)) + if (Rhythmic_head::has_interface (info.grob_l_)) { - last_head_ = head_; - head_ = info.elem_l_; - if (to_boolean (get_property ("followThread"))) + head_ = info.grob_l_; + if (to_boolean (get_property ("followVoice"))) { - Translator* staff = daddy_trans_l_ && daddy_trans_l_->daddy_trans_l_ - ? daddy_trans_l_->daddy_trans_l_->daddy_trans_l_ : 0; - if (staff != last_staff_) + Translator_group * tr = daddy_trans_l_; + while (tr && tr->type_str_ != "Staff") + tr = tr->daddy_trans_l_ ; + + if (tr && tr->type_str_ == "Staff" && tr != last_staff_) { if (last_head_) - last_req_ = (Request*)1; // ugh - last_staff_ = staff; + follow_ = true; + last_staff_ = tr; } } } } + void Note_head_line_engraver::create_grobs () { - if (!line_ && last_req_ && last_head_ && head_) + if (!line_ && (follow_ || last_req_) && last_head_ && head_ + && (last_head_ != head_)) { - /* type Glissando? */ - line_ = new Spanner (get_property ("NoteHeadLine")); - line_->set_bound (RIGHT, head_); + /* TODO: Don't follow if there's a beam. + + We can't do beam-stuff here, since beam doesn't exist yet. + 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_->set_bound (LEFT, last_head_); - - line_->set_parent (head_, X_AXIS); - line_->set_parent (head_, Y_AXIS); - - line_->set_parent (last_head_, X_AXIS); - line_->set_parent (last_head_, Y_AXIS); - - if ((int)last_req_ == 1) // ugh - last_req_ = 0; - + 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); + announce_grob (line_, last_req_); - last_req_ = 0; - last_head_ = head_; - head_ = 0; + last_req_ = 0; + + follow_ = false; } } @@ -121,11 +135,24 @@ Note_head_line_engraver::stop_translation_timestep () typeset_grob (line_); line_ = 0; } + if (head_) + last_head_ = head_; + head_ = 0; + if (req_) - last_req_ = req_; - req_ = 0; + { + last_req_ = req_; + req_ =0; + } } -ADD_THIS_TRANSLATOR (Note_head_line_engraver); + +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", +/* acks */ "rhythmic-head-interface", +/* reads */ "followVoice", +/* write */ "");