]> git.donarmstrong.com Git - lilypond.git/blob - lily/trill-spanner-engraver.cc
fix tuplet example
[lilypond.git] / lily / trill-spanner-engraver.cc
1 /*
2   trill-spanner-engraver.cc -- implement Trill_spanner_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2000--2007 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 /*
10   C&P from text-spanner.cc
11
12   - todo: ending should be detected automatically? a new note
13   automatically is the end of the trill?
14 */
15
16 #include "engraver.hh"
17
18 #include "international.hh"
19 #include "note-column.hh"
20 #include "side-position-interface.hh"
21 #include "stream-event.hh"
22 #include "spanner.hh"
23
24 #include "translator.icc"
25
26 class Trill_spanner_engraver : public Engraver
27 {
28 public:
29   TRANSLATOR_DECLARATIONS (Trill_spanner_engraver);
30 protected:
31   virtual void finalize ();
32   DECLARE_ACKNOWLEDGER (note_column);
33   DECLARE_TRANSLATOR_LISTENER (trill_span);
34   void stop_translation_timestep ();
35   void process_music ();
36
37 private:
38   Spanner *span_;
39   Spanner *finished_;
40   Stream_event *current_event_;
41   Drul_array<Stream_event *> event_drul_;
42   void typeset_all ();
43 };
44
45 Trill_spanner_engraver::Trill_spanner_engraver ()
46 {
47   finished_ = 0;
48   current_event_ = 0;
49   span_ = 0;
50   event_drul_[START] = 0;
51   event_drul_[STOP] = 0;
52 }
53
54 IMPLEMENT_TRANSLATOR_LISTENER (Trill_spanner_engraver, trill_span);
55 void
56 Trill_spanner_engraver::listen_trill_span (Stream_event *ev)
57 {
58   Direction d = to_dir (ev->get_property ("span-direction"));
59   ASSIGN_EVENT_ONCE (event_drul_[d], ev);
60 }
61
62 void
63 Trill_spanner_engraver::process_music ()
64 {
65   if (event_drul_[STOP])
66     {
67       if (!span_)
68         event_drul_[STOP]->origin ()->warning (_ ("cannot find start of trill spanner"));
69       else
70         {
71           finished_ = span_;
72           span_ = 0;
73           current_event_ = 0;
74         }
75     }
76
77   if (event_drul_[START])
78     {
79       if (current_event_)
80         event_drul_[START]->origin ()->warning (_ ("already have a trill spanner"));
81       else
82         {
83           current_event_ = event_drul_[START];
84           span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ());
85           Side_position_interface::set_axis (span_, Y_AXIS);
86           event_drul_[START] = 0;
87         }
88     }
89 }
90
91 void
92 Trill_spanner_engraver::acknowledge_note_column (Grob_info info)
93 {
94   Spanner *spans[2] ={span_, finished_};
95   for (int i = 0; i < 2; i++)
96     {
97       if (spans[i])
98         {
99           Side_position_interface::add_support (spans[i], info.grob ());
100           add_bound_item (spans[i], info.grob ());
101         }
102     }
103 }
104
105 void
106 Trill_spanner_engraver::typeset_all ()
107 {
108   if (finished_)
109     {
110       if (!finished_->get_bound (RIGHT))
111         {
112           Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
113           finished_->set_bound (RIGHT, e);
114         }
115       finished_ = 0;
116     }
117 }
118
119 void
120 Trill_spanner_engraver::stop_translation_timestep ()
121 {
122   if (span_ && !span_->get_bound (LEFT))
123     {
124       Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
125       span_->set_bound (LEFT, e);
126     }
127
128   typeset_all ();
129   event_drul_[START] = 0;
130   event_drul_[STOP] = 0;
131 }
132
133 void
134 Trill_spanner_engraver::finalize ()
135 {
136   typeset_all ();
137   if (span_)
138     {
139       finished_ = span_;
140       typeset_all ();
141     }
142 }
143
144 ADD_ACKNOWLEDGER (Trill_spanner_engraver, note_column);
145 ADD_TRANSLATOR (Trill_spanner_engraver,
146                 /* doc */ "Create trill spanner from an event.",
147                 /* create */
148                 "TrillSpanner ",
149                 /* read */ "",
150                 /* write */ "");