]> git.donarmstrong.com Git - lilypond.git/blob - lily/trill-spanner-engraver.cc
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[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_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 (_ ("cannot 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::typeset_all ()
92 {
93   if (finished_)
94     {
95       if (!finished_->get_bound (RIGHT))
96         {
97           Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
98           finished_->set_bound (RIGHT, e);
99         }
100       finished_ = 0;
101     }
102 }
103
104 void
105 Trill_spanner_engraver::stop_translation_timestep ()
106 {
107   if (span_ && !span_->get_bound (LEFT))
108     {
109       Grob *e = unsmob_grob (get_property ("currentMusicalColumn"));
110       span_->set_bound (LEFT, e);
111     }
112
113   typeset_all ();
114   event_drul_[START] = 0;
115   event_drul_[STOP] = 0;
116 }
117
118 void
119 Trill_spanner_engraver::finalize ()
120 {
121   typeset_all ();
122   if (span_)
123     {
124       finished_ = span_;
125       typeset_all ();
126     }
127 }
128
129 ADD_TRANSLATOR (Trill_spanner_engraver,
130                 /* doc */ "Create trill spanner from an event.",
131                 /* create */
132                 "TrillSpanner ",
133                 /* read */ "",
134                 /* write */ "");