X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-spanner.cc;h=1ce8128d9deac1de3198314a34e33befddb22e49;hb=45bae7c4e36d595cf545c85a53ff14c95bf4cf9c;hp=6258b17008f142d414fc23ced7e59b64515953e4;hpb=aaa52903d633cdeaa642c20ab42ec268f4e17a2b;p=lilypond.git diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index 6258b17008..1ce8128d9d 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -11,66 +11,70 @@ #include "debug.hh" #include "lookup.hh" #include "molecule.hh" -#include "note-column.hh" #include "paper-column.hh" -#include "bar.hh" #include "paper-def.hh" #include "volta-spanner.hh" -#include "stem.hh" -#include "dimension-cache.hh" #include "group-interface.hh" -#include "atom.hh" +#include "side-position-interface.hh" +#include "directional-element-interface.hh" -Volta_spanner::Volta_spanner () +void +Volta_spanner::set_interface (Score_element*me) { - dim_cache_ [Y_AXIS]->set_callback (dim_callback); - set_elt_property ("bars", SCM_EOL); - set_elt_property ("note-columns", SCM_EOL); + Side_position::set_axis (me, Y_AXIS); + Directional_element_interface::set (me, UP); } + /* - FIXME: too complicated. - */ -Molecule* -Volta_spanner::do_brew_molecule_p () const -{ - Molecule* mol_p = new Molecule; + this is too complicated. Yet another version of side-positioning, + badly implemented. - Link_array bar_arr - = Group_interface__extract_elements (this, (Bar*)0, "bars"); + -- + + * Should look for system_start_delim to find left edge of staff. + + +*/ + +MAKE_SCHEME_CALLBACK(Volta_spanner,brew_molecule); +SCM +Volta_spanner::brew_molecule (SCM smob) +{ + Score_element *me = unsmob_element (smob); + Link_array bar_arr + = Pointer_group_interface__extract_elements (me, (Item*)0, "bars"); if (!bar_arr.size ()) - return mol_p; + return SCM_EOL; - Link_array note_column_arr - = Group_interface__extract_elements (this, (Score_element*)0, "note-columns"); - bool no_vertical_start = false; - bool no_vertical_end = to_boolean (get_elt_property ("last-volta")); - Spanner *orig_span = dynamic_cast (original_l_); - if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)this)) + bool no_vertical_end = to_boolean (me->get_elt_property ("last-volta")); + Spanner *orig_span = dynamic_cast (me->original_l_); + if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)me)) no_vertical_start = true; - if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)this)) + if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)me)) no_vertical_end = true; #if 0 // FIXME - if (bar_arr.top ()->get_elt_property (type_str_.length_i () > 1) + if (bar_arr.top ()->me->get_elt_property (type_str_.length_i () > 1) no_vertical_end = false; #endif - Real staff_space = paper_l ()->get_var ("interline"); - Real half_staff_space = staff_space/2; - Real t = paper_l ()->get_var ("volta_thick"); - - Real dx = half_staff_space; - Real w = spanner_length() - dx - get_broken_left_end_align (); - Real h = paper_l()->get_var ("volta_spanner_height"); - - Molecule volta; + Real staff_space = me->paper_l ()->get_var ("staffspace"); + Real staff_thick = me->paper_l ()->get_var ("stafflinethickness"); + Real half_space = staff_space / 2; + Real left = dynamic_cast(me)->get_broken_left_end_align (); + Real w = dynamic_cast(me)->spanner_length () - left - half_space; + Real h = staff_space * gh_scm2double (me->get_elt_property ("height")); + Real t = staff_thick * gh_scm2double (me->get_elt_property ("thickness")); - Atom *at = new Atom(gh_list (ly_symbol2scm ("volta"), + /* + ugh: should build from line segments. + */ + SCM at = (gh_list (ly_symbol2scm ("volta"), gh_double2scm (h), gh_double2scm (w), gh_double2scm (t), @@ -78,95 +82,31 @@ Volta_spanner::do_brew_molecule_p () const gh_int2scm (no_vertical_end), SCM_UNDEFINED)); - volta.dim_[Y_AXIS] = Interval (- h/2, h/2); - volta.dim_[X_AXIS] = Interval (0, w); - volta.add_atom (at->self_scm_); - - Molecule num (lookup_l ()->text ("volta", - ly_scm2string (get_elt_property("text")), - paper_l ())); - Real dy = bar_arr.top ()->extent (Y_AXIS) [UP] >? - bar_arr[0]->extent (Y_AXIS) [UP]; - dy += 2 * h; - - - /* - CODE DUPLICATION. - FIXME (see axis-group-elt, side-pos interface.) - */ - 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 ())); - Real gap = two.dim_.x ().length () / 2; - Offset off (num.dim_.x ().length () + gap, - h / half_staff_space - gap); - num.translate (off); - mol_p->add_molecule (volta); - mol_p->add_molecule (num); - mol_p->translate (Offset (0, dy)); - return mol_p; -} - -void -Volta_spanner::do_add_processing () -{ - - Link_array bar_arr - = Group_interface__extract_elements (this, (Bar*)0, "bars"); + Box b (Interval (0, w), Interval (0, h)); + Molecule mol (b, at); + Molecule num (me->lookup_l ()->text ("volta", + ly_scm2string (me->get_elt_property("text")), + me->paper_l ())); - if (bar_arr.size ()) - { - set_bounds (LEFT, bar_arr[0]); - set_bounds (RIGHT, bar_arr.top ()); - } + mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () + - staff_space); + mol.translate_axis (left, X_AXIS); + return mol.create_scheme(); } -/* - 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::dim_callback (Dimension_cache const *c) -{ - 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 () +Volta_spanner::add_bar (Score_element *me, Item* b) { - 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) -{ - Group_interface gi(this, "bars"); - gi.add_element (c); + Pointer_group_interface gi(me, "bars"); + gi.add_element (b); - add_dependency (c); + Side_position::add_support (me,b); + add_bound_item (dynamic_cast(me), b); } void -Volta_spanner::add_column (Note_column* c) +Volta_spanner::add_column (Score_element*me, Score_element* c) { - Group_interface gi(this, "note-columns"); - gi.add_element (c); - - add_dependency (c); + Side_position::add_support (me,c); } - -