(process_acknowledged_grobs):
[lilypond.git] / lily / glissando-engraver.cc
blob7976601b7268a81bce566a8b4d06a75cbc66cd45
1 /*
2 note-head-line-engraver.cc -- implement Note_head_line_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2003 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
9 #include "warn.hh"
10 #include "event.hh"
11 #include "spanner.hh"
12 #include "rhythmic-head.hh"
13 #include "engraver.hh"
15 /**
16 Create line-spanner grobs for glissandi lines that connect note
17 heads.
19 class Glissando_engraver : public Engraver
21 public:
22 TRANSLATOR_DECLARATIONS(Glissando_engraver);
24 protected:
25 virtual void acknowledge_grob (Grob_info);
26 virtual void finalize ();
27 virtual void stop_translation_timestep ();
28 virtual bool try_music (Music *);
29 virtual void process_music ();
30 private:
31 Spanner *line_;
32 Spanner *last_line_;
33 Music* event_;
36 Glissando_engraver::Glissando_engraver ()
38 last_line_ = line_ = 0;
39 event_ = 0;
42 bool
43 Glissando_engraver::try_music (Music* m)
45 if (!event_)
47 event_ = m;
48 return true;
50 return false;
53 void
54 Glissando_engraver::process_music ()
56 if (event_)
58 line_ = new Spanner (get_property ("Glissando"));
59 announce_grob (line_, event_->self_scm ());
64 void
65 Glissando_engraver::acknowledge_grob (Grob_info info)
67 if (Rhythmic_head::has_interface (info.grob_))
69 Grob * g = info.grob_;
70 if (line_)
71 line_->set_bound (LEFT, g);
73 if (last_line_)
74 last_line_->set_bound (RIGHT, g);
79 void
80 Glissando_engraver::stop_translation_timestep ()
82 if (last_line_ && last_line_->get_bound (RIGHT))
84 typeset_grob (last_line_);
85 last_line_ =0;
87 if (line_)
89 if ( last_line_)
90 programming_error ("Overwriting glissando.");
91 last_line_ = line_;
93 line_ = 0;
94 event_ = 0;
97 void
98 Glissando_engraver::finalize ()
100 if (line_)
102 String msg = _("Unterminated glissando.");
104 if (event_)
105 event_->origin ()->warning (msg);
106 else
107 warning (msg);
109 line_->suicide ();
110 line_ =0;
116 ENTER_DESCRIPTION(Glissando_engraver,
117 /* descr */ "Engrave a glissandi",
118 /* creats*/ "Glissando",
119 /* accepts */ "glissando-event",
120 /* acks */ "rhythmic-head-interface",
121 /* reads */ "followVoice",
122 /* write */ "");