X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fextender-engraver.cc;h=5c893207eedcbd211b994948454bd97d6e63dd04;hb=46bfe1acbea4a8c22817d6d650734ff92029c22e;hp=3cf5b3455c9c487e484a3c40e90b0332a2a14ac0;hpb=bb446de35e2d24c7f6f15425a76b433cb71a4a1d;p=lilypond.git diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 3cf5b3455c..5c893207ee 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -1,57 +1,90 @@ /* extender-engraver.cc -- implement Extender_engraver - (c) 1998--1999 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 "g-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 +{ + Score_element *last_lyric_l_; + Score_element *current_lyric_l_; + Extender_req* req_l_; + Spanner* extender_p_; +public: + Extender_engraver (); + VIRTUAL_COPY_CONS (Translator); + +protected: + virtual void acknowledge_element (Score_element_info); + virtual void do_removal_processing(); + virtual void do_process_music(); + virtual bool do_try_music (Music*); + virtual void do_pre_move_processing(); + virtual void do_post_move_processing (); +private: + +}; + 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) { - G_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_->item_l_drul_[LEFT]) - extender_spanner_p_->set_textitem (LEFT, t); - else - if (span_reqs_drul_[RIGHT] && !extender_spanner_p_->item_l_drul_[RIGHT]) - extender_spanner_p_->set_textitem (RIGHT, t); + // -> text_item + if (i.elem_l_->has_interface (ly_symbol2scm("text-item-interface"))) + + { + current_lyric_l_ = i.elem_l_; + if (extender_p_ + && !extender_p_->get_bound (RIGHT) + ) + { + Lyric_extender(extender_p_).set_textitem (RIGHT, dynamic_cast (i.elem_l_)); + } + } } + bool -Extender_engraver::do_try_music (Music* req_l) +Extender_engraver::do_try_music (Music* r) { - if (Extender_req* p = dynamic_cast (req_l)) + if (Extender_req* p = dynamic_cast (r)) { - if (bool (extender_spanner_p_) == bool (p->spantype_ == START)) - return false; - - Direction d = (!extender_spanner_p_) ? LEFT : RIGHT; - if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (p)) + if (req_l_) return false; - span_reqs_drul_[d] = p; - span_mom_drul_[d] = get_staff_info ().musical_l ()->when (); + req_l_ = p; return true; } return false; @@ -60,33 +93,53 @@ Extender_engraver::do_try_music (Music* req_l) void Extender_engraver::do_removal_processing () { - if (extender_spanner_p_) + if (extender_p_) { - span_reqs_drul_[LEFT]->warning (_ ("unterminated extender")); - extender_spanner_p_->set_bounds(RIGHT, get_staff_info ().command_l ()); + req_l_->origin ()->warning (_ ("unterminated extender")); + extender_p_->set_bound(RIGHT, unsmob_element (get_property ("currentCommandColumn"))); } } void -Extender_engraver::do_process_requests () +Extender_engraver::do_process_music () { - if (extender_spanner_p_ || !span_reqs_drul_[LEFT]) - return; + if (req_l_) + { + 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 (extender_p_).set_textitem (LEFT, last_lyric_l_); + announce_element (extender_p_, req_l_); + } } + void Extender_engraver::do_pre_move_processing () { - if (!extender_spanner_p_ || !span_reqs_drul_[RIGHT]) - return; + if (extender_p_) + { + typeset_element (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::do_post_move_processing () +{ + req_l_ = 0; +} + +