X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=inline;f=lily%2Fvolta-engraver.cc;h=d374278b57e3e073ff26de9efae6d5cd4505a848;hb=33f2e59ea0b2a1ba41e943b5afa29e5fee97ba94;hp=14acbf424988385df472c7fda26b860d602114b9;hpb=1b9fc29140bd1d9345f784595afd22158876dfb7;p=lilypond.git diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index 14acbf4249..d374278b57 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Han-Wen Nienhuys + (c) 2000--2003 Han-Wen Nienhuys */ @@ -31,13 +31,15 @@ protected: virtual void finalize (); virtual void stop_translation_timestep (); virtual void process_music (); - virtual void process_acknowledged_grobs (); Moment started_mom_; Spanner *volta_span_; Spanner *end_volta_span_; SCM staff_; SCM start_string_; + + bool staff_eligible (); + }; Volta_engraver::Volta_engraver () @@ -48,10 +50,23 @@ Volta_engraver::Volta_engraver () } -void -Volta_engraver::process_music () +/* + TODO: this logic should be rewritten, it is buggy. + + One of the problems is that we can't determine wether or not to + print the volta bracket during the first step, since that requires + acknowledging the staff. + */ +bool +Volta_engraver::staff_eligible () { - if (unsmob_grob (staff_)) + /* + UGH. + */ + if (!unsmob_grob (staff_)) + return true; + + if (!to_boolean (get_property ("voltaOnThisStaff"))) { /* TODO: this does weird things when you open a piece with a @@ -68,21 +83,35 @@ Volta_engraver::process_music () */ if (!gh_pair_p (staffs)) - programming_error ("Huh? Volta engraver can't find staffs?"); + { + programming_error ("Huh? Volta engraver can't find staffs?"); + return false; + } else if (ly_car (scm_last_pair (staffs)) != staff_) - return ; + { + return false; + } } - - + return true; +} + +void +Volta_engraver::process_music () +{ SCM cs = get_property ("repeatCommands"); + if (!staff_eligible ()) + return ; + + bool end = false; start_string_ = SCM_EOL; while (gh_pair_p (cs)) { SCM c = ly_car (cs); - if (gh_pair_p (c) && ly_car (c) == ly_symbol2scm ("volta") + if (gh_pair_p (c) + && ly_car (c) == ly_symbol2scm ("volta") && gh_pair_p (ly_cdr (c))) { if (ly_cadr (c) == SCM_BOOL_F) @@ -116,7 +145,8 @@ Volta_engraver::process_music () volta_span_ =0; } - if (gh_string_p (start_string_) && volta_span_) + if (volta_span_ && + (gh_string_p (start_string_) || gh_pair_p (start_string_))) { warning (_ ("Already have a volta spanner. Stopping that one prematurely.")); @@ -129,25 +159,20 @@ Volta_engraver::process_music () end_volta_span_ = volta_span_; volta_span_ = 0; } -} -/* - this could just as well be done in process_music (), but what the hack. - */ -void -Volta_engraver::process_acknowledged_grobs () -{ - if (!volta_span_ && gh_string_p (start_string_)) + if (!volta_span_ && + (gh_string_p (start_string_) || gh_pair_p (start_string_))) { started_mom_ = now_mom () ; - volta_span_ = new Spanner (get_property ("VoltaBracket")); + volta_span_ = make_spanner ("VoltaBracket"); announce_grob (volta_span_, SCM_EOL); volta_span_->set_grob_property ("text", start_string_); } } + void Volta_engraver::acknowledge_grob (Grob_info i) { @@ -197,6 +222,19 @@ Volta_engraver::finalize () void Volta_engraver::stop_translation_timestep () { + if (volta_span_ && !staff_eligible ()) + { + /* + THIS IS A KLUDGE. + + we need to do this here, because STAFF_ is not initialized yet + in the 1st call of process_music() + */ + + volta_span_->suicide( ); + volta_span_ = 0; + } + if (end_volta_span_) { typeset_grob (end_volta_span_); @@ -212,6 +250,6 @@ ENTER_DESCRIPTION(Volta_engraver, /* descr */ "Make volta brackets", /* creats*/ "VoltaBracket", /* accepts */ "", -/* acks */ "bar-line-interface staff-symbol-interface note-column-interface", +/* acks */ "bar-line-interface staff-symbol-interface note-column-interface", /* reads */ "repeatCommands voltaSpannerDuration stavesFound", /* write */ "");