X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flocal-key-engraver.cc;h=8e773bf05a6e37683a0eb522e7a5e9d8ba2b8bf2;hb=3a0e9efb7f067e5b334ba0596b95e15d96d7cc49;hp=54df397c45339fde06195a0472f54f8ce255b008;hpb=9efbad2d9487a05b04423e7e9f062968e8f8eaf4;p=lilypond.git diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index 54df397c45..8e773bf05a 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -1,7 +1,7 @@ /* - local-key-reg.cc -- implement Local_key_engraver + local-key-engraver.cc -- implement Local_key_engraver - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "musical-request.hh" @@ -14,13 +14,14 @@ #include "tie.hh" #include "note-head.hh" #include "time-description.hh" -#include "engraver-group.hh" - +#include "engraver-group-engraver.hh" +#include "grace-align-item.hh" Local_key_engraver::Local_key_engraver() { - key_C_ = 0; + key_grav_l_ = 0; key_item_p_ =0; + grace_align_l_ =0; } void @@ -32,17 +33,24 @@ Local_key_engraver::do_creation_processing () Breaks if Key_engraver is removed from under us. */ Translator * result = - daddy_grav_l()->get_simple_translator (Key_engraver::static_name()); + daddy_grav_l()->get_simple_translator ("Key_engraver"); + + key_grav_l_ = dynamic_cast (result); - if (!result) + if (!key_grav_l_) { - warning (_ ("out of tune") + "! " + _ ("can't find") + " Key_engraver"); + warning (_ ("out of tune:")); + warning (_f ("Can't find: `%s'", "Key_engraver")); } else { - key_C_ = &((Key_engraver*)dynamic_cast (result))->key_; - local_key_ = *key_C_; + local_key_ = key_grav_l_->key_; } + + /* + TODO + (if we are grace) get key info from parent Local_key_engraver + */ } void @@ -50,6 +58,8 @@ Local_key_engraver::process_acknowledged () { if (!key_item_p_ && mel_l_arr_.size()) { + SCM f = get_property ("forgetAccidentals",0); + bool forget = gh_boolean_p (f) && gh_scm2bool(f); for (int i=0; i < mel_l_arr_.size(); i++) { Item * support_l = support_l_arr_[i]; @@ -57,7 +67,11 @@ Local_key_engraver::process_acknowledged () if (tied_l_arr_.find_l (support_l) && !note_l->forceacc_b_) - continue; + { + if (!forget) + local_key_.set (note_l->pitch_); + continue; + } if (!note_l->forceacc_b_ && local_key_.different_acc (note_l->pitch_)) @@ -67,12 +81,28 @@ Local_key_engraver::process_acknowledged () key_item_p_ = new Local_key_item; announce_element (Score_element_info (key_item_p_, 0)); } - key_item_p_->add (note_l->pitch_); + + + key_item_p_->add_pitch (note_l->pitch_, + note_l->cautionary_b_); key_item_p_->add_support (support_l); - local_key_.set (note_l->pitch_); + + if (!forget) + local_key_.set (note_l->pitch_); } - } + if (key_item_p_ && grace_align_l_) + { + grace_align_l_->add_support (key_item_p_); + grace_align_l_ =0; + } + +} + +void +Local_key_engraver::do_removal_processing () +{ + // TODO: signal accidentals to Local_key_engraver the } void @@ -86,7 +116,8 @@ Local_key_engraver::do_pre_move_processing() typeset_element (key_item_p_); key_item_p_ =0; } - + + grace_align_l_ = 0; mel_l_arr_.clear(); tied_l_arr_.clear(); support_l_arr_.clear(); @@ -95,26 +126,33 @@ Local_key_engraver::do_pre_move_processing() void Local_key_engraver::acknowledge_element (Score_element_info info) -{ - Score_element * elem_l = info.elem_l_; - Item * item_l = dynamic_cast (elem_l); +{ + SCM wg= get_property ("weAreGraceContext", 0); + + bool selfgr = gh_boolean_p (wg) &&gh_scm2bool (wg); + bool he_gr = info.elem_l_->get_elt_property (grace_scm_sym) != SCM_BOOL_F; + Grace_align_item * gai = dynamic_cast (info.elem_l_); + if (he_gr && !selfgr && gai) + { + grace_align_l_ = gai; + } Note_req * note_l = dynamic_cast (info.req_l_); + Note_head * note_head = dynamic_cast (info.elem_l_); + - if (note_l && item_l && item_l->is_type_b (Note_head::static_name ())) + + if (he_gr != selfgr) + return; + + if (note_l && note_head) { mel_l_arr_.push (note_l); - support_l_arr_.push (item_l); - } - else if (dynamic_cast (info.req_l_)) - { - local_key_ = *key_C_; + support_l_arr_.push (note_head); } - else if (elem_l->is_type_b (Tie::static_name ())) + else if (Tie * tie_l = dynamic_cast (info.elem_l_)) { - Tie * tie_l = (Tie*)dynamic_cast (elem_l); - if (tie_l->same_pitch_b_) - tied_l_arr_.push (tie_l-> head_l_drul_[RIGHT]); + tied_l_arr_.push (tie_l-> head_l_drul_[RIGHT]); } } @@ -124,11 +162,17 @@ Local_key_engraver::do_process_requests() Time_description const * time_C_ = get_staff_info().time_C_; if (time_C_ && !time_C_->whole_in_measure_) { - if (key_C_) - local_key_= *key_C_; + SCM n = get_property ("noResetKey",0); + bool no_res = gh_boolean_p (n) && gh_scm2bool (n); + if (!no_res && key_grav_l_) + local_key_= key_grav_l_->key_; + } + else if (key_grav_l_ && key_grav_l_->key_changed_b ()) + { + local_key_ = key_grav_l_->key_; } } -IMPLEMENT_IS_TYPE_B1(Local_key_engraver,Engraver); + ADD_THIS_TRANSLATOR(Local_key_engraver);