X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-head-line-engraver.cc;h=ba0c65d71d5def3f97a4c4c79561270e2f49259c;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=ae21145eca4df53522e2d057096545e571fffd27;hpb=f30b976e93c7b865871364d915e63b33d289e401;p=lilypond.git diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index ae21145eca..ba0c65d71d 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -1,131 +1,129 @@ -/* - note-head-line-engraver.cc -- implement Note_head_line_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2000 Jan Nieuwenhuizen - */ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2000--2014 Jan Nieuwenhuizen + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ #include "engraver.hh" -#include "group-interface.hh" -#include "item.hh" -#include "musical-request.hh" -#include "spanner.hh" +#include "pointer-group-interface.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" +#include "spanner.hh" +#include "item.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. +*/ 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); - virtual void create_grobs (); - virtual void stop_translation_timestep (); - virtual bool try_music (Music *); + DECLARE_ACKNOWLEDGER (rhythmic_head); + void process_acknowledged (); + void stop_translation_timestep (); private: - Spanner* line_; - Request* req_; - Request* last_req_; - Translator* last_staff_; - Grob* head_; - Grob* last_head_; + Spanner *line_; + Context *last_staff_; + bool follow_; + Grob *head_; + Grob *last_head_; }; 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) +Note_head_line_engraver::acknowledge_rhythmic_head (Grob_info info) { - if (Rhythmic_head::has_interface (info.elem_l_)) + head_ = info.grob (); + Context *tr = context (); + + while (tr && !tr->is_alias (ly_symbol2scm ("Staff"))) + tr = tr->get_parent_context (); + + if (tr + && tr->is_alias (ly_symbol2scm ("Staff")) && tr != last_staff_ + && to_boolean (get_property ("followVoice"))) { - last_head_ = head_; - head_ = info.elem_l_; - if (to_boolean (get_property ("followThread"))) - { - 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_) - { - if (last_head_) - last_req_ = (Request*)1; // ugh - last_staff_ = staff; - } - } + if (last_head_) + follow_ = true; } + last_staff_ = tr; } void -Note_head_line_engraver::create_grobs () +Note_head_line_engraver::process_acknowledged () { - if (!line_ && last_req_ && last_head_ && head_) + if (!line_ && follow_ && last_head_ && head_) { - /* type Glissando? */ - line_ = new Spanner (get_property ("NoteHeadLine")); - line_->set_bound (LEFT, head_); - line_->set_bound (RIGHT, 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; - - announce_grob (line_, last_req_); - last_req_ = 0; - last_head_ = head_; - head_ = 0; + /* 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_ = make_spanner ("VoiceFollower", head_->self_scm ()); + + line_->set_bound (LEFT, last_head_); + line_->set_bound (RIGHT, head_); + + follow_ = false; } } void Note_head_line_engraver::stop_translation_timestep () { - if (line_) - { - typeset_grob (line_); - line_ = 0; - } - if (req_) - last_req_ = req_; - req_ = 0; + line_ = 0; + if (head_) + last_head_ = head_; + head_ = 0; } +#include "translator.icc" + +ADD_ACKNOWLEDGER (Note_head_line_engraver, rhythmic_head); +ADD_TRANSLATOR (Note_head_line_engraver, + /* doc */ + "Engrave a line between two note heads, for example a" + " glissando. If @code{followVoice} is set, staff switches" + " also generate a line.", + + /* create */ + "Glissando " + "VoiceFollower ", -ADD_THIS_TRANSLATOR (Note_head_line_engraver); + /* read */ + "followVoice ", + /* write */ + "" + );