X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar-script-engraver.cc;h=689ecea2bcff4166f9b1cadc40d61915ce8da4e3;hb=ffe548cfbb3c3b37c8969f49b5aba04ef998d080;hp=14c26b6e0313215589c6b65769579f41045ba0d4;hpb=5f42fe18c41237a73d99fd76b34e434a33598704;p=lilypond.git diff --git a/lily/bar-script-engraver.cc b/lily/bar-script-engraver.cc index 14c26b6e03..689ecea2bc 100644 --- a/lily/bar-script-engraver.cc +++ b/lily/bar-script-engraver.cc @@ -10,70 +10,82 @@ #include "bar-script-engraver.hh" #include "bar.hh" #include "clef-item.hh" -#include "g-staff-side.hh" -#include "g-text-item.hh" +#include "side-position-interface.hh" +#include "text-item.hh" #include "lily-guile.hh" +#include "paper-column.hh" +#include "paper-def.hh" +#include "dimension-cache.hh" +#include "staff-symbol-referencer.hh" +#include "side-position-interface.hh" +#include "staff-symbol.hh" Bar_script_engraver::Bar_script_engraver () { axis_ = Y_AXIS; - staff_side_p_ = 0; text_p_ =0; - hang_on_clef_b_ = false; - visibility_lambda_ - = gh_eval_str ("non_postbreak_visibility"); } void Bar_script_engraver::do_creation_processing () { - Scalar prop = get_property (type_ + "HangOnClef", 0); - if (prop.to_bool ()) - { - hang_on_clef_b_ = true; - } + String t = type_ + "VisibilityFunction"; + SCM proc = get_property (t, 0); + + if (gh_procedure_p (proc)) + visibility_lambda_ = proc; } + +/* + Some interesting item came across. Lets attach the text and the + positioner to the item. + +*/ + void -Bar_script_engraver::do_acknowledge_element (Item *i) +Bar_script_engraver::attach_script_to_item (Item *i) { Axis other_axis = Axis((axis_ + 1)%2); - if (staff_side_p_ && !staff_side_p_->dim_cache_[other_axis].parent_l_) + if (text_p_ && !text_p_->parent_l(other_axis)) { - staff_side_p_->dim_cache_[other_axis].parent_l_ - = &i->dim_cache_[other_axis]; - staff_side_p_->dim_cache_[axis_].parent_l_ - = &i->dim_cache_[axis_]; + text_p_->set_parent (i,other_axis); + text_p_->set_parent (i,axis_); + + if (!text_p_->parent_l(other_axis)) + text_p_->set_parent (i,other_axis); + + Side_position_interface (text_p_).add_support (i); - staff_side_p_->add_support (i); - i->add_dependency (staff_side_p_); // UGH. + /* + How do we make sure that text_p_ has a dependency from + someone else? We can't use I for that, so we use some other element. + */ + // text_p_->set_elt_property ("dangling", SCM_BOOL_T) + get_staff_info ().command_pcol_l ()->add_dependency (text_p_); } } - +/* + URG. + */ Item* Bar_script_engraver::cast_to_interesting_item (Score_element *e) { Item * i =0; - if (hang_on_clef_b_) - { - Clef_item * c = dynamic_cast (e); - if (c && c->default_b_) - { - i = c; - } - } - else - { - i = dynamic_cast (e); - } + + /* + should do type lookup: if (e ->is_type (hang_on_type)) + */ + i = dynamic_cast (e); + return i; } void Bar_script_engraver::acknowledge_element (Score_element_info inf) { - if (inf.origin_grav_l_arr_.size () == 1) + if (inf.origin_trans_l_arr (this).size () == 1) { Item *i=cast_to_interesting_item (inf.elem_l_); if (!i) @@ -82,10 +94,10 @@ Bar_script_engraver::acknowledge_element (Score_element_info inf) /* Only put numbers on bars that are at our own level (don't put numbers over the staffs of a GrandStaff, only over the GrandStaff itself */ - if (inf.origin_grav_l_arr_.size () != 1) + if (inf.origin_trans_l_arr (this).size () != 1) return; - do_acknowledge_element (i); + attach_script_to_item (i); } } @@ -94,53 +106,51 @@ Bar_script_engraver::do_pre_move_processing () { if (text_p_) { + Staff_symbol * st = staff_symbol_referencer (text_p_).staff_symbol_l(); + + if (st) + side_position (text_p_).add_support (st); + typeset_element (text_p_); text_p_ =0; } - - if (staff_side_p_) - { - typeset_element (staff_side_p_); - staff_side_p_ = 0; - } } void Bar_script_engraver::create_items (Request *rq) { - if (staff_side_p_ || text_p_) + if (text_p_) return; - staff_side_p_ = new G_staff_side_item; - staff_side_p_->axis_ = axis_; - staff_side_p_->breakable_b_ = true; // ugh + text_p_ = new Text_item; + text_p_->set_elt_property ("breakable", SCM_BOOL_T); // ugh + Side_position_interface staffside(text_p_); + staffside.set_axis (axis_); - - text_p_ = new G_text_item; - text_p_->breakable_b_ = true; // ugh - - Scalar prop = get_property (type_ + "Direction", 0); - if (prop.isnum_b ()) + SCM prop = get_property (type_ + "Direction", 0); + if (!isdir_b (prop)) { - staff_side_p_->dir_ = (Direction) (int) prop; + prop = gh_int2scm (UP); } - else + text_p_->set_elt_property ("direction", prop); + + SCM padding = get_property (type_ + "ScriptPadding", 0); + if (gh_number_p(padding)) { - staff_side_p_->dir_ = UP; + text_p_->set_elt_property ("padding", padding); } - - staff_side_p_->set_victim(text_p_); - - Scalar padding = get_property (type_ + "ScriptPadding", 0); - if (padding.length_i() && padding.isnum_b ()) + else { - staff_side_p_->padding_f_ = Real(padding); + text_p_ + ->set_elt_property ("padding", + gh_double2scm(paper_l ()->get_var ("interline"))); } - staff_side_p_->visibility_lambda_ = visibility_lambda_; - text_p_->visibility_lambda_ = visibility_lambda_; + if (gh_procedure_p (visibility_lambda_)) + text_p_->set_elt_property ("visibility-lambda", + visibility_lambda_); announce_element (Score_element_info (text_p_, rq)); - announce_element (Score_element_info (staff_side_p_, rq)); } +