X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finstrument-name-engraver.cc;h=8e1e84dc8e9f072227a12e7d90887b97c98052d8;hb=015bb3813eb4ac879df0561e5c6e28e9d1146792;hp=11758a82c8e43c1ff93ee2bef972722ddf081359;hpb=d9b43b93f2c885409bafdb157138158f65cc49aa;p=lilypond.git diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index 11758a82c8..8e1e84dc8e 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -1,48 +1,46 @@ /* - new-staff-margin-engraver.cc -- implement Instrument_name_engraver + instrument-name-engraver.cc -- implement Instrument_name_engraver source file of the GNU LilyPond music typesetter - (c) 2000--2002 Han-Wen Nienhuys + (c) 2000--2005 Han-Wen Nienhuys */ #include "engraver.hh" -#include "item.hh" -#include "bar.hh" +#include "bar-line.hh" #include "system-start-delimiter.hh" #include "side-position-interface.hh" #include "align-interface.hh" #include "axis-group-interface.hh" -#include "translator-group.hh" +#include "context.hh" +#include "text-item.hh" class Instrument_name_engraver : public Engraver { - Item *text_; - Grob *delim_ ; - void create_text (SCM s); public: - TRANSLATOR_DECLARATIONS(Instrument_name_engraver); + TRANSLATOR_DECLARATIONS (Instrument_name_engraver); +protected: + Grob *text_; + + virtual void create_text (); virtual void initialize (); virtual void acknowledge_grob (Grob_info); virtual void stop_translation_timestep (); + virtual void process_music (); }; - - Instrument_name_engraver::Instrument_name_engraver () { text_ = 0; - delim_ =0; } - void Instrument_name_engraver::initialize () { - daddy_trans_l_->set_property ("instrumentSupport", SCM_EOL); + context ()->set_property ("instrumentSupport", SCM_EOL); } void @@ -50,49 +48,51 @@ Instrument_name_engraver::stop_translation_timestep () { if (text_) { - text_->set_grob_property ("side-support-elements", - get_property ("instrumentSupport")); - typeset_grob (text_); + text_->set_property ("side-support-elements", + get_property ("instrumentSupport")); text_ = 0; } } void -Instrument_name_engraver::create_text (SCM txt) +Instrument_name_engraver::create_text () { - if (!text_) - { - text_ = new Item (get_property ("InstrumentName")); - - if (text_->get_grob_property ("text") != txt) - text_->set_grob_property ("text", txt); - - if (delim_) - text_->set_parent (delim_, Y_AXIS); + if (text_) + return ; + + SCM txt = get_property ("instrument"); + + if (now_mom () > Moment (0)) + txt = get_property ("instr"); + /* + UGH. + */ + if (txt == SCM_EOL) + return ; + + + text_ = make_item ("InstrumentName", SCM_EOL); - announce_grob (text_,0); - } + if (text_->get_property ("text") != txt) + text_->set_property ("text", txt); + } void Instrument_name_engraver::acknowledge_grob (Grob_info i) { - if (Bar::has_interface (i.grob_l_)) + if (Bar_line::has_interface (i.grob_)) { - SCM s = get_property ("instrument"); - - if (now_mom () > Moment (0)) - s = get_property ("instr"); - - /* - FIXME: use markup_p () to check type. - */ - if (gh_string_p (s) || gh_pair_p (s)) - create_text (s); + create_text (); } - if (dynamic_cast (i.grob_l_) - && i.grob_l_->has_interface (ly_symbol2scm ("dynamic-interface"))) + /* + Ugh - typechecking for pedal and dynamic sucks. + */ + if (dynamic_cast (i.grob_) + && (i.grob_->internal_has_interface (ly_symbol2scm ("dynamic-interface")) + || i.grob_->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))) + ) return; /* @@ -100,29 +100,91 @@ Instrument_name_engraver::acknowledge_grob (Grob_info i) groups enclosing that staff. The alignment has no real location, but is only a vehicle for the placement routine it contains, and therefore the location of its refpoint won't be very useful. - + + We could also just use stavesFound, but lets keep this working + without staffs as well. */ - if (dynamic_cast (i.grob_l_) - && ((Axis_group_interface::has_interface (i.grob_l_) - && Axis_group_interface::axis_b (i.grob_l_, Y_AXIS))) - && !Align_interface::has_interface (i.grob_l_)) + if (dynamic_cast (i.grob_) + && ((Axis_group_interface::has_interface (i.grob_) + && Axis_group_interface::has_axis (i.grob_, Y_AXIS))) + && !Align_interface::has_interface (i.grob_)) { - SCM nl = gh_cons (i.grob_l_->self_scm (), + SCM nl = scm_cons (i.grob_->self_scm (), get_property ("instrumentSupport")); - daddy_trans_l_->set_property ("instrumentSupport", nl); + context ()->set_property ("instrumentSupport", nl); } } +void +Instrument_name_engraver::process_music () +{ + /* + Also create text if barlines in other groups. This allows + a name to be attached to lyrics or chords. + */ + if (scm_is_string (get_property ("whichBar"))) + create_text (); +} - - -ENTER_DESCRIPTION(Instrument_name_engraver, -/* descr */ " Prints the name of the instrument (specified by -@code{Staff.instrument} and @code{Staff.instr}) -at the left of the -staff.", +ADD_TRANSLATOR (Instrument_name_engraver, +/* descr */ " Prints the name of the instrument (specified by " +" @code{Staff.instrument} and @code{Staff.instr}) " +"at the left of the staff. ", /* creats*/ "InstrumentName", -/* acks */ "bar-line-interface axis-group-interface", +/* accepts */ "", +/* acks */ "bar-line-interface axis-group-interface", /* reads */ "instrument instr", /* write */ ""); + +/****************************************************************/ + + +class Vocal_name_engraver : public Instrument_name_engraver +{ +public: + TRANSLATOR_DECLARATIONS (Vocal_name_engraver); + virtual void create_text (); +}; + + +Vocal_name_engraver::Vocal_name_engraver () +{ +} + + +void +Vocal_name_engraver::create_text () +{ + if (text_) + return ; + + SCM txt = get_property ("vocalName"); + + if (now_mom () > Moment (0)) + txt = get_property ("vocNam"); + + /* + UGH. + */ + if (txt == SCM_EOL) + return ; + + text_ = make_item ("VocalName", SCM_EOL); + + if (text_->get_property ("text") != txt) + text_->set_property ("text", txt); + +} + + + +ADD_TRANSLATOR (Vocal_name_engraver, +/* descr */ " Prints the name of the a lyric voice (specified by " +" @code{Staff.vocalName} and @code{Staff.vocNam}) " +"at the left of the staff. ", +/* creats*/ "VocalName", +/* accepts */ "", +/* acks */ "bar-line-interface axis-group-interface", +/* reads */ "vocNam vocalName", +/* write */ "");