]> git.donarmstrong.com Git - lilypond.git/blob - lily/figured-bass-position-engraver.cc
(acknowledge_slur):
[lilypond.git] / lily / figured-bass-position-engraver.cc
1 /*
2   figured-bass-position-engraver.cc -- implement Figured_bass_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "engraver.hh"
11
12 #include "context.hh"
13 #include "music.hh"
14 #include "spanner.hh"
15 #include "side-position-interface.hh"
16 #include "translator.icc"
17 #include "axis-group-interface.hh"
18
19 class Figured_bass_position_engraver : public Engraver
20 {
21   TRANSLATOR_DECLARATIONS(Figured_bass_position_engraver);
22
23   Spanner *bass_figure_alignment_;
24   Spanner *positioner_;
25   vector<Grob*> support_;
26
27 protected:
28   DECLARE_ACKNOWLEDGER (note_column);
29   DECLARE_ACKNOWLEDGER (slur);
30   DECLARE_ACKNOWLEDGER (tie);
31   DECLARE_ACKNOWLEDGER (bass_figure_alignment);
32   DECLARE_END_ACKNOWLEDGER (bass_figure_alignment);
33
34   virtual void finalize ();
35   void start_spanner ();
36   void stop_spanner ();
37   void stop_translation_timestep ();
38 };
39
40 Figured_bass_position_engraver::Figured_bass_position_engraver ()
41 {
42   positioner_ = 0;
43   bass_figure_alignment_ = 0;
44 }
45
46 void
47 Figured_bass_position_engraver::start_spanner ()
48 {
49   assert (!positioner_);
50
51   positioner_ = make_spanner("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ());
52   positioner_->set_bound (LEFT, bass_figure_alignment_->get_bound (LEFT));
53   Axis_group_interface::add_element (positioner_, bass_figure_alignment_);
54 }
55
56 void
57 Figured_bass_position_engraver::stop_spanner ()
58 {
59   if (positioner_ && !positioner_->get_bound (RIGHT))
60     {
61       positioner_->set_bound (RIGHT, bass_figure_alignment_->get_bound (RIGHT));
62     }
63   
64   positioner_ = 0;
65   bass_figure_alignment_ = 0;
66 }
67
68 void
69 Figured_bass_position_engraver::finalize () 
70 {
71   stop_spanner ();
72 }
73
74 void
75 Figured_bass_position_engraver::acknowledge_note_column (Grob_info info)
76 {
77   support_.push_back (info.grob ());
78 }
79
80
81 void
82 Figured_bass_position_engraver::acknowledge_slur (Grob_info info)
83 {
84   support_.push_back (info.grob ());
85 }
86
87 void
88 Figured_bass_position_engraver::acknowledge_tie (Grob_info info)
89 {
90   support_.push_back (info.grob ());
91 }
92
93 void
94 Figured_bass_position_engraver::stop_translation_timestep ()
95 {
96   if (positioner_)
97     {
98       for (vsize i = 0; i < support_.size (); i++)
99         Side_position_interface::add_support (positioner_, support_[i]);
100     }
101
102   support_.clear ();
103 }
104
105 void
106 Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info info)
107 {
108   (void)info;
109   stop_spanner ();
110 }
111
112 void
113 Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info info)
114 {
115   bass_figure_alignment_ = dynamic_cast<Spanner*> (info.grob ());
116   start_spanner ();
117 }
118
119
120 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column);
121 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,slur);
122 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,tie);
123 ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
124 ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment);
125
126 ADD_TRANSLATOR (Figured_bass_position_engraver,
127                 /* doc */
128                 "Position figured bass alignments over notes.",
129                 
130                 /* create */
131                 "BassFigureAlignmentPositioning ",
132
133                 /* accept */ "",
134
135                 /* read */
136                 " ",
137                 /* write */ "");