X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finstrument-name-engraver.cc;h=8e1e84dc8e9f072227a12e7d90887b97c98052d8;hb=015bb3813eb4ac879df0561e5c6e28e9d1146792;hp=e166f48ec99e1242655a8b815fc5b06f90288bd8;hpb=6b9bfd374643d1eed1ea158777d796c57a2bcd3a;p=lilypond.git diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index e166f48ec9..8e1e84dc8e 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -3,46 +3,44 @@ 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-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_->set_property ("instrumentSupport", SCM_EOL); + context ()->set_property ("instrumentSupport", SCM_EOL); } void @@ -50,28 +48,34 @@ 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_, SCM_EOL); - } + if (text_->get_property ("text") != txt) + text_->set_property ("text", txt); + } void @@ -79,20 +83,16 @@ Instrument_name_engraver::acknowledge_grob (Grob_info i) { if (Bar_line::has_interface (i.grob_)) { - SCM s = get_property ("instrument"); - - if (now_mom () > Moment (0)) - s = get_property ("instr"); - - /* - FIXME: use get_markup () to check type. - */ - if (gh_string_p (s) || gh_pair_p (s)) - create_text (s); + create_text (); } + /* + 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 ("dynamic-interface")) + || i.grob_->internal_has_interface (ly_symbol2scm ("piano-pedal-interface"))) + ) return; /* @@ -100,34 +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_) && ((Axis_group_interface::has_interface (i.grob_) - && Axis_group_interface::axis_b (i.grob_, Y_AXIS))) + && Axis_group_interface::has_axis (i.grob_, Y_AXIS))) && !Align_interface::has_interface (i.grob_)) { - SCM nl = gh_cons (i.grob_->self_scm (), + SCM nl = scm_cons (i.grob_->self_scm (), get_property ("instrumentSupport")); - daddy_trans_->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", -/* accepts */ "general-music", +/* 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 */ "");