X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fextender-engraver.cc;h=a6bcd2593ee6c6dda7ef28afd6590be4023fa5e5;hb=f9efd2c54b174591fa42889557686c7aea356547;hp=92018629d931a82722b7f842b4e3450b000a0c00;hpb=e590acdf36f87d36f68b322c08246664c9a7297a;p=lilypond.git diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 92018629d9..a6bcd2593e 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -1,96 +1,149 @@ /* extender-engraver.cc -- implement Extender_engraver - (c) 1998 Jan Nieuwenhuizen + (c) 1999 Glen Prideaux , + Han-Wen Nienhuys, Jan Nieuwenhuizen. + */ -#include "proto.hh" +#include "flower-proto.hh" #include "musical-request.hh" -#include "extender-engraver.hh" -#include "extender-spanner.hh" -#include "text-def.hh" -#include "score-column.hh" -#include "text-item.hh" +#include "lyric-extender.hh" +#include "paper-column.hh" +#include "item.hh" +#include "engraver.hh" +#include "drul-array.hh" +#include "lyric-extender.hh" +#include "pqueue.hh" + + +/** + Generate an centred extender. Should make a Extender_spanner that + typesets a nice centred extender of varying length depending on the + gap between syllables. + + We remember the last Item that come across. When we get a + request, we create the spanner, and attach the left point to the + last lyrics, and the right point to any lyrics we receive by + then. */ +class Extender_engraver : public Engraver +{ + Grob *last_lyric_l_; + Grob *current_lyric_l_; + Extender_req* req_l_; + Spanner* extender_p_; +public: + TRANSLATOR_DECLARATIONS(Extender_engraver); + +protected: + virtual void acknowledge_grob (Grob_info); + virtual void finalize (); + virtual bool try_music (Music*); + virtual void stop_translation_timestep (); + virtual void start_translation_timestep (); + virtual void process_music (); +private: + +}; + + -IMPLEMENT_IS_TYPE_B1 (Extender_engraver,Engraver); -ADD_THIS_TRANSLATOR (Extender_engraver); Extender_engraver::Extender_engraver () { - extender_spanner_p_ = 0; - span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0; + current_lyric_l_ = 0; + last_lyric_l_ = 0; + extender_p_ = 0; + req_l_ = 0; } void -Extender_engraver::acknowledge_element (Score_element_info i) +Extender_engraver::acknowledge_grob (Grob_info i) { - Text_item* t = (dynamic_cast (i.elem_l_)); - if (!t) - return; - if (!extender_spanner_p_) - return; - if (!span_reqs_drul_[LEFT]) - return; - - if (!extender_spanner_p_->textitem_l_drul_[LEFT]) - extender_spanner_p_->set_textitem (LEFT, t); - else - if (span_reqs_drul_[RIGHT] && !extender_spanner_p_->textitem_l_drul_[RIGHT]) - extender_spanner_p_->set_textitem (RIGHT, t); + // -> text_item + if (i.grob_l_->internal_has_interface (ly_symbol2scm ("lyric-syllable-interface"))) + { + current_lyric_l_ = i.grob_l_; + if (extender_p_ + && !extender_p_->get_bound (RIGHT) + ) + { + Lyric_extender::set_textitem (extender_p_, RIGHT, dynamic_cast (i.grob_l_)); + } + } } + bool -Extender_engraver::do_try_request (Request* req_l) +Extender_engraver::try_music (Music* r) { - Extender_req* p = dynamic_cast (req_l); - if (!p) - return false; - - if (bool (extender_spanner_p_) == bool (p->spantype == Span_req::START)) - return false; - - Direction d = (!extender_spanner_p_) ? LEFT : RIGHT; - if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (req_l)) - return false; + if (Extender_req* p = dynamic_cast (r)) + { + if (req_l_) + return false; - span_reqs_drul_[d] = p; - span_mom_drul_[d] = get_staff_info ().musical_l ()->when (); - return true; + req_l_ = p; + return true; + } + return false; } void -Extender_engraver::do_removal_processing () +Extender_engraver::finalize () { - if (extender_spanner_p_) + if (extender_p_) { - span_reqs_drul_[LEFT]->warning (_ ("unterminated extender")); - extender_spanner_p_->unlink (); - delete extender_spanner_p_; - extender_spanner_p_ = 0; - span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0; + req_l_->origin ()->warning (_ ("unterminated extender")); + extender_p_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); } } void -Extender_engraver::do_process_requests () +Extender_engraver::process_music () { - if (extender_spanner_p_ || !span_reqs_drul_[LEFT]) - return; + if (req_l_ && ! extender_p_) + { + if (!last_lyric_l_) + { + req_l_->origin ()->warning (_ ("Nothing to connect extender to on the left. Ignoring extender request.")); + return; + } + + extender_p_ = new Spanner (get_property ("LyricExtender")); - extender_spanner_p_ = new Extender_spanner; - announce_element (Score_element_info (extender_spanner_p_, span_reqs_drul_[LEFT])); + Lyric_extender::set_textitem (extender_p_, LEFT, last_lyric_l_); + announce_grob(extender_p_, req_l_->self_scm()); + } } + void -Extender_engraver::do_pre_move_processing () +Extender_engraver::stop_translation_timestep () { - if (!extender_spanner_p_ || !span_reqs_drul_[RIGHT]) - return; + if (extender_p_) + { + typeset_grob (extender_p_); + extender_p_ = 0; + } - typeset_element (extender_spanner_p_); - - extender_spanner_p_ = 0; - span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0; + if (current_lyric_l_) + { + last_lyric_l_ = current_lyric_l_; + current_lyric_l_ =0; + } +} + +void +Extender_engraver::start_translation_timestep () +{ + req_l_ = 0; } + +ENTER_DESCRIPTION(Extender_engraver, +/* descr */ "Create lyric extenders", +/* creats*/ "LyricExtender", +/* acks */ "lyric-syllable-interface", +/* reads */ "", +/* write */ "");