X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fvolta-spanner.cc;h=ac0973f9e5954f210780934254de57346042b2fd;hb=d26be70e8f3942df6f13e25a7f79321b9b98d1a8;hp=a92e590714e382c8c0673bd90d2128de78e47ab1;hpb=339ea28cd7e4f8a1c1ca7c1d4dfe803a3f4c03e6;p=lilypond.git diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index a92e590714..ac0973f9e5 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -17,12 +17,15 @@ #include "paper-def.hh" #include "volta-spanner.hh" #include "stem.hh" - -#include "pointer.tcc" +#include "dimension-cache.hh" +#include "group-interface.hh" Volta_spanner::Volta_spanner () { last_b_ = false; + dim_cache_ [Y_AXIS]->set_callback (dim_callback); + set_elt_property ("bars", SCM_EOL); + set_elt_property ("note-columns", SCM_EOL); } Molecule* @@ -30,36 +33,43 @@ Volta_spanner::do_brew_molecule_p () const { Molecule* mol_p = new Molecule; - if (!bar_arr_.size ()) + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (!bar_arr.size ()) return mol_p; + + Link_array note_column_arr + = Group_interface__extract_elements (this, (Bar*)0, "note-columns"); + bool no_vertical_start = false; bool no_vertical_end = last_b_; Spanner *orig_span = dynamic_cast (original_l_); - if (orig_span && orig_span->broken_into_l_arr_[0] != this) + if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)this)) no_vertical_start = true; - if (orig_span && orig_span->broken_into_l_arr_.top () != this) + if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)this)) no_vertical_end = true; - if (bar_arr_.top ()->type_str_.length_i () > 1) + if (bar_arr.top ()->type_str_.length_i () > 1) no_vertical_end = false; - Real interline_f = paper_l ()->get_realvar (interline_scm_sym); + Real interline_f = paper_l ()->get_var ("interline"); Real internote_f = interline_f/2; - Real t = paper_l ()->get_realvar (volta_thick_scm_sym); + Real t = paper_l ()->get_var ("volta_thick"); Real dx = internote_f; - Real w = extent (X_AXIS).length () - dx; + Real w = spanner_length() - dx - get_broken_left_end_align (); Real h = paper_l()->get_var ("volta_spanner_height"); Molecule volta (lookup_l ()->volta (h, w, t, no_vertical_start, no_vertical_end)); Molecule num (lookup_l ()->text ("volta", number_str_, paper_l ())); - Real dy = bar_arr_.top ()->extent (Y_AXIS) [UP] > - bar_arr_[0]->extent (Y_AXIS) [UP]; + Real dy = bar_arr.top ()->extent (Y_AXIS) [UP] > + bar_arr[0]->extent (Y_AXIS) [UP]; dy += 2 * h; - for (int i = 0; i < note_column_arr_.size (); i++) - dy = dy >? note_column_arr_[i]->extent (Y_AXIS)[BIGGER]; + for (int i = 0; i < note_column_arr.size (); i++) + dy = dy >? note_column_arr[i]->extent (Y_AXIS)[BIGGER]; dy -= h; Molecule two (lookup_l ()->text ("number", "2", paper_l ())); @@ -76,50 +86,64 @@ Volta_spanner::do_brew_molecule_p () const void Volta_spanner::do_add_processing () { - if (bar_arr_.size ()) + + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (bar_arr.size ()) { - set_bounds (LEFT, bar_arr_[0]); - set_bounds (RIGHT, bar_arr_.top ()); + set_bounds (LEFT, bar_arr[0]); + set_bounds (RIGHT, bar_arr.top ()); } } - + +/* + Originally the following comment existed here + "in most cases, it's a lot better not no have height...", + but problems existed with collision between volta spanner + and above staff or lyrics for multi-staff music, so the proper + height is now being returned. Additional space should still + be added elsewhere so lyrics from above staff do not sit on + volta spanner. (Roy R. Rankin) +*/ Interval -Volta_spanner::do_height () const +Volta_spanner::dim_callback (Dimension_cache const *c) { - /* - in most cases, it's a lot better not no have height... - */ - Interval i; - return i; + Volta_spanner * v = dynamic_cast (c->element_l ()); + Real h = v->paper_l()->get_var ("volta_spanner_height") * 2.; + return Interval (0., h); } void Volta_spanner::do_post_processing () { - if (bar_arr_.size()) - translate_axis (bar_arr_[0]->extent (Y_AXIS)[UP], Y_AXIS); -} -void -Volta_spanner::do_substitute_element_pointer (Score_element* o, Score_element* n) -{ - if (Note_column* c = dynamic_cast (o)) - note_column_arr_.substitute (c, dynamic_cast (n)); - else if (Bar* c = dynamic_cast (o)) - bar_arr_.substitute (c, dynamic_cast (n)); + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (bar_arr.size()) + translate_axis (bar_arr[0]->extent (Y_AXIS)[UP], Y_AXIS); + translate_axis (get_broken_left_end_align (), X_AXIS); } + + void Volta_spanner::add_bar (Bar* c) { - bar_arr_.push (c); + Group_interface gi(this, "bars"); + gi.add_element (c); + add_dependency (c); } void Volta_spanner::add_column (Note_column* c) { - note_column_arr_.push (c); + Group_interface gi(this, "note-columns"); + gi.add_element (c); + add_dependency (c); } +