]> git.donarmstrong.com Git - lilypond.git/blob - lily/instrument-name-engraver.cc
74f0754cd1d2e693de85506e13e680f2cb5673c4
[lilypond.git] / lily / instrument-name-engraver.cc
1 /*   
2   instrument-name-engraver.cc --  implement Instrument_name_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "engraver.hh"
11 #include "item.hh"
12 #include "bar-line.hh"
13 #include "system-start-delimiter.hh"
14 #include "side-position-interface.hh"
15 #include "align-interface.hh"
16 #include "axis-group-interface.hh"
17 #include "translator-group.hh"
18 #include "text-item.hh"
19
20 class Instrument_name_engraver : public Engraver
21 {
22   
23 public:
24   TRANSLATOR_DECLARATIONS(Instrument_name_engraver);
25
26 protected:
27   Grob *text_;
28
29   virtual void create_text ();
30   virtual void initialize ();
31   virtual void acknowledge_grob (Grob_info);
32   virtual void stop_translation_timestep ();
33   virtual void process_music ();
34 };
35
36 Instrument_name_engraver::Instrument_name_engraver ()
37 {
38   text_ = 0;
39 }
40
41
42 void
43 Instrument_name_engraver::initialize ()
44 {
45   daddy_trans_->set_property ("instrumentSupport", SCM_EOL); 
46 }
47
48 void
49 Instrument_name_engraver::stop_translation_timestep ()
50 {
51   if (text_)
52     {
53       text_->set_grob_property ("side-support-elements",
54                                 get_property ("instrumentSupport"));
55       typeset_grob (text_);
56       text_ = 0;
57     }
58 }
59
60
61 void
62 Instrument_name_engraver::create_text ()
63 {
64   if (text_)
65     return ;
66   
67   SCM txt = get_property ("instrument");
68   
69   if (now_mom () > Moment (0))
70     txt = get_property ("instr");
71   /*
72     UGH.
73   */
74   if (txt == SCM_EOL)
75     return ;
76
77   
78   text_ = make_item ("InstrumentName");
79       
80   if (text_->get_grob_property ("text") != txt)
81     text_->set_grob_property ("text", txt);
82   announce_grob (text_, SCM_EOL);
83   }
84
85 void
86 Instrument_name_engraver::acknowledge_grob (Grob_info i)
87 {
88   if (Bar_line::has_interface (i.grob_))
89     {
90       create_text();
91     }
92
93   if (dynamic_cast<Spanner*> (i.grob_)
94       && i.grob_->internal_has_interface (ly_symbol2scm ("dynamic-interface")))
95     return;
96
97   /*
98     Hang the instrument names on the staves, but not on the alignment
99     groups enclosing that staff. The alignment has no real location,
100     but is only a vehicle for the placement routine it contains, and
101     therefore the location of its refpoint won't be very useful.
102
103     We could also just use stavesFound, but lets keep this working
104     without staffs as well.
105   */
106   if (dynamic_cast<Spanner*> (i.grob_)
107       && ((Axis_group_interface::has_interface (i.grob_)
108            && Axis_group_interface::axis_b (i.grob_, Y_AXIS)))
109       && !Align_interface::has_interface (i.grob_))
110     {
111       SCM nl = gh_cons (i.grob_->self_scm (),
112                         get_property ("instrumentSupport"));
113
114       daddy_trans_->set_property ("instrumentSupport", nl);
115     }
116 }
117
118 void
119 Instrument_name_engraver::process_music ()
120 {
121   /*
122     Also create text if barlines in other groups. This allows
123     a name to be attached to lyrics or chords. 
124    */
125   if (gh_string_p (get_property ("whichBar")))
126     create_text();
127 }
128
129 ENTER_DESCRIPTION(Instrument_name_engraver,
130 /* descr */       " Prints the name of the instrument (specified by "
131 " @code{Staff.instrument} and @code{Staff.instr}) "
132 "at the left of the staff. ",
133 /* creats*/       "InstrumentName",
134 /* accepts */     "",
135 /* acks  */      "bar-line-interface axis-group-interface",
136 /* reads */       "instrument instr",
137 /* write */       "");
138
139 /****************************************************************/
140
141
142 class Vocal_name_engraver : public Instrument_name_engraver
143 {
144 public:
145   TRANSLATOR_DECLARATIONS(Vocal_name_engraver);
146   virtual void create_text ();
147 };
148
149
150 Vocal_name_engraver::Vocal_name_engraver ()
151 {
152 }
153
154
155 void
156 Vocal_name_engraver::create_text ()
157 {
158   if (text_)
159     return ;
160   
161   SCM txt = get_property ("vocalName");
162   
163   if (now_mom () > Moment (0))
164     txt = get_property ("vocNam");
165
166   /*
167     UGH.
168   */
169   if (txt == SCM_EOL)
170     return ;
171   
172   text_ = make_item ("VocalName");
173       
174   if (text_->get_grob_property ("text") != txt)
175     text_->set_grob_property ("text", txt);
176   announce_grob (text_, SCM_EOL);
177 }
178
179
180
181 ENTER_DESCRIPTION(Vocal_name_engraver,
182 /* descr */       " Prints the name of the a lyric voice (specified by "
183 " @code{Staff.vocalName} and @code{Staff.vocNam}) "
184 "at the left of the staff. ",
185 /* creats*/       "VocalName",
186 /* accepts */     "",
187 /* acks  */      "bar-line-interface axis-group-interface",
188 /* reads */       "vocNam vocalName",
189 /* write */       "");