]> git.donarmstrong.com Git - lilypond.git/blob - lily/balloon-engraver.cc
27be4605310b3115030db608b5271ba6ce04becc
[lilypond.git] / lily / balloon-engraver.cc
1 /* 
2   balloon-engraver.cc -- implement Balloon_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2006--2007 Han-Wen Nienhuys <hanwen@lilypond.org>
7   
8 */
9
10 #include "engraver.hh"
11
12 #include "stream-event.hh"
13 #include "item.hh"
14
15 #include "translator.icc"
16
17 class Balloon_engraver : public Engraver
18 {
19   TRANSLATOR_DECLARATIONS (Balloon_engraver);
20
21   DECLARE_TRANSLATOR_LISTENER (annotate_output);
22   DECLARE_ACKNOWLEDGER (grob);
23   vector<Stream_event *> events_;
24
25   void stop_translation_timestep ();
26   
27   void balloonify (Grob *, Stream_event *); 
28 };
29
30 IMPLEMENT_TRANSLATOR_LISTENER (Balloon_engraver, annotate_output);
31 void
32 Balloon_engraver::listen_annotate_output (Stream_event *ev)
33 {
34   events_.push_back (ev);
35 }
36
37 void
38 Balloon_engraver::stop_translation_timestep ()
39 {
40   events_.clear ();
41 }
42
43 Balloon_engraver::Balloon_engraver ()
44 {
45 }
46
47 void
48 Balloon_engraver::balloonify (Grob *g, Stream_event *event)
49 {
50   Grob * b = make_item ("BalloonTextItem", event->self_scm ());
51   b->set_property ("text", event->get_property ("text"));
52   b->set_parent (g, Y_AXIS);
53   b->set_parent (g, X_AXIS);
54 }
55
56 void
57 Balloon_engraver::acknowledge_grob (Grob_info info)
58 {
59   Stream_event *cause = info.event_cause ();
60   
61   SCM arts = cause ? cause->get_property ("articulations") : SCM_EOL;
62   for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s))
63     {
64       Stream_event *e = unsmob_stream_event (scm_car (s));
65       if (e->in_event_class ("annotate-output-event"))
66         {
67           balloonify (info.grob (), e);
68         }
69     }
70
71   for (vsize i = 0; i < events_.size (); i++)
72     {
73       if (info.grob ()->name () == ly_symbol2string (events_[i]->get_property ("symbol")))
74         balloonify (info.grob (), events_[i]);
75     }
76 }
77
78
79   
80 ADD_ACKNOWLEDGER (Balloon_engraver, grob);
81   
82 ADD_TRANSLATOR (Balloon_engraver,
83                /* doc */
84                "Create balloon texts.",
85
86                /* create */
87                "BalloonTextItem ",
88
89                /*read*/
90                "",
91
92                /*write*/
93                ""
94                );