X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-head-line-engraver.cc;h=f2d3ad8684346d826fc830c9462767254c8b13f9;hb=a6a51abfd0195a3cf7d6ea095cf69808852f21ce;hp=f5737a795d2b7bfa652e308c68f2ba83772d42b0;hpb=e540311d3f5799216c91d203080f63b65cccde07;p=lilypond.git diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc index f5737a795d..f2d3ad8684 100644 --- a/lily/note-head-line-engraver.cc +++ b/lily/note-head-line-engraver.cc @@ -1,29 +1,37 @@ -/* - note-head-line-engraver.cc -- implement Note_head_line_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2000--2004 Jan Nieuwenhuizen - */ +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2000--2015 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 "event.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 "context.hh" - +#include "spanner.hh" +#include "item.hh" /** 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 { @@ -31,19 +39,20 @@ public: TRANSLATOR_DECLARATIONS (Note_head_line_engraver); protected: - virtual void acknowledge_grob (Grob_info); - virtual void process_acknowledged_grobs (); - virtual void stop_translation_timestep (); + void acknowledge_rhythmic_head (Grob_info); + void process_acknowledged (); + void stop_translation_timestep (); private: - Spanner* line_; - Context* last_staff_; + Spanner *line_; + Context *last_staff_; bool follow_; - Grob* head_; - Grob* last_head_; + Grob *head_; + Grob *last_head_; }; -Note_head_line_engraver::Note_head_line_engraver () +Note_head_line_engraver::Note_head_line_engraver (Context *c) + : Engraver (c) { line_ = 0; follow_ = false; @@ -53,45 +62,35 @@ Note_head_line_engraver::Note_head_line_engraver () } 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.grob_)) + head_ = info.grob (); + Context *tr = find_context_above (context (), ly_symbol2scm ("Staff")); + if (tr + && tr != last_staff_ + && to_boolean (get_property ("followVoice"))) { - head_ = info.grob_; - if (to_boolean (get_property ("followVoice"))) - { - 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_) - { - if (last_head_) - follow_ = true; - last_staff_ = tr; - } - } + if (last_head_) + follow_ = true; } + last_staff_ = tr; } - void -Note_head_line_engraver::process_acknowledged_grobs () +Note_head_line_engraver::process_acknowledged () { if (!line_ && follow_ && last_head_ && 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 */ + 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_ = make_spanner ("VoiceFollower", head_->self_scm ()); + line_->set_bound (LEFT, last_head_); line_->set_bound (RIGHT, head_); - follow_ = false; } @@ -100,24 +99,31 @@ Note_head_line_engraver::process_acknowledged_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; } +#include "translator.icc" + +void +Note_head_line_engraver::boot () +{ + ADD_ACKNOWLEDGER (Note_head_line_engraver, rhythmic_head); +} + +ADD_TRANSLATOR (Note_head_line_engraver, + /* doc */ + "Engrave a line between two note heads in a staff" + " switch if @code{followVoice} is set.", + /* create */ + "VoiceFollower ", + /* read */ + "followVoice ", -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 */ ""); + /* write */ + "" + );