2 instrument-name-engraver.cc -- implement Instrument_name_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.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"
20 class Instrument_name_engraver : public Engraver
27 TRANSLATOR_DECLARATIONS(Instrument_name_engraver);
29 virtual void initialize ();
30 virtual void acknowledge_grob (Grob_info);
31 virtual void stop_translation_timestep ();
32 virtual void process_music ();
37 Instrument_name_engraver::Instrument_name_engraver ()
45 Instrument_name_engraver::initialize ()
47 daddy_trans_->set_property ("instrumentSupport", SCM_EOL);
51 Instrument_name_engraver::stop_translation_timestep ()
55 text_->set_grob_property ("side-support-elements",
56 get_property ("instrumentSupport"));
63 Instrument_name_engraver::create_text ()
67 SCM txt = get_property ("instrument");
69 if (now_mom () > Moment (0))
70 txt = get_property ("instr");
72 if (!new_markup_p (txt))
75 text_ = new Item (get_property ("InstrumentName"));
77 if (text_->get_grob_property ("text") != txt)
78 text_->set_grob_property ("text", txt);
80 if (new_markup_p (txt))
81 text_->set_grob_property ("molecule-callback", new_markup_brewer());
84 text_->set_parent (delim_, Y_AXIS);
86 announce_grob (text_, SCM_EOL);
91 Instrument_name_engraver::acknowledge_grob (Grob_info i)
93 if (Bar_line::has_interface (i.grob_))
98 if (dynamic_cast<Spanner*> (i.grob_)
99 && i.grob_->internal_has_interface (ly_symbol2scm ("dynamic-interface")))
103 Hang the instrument names on the staves, but not on the alignment
104 groups enclosing that staff. The alignment has no real location,
105 but is only a vehicle for the placement routine it contains, and
106 therefore the location of its refpoint won't be very useful.
108 We could also just use stavesFound, but lets keep this working
109 without staffs as well.
111 if (dynamic_cast<Spanner*> (i.grob_)
112 && ((Axis_group_interface::has_interface (i.grob_)
113 && Axis_group_interface::axis_b (i.grob_, Y_AXIS)))
114 && !Align_interface::has_interface (i.grob_))
116 SCM nl = gh_cons (i.grob_->self_scm (),
117 get_property ("instrumentSupport"));
119 daddy_trans_->set_property ("instrumentSupport", nl);
124 Instrument_name_engraver::process_music ()
127 Also create text if barlines in other groups. This allows
128 a name to be attached to lyrics or chords.
130 if (gh_string_p (get_property ("whichBar")))
134 ENTER_DESCRIPTION(Instrument_name_engraver,
135 /* descr */ " Prints the name of the instrument (specified by "
136 " @code{Staff.instrument} and @code{Staff.instr}) "
137 "at the left of the staff. ",
138 /* creats*/ "InstrumentName",
140 /* acks */ "bar-line-interface axis-group-interface",
141 /* reads */ "instrument instr",