X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fclef-engraver.cc;h=64443eb18b6f187c1aa790d0725a312a8f95976b;hb=f988425624a6f6d1a48aea0ac0c1c84ff0857e56;hp=cffdd3f34059e624483b5fa71dc419e22d8c591c;hpb=dd36ce6e97590323a7b6a61eb4a3f08d265c5b6e;p=lilypond.git diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index cffdd3f340..64443eb18b 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -1,4 +1,5 @@ /* + clef-engraver.cc -- implement Clef_engraver source file of the GNU LilyPond music typesetter @@ -9,23 +10,27 @@ */ #include -#include "staff-symbol-referencer.hh" + +#include "translator-group.hh" +#include "key-item.hh" +#include "local-key-item.hh" #include "bar.hh" -#include "clef-item.hh" +#include "note-head.hh" +#include "staff-symbol-referencer.hh" #include "debug.hh" #include "command-request.hh" -#include "timing-translator.hh" -#include "note-head.hh" -#include "key-item.hh" -#include "local-key-item.hh" -#include "array.hh" #include "engraver.hh" #include "direction.hh" +#include "side-position-interface.hh" +#include "item.hh" /// where is c-0 in the staff? -class Clef_engraver : public Engraver { - Clef_item * clef_p_; +class Clef_engraver : public Engraver +{ + Item * clef_p_; + Item * octavate_p_; Clef_change_req * clef_req_l_; + void create_clef(); bool set_type (String); protected: @@ -44,17 +49,21 @@ public: SCM clef_glyph_; // no need for protection. Always referenced somewhere else. Clef_engraver(); + + bool first_b_; }; Clef_engraver::Clef_engraver() { + first_b_ = true; clef_glyph_ = SCM_EOL; clef_p_ = 0; clef_req_l_ = 0; c0_position_i_ = 0; clef_position_i_ = 0; octave_dir_ = CENTER; + octavate_p_ = 0; } bool @@ -95,10 +104,18 @@ Clef_engraver::set_type (String s) } c0_position_i_ -= (int) octave_dir_ * 7; + + SCM basic = ly_symbol2scm ("basicClefItemProperties"); + SCM c0 = ly_symbol2scm ("c0-position"); + SCM gl = ly_symbol2scm ("glyph"); + daddy_trans_l_->execute_single_pushpop_property (basic, gl, SCM_UNDEFINED); + daddy_trans_l_->execute_single_pushpop_property (basic, c0, SCM_UNDEFINED); + daddy_trans_l_->execute_single_pushpop_property (basic, gl, clef_glyph_); + daddy_trans_l_->execute_single_pushpop_property (basic, c0, gh_int2scm (c0_position_i_)); + return true; } - /** Generate a clef at the start of a measure. (when you see a Bar, ie. a breakpoint) @@ -106,25 +123,24 @@ Clef_engraver::set_type (String s) void Clef_engraver::acknowledge_element (Score_element_info info) { - if (dynamic_cast(info.elem_l_) - && gh_string_p (clef_glyph_)) - create_clef(); - - /* ugh; should make Clef_referenced baseclass */ - Item * it_l =dynamic_cast (info.elem_l_); - if (it_l) + Item * item =dynamic_cast (info.elem_l_); + if (item) { - if (dynamic_cast(it_l) - || dynamic_cast (it_l) - ) - + if (Bar::has_interface (info.elem_l_) + && gh_string_p (clef_glyph_)) + create_clef(); + + + if (Note_head::has_interface (item) + || Local_key_item::has_interface (item)) { - Staff_symbol_referencer_interface si (it_l); - si.set_position (int (si.position_f ()) + c0_position_i_); + int p = int (Staff_symbol_referencer::position_f (item)) + c0_position_i_; + Staff_symbol_referencer::set_position (item,p); + } - else if (Key_item *k = dynamic_cast(it_l)) + else if (Key_item::has_interface (item)) { - k->set_elt_property ("c0-position", gh_int2scm (c0_position_i_)); + item->set_elt_property ("c0-position", gh_int2scm (c0_position_i_)); } } } @@ -136,8 +152,6 @@ Clef_engraver::do_creation_processing() if (gh_string_p (def)) { set_type (ly_scm2string (def)); - create_clef (); - clef_p_->set_elt_property ("non-default", SCM_BOOL_T); } } @@ -148,7 +162,7 @@ Clef_engraver::do_try_music (Music * r_l) { clef_req_l_ = cl; if (!set_type (cl->clef_str_)) - cl->error (_ ("unknown clef type")); + cl->origin ()->warning (_ ("unknown clef type")); return true; } @@ -162,22 +176,27 @@ Clef_engraver::create_clef() { if (!clef_p_) { - Clef_item *c= new Clef_item; - c->set_elt_property ("breakable", SCM_BOOL_T); - c->set_elt_property ("break-aligned", SCM_BOOL_T); - announce_element (Score_element_info (c, clef_req_l_)); + Item *c= new Item (get_property ("basicClefItemProperties")); + announce_element (c, clef_req_l_); - Staff_symbol_referencer_interface si(c); - si.set_interface (); + Staff_symbol_referencer::set_interface (c); clef_p_ = c; } - Staff_symbol_referencer_interface si(clef_p_); - clef_p_->set_elt_property ("glyph", clef_glyph_); - si.set_position (clef_position_i_); + Staff_symbol_referencer::set_position(clef_p_, clef_position_i_); if (octave_dir_) { - clef_p_->set_elt_property ("octave-dir", gh_int2scm (octave_dir_)); + Item * g = new Item (get_property ("basicOctavateEightProperties")); + Side_position::set_axis (g,Y_AXIS); + Side_position::add_support (g,clef_p_); + + g->set_parent (clef_p_, Y_AXIS); + g->set_parent (clef_p_, X_AXIS); + g->add_offset_callback (Side_position::aligned_on_self, X_AXIS); + g->add_offset_callback (Side_position::centered_on_parent, X_AXIS); + g->set_elt_property ("direction", gh_int2scm (octave_dir_)); + octavate_p_ = g; + announce_element (octavate_p_, clef_req_l_); } } @@ -185,7 +204,7 @@ Clef_engraver::create_clef() void Clef_engraver::do_process_music() { - if (clef_req_l_) + if (clef_req_l_ || first_b_) { create_clef(); clef_p_->set_elt_property ("non-default", SCM_BOOL_T); @@ -197,13 +216,29 @@ Clef_engraver::do_pre_move_processing() { if (clef_p_) { - if(to_boolean (clef_p_->remove_elt_property("non-default"))) - clef_p_->set_elt_property("visibility-lambda", - ly_eval_str ("all-visible")); + SCM vis = 0; + if(to_boolean (clef_p_->get_elt_property("non-default"))) + { + vis = get_property ("explicitClefVisibility"); + } + + if (vis) + { + clef_p_->set_elt_property("visibility-lambda", vis); + if (octavate_p_) + octavate_p_->set_elt_property("visibility-lambda", vis); + } typeset_element (clef_p_); clef_p_ =0; + + if (octavate_p_) + typeset_element(octavate_p_); + + octavate_p_ = 0; } + + first_b_ = 0; } void @@ -212,8 +247,5 @@ Clef_engraver::do_post_move_processing() clef_req_l_ = 0; } - - - ADD_THIS_TRANSLATOR(Clef_engraver);