From: fred Date: Tue, 28 Nov 2000 17:59:42 +0000 (+0000) Subject: lilypond-1.3.112 X-Git-Tag: release/1.5.59~5719 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=10202bcafc768d69d88903b4221a01bf1ab39508;p=lilypond.git lilypond-1.3.112 --- diff --git a/input/test/follow-thread.ly b/input/test/follow-thread.ly new file mode 100644 index 0000000000..d0df4d3873 --- /dev/null +++ b/input/test/follow-thread.ly @@ -0,0 +1,27 @@ +% followThread: connect note heads with line when thread switches staff + +\score{ + \context PianoStaff < + \context Staff=one \notes\relative c''{ + \context Thread + a + \translator Staff=two + a, + +% smaller = easier to debug. +%{ a + \translator Staff=one + a'' +%} + s2 + } + \context Staff=two { \clef bass; \skip 1; } + > + \paper{ + linewidth = 70.\mm; + \translator { + \ScoreContext + followThread = ##t + } + } +} diff --git a/lily/note-head-line-engraver.cc b/lily/note-head-line-engraver.cc new file mode 100644 index 0000000000..57e62f5e6d --- /dev/null +++ b/lily/note-head-line-engraver.cc @@ -0,0 +1,131 @@ +/* + note-head-line-engraver.cc -- implement Note_head_line_engraver + + source file of the GNU LilyPond music typesetter + + (c) 2000 Jan Nieuwenhuizen + */ + +#include "engraver.hh" +#include "group-interface.hh" +#include "item.hh" +#include "musical-request.hh" +#include "spanner.hh" +#include "rhythmic-head.hh" +#include "side-position-interface.hh" +#include "staff-symbol-referencer.hh" +#include "translator-group.hh" + +/** + Create line-spanner grobs for glissandi (and possibly other) lines + that connect note heads. + */ + +class Note_head_line_engraver : public Engraver +{ +public: + VIRTUAL_COPY_CONS (Translator); + 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 *); + +private: + Spanner* line_; + Request* req_; + Request* last_req_; + Translator* last_staff_; + Grob* head_; + Grob* last_head_; +}; + +Note_head_line_engraver::Note_head_line_engraver () +{ + line_ = 0; + req_ = 0; + last_req_ = 0; + 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.elem_l_)) + { + 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; + } + } + } +} + +void +Note_head_line_engraver::create_grobs () +{ + if (!line_ && last_req_ && last_head_ && head_) + { + /* type Glissando? */ + line_ = new Spanner (get_property ("NoteHeadLine")); + line_->set_bound (RIGHT, head_); + 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; + + announce_grob (line_, last_req_); + last_req_ = 0; + last_head_ = head_; + head_ = 0; + } +} + +void +Note_head_line_engraver::stop_translation_timestep () +{ + if (line_) + { + typeset_grob (line_); + line_ = 0; + } + if (req_) + last_req_ = req_; + req_ = 0; +} + + +ADD_THIS_TRANSLATOR (Note_head_line_engraver); +