]> git.donarmstrong.com Git - lilypond.git/blob - lily/trill-spanner-engraver.cc
8770ab9cefd97754ac420c82333103d92f433d92
[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--2006 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
23 #include "translator.icc"
24
25 class Trill_spanner_engraver : public Engraver
26 {
27 public:
28   TRANSLATOR_DECLARATIONS (Trill_spanner_engraver);
29 protected:
30   virtual void finalize ();
31   DECLARE_ACKNOWLEDGER (note_column);
32   DECLARE_TRANSLATOR_LISTENER (trill_span);
33   void stop_translation_timestep ();
34   void process_music ();
35
36 private:
37   Spanner *span_;
38   Spanner *finished_;
39   Stream_event *current_event_;
40   Drul_array<Stream_event *> event_drul_;
41   void typeset_all ();
42 };
43
44 Trill_spanner_engraver::Trill_spanner_engraver ()
45 {
46   finished_ = 0;
47   current_event_ = 0;
48   span_ = 0;
49   event_drul_[START] = 0;
50   event_drul_[STOP] = 0;
51 }
52
53 IMPLEMENT_TRANSLATOR_LISTENER (Trill_spanner_engraver, trill_span);
54 void
55 Trill_spanner_engraver::listen_trill_span (Stream_event *ev)
56 {
57   Direction d = to_dir (ev->get_property ("span-direction"));
58   ASSIGN_EVENT_ONCE (event_drul_[d], ev);
59 }
60
61 void
62 Trill_spanner_engraver::process_music ()
63 {
64   if (event_drul_[STOP])
65     {
66       if (!span_)
67         event_drul_[STOP]->origin ()->warning (_ ("can't find start of trill spanner"));
68       else
69         {
70           finished_ = span_;
71           span_ = 0;
72           current_event_ = 0;
73         }
74     }
75
76   if (event_drul_[START])
77     {
78       if (current_event_)
79         event_drul_[START]->origin ()->warning (_ ("already have a trill spanner"));
80       else
81         {
82           current_event_ = event_drul_[START];
83           span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ());
84           Side_position_interface::set_axis (span_, Y_AXIS);
85           event_drul_[START] = 0;
86         }
87     }
88 }
89
90 void
91 Trill_spanner_engraver::acknowledge_note_column (Grob_info info)
92 {
93   Spanner *spans[2] ={span_, finished_};
94   for (int i = 0; i < 2; i++)
95     {
96       if (spans[i])
97         {
98           Side_position_interface::add_support (spans[i], info.grob ());
99           add_bound_item (spans[i], dynamic_cast<Item *> (info.grob ()));
100         }
101     }
102 }
103
104 void
105 Trill_spanner_engraver::typeset_all ()
106 {
107   if (finished_)
108     {
109       if (!finished_->get_bound (RIGHT))
110         {
111           Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
112           finished_->set_bound (RIGHT, e);
113         }
114       finished_ = 0;
115     }
116 }
117
118 void
119 Trill_spanner_engraver::stop_translation_timestep ()
120 {
121   if (span_ && !span_->get_bound (LEFT))
122     {
123       Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
124       span_->set_bound (LEFT, e);
125     }
126
127   typeset_all ();
128   event_drul_[START] = 0;
129   event_drul_[STOP] = 0;
130 }
131
132 void
133 Trill_spanner_engraver::finalize ()
134 {
135   typeset_all ();
136   if (span_)
137     {
138       finished_ = span_;
139       typeset_all ();
140     }
141 }
142
143 ADD_ACKNOWLEDGER (Trill_spanner_engraver, note_column);
144 ADD_TRANSLATOR (Trill_spanner_engraver,
145                 /* doc */ "Create trill spanner from an event.",
146                 /* create */ "TrillSpanner",
147                 /* accept */ "trill-span-event",
148                 /* read */ "",
149                 /* write */ "");