X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-engraver.cc;h=248d5740e9f0c46f9f39c7f6887ad6e5f528ba3d;hb=e540311d3f5799216c91d203080f63b65cccde07;hp=4d03ac6ea3857575e003a4066fb99751c5974d84;hpb=8d7a55721e3305f745c0b24c367de002dd197825;p=lilypond.git diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index 4d03ac6ea3..248d5740e9 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -3,17 +3,18 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Han-Wen Nienhuys + (c) 2000--2004 Han-Wen Nienhuys */ #include "engraver.hh" -#include "translator-group.hh" -#include "volta-spanner.hh" +#include "context.hh" +#include "volta-bracket.hh" #include "item.hh" #include "note-column.hh" -#include "bar.hh" +#include "bar-line.hh" #include "side-position-interface.hh" +#include "warn.hh" #include "staff-symbol.hh" /* @@ -23,34 +24,49 @@ class Volta_engraver : public Engraver { public: - TRANSLATOR_DECLARATIONS(Volta_engraver); + TRANSLATOR_DECLARATIONS (Volta_engraver); protected: virtual void acknowledge_grob (Grob_info); virtual void finalize (); virtual void stop_translation_timestep (); virtual void process_music (); - virtual void create_grobs (); Moment started_mom_; - Spanner *volta_span_p_; - Spanner *end_volta_span_p_; + Spanner *volta_span_; + Spanner *end_volta_span_; SCM staff_; - SCM start_str_; + SCM start_string_; + + bool staff_eligible (); + }; Volta_engraver::Volta_engraver () { staff_ = SCM_EOL; - volta_span_p_ = 0; - end_volta_span_p_ = 0; + volta_span_ = 0; + end_volta_span_ = 0; } -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 @@ -66,32 +82,48 @@ Volta_engraver::process_music () volta engraver in score context or somesuch. */ - if (ly_car (scm_last_pair (staffs)) != staff_) - return ; + if (!ly_c_pair_p (staffs)) + { + programming_error ("Huh? Volta engraver can't find staffs?"); + return false; + } + else if (ly_car (scm_last_pair (staffs)) != staff_) + { + return false; + } } - - + return true; +} + +void +Volta_engraver::process_music () +{ SCM cs = get_property ("repeatCommands"); + if (!staff_eligible ()) + return ; + + bool end = false; - start_str_ = SCM_EOL; - while (gh_pair_p (cs)) + start_string_ = SCM_EOL; + while (ly_c_pair_p (cs)) { SCM c = ly_car (cs); - if (gh_pair_p (c) && ly_car (c) == ly_symbol2scm ("volta") - && gh_pair_p (ly_cdr (c))) + if (ly_c_pair_p (c) + && ly_car (c) == ly_symbol2scm ("volta") + && ly_c_pair_p (ly_cdr (c))) { if (ly_cadr (c) == SCM_BOOL_F) end = true; else - start_str_ = ly_cadr (c); + start_string_ = ly_cadr (c); } cs = ly_cdr (cs); } - if (volta_span_p_) + if (volta_span_) { SCM l (get_property ("voltaSpannerDuration")); Moment now = now_mom (); @@ -103,67 +135,63 @@ Volta_engraver::process_music () } - if (end && !volta_span_p_) + if (end && !volta_span_) { warning (_ ("No volta spanner to end")); // fixme: be more verbose. } else if (end) { - end_volta_span_p_ = volta_span_p_; - volta_span_p_ =0; + end_volta_span_ = volta_span_; + volta_span_ =0; } - if (gh_string_p (start_str_) && volta_span_p_) + if (volta_span_ && + (ly_c_string_p (start_string_) || ly_c_pair_p (start_string_))) { warning (_ ("Already have a volta spanner. Stopping that one prematurely.")); - if (end_volta_span_p_) + if (end_volta_span_) { warning (_ ("Also have a stopped spanner. Giving up.")); return ; } - end_volta_span_p_ = volta_span_p_; - volta_span_p_ = 0; + 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::create_grobs () -{ - if (!volta_span_p_ && gh_string_p (start_str_)) + if (!volta_span_ && + (ly_c_string_p (start_string_) || ly_c_pair_p (start_string_))) { started_mom_ = now_mom () ; - volta_span_p_ = new Spanner (get_property ("VoltaBracket")); - Volta_spanner::set_interface (volta_span_p_); - announce_grob (volta_span_p_, SCM_EOL); - volta_span_p_->set_grob_property ("text", start_str_); + volta_span_ = make_spanner ("VoltaBracket", SCM_EOL); + + + volta_span_->set_property ("text", start_string_); } } + void Volta_engraver::acknowledge_grob (Grob_info i) { - if (Item* item = dynamic_cast (i.grob_l_)) + if (Item* item = dynamic_cast (i.grob_)) { if (Note_column::has_interface (item)) { - if (volta_span_p_) - Volta_spanner::add_column (volta_span_p_,item); + if (volta_span_) + Volta_bracket_interface::add_column (volta_span_,item); } - if (Bar::has_interface (item)) + if (Bar_line::has_interface (item)) { - if (volta_span_p_) - Volta_spanner::add_bar (volta_span_p_, item); - if (end_volta_span_p_) - Volta_spanner::add_bar (end_volta_span_p_ , item); + if (volta_span_) + Volta_bracket_interface::add_bar (volta_span_, item); + if (end_volta_span_) + Volta_bracket_interface::add_bar (end_volta_span_ , item); } } - else if (Staff_symbol::has_interface (i.grob_l_)) + else if (Staff_symbol::has_interface (i.grob_)) { /* We only want to know about a single staff: then we add to the @@ -172,20 +200,20 @@ Volta_engraver::acknowledge_grob (Grob_info i) staff_ = SCM_UNDEFINED; if (staff_ != SCM_UNDEFINED) - staff_ = i.grob_l_->self_scm(); + staff_ = i.grob_->self_scm (); } } void Volta_engraver::finalize () { - if (volta_span_p_) + if (volta_span_) { - typeset_grob (volta_span_p_); + typeset_grob (volta_span_); } - if (end_volta_span_p_) + if (end_volta_span_) { - typeset_grob (end_volta_span_p_); + typeset_grob (end_volta_span_); } } @@ -194,10 +222,23 @@ Volta_engraver::finalize () void Volta_engraver::stop_translation_timestep () { - if (end_volta_span_p_) + 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_p_); - end_volta_span_p_ =0; + typeset_grob (end_volta_span_); + end_volta_span_ =0; } } @@ -205,9 +246,10 @@ Volta_engraver::stop_translation_timestep () TODO: should attach volta to paper-column if no bar is found. */ -ENTER_DESCRIPTION(Volta_engraver, +ENTER_DESCRIPTION (Volta_engraver, /* descr */ "Make volta brackets", /* creats*/ "VoltaBracket", +/* accepts */ "", /* acks */ "bar-line-interface staff-symbol-interface note-column-interface", /* reads */ "repeatCommands voltaSpannerDuration stavesFound", /* write */ "");